[
  {
    "path": ".config/cliff.toml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n# git-cliff ~ default configuration file\n# https://git-cliff.org/docs/configuration\n#\n# Lines starting with \"#\" are comments.\n# Configuration options are organized into tables and keys.\n# See documentation for more information on available options.\n\n[changelog]\n# changelog header\nheader = \"\"\"\n<!--\nSPDX-FileCopyrightText: 2024 Christina Sørensen\nSPDX-FileContributor: Christina Sørensen\n\nSPDX-License-Identifier: EUPL-1.2\n-->\n# Changelog\\n\n\"\"\"\n# template for the changelog body\n# https://tera.netlify.app/docs\nbody = \"\"\"\n{% if version %}\\\n    ## [{{ version | trim_start_matches(pat=\"v\") }}] - {{ timestamp | date(format=\"%Y-%m-%d\") }}\n{% else %}\\\n    ## [unreleased]\n{% endif %}\\\n{% for group, commits in commits | group_by(attribute=\"group\") %}\n    ### {{ group | upper_first }}\n    {% for commit in commits %}\n        - {% if commit.breaking %}[**breaking**] {% endif %}{{ commit.message | upper_first }}\\\n    {% endfor %}\n{% endfor %}\\n\n\"\"\"\n# remove the leading and trailing whitespace from the template\ntrim = true\n# changelog footer\nfooter = \"\"\"\n\n\"\"\"\n\n[git]\n# parse the commits based on https://www.conventionalcommits.org\nconventional_commits = true\n# filter out the commits that are not conventional\nfilter_unconventional = true\n# process each line of a commit as an individual commit\nsplit_commits = false\n# regex for preprocessing the commit messages\ncommit_preprocessors = [\n  # { pattern = '\\((\\w+\\s)?#([0-9]+)\\)', replace = \"([#${2}](https://github.com/orhun/git-cliff/issues/${2}))\"}, # replace issue numbers\n]\n# regex for parsing and grouping commits\ncommit_parsers = [\n  { message = \"^feat\", group = \"Features\" },\n  { message = \"^fix\", group = \"Bug Fixes\" },\n  { message = \"^docs\", group = \"Documentation\" },\n  { message = \"^perf\", group = \"Performance\" },\n  { message = \"^refactor\", group = \"Refactor\" },\n  { message = \"^style\", group = \"Styling\" },\n  { message = \"^test\", group = \"Testing\" },\n  { message = \"^chore\\\\(release\\\\): prepare for\", skip = true },\n  { message = \"^chore\", group = \"Miscellaneous Tasks\" },\n  { body = \".*security\", group = \"Security\" },\n]\n# protect breaking changes from being skipped due to matching a skipping commit_parser\nprotect_breaking_commits = false\n# filter out the commits that are not matched by commit parsers\nfilter_commits = false\n# glob pattern for matching git tags\ntag_pattern = \"v[0-9]*\"\n# regex for skipping tags\nskip_tags = \"v0.1.0-beta.1\"\n# regex for ignoring tags\nignore_tags = \"\"\n# sort the tags topologically\ntopo_order = false\n# sort the commits inside sections by oldest/newest order\nsort_commits = \"oldest\"\n# limit the number of commits included in the changelog.\n# limit_commits = 42\n"
  },
  {
    "path": ".config/treefmt.nix",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n{\n  projectRootFile = \"Cargo.toml\";\n  programs = {\n    nixfmt.enable = true; # nix\n    statix.enable = true; # nix static analysis\n    deadnix.enable = true; # find dead nix code\n    # TODO https://github.com/numtide/treefmt-nix/issues/343\n    #rustfmt.enable = true; # rust\n    shellcheck.enable = true; # bash/shell\n    taplo.enable = true; # toml\n    yamlfmt.enable = true; # yaml\n  };\n  settings = {\n    formatter = {\n      shellcheck = {\n        includes = [\n          \"*.sh\"\n          \"./completions/bash/eza\"\n        ];\n        excludes = [ \".envrc\" ];\n      };\n      taplo.excludes = [ \"tests/ptests/*.toml\" ];\n      yamlfmt.excludes = [ \"./powertest.yaml\" ];\n    };\n  };\n}\n"
  },
  {
    "path": ".envrc",
    "content": "if has nix; then\n  use flake .\nfi\n"
  },
  {
    "path": ".git-blame-ignore-revs",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n# This file contains a list of commits that are not likely what you\n# are looking for in a blame, such as mass reformatting or renaming.\n# You can set this file as a default ignore file for blame by running\n# the following command.\n#\n# $ git config blame.ignoreRevsFile .git-blame-ignore-revs\n#\n# To temporarily not use this file add\n# --ignore-revs-file=\"\"\n# to your blame command.\n#\n# The ignoreRevsFile can't be set globally due to blame failing if the file isn't present.\n# To not have to set the option in every repository it is needed in,\n# save the following script in your path with the name \"git-bblame\"\n# now you can run\n# $ git bblame $FILE\n# to use the .git-blame-ignore-revs file if it is present.\n#\n# #!/usr/bin/env bash\n# repo_root=$(git rev-parse --show-toplevel)\n# if [[ -e $repo_root/.git-blame-ignore-revs ]]; then\n#     git blame --ignore-revs-file=\"$repo_root/.git-blame-ignore-revs\" $@\n# else\n#     git blame $@\n# fi\n\n# treewide rustfmt https://github.com/eza-community/eza/pull/405\n0e06409b07f060e3afe1c099c4c54e6504847ee0\n\n# initial powertests https://github.com/eza-community/eza/pull/644/commits\n2273e29bc006baeb76795ae40c7b8b76f61c6f26\n4f949fc9bbb1e387b489ad841af56e7be448bef3\n\n# Rustfmt related commits\n29d009a439f43190ec617080e1afd96773264f81\nbe0c2d1ba1feebc9ed7b2f24b80619dbf8fdf143\n313e602cde89b2ec8089b7588f57f4601579a249\n2704e0a8499802b4b79f120349ac3bd41e02c208\nc86edc54435a57466204bf41a0166c7b6f687aeb\n\n# Rust edition 2024\n37ec91db827823cf32068ab930ffc83b790800b6\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n# Lines starting with a '#' are comments.\n# Each line is a file pattern followed by one or more owners.\n\n# These owners will be the default owners for everything in the repository.\n# * @global-owner1 @global-owner2\n\n# The 'docs/*' pattern will match files like\n# 'docs/getting-started.md' but not further nested files like\n# 'docs/build-app/troubleshooting.md'.\n# docs/*  @doc-owner-team\n\n# You can also use email addresses if the user isn't on GitHub.\n# *.py admin@example.com\n\n# You can use a '*' at the end of a pattern to match all files\n# of a particular type.\n# *.* @all-file-types-owner\n\n# Order is important. The last matching pattern has the most precedence.\n# This means if a pull request touches both *.js and *.css files,\n# it will only request a review from @js-owner, not @css-owner.\n# *.js @js-owner\n# *.css @css-owner\n\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\ngithub: cafkafk\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Report a crash, runtime error, or invalid output in eza\ntitle: 'bug: '\nlabels: errors\nassignees: ''\n\n---\n\nIf eza does something unexpected, or its output looks wrong, or it displays an error on the screen, or if it outright crashes, then please include the following information in your report:\n\n- The version of eza being used (`eza --version`)\n- The command-line arguments you are using\n- Your shell and terminal\n- Your operating system and hardware platform\n\nIf it’s a crash, please include the full text of the crash that gets printed to the screen. If you’re seeing unexpected behaviour, a screenshot of the issue will help a lot.\n\n---\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/compilation_error.md",
    "content": "---\nname: Compilation error\nabout: Report a problem compiling eza\ntitle: 'ci: '\nlabels: ''\nassignees: ''\n\n---\n\nIf eza fails to compile, or if there is a problem during the build process, then please include the following information in your report:\n\n- The exact eza commit you are building (`git rev-parse --short HEAD`)\n- The version of rustc you are compiling it with (`rustc --version`)\n- Your operating system and hardware platform\n- The Rust build target (the _exact_ output of `rustc --print cfg`)\n\nIf you are seeing compilation errors, please include the output of the build process.\n\n---\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n#\n# SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n# SPDX-FileCopyrightText: 2014 Benjamin Sago\n# SPDX-License-Identifier: MIT\nblank_issues_enabled: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Request a feature or enhancement to eza\ntitle: 'feat:  '\nlabels: ''\nassignees: ''\n\n---\n\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/question.md",
    "content": "---\nname: Question\nabout: Ask a question about eza\ntitle: ''\nlabels: question\nassignees: ''\n\n---\n\nThis should be posted in Q&A in discussions\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE/pull_request_template.md",
    "content": "<!--- Provide a general summary of your changes in the Title above -->\n\n<!--- Make sure you've read CONTRIBUTING.md and CODE_OF_CONDUCT.md -->\n<!---  -->\n<!--- If suggesting a major new feature or major change, please discuss it in an issue/discussions first -->\n<!--- If fixing a bug, IDEALLY there should be an issue describing it with steps to reproduce -->\n##### Description\n<!--- Describe your changes in detail -->\n<!--- Why is this change required? What problem does it solve? -->\n<!--- If it fixes an open issue, please link to the issue here. -->\n<!--- Consider including potentially useful screenshots of your feature in action -->\n\n##### How Has This Been Tested?\n<!--- Please describe in detail how you tested your changes. -->\n<!--- Include details of your testing environment, and the tests you ran to -->\n<!--- see how your change affects other areas of the code, etc. -->\n\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n#\n# SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n# SPDX-FileCopyrightText: 2014 Benjamin Sago\n# SPDX-License-Identifier: MIT\n# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where the package manifests are located.\n# Please see the documentation for all configuration options:\n# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\nversion: 2\nupdates:\n  - package-ecosystem: \"cargo\" # See documentation for possible values\n    directory: \"/\" # Location of package manifests\n    schedule:\n      interval: \"weekly\"\n  - package-ecosystem: \"github-actions\"\n    # Workflow files stored in the\n    # default location of `.github/workflows`\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n"
  },
  {
    "path": ".github/workflows/apt.yml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n#\n# SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n# SPDX-FileCopyrightText: 2014 Benjamin Sago\n# SPDX-License-Identifier: MIT\nname: Apt Installation\non:\n  schedule:\n    - cron: '0 0 * * *'\n  push:\n    branches: [main]\n    paths:\n      - 'deb.asc'\n      - '.github/workflows/apt.yml'\n  pull_request:\n    branches: [main]\n    paths:\n      - 'deb.asc'\n      - '.github/workflows/apt.yml'\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }}\n  cancel-in-progress: true\njobs:\n  apt_installation:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Install eza via apt repo\n        run: |\n          wget -qO- https://raw.githubusercontent.com/eza-community/eza/main/deb.asc | sudo tee /etc/apt/trusted.gpg.d/gierens.asc && \\\n          echo \"deb http://deb.gierens.de stable main\" | sudo tee /etc/apt/sources.list.d/gierens.list && \\\n          sudo apt update && \\\n          sudo apt install -y eza\n      - name: Run eza\n        run: eza\n      - name: Open man page\n        run: man eza | cat\n"
  },
  {
    "path": ".github/workflows/unit-tests.yml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\nname: Unit tests\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n  workflow_dispatch:\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }}\n  cancel-in-progress: true\nenv:\n  CARGO_TERM_COLOR: always\n  RUSTFLAGS: --deny warnings\n  msrv: '1.90'\njobs:\n  security_audit:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: taiki-e/install-action@cargo-deny\n      - name: Scan for vulnerabilities\n        run: cargo deny check\n  check_if_pr:\n    runs-on: ubuntu-latest\n    outputs:\n      is_pr: ${{ steps.check.outputs.is_pr }}\n    steps:\n      - name: Check if it's a PR\n        id: check\n        run: |\n          if [ \"${{ github.event_name }}\" == \"pull_request\" ]; then\n            echo \"is_pr=true\" >> $GITHUB_OUTPUT\n          else\n            echo \"is_pr=false\" >> $GITHUB_OUTPUT\n          fi\n  no-merge-commits:\n    needs: check_if_pr\n    if: needs.check_if_pr.outputs.is_pr == 'true'\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n      - name: Run test\n        uses: NexusPHP/no-merge-commits@v2.2.1\n        with:\n          token: ${{ secrets.GITHUB_TOKEN }}\n  conventional:\n    needs: [check_if_pr, no-merge-commits]\n    name: Conventional Commits\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - uses: webiny/action-conventional-commits@v1.3.0\n  unit-tests:\n    needs: conventional\n    runs-on: ${{ matrix.os }}\n    continue-on-error: ${{ matrix.rust == 'nightly' }}\n    strategy:\n      matrix:\n        os: [ubuntu-latest, macos-latest, windows-latest]\n        rust: [msrv, stable, beta, nightly]\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n      - run: rustup toolchain install ${{ matrix.rust == 'msrv' && env.msrv || matrix.rust }} --profile minimal\n      - uses: Swatinem/rust-cache@v2\n      - name: Install cargo-hack\n        uses: nick-fields/retry@v3\n        with:\n          timeout_minutes: 5\n          max_attempts: 5\n          command: cargo install cargo-hack --locked\n      - name: Run rustfmt checks\n        run: cargo fmt --check\n      - name: Run clippy lints\n        if: ${{ matrix.os != 'windows-latest' }}\n        run: cargo clippy -- -D warnings\n      - name: Run unit tests\n        run: cargo hack test\n  unit-tests-freebsd:\n    needs: conventional\n    runs-on: ubuntu-22.04\n    timeout-minutes: 20\n    continue-on-error: ${{ matrix.rust == 'nightly' }}\n    strategy:\n      matrix:\n        rust: [msrv, stable, beta, nightly]\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          submodules: recursive\n      - name: Compile\n        uses: vmactions/freebsd-vm@v1\n        with:\n          release: '15.0'\n          usesh: true\n          prepare: |\n            pkg install -y curl git\n            curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain ${{ matrix.rust == 'msrv' && env.msrv || matrix.rust }} --profile minimal -y\n            . ~/.cargo/env\n            cargo install cargo-hack\n            git config --global --add safe.directory /home/runner/work/eza/eza\n          run: |\n            set -e\n            . ~/.cargo/env\n            export CARGO_TERM_COLOR=\"always\"\n            export RUSTFLAGS=\"--deny warnings\"\n            cargo fmt --check\n            cargo clippy -- -D warnings\n            cargo hack test\n  unit-tests-netbsd:\n    needs: conventional\n    runs-on: ubuntu-22.04\n    timeout-minutes: 20\n    continue-on-error: ${{ matrix.rust == 'nightly' }}\n    strategy:\n      matrix:\n        rust: [msrv, stable, beta, nightly]\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          submodules: recursive\n      - name: Compile\n        uses: vmactions/netbsd-vm@v1\n        with:\n          release: '10.1'\n          usesh: true\n          prepare: |\n            PATH=\"/root/.cargo/bin:/usr/pkg/sbin:/usr/pkg/bin:$PATH\"\n            PKG_PATH=\"https://ftp.netbsd.org/pub/pkgsrc/packages/NetBSD/amd64/10.1/All/\"\n            export PATH PKG_PATH\n            /usr/sbin/pkg_add -uu curl git\n            curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain ${{ matrix.rust == 'msrv' && env.msrv || matrix.rust }} --profile minimal -y\n            . ~/.cargo/env\n            cargo install cargo-hack\n            git config --global --add safe.directory /home/runner/work/eza/eza\n          run: |\n            set -e\n            . ~/.cargo/env\n            export CARGO_TERM_COLOR=\"always\"\n            export RUSTFLAGS=\"--deny warnings\"\n            cargo fmt --check\n            cargo clippy -- -D warnings\n            cargo hack test\n  unit-tests-openbsd:\n    needs: conventional\n    runs-on: ubuntu-22.04\n    timeout-minutes: 20\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          submodules: recursive\n      - name: Compile\n        uses: vmactions/openbsd-vm@v1\n        with:\n          release: '7.8'\n          usesh: true\n          prepare: |\n            pkg_add rust rust-rustfmt rust-clippy git\n            cargo install cargo-hack\n            git config --global --add safe.directory /home/runner/work/eza/eza\n          run: |\n            set -e\n            export CARGO_TERM_COLOR=\"always\"\n            # Do not treat warnings as failure, since OpenBSD lags behind \"rustup\" versions.\n            # https://github.com/rust-lang/rustup/issues/2377\n            # https://github.com/rust-lang/rustup/issues/2168\n            # export RUSTFLAGS=\"--deny warnings\"\n            cargo fmt --check\n            # cargo clippy -- -D warnings\n            cargo hack test\n  flake-check:\n    needs: conventional\n    name: Check Nix Flake\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        checks: [build, formatting, lint, pre-commit-check, test, trycmd]\n        target: [x86_64-linux]\n    steps:\n      - uses: actions/checkout@v6\n      - name: Install Nix\n        uses: DeterminateSystems/nix-installer-action@v17\n      - name: Nix Flake Check\n        run: nix build .#checks.${{ matrix.target }}.${{ matrix.checks }} -L\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n  flake-build:\n    needs: conventional\n    name: Build Nix package\n    # if cross compilation is desired add 'aarch64-linux', 'x86_64-darwin' and 'aarch64-darwin' and fix the flake to support cross compilation.\n    strategy:\n      matrix:\n        target: [x86_64-linux]\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n      - name: Install Nix\n        uses: DeterminateSystems/nix-installer-action@v17\n      - name: Nix Build\n        run: nix build .#packages.${{ matrix.target }}.default -L\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/update-dependencies.sh",
    "content": "#!/usr/bin/env bash\n# SPDX-FileCopyrightText: 2025 Christina Sørensen\n#\n# SPDX-License-Identifier: EUPL-1.2\n\nset -euo pipefail\n\ncommit_changes() {\n  local file_to_check=\"$1\"\n  local commit_subject=\"$2\"\n  local commit_body=\"$3\"\n\n  # Check if the file has changes staged or unstaged\n  if ! git diff --quiet --exit-code \"$file_to_check\"; then\n    echo \"$file_to_check has been updated. Committing changes.\"\n    git add \"$file_to_check\"\n    \n    printf \"%s\\n\\n%s\" \"$commit_subject\" \"$commit_body\" | git commit -F -\n  else\n    echo \"No changes to $file_to_check. Skipping commit.\"\n  fi\n}\n\nBRANCH_NAME=\"deps_update_$(date --iso-8601)\"\nif git rev-parse --verify \"$BRANCH_NAME\" >/dev/null 2>&1; then\n  echo \"Branch '$BRANCH_NAME' already exists. Checking out.\"\n  git switch \"$BRANCH_NAME\"\nelse\n  git switch -c \"$BRANCH_NAME\"\nfi\n\n# 1. Update Cargo dependencies\necho \"Checking for Cargo dependency updates...\"\n# Redirect stderr to stdout to capture cargo's output.\nCARGO_OUTPUT=$(cargo update --recursive 2>&1)\nUPDATED_CRATES=$(echo \"$CARGO_OUTPUT\" | grep 'Updating' || true)\ncommit_changes \"Cargo.lock\" \"build(deps): cargo bump $(date --iso-8601)\" \"$UPDATED_CRATES\"\n\n# 2. Update Nix Flake dependencies\necho \"Checking for Nix Flake dependency updates...\"\n# Use grep -A 2 to capture the 2 lines *after* the match.\nFLAKE_OUTPUT=$(nix flake update 2>&1)\nUPDATED_FLAKES=$(echo \"$FLAKE_OUTPUT\" | grep -A 2 'Updated input' || true)\ncommit_changes \"flake.lock\" \"build(deps): flake bump $(date --iso-8601)\" \"$UPDATED_FLAKES\"\n\necho \"Dependency update process complete.\"\ngit status\n"
  },
  {
    "path": ".github/workflows/update-dependencies.yaml",
    "content": "# SPDX-FileCopyrightText: 2025 Christina Sørensen\n#\n# SPDX-License-Identifier: EUPL-1.2\nname: \"Automated Dependency Bump\"\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 0 * * 4'\njobs:\n  update-and-create-pr:\n    runs-on: ubuntu-latest\n    concurrency:\n      group: ${{ github.workflow }}-${{ github.ref }}\n      cancel-in-progress: true\n    steps:\n      - name: \"Checkout repository\"\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n      - name: \"Install Nix\"\n        uses: cachix/install-nix-action@v22\n        with:\n          nix_path: nixpkgs=channel:nixos-unstable\n      - name: \"Set up Git credentials\"\n        run: |\n          git config user.name \"github-actions[bot]\"\n          git config user.email \"github-actions[bot]@users.noreply.github.com\"\n      - name: \"Run update script\"\n        id: run_script\n        run: |\n          chmod +x .github/workflows/update-dependencies.sh\n          .github/workflows/update-dependencies.sh\n\n          BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)\n          echo \"branch=${BRANCH_NAME}\" >> $GITHUB_OUTPUT\n      - name: \"Create Pull Request\"\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          gh pr create \\\n            --title \"build(deps): Automatic dependency updates for $(date --iso-8601)\" \\\n            --body \"This PR was automatically generated by a GitHub Action to update crate and flake dependencies. Please review the changes and merge.\" \\\n            --base main \\\n            --head ${{ steps.run_script.outputs.branch }}\n"
  },
  {
    "path": ".github/workflows/winget.yml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n#\n# SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n# SPDX-FileCopyrightText: 2014 Benjamin Sago\n# SPDX-License-Identifier: MIT\nname: Publish to Winget\non:\n  release:\n    types: [released]\njobs:\n  publish:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: vedantmgoyal2009/winget-releaser@v2\n        with:\n          identifier: eza-community.eza\n          installers-regex: '-pc-windows-gnu\\.zip$'\n          token: ${{ secrets.WINGET_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n# Nix Flake stuff\nresult\n\n# Generated by nix-pre-commit-hooks\n/.pre-commit-config.yaml\n\n# Direnv\n.direnv\n\n# Rust stuff\ntarget\n\n# Vagrant stuff\n.vagrant\n*.log\n\n# Compiled artifacts\n# (see devtools/*-package-for-*.sh)\n/eza-linux-x86_64\n/eza-linux-x86_64-*.zip\n/eza-macos-x86_64\n/eza-macos-x86_64-*.zip\n/eza_*.deb\n/MD5SUMS\n/SHA1SUMS\n\n# Snap stuff\nparts\nprime\nstage\n*.snap\n\n# VHS testing stuff\nout.gif\ntests/tmp\n\n## Dynamically generated\ntests/test_dir\n\n# Miscenallous\n.idea\n"
  },
  {
    "path": ".pre-commit-config-non-nix.yaml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\nrepos:\n  - repo: local\n    hooks:\n      - id: rust-linting\n        name: Rust linting\n        description: Run rustfmt on included files\n        entry: cargo fmt --\n        types: [file, rust]\n        language: system\n      - id: rust-clippy\n        name: Rust clippy\n        description: Run clippy on included files\n        pass_filenames: false\n        entry: cargo clippy --workspace --all-targets --all-features\n        types: [file, rust]\n        language: system\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "<!--\nSPDX-FileCopyrightText: 2024 Christina Sørensen\nSPDX-FileContributor: Christina Sørensen\n\nSPDX-License-Identifier: EUPL-1.2\n-->\n# Changelog\n\n## [0.23.4] - 2025-10-03\n\n### Bug Fixes\n\n- Update nixpkgs/cargo dependencies\n\n## [0.23.3] - 2025-09-14\n\n### Documentation\n\n- Corrected \"user_executable_file\" option \n\n### Features\n\n- Update flake inputs\n\n### Miscellaneous Tasks\n\n- Update snapcraft manifest for core24\n- Eza v0.23.3 changelogs, version bump\n\n### Build\n\n- Update cargo deps\n\n## [0.23.2] - 2025-09-06\n\n### Miscellaneous Tasks\n\n- Eza v0.23.2 changelogs, version bump\n\n### Styling\n\n- Update nix style\n\n### Build\n\n- Update cargo\n- Update flake\n\n## [0.23.1] - 2025-08-31\n\n### Bug Fixes\n\n- Restore unsafe blocks for libc major/minor device id\n- `cargo deb` metadata to `LICENSE.txt`\n\n### Documentation\n\n- Improve man page description of flags with default values\n- \"default behavior\" means eza's default behavior, not an option's default value\n\n### Features\n\n- Added completion\n\n### Miscellaneous Tasks\n\n- Eza v0.23.1 changelogs, version bump\n\n### Build\n\n- Cargo bump 2025-07-19\n- Flake bump 2025-07-19\n\n## [0.23.0] - 2025-07-18\n\n### Bug Fixes\n\n- [**breaking**] Make --grid work when not in TTY\n- [**breaking**] Stdin behavior\n\n### Documentation\n\n- Add `--smart-group` option to README\n\n### Features\n\n- Add icons for changelog and todo files\n- Use CHANGES icon for CHANGELOG as well\n\n### Miscellaneous Tasks\n\n- Remove unused dependency\n- Eza v0.23.0 changelogs, version bump\n\n## [0.22.1] - 2025-07-12\n\n### Bug Fixes\n\n- Replace default_input_path check with \".\" check\n\n### Documentation\n\n- \"cheks\" should be \"checks\"\n\n### Features\n\n- [**breaking**] Define -d/--treat-dirs-as-files behavior, tests\n- Refresh icon set with new glyphs and additions\n\n### Miscellaneous Tasks\n\n- Eza v0.22.0 changelogs, version bump\n- Eza v0.22.1 changelogs, version bump\n\n### Build\n\n- Bump phf from 0.11.3 to 0.12.1\n- Cargo bump 2025-07-03\n- Flake bump 2025-07-03\n- Bump windows-sys from 0.59.0 to 0.60.2\n\n### Ci\n\n- Automate dependency updates\n\n## [0.21.6] - 2025-06-26\n\n### Documentation\n\n- Add missing --absolute option to man page\n\n### Features\n\n- Add prettier icon for `.prettierrc.{json,json5,toml,yaml,yml}`\n\n### Miscellaneous Tasks\n\n- Upgrade FreeBSD to 14.3-RELEASE in unit tests workflow\n- Eza v0.21.6 changelogs, version bump\n\n### Build\n\n- Bump libc from 0.2.172 to 0.2.174\n- Cargo bump 2025-06-26\n- Flake bump 2025-06-26\n\n## [0.21.5] - 2025-06-20\n\n### Bug Fixes\n\n- Use OpenBSD 7.7 that has MSRV, instead of 7.6\n- Excessive open file descriptors\n- Typo\n- Impl desirable behaviour for unreadables\n- Unreadables format style\n- Clippy warnings\n- Missing word in comment\n\n### Miscellaneous Tasks\n\n- Eza v0.21.5 changelogs, version bump\n\n### Styling\n\n- Fix various clippy warnings for rust 1.86\n- Remove unnecessary semicolon\n\n## [0.21.4] - 2025-05-30\n\n### Bug Fixes\n\n- Escape spaces in file path to make them work correctly\n- List inside working dir with `--list-dirs` and no path passed\n- Ignore incorrect Unicode path instead of crashing on Windows\n\n### Miscellaneous Tasks\n\n- Add Visual Studio icon for *.suo\n- Add swift icon for *.xcplayground\n- Add dropbox icon\n- Eza v0.21.4 changelogs, version bump\n\n### Refactor\n\n- Clippy lints\n\n### Styling\n\n- Update formatting\n\n### Build\n\n- Flake bump 2025-05-29\n- Cargo bump 2025-05-29\n- 1.81 -> 1.82\n\n## [0.21.3] - 2025-05-02\n\n### Features\n\n- Add support for .ipynb file icons\n\n### Miscellaneous Tasks\n\n- Eza v0.21.3 changelogs, version bump\n\n### Styling\n\n- Unbreak formatting\n\n### Build\n\n- Bump DeterminateSystems/nix-installer-action from 16 to 17\n- Cargo bump 2025-05-01\n- Flake bump 2025-05-01\n\n## [0.21.2] - 2025-04-25\n\n### Bug Fixes\n\n- Make clippy work again\n\n### Documentation\n\n- Update Fedora install instructions for Fedora 42\n- Specify perf improvements\n\n### Features\n\n- Remove dependency on once_cell\n\n### Miscellaneous Tasks\n\n- Add icon for '.stowrc' files\n- Eza v0.21.2 changelogs, version bump\n\n### Performance\n\n- Use a hashmap when possible for file extension matching\n\n### Styling\n\n- Clean up glob matching code\n\n### Build\n\n- Bump uutils_term_grid from 0.6.0 to 0.7.0\n\n## [0.21.1] - 2025-04-19\n\n### Bug Fixes\n\n- Don’t truncate branch name\n- Hi extension icon wasnt working as it was in the wrong aray\n\n### Documentation\n\n- Update README.md\n- Add crates.io link for README.md badge\n\n### Miscellaneous Tasks\n\n- Add MS DOS icon for *.com\n- Add ruby icon for config.ru, Gemfile, Gemfile.lock, procfile, rake, rakefile and change ruby icon\n- Add python icon for *.pxd and *.pyx\n- Add markdown icon for *.mdx\n- Add fsharp icon for *.f# and *.fsscript\n- Add clojure icon for *.cljc and *.edn\n- Eza v0.21.1 changelogs, version bump\n\n### Build\n\n- Flake bump 2025-04-19\n- Cargo bump 2025-04-19\n\n## [0.21.0] - 2025-03-31\n\n### Bug Fixes\n\n- Flake bump 2025-03-20\n- Remove unnescesarry unsafe blocks for libc major/minor device id\n- Unwrap -> expect on libc deviceid calls\n- Formatting issue\n- Fix unused PermissionsPlus fields\n\n### Miscellaneous Tasks\n\n- Eza v0.21.0 changelogs, version bump\n\n### Build\n\n- Cargo deps 2025-03-20\n- [**breaking**] Change MSRV 1.78.0 -> 1.81.0\n- Bump flake deps 2025-03-30\n- Bump cargo deps 2025-03-30\n\n## [0.20.24] - 2025-03-13\n\n### Bug Fixes\n\n- Make temp files visible on white background\n\n### Documentation\n\n- More precise temp files color description\n\n### Features\n\n- Add `.exercism` folder icon\n- Add `.ocamlinit` icon\n- Add `.opam` folder icon\n\n### Miscellaneous Tasks\n\n- Add gcloud icon for .gcloudignore\n- Add vim icon for .gvimrc, _vimrc and _gvimrc\n- Add fennel icon for ~/.fennelrc and ~/.config/fennel/fennelrc\n- Eza v0.20.24 changelogs, version bump\n\n### Build\n\n- Bump once_cell from 1.20.3 to 1.21.0\n- Bump terminal_size from 0.4.1 to 0.4.2\n- Bump serde from 1.0.218 to 1.0.219\n- Bump chrono from 0.4.39 to 0.4.40\n\n## [0.20.23] - 2025-02-27\n\n### Bug Fixes\n\n- Add Pixi installation instructions\n\n### Miscellaneous Tasks\n\n- Eza v0.20.23 changelogs, version bump\n\n### Build\n\n- Bump libc from 0.2.169 to 0.2.170\n- Bump serde from 1.0.217 to 1.0.218\n- Bump log from 0.4.25 to 0.4.26\n- Bump trycmd from 0.15.8 to 0.15.9\n\n### Ci\n\n- Remove magic nix cache\n\n## [0.20.22] - 2025-02-20\n\n### Features\n\n- Add prettier icon for *.prettierignore\n- Add icon for *.hrl\n- Add photoshop icon for *.psb\n- Add eslint icon for .eslintignore\n- Add renovate icon for renovate.json\n- Add elixir icon for *.eex, *.leex and mix.lock\n\n### Miscellaneous Tasks\n\n- Eza v0.20.22 changelogs, version bump\n\n### Build\n\n- Bump once_cell from 1.20.2 to 1.20.3\n\n## [0.20.21] - 2025-02-13\n\n### Bug Fixes\n\n- Start publishing libgit arm builds\n\n### Miscellaneous Tasks\n\n- Eza v0.20.21 changelogs, version bump\n\n### Build\n\n- Add libgit alternative for arm builds\n\n## [0.20.20] - 2025-02-07\n\n### Bug Fixes\n\n- Make `flake.lock` icon the nix logo\n\n### Miscellaneous Tasks\n\n- Eza v0.20.20 changelogs, version bump\n\n## [0.20.19] - 2025-01-30\n\n### Bug Fixes\n\n- Update MSRV to 1.78 to solve rust malfunction\n- Rustc false dead code positives\n- Rustc false positives in tests\n- Regression in theme config location, simplify path\n- Wrong file name for Brewfile\n\n### Documentation\n\n- Add note regarding ci msrv update\n\n### Features\n\n- Add `.norg` icon\n\n### Miscellaneous Tasks\n\n- Eza v0.20.19 changelogs, version bump\n\n### Build\n\n- Bump dirs from 5.0.1 to 6.0.0\n- Bump NexusPHP/no-merge-commits from 2.1.0 to 2.2.1\n- Bump flake\n- Bump cargo\n\n### Ci\n\n- Fix and unify msrv and add matrix to free/netbsd\n\n## [0.20.18] - 2025-01-23\n\n### Bug Fixes\n\n- Support additional yaml file extension, clippy\n\n### Miscellaneous Tasks\n\n- Eza v0.20.18 changelogs, version bump\n\n### Build\n\n- Cargo bump 2025-01-23\n- Flake bump 2025-01-23\n\n### Ci\n\n- Use rust 1.74 instead of latest via rustup\n\n## [0.20.17] - 2025-01-16\n\n### Features\n\n- Add editorconfig icon for .editorconfig\n\n### Miscellaneous Tasks\n\n- Eza v0.20.17 changelogs, version bump\n\n### Build\n\n- Cargo bump 2025-01-16\n- Flake bump 2025-01-16\n\n## [0.20.16] - 2025-01-09\n\n### Features\n\n- Add brew icon for brewfile and brewfile.lock.json\n\n### Miscellaneous Tasks\n\n- Eza v0.20.16 changelogs, version bump\n\n### Build\n\n- Update flake inputs 2025-01-08\n- Update cargo inputs 2025-01-08\n- Bump git2 from 0.19.0 to 0.20.0\n\n## [0.20.15] - 2025-01-02\n\n### Features\n\n- Add icons from nerd fonts 3.3.0 release & more\n- Add new icons, extensive list\n\n### Miscellaneous Tasks\n\n- Eza v0.20.15 changelogs, version bump\n\n### Build\n\n- We switch to our own fork of natord\n\n### Ci\n\n- Bump FreeBSD / NetBSD versions.\n\n## [0.20.14] - 2024-12-26\n\n### Bug Fixes\n\n- ...those pesky workflow targets\n- Remove separate bsd tests\n- Remove audit workflow\n\n### Features\n\n- Audit checks in main CI\n\n### Miscellaneous Tasks\n\n- Eza v0.20.14 changelogs, version bump\n\n### Refactor\n\n- Move eza, trycmd packages\n- Move BSD unit tests to main flow\n\n### Styling\n\n- Format workflows\n- Ci checks formatted\n\n### Build\n\n- Cargo 2024-12-25\n\n### Ci\n\n- Simplify\n- Let's just always run em'\n- Only run big checks on PRs to main\n- Faster flake checks... maybe?\n- Flakes on latest ubuntu\n- Only do no-merge-commits on PR\n\n## [0.20.13] - 2024-12-18\n\n### Bug Fixes\n\n- Pre-commit-hooks.nix trying to be too clever\n- Remove stray description (originally from `--decay-mode`)\n\n### Miscellaneous Tasks\n\n- Eza v0.20.13 changelogs, version bump\n\n### Build\n\n- Update crate deps Mon Dec 16\n- Update flake deps Mon Dec 16\n\n### Ci\n\n- Update to PRESENT DAY, PRESENT TIME\n\n## [0.20.12] - 2024-12-11\n\n### Bug Fixes\n\n- Add unicode-3.0 license\n- Use safe terminal_size_of\n- Use terminal_size_of with borrowed raw handle\n\n### Features\n\n- Move MSRV to 1.74 and deep bump cargo deps\n- Add Gleam lang icon\n\n### Miscellaneous Tasks\n\n- Eza v0.20.12 changelogs, version bump\n\n### Testing\n\n- Regen for 1.74\n\n### Build\n\n- Bump terminal_size from 0.3.0 to 0.4.1\n\n### Ci\n\n- Openbsd 7.4 -> 7.6\n\n## [0.20.11] - 2024-12-05\n\n### Bug Fixes\n\n- Bump libc from 0.2.165 to 0.2.167\n\n### Miscellaneous Tasks\n\n- Eza v0.20.11 changelogs, version bump\n\n## [0.20.10] - 2024-11-28\n\n### Bug Fixes\n\n- People dislike the phrasing \"maintained\" on hackernews\n\n### Miscellaneous Tasks\n\n- Eza v0.20.10 changelogs, version bump\n\n### Build\n\n- Bump libc from 0.2.164 to 0.2.165\n\n## [0.20.9] - 2024-11-21\n\n### Bug Fixes\n\n- Remove newline after doc comment of `regen` recipe\n\n### Miscellaneous Tasks\n\n- Eza v0.20.9 changelogs, version bump\n\n### Refactor\n\n- List all recipes by default\n- Group related recipes\n\n### Build\n\n- Bump libc from 0.2.162 to 0.2.164\n- Bump DeterminateSystems/nix-installer-action from 15 to 16\n\n## [0.20.8] - 2024-11-14\n\n### Bug Fixes\n\n- Cross-compiling by updating to libz-sys to 1.1.20\n\n### Miscellaneous Tasks\n\n- Eza v0.20.8 changelogs, version bump\n\n### Build\n\n- Bump palette from 0.7.5 to 0.7.6\n- Bump libc from 0.2.161 to 0.2.162\n- Bump serde from 1.0.214 to 1.0.215\n\n## [0.20.7] - 2024-11-07\n\n### Bug Fixes\n\n- Palette v0.7.6 -> v0.7.5\n\n### Miscellaneous Tasks\n\n- Update package.exclude list in Cargo.toml\n- Eza v0.20.7 changelogs, version bump\n\n### Build\n\n- Bump DeterminateSystems/nix-installer-action from 14 to 15\n- Bump serde_norway from 0.9.38 to 0.9.39\n- Bump trycmd from 0.15.7 to 0.15.8\n\n## [0.20.6] - 2024-10-31\n\n### Bug Fixes\n\n- Changelog spelling\n\n### Documentation\n\n- Fix typo `--get-repos-no-status` to `--git-repos-no-status`\n\n### Miscellaneous Tasks\n\n- Eza v0.20.6 changelogs, version bump\n\n### Build\n\n- Bump serde from 1.0.210 to 1.0.214\n\n## [0.20.5] - 2024-10-25\n\n### Bug Fixes\n\n- Ensure nested tree parts align under item name\n- Remove depricated `chrono` `from_timestamp_opt`\n\n### Miscellaneous Tasks\n\n- Update generated test files\n- Eza v0.20.5 changelogs, version bump\n\n### Build\n\n- Bump libc from 0.2.159 to 0.2.161\n- Chrono v0.4.34 -> v0.4.38\n\n## [0.20.4] - 2024-10-18\n\n### Bug Fixes\n\n- Filetype, coloring for executables and folder\n\n### Miscellaneous Tasks\n\n- Eza v0.20.4 changelogs, version bump\n\n## [0.20.3] - 2024-10-17\n\n### Bug Fixes\n\n- Git cliff docs issue\n\n### Miscellaneous Tasks\n\n- Eza v0.20.3 changelogs, version bump\n\n### Performance\n\n- Reuse filetype from DirEntry\n\n## [0.20.2] - 2024-10-09\n\n### Bug Fixes\n\n- Colors in old ms command prompt\n- Bring help text in line with available flags\n- Do not print parent filename with --absolute=on\n\n### Miscellaneous Tasks\n\n- Add fox installation option\n- Eza v0.20.2 changelogs, version bump\n\n### Build\n\n- Bump once_cell from 1.20.1 to 1.20.2\n\n## [0.20.1] - 2024-10-03\n\n### Bug Fixes\n\n- Release recipe\n- Support passing multiple options for generate-trycmd-test.sh\n- Move options into flags\n- Rustfmt errors\n\n### Documentation\n\n- Fix cross-references\n- Update file type colors\n- Document that exit 13 == permission denied\n\n### Features\n\n- Update just, add more formats\n- Recursively walk symlinks pointing at dirs\n- Add --follow-symlinks option\n- Add autocomplete for --follow-symlinks\n- Show directories last\n\n### Miscellaneous Tasks\n\n- Eza v0.20.1 changelogs, version bump\n\n### Testing\n\n- Add cases for -T and --follow-symlinks\n- Regenerate tests broken by line number changes\n\n### Build\n\n- Fix manual version\n- Bump once_cell from 1.19.0 to 1.20.1\n\n### Ci\n\n- Remove flakehub, flakestry publish\n\n## [0.20.0] - 2024-09-26\n\n### Bug Fixes\n\n- Flake trycmd bug\n- Pre-commit-hook taplo bug\n\n### Documentation\n\n- Add link to eza-themes repository in readme\n- Cargo install dir inaccurate\n- Add x-cmd method to install eza\n- Adding a testing infos file to guide everyone through tests\n\n### Features\n\n- Add `opml` file extension\n- Add a regen rule\n- [**breaking**] Relicensed to EUPL-1.2\n\n### Miscellaneous Tasks\n\n- Eza v0.20.0 changelogs, version bump\n\n### Refactor\n\n- Move some files to `.config`\n- Release scripts use `.config`\n- Relicense to EUPL-1.2\n\n### Styling\n\n- Switch to nixfmt rfc style, format tree\n- Remove blank line\n\n### Testing\n\n- Regenerate integration tests\n- Regenerate tests\n\n### Build\n\n- Darwin devShell resuse eza deps\n- Ensure flake inputs aren't duplicated'\n- Remove semnix deps\n- Bump flake lock 2024-09-26\n- Removed unused flake follows\n- Add cargo to devShell\n- Add clippy to devShell\n- Use toolchain in devShell\n- Bump libc from 0.2.158 to 0.2.159\n- Bump unicode-width from 0.1.13 to 0.2.0\n\n### Ci\n\n- Full nix3 command output in logs\n- Allow EUPL-1.2\n- Unblock windows\n\n## [0.19.4] - 2024-09-18\n\n### Bug Fixes\n\n- Remove non_alpha from percent encoding to fix hyprlinks\n\n### Features\n\n- Pass from serde_yaml to serde_norway\n\n### Miscellaneous Tasks\n\n- Eza v0.19.4 changelogs, version bump\n\n## [0.19.3] - 2024-09-12\n\n### Bug Fixes\n\n- Convert empty space to %20 when render hyperlinks\n- Split commit workflows and run no-merge-commits only on PRs\n- Correct naming of commit related workflows\n\n### Documentation\n\n- Better version bump commit summary\n\n### Features\n\n- Add no-merge-commits job to commits workflow\n\n### Miscellaneous Tasks\n\n- Rename justfile\n- Eza v0.19.3 changelogs, version bump\n\n### Refactor\n\n- Rename conventional-commits workflow to commits\n\n### Build\n\n- Bump DeterminateSystems/nix-installer-action from 13 to 14\n- Bump DeterminateSystems/flake-checker-action from 8 to 9\n- Bump actions/checkout from 3 to 4\n- Bump libc from 0.2.155 to 0.2.158\n- Bump nu-ansi-term from 0.50.0 to 0.50.1\n\n## [0.19.2] - 2024-09-05\n\n### Bug Fixes\n\n- Remove unnecessary map and make clippy happy\n- Adjust grid details for CI tests\n- Imports and merge conflicts\n- Rustfmt issues\n- Clippy issues\n- Revise UiStyles::plain to have no style at all\n- Pr reviews fixes for theme file\n- Selectively filter files when recursing #1101\n- Fix typo in FromOverride<FileKinds> impl\n- Add serde(default) to StyleOverride.foreground/background fields\n\n### Documentation\n\n- Add Flox to INSTALL.md\n- Add ic for icon color to colors man page\n- Add further documentation about theme file\n\n### Features\n\n- Add c++ module interfaces as source file types\n- Add icon field to UiStyles\n- Add ic key for UiStyles icon in set_exa\n- Add None as icon value in UiStyles.default_theme\n- Add icon function to FileNameColours trait\n- Implement FileNameColours.icon for Theme\n- Adjust FileName.paint to consider possible icon color\n- Begin implementation of config file\n- Allow writing default theme.yml file for eventual config file implementation\n- Theme file configuration base\n- Add IconOverrides struct and UiStyles.icon_overrides\n- Add icon_override function to FileNameColours trait\n- Implement FileNameColours.icon_override for Theme\n- Handle icon overrides in FileName.paint\n- Add example config for icon_overrides\n- Rename UiStyles.icon_override to icons and add Style field\n- Add shorthand aliases to StyleOverride variables\n- Add custom deserialize_color and use in StyleOverride\n- Outsource color_from_str function to make it testable\n\n### Miscellaneous Tasks\n\n- Release eza v0.19.2\n\n### Refactor\n\n- Simplify icon style setting in FileName.paint\n- Make every setting optional with override layer\n- Simplify sample theme.yml\n- Formatting for rustfmt macro\n\n### Styling\n\n- Fix clippy issue in FileName.paint\n- Apply rustfmt\n- Simplify from_str_radix calls to please clippy\n\n### Testing\n\n- Add unit tests for color_from_str function\n\n### Build\n\n- Bump windows-sys from 0.52.0 to 0.59.0\n\n### Ci\n\n- Allow MPL-2.0\n\n## [0.19.1] - 2024-08-28\n\n### Bug Fixes\n\n- FreeBSD build.\n- Typo\n\n### Miscellaneous Tasks\n\n- Release eza v0.19.1\n\n### Build\n\n- Bump uzers from 0.12.0 to 0.12.1\n\n## [0.19.0] - 2024-08-08\n\n### Bug Fixes\n\n- [**breaking**] Implement `EZA_GRID_ROWS` grid details view minimum rows threshold\n\n### Miscellaneous Tasks\n\n- Release eza v0.19.0\n\n## [0.18.24] - 2024-08-03\n\n### Bug Fixes\n\n- 1.80 breakage from time crate\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.24\n\n### Build\n\n- Bump time dependency\n\n## [0.18.23] - 2024-07-25\n\n### Bug Fixes\n\n- Disable broken freebsd tests\n\n### Documentation\n\n- Clear up confusion around ls\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.23\n\n### Build\n\n- Bump log from 0.4.21 to 0.4.22\n- Bump DeterminateSystems/nix-installer-action from 12 to 13\n- Bump plist from 1.6.1 to 1.7.0\n\n## [0.18.22] - 2024-07-18\n\n### Bug Fixes\n\n- Use NaiveDateTime::from_timestamp_opt instead of panicky From impl\n\n### Features\n\n- Add non-nix pre-commit rustfmt and clippy hooks\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.22\n\n### Ci\n\n- Bump FreeBSD version.\n\n## [0.18.21] - 2024-07-01\n\n### Bug Fixes\n\n- Fix missing line breaks in _eza\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.21\n\n## [0.18.20] - 2024-06-27\n\n### Features\n\n- Add --no-|show-symlinks flags for filtering output\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.20\n\n## [0.18.19] - 2024-06-20\n\n### Bug Fixes\n\n- Ship release binaries\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.19\n\n### Build\n\n- Bump git2 from 0.18.3 to 0.19.0\n\n## [0.18.18] - 2024-06-13\n\n### Features\n\n- Extend deny check in audit workflow to all\n- Add deny.toml and workflow file to audit workflow paths\n- Run on all features by default\n- Ask for shell and terminal in bug report template\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.18\n\n### Build\n\n- Bump unicode-width from 0.1.12 to 0.1.13\n- Bump DeterminateSystems/flake-checker-action from 7 to 8\n- Bump DeterminateSystems/nix-installer-action from 11 to 12\n\n## [0.18.17] - 2024-06-05\n\n### Features\n\n- Add icon for Nushell extension\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.17\n\n### Build\n\n- Bump trycmd from 0.15.1 to 0.15.2\n- Bump libc from 0.2.154 to 0.2.155\n\n## [0.18.16] - 2024-05-16\n\n### Bug Fixes\n\n- Change windows-only imports to be windows-only\n\n### Documentation\n\n- Replace decay with color-scale\n- Update INSTALL.md\n- Fix typo in `INSTALL.md`\n- Use 3 columns for packaging status badge\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.16\n\n### Build\n\n- Bump DeterminateSystems/flake-checker-action from 5 to 7\n- Bump DeterminateSystems/nix-installer-action from 10 to 11\n\n## [0.18.15] - 2024-05-09\n\n### Bug Fixes\n\n- Correct command for latest tag in deb-package.sh\n\n### Documentation\n\n- Add how to find man pages in terminal and online. Partly fixes #967\n- Correct heading levels in markdown\n- Move heading out of collapsed section\n- Add some keywords for benefit of ctrl-f\n\n### Features\n\n- Return to original commit at the end of deb-package.sh\n- Add optional tag argument to deb-package.sh\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.15\n\n## [0.18.14] - 2024-05-02\n\n### Features\n\n- Add icon for \"cron.minutely\" directory\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.14\n\n### Build\n\n- Bump uzers from 0.11.3 to 0.12.0\n- Bump libc from 0.2.153 to 0.2.154\n- Bump unicode-width from 0.1.11 to 0.1.12\n- Bump palette from 0.7.5 to 0.7.6\n\n## [0.18.13] - 2024-04-25\n\n### Bug Fixes\n\n- Allow unused imports for freebsd\n- Checking for deref flag in file_name\n\n### Features\n\n- Add scheme filetype and icons\n- Generate completion/manpage tarballs on release\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.13\n\n## [0.18.11] - 2024-04-19\n\n### Bug Fixes\n\n- Fix clippy lints\n- Enable the rule only for NetBSD.\n- Build aarch64, arm without libgit2\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.11\n\n### Ci\n\n- Bump NetBSD version to 10.0\n\n## [0.18.10] - 2024-04-11\n\n### Bug Fixes\n\n- Bump trycmd from 0.15.0 to 0.15.1\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.10\n\n### Build\n\n- Bump nu-ansi-term from 0.49.0 to 0.50.0\n\n## [0.18.9] - 2024-03-27\n\n### Features\n\n- Switch out ansiterm crate for nu_ansi_term\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.9\n\n### Build\n\n- Bump DeterminateSystems/nix-installer-action from 9 to 10\n- Bump plist from 1.6.0 to 1.6.1\n- Bump rayon from 1.9.0 to 1.10.0\n- Bump git2 from 0.18.2 to 0.18.3\n\n## [0.18.8] - 2024-03-21\n\n### Bug Fixes\n\n- Avoid deprecation warnings\n- Rustfmt issues\n\n### Features\n\n- Add fennel lang icon and associations\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.8\n\n## [0.18.7] - 2024-03-14\n\n### Bug Fixes\n\n- Bugfix to resolve absolute paths that are not symlinks\n\n### Features\n\n- Add filetype and icon for .hh extension\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.7\n\n## [0.18.6] - 2024-03-06\n\n### Bug Fixes\n\n- NetBSD did not have fflagstostr and as such did not build properly\n- Fix total-size option\n- Add fortran to source filetypes\n- Fix absolute_path() for broken symlinks\n- Update line numbers in panic messages in tests\n\n### Features\n\n- Add filetype and icon for age\n- Adding icons for graphql extensions\n- Add nim icons\n- Use fsharp icon for fsproj files (similar to cs/csproj)\n- Add new icons, diverse selection\n- Adding more haskell related icons\n- Adding more icons for docker specific files\n- Adding more dockerfile icons\n- Add --absolute flag\n- Add shell completions for --absolute flag\n\n### Miscellaneous Tasks\n\n- Cleaning dirs\n- Release eza v0.18.6\n\n### Refactor\n\n- Port grid and grid-details to new uutils-term-grid\n\n### Testing\n\n- Add integration tests and powertests for --absolute flag\n- Add directory symlink to tests/itest/\n\n### Build\n\n- Bump log from 0.4.20 to 0.4.21\n- Bump rayon from 1.8.1 to 1.9.0\n\n### Ci\n\n- Add NetBSD to CI.\n- Fix warnings.\n- Add FreeBSD to CI.\n- Add OpenBSD to CI.\n\n## [0.18.5] - 2024-02-29\n\n### Bug Fixes\n\n- Bump palette from 0.7.4 to 0.7.5\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.5\n\n## [0.18.4] - 2024-02-22\n\n### Bug Fixes\n\n- Classification width should be taken into account with -F=auto\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.4\n\n### Build\n\n- Bump libc from 0.2.152 to 0.2.153\n- Bump chrono from 0.4.33 to 0.4.34\n- Bump trycmd from 0.14.20 to 0.15.0\n\n## [0.18.3] - 2024-02-15\n\n### Bug Fixes\n\n- Duplicates in shell completions\n\n### Documentation\n\n- Add target arch to deb PPA installation for strict apt environments\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.3\n\n### Performance\n\n- Do not pre-compute MountInfo to reduce readlink calls\n\n### Refactor\n\n- Use #[default] attribute instead of custom impl for enums\n\n## [0.18.2] - 2024-02-08\n\n### Bug Fixes\n\n- Update libgit2 to 1.7.2\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.2\n\n## [0.18.1] - 2024-02-08\n\n### Bug Fixes\n\n- Change shasum for main commit\n\n### Documentation\n\n- Add manual installation section\n\n### Miscellaneous Tasks\n\n- Release eza v0.18.1\n\n### Refactor\n\n- Replace scoped_threadpool with rayon\n\n### Build\n\n- Add empty rustfmt to ensure project specific settings\n- Bump libc from 0.2.151 to 0.2.152\n- Bump nick-fields/retry from 2 to 3\n- Bump palette from 0.7.3 to 0.7.4\n- Bump webiny/action-conventional-commits from 1.2.0 to 1.3.0\n\n## [0.18.0] - 2024-02-01\n\n### Features\n\n- [**breaking**] Add --classify=always,auto,never\n\n### Miscellaneous Tasks\n\n- Remove rustfmt config file that has a nightly only option in favor of rustfmt skip directive which is already in place\n- Fix small typo in pull request template\n- Release eza v0.18.0\n\n### Refactor\n\n- Change cast to coertion, remove rustfmt skip and clippy lint ignore directives\n\n### Testing\n\n- Regenerate classification related tests\n\n### Build\n\n- Change flake inputs\n\n## [0.17.3] - 2024-01-25\n\n### Bug Fixes\n\n- Remove version testing\n\n### Miscellaneous Tasks\n\n- Avoid `unwrap()` by changing filter-then-map to `filter_map`\n- Release eza v0.17.3\n\n### Build\n\n- Bump shlex from 1.2.0 to 1.3.0\n- Bump chrono from 0.4.31 to 0.4.33\n- Bump trycmd from 0.14.19 to 0.14.20\n\n## [0.17.2] - 2024-01-20\n\n### Bug Fixes\n\n- Crash using --git-repos on unreadable dir\n- Crash using --git-repos on unreadable dir\n\n### Miscellaneous Tasks\n\n- Release eza v0.17.2\n\n### Build\n\n- Add cargo-bump for releasing\n\n## [0.17.1] - 2024-01-11\n\n### Bug Fixes\n\n- Offset widths in grid mode with utf8 filenames\n- Format the code\n- Unformat the code where needed\n- Format the code correctly this time\n- Redo everything from scratch\n- Stack overflow when '-laaR' are used\n- Stack overflow when '-laaR' is used\n\n### Features\n\n- Add Fortran icons\n\n### Miscellaneous Tasks\n\n- Adding blake3 to checksums\n- Release eza v0.17.1\n\n### Testing\n\n- Regenerate version tests... and others\n- Updated tests to fit new features\n\n### Build\n\n- Add b3sum to devshell deps\n\n## [0.17.0] - 2023-12-13\n\n### Bug Fixes\n\n- Add color scale mode to the bash completions\n- Add color scale mode to the fish completions\n- Quote symbolic links correctly when their destinations contain spaces\n\n### Documentation\n\n- Modify documentation about custom time style\n\n### Features\n\n- Add BSD file flags\n- Add Windows file attributes\n- [**breaking**] Support different custom time style for non-recent/recent files\n\n### Miscellaneous Tasks\n\n- Release eza v0.17.0\n\n### Testing\n\n- Regen powertests\n- Regenerate\n- Add tests for non-recent/recent custom time style\n- Update powertest expected help message output\n\n### Build\n\n- Update `flake.lock`\n- Bump DeterminateSystems/nix-installer-action from 8 to 9\n- Bump once_cell from 1.18.0 to 1.19.0\n- Bump libc from 0.2.150 to 0.2.151\n\n### Ci\n\n- Remove labeler\n\n## [0.16.3] - 2023-12-07\n\n### Bug Fixes\n\n- Add bare git_repos fn if feature git is disabled\n- Fixing color of size unit\n- Color-scale broked size for colors\n\n### Miscellaneous Tasks\n\n- Release eza v0.16.3\n\n### Testing\n\n- Fix powertests post-release\n\n### Build\n\n- Bump percent-encoding from 2.3.0 to 2.3.1\n- Bump actions/labeler from 4 to 5\n\n## [0.16.2] - 2023-11-30\n\n### Bug Fixes\n\n- Calculate width correctly when using grid icons & classify\n- Fix the windows build\n\n### Miscellaneous Tasks\n\n- Release eza v0.16.2\n\n### Testing\n\n- Fix version tests\n\n### Build\n\n- Bump webiny/action-conventional-commits from 1.1.0 to 1.2.0\n- Bump DeterminateSystems/nix-installer-action from 7 to 8\n- Bump windows-sys from 0.48.0 to 0.52.0\n\n## [0.16.1] - 2023-11-23\n\n### Bug Fixes\n\n- Don't panic with todo!() on inaccessible dir\n- Don't panic if the btime of a file is Err\n- Lifetime annotations and manpage/shell completion nits\n- Reflow help\n\n### Features\n\n- Handle formatting and display of binary extended attributes.\n- Add netbsd and freebsd support for extended attributes\n\n### Miscellaneous Tasks\n\n- Update flake inputs\n- Release eza v0.16.1\n\n### Testing\n\n- Vars mocking\n- Display and meta options\n- Filtering and sorting\n- Long view options\n- Regenerate `--help` tests\n\n### Build\n\n- Sign release tags\n\n## [0.16.0] - 2023-11-16\n\n### Bug Fixes\n\n- Fix cross compilation\n- Snap requires a base\n- Move `--smart-group` to long view options\n- Colo[u]r-scale didn't have a base value\n- Fix snapcraft.yaml formatting\n\n### Documentation\n\n- Add comments for bzip variants\n- Added the fact that total-size is unix only\n\n### Features\n\n- Add some file extensions\n- Abort on panic (saving 0.1 M)\n- Add powertest\n\n### Miscellaneous Tasks\n\n- Ignore blame from #644\n- Stabilize powertest version\n- Release eza v0.16.0\n\n### Testing\n\n- Implements tests using the generated directory\n- Powertests using generated testdirs\n- Add hashed versions of powertests\n\n## [0.15.3] - 2023-11-09\n\n### Bug Fixes\n\n- Changed quote in --almost-all completion\n- [**breaking**] Remove Repo column when using --git-repos when no git repo\n- Reformat `help.rs`\n- Allow unused macro rule arms\n\n### Documentation\n\n- Improve CONTRIBUTING.md, README.md\n- Improve README.md\n- Introduce INSTALL.md\n\n### Features\n\n- Create EZA_ICONS_AUTO environment variable\n- Create EZA_ICONS_AUTO environment variable\n- Demo gif and gif generation recipe\n- Add ocaml icon filetypes\n- Add PRQL\n- Add `--color-scale`\n\n### Miscellaneous Tasks\n\n- Add to CODEOWNERS file to make sure I get ping'd on files being touched\n- Add myself to codeowners to watch modifications on parsing\n- Improve the PR template\n- Release eza v0.15.3\n\n### Refactor\n\n- Remove commented out test code\n- Finalize `decay` -> `color_scale`\n\n### Build\n\n- Refactor flake\n- Bump libc from 0.2.149 to 0.2.150\n- Bump DeterminateSystems/nix-installer-action from 4 to 7\n- Bump rustix from 0.38.13 to 0.38.21\n\n### Ci\n\n- Refactor pre-commit-hooks\n- Refactor publish workflow\n\n## [0.15.2] - 2023-11-02\n\n### Bug Fixes\n\n- Correct width when --no-quotes is used\n- Clippy lint and add option to grid-details\n- --smart-group only works for current user\n\n### Features\n\n- Add Typst to the recognized files\n\n### Miscellaneous Tasks\n\n- Release eza v0.15.2\n\n### Refactor\n\n- Replace `lazy_static` with `once_cell`\n- Replace plain values with TextColours\n\n### Testing\n\n- Added more content to the dir generator\n- Changed size of one of the files\n\n## [0.15.1] - 2023-10-26\n\n### Bug Fixes\n\n- Only store top-level recursive dir size\n- Changed windows methods\n- Underscored unused windows variables\n- Added device for filesystem to hashmap\n- Don’t display target’s size if we’re not dereferencing\n- Display offset for filenames with spaces\n- Fix clippy warnings\n- Fix doc-tests on RecursiveSize\n- Fix dead_code warnings on Windows\n\n### Documentation\n\n- Fix doc-tests formatting and address other documentation review requests\n\n### Features\n\n- Add a new filetype for source code files\n- Add a new icons for source code files and other files\n- Support for displaying blocksize on directories\n\n### Miscellaneous Tasks\n\n- Release eza v0.15.1\n\n### Refactor\n\n- Move total-size calculations to File\n- Add RecursiveSize type to simplify total-size calculation\n\n## [0.15.0] - 2023-10-19\n\n### Bug Fixes\n\n- Reenable debug symbols in debug builds\n- Fmt, windows, and nix fixes\n- Reverted autofmt changes\n- Updated match indents\n- Changed flag name\n- Clippy lint\n- Merge conflict with main\n\n### Documentation\n\n- Correct color option spellings\n- Added flag to readme\n- Added flag to man\n\n### Features\n\n- Add option --smart-group\n- Add completions, man for --smart-group\n- Added recursive directory parser\n- Added flag to completions\n- Add icons=always,auto,never. dont display icons in a tty|piped\n- Fix auto value for colors and icons + documentation\n- [**breaking**] Remove --no-icons in favor of --icons=always,auto,never. default is auto\n\n### Miscellaneous Tasks\n\n- Upgrade to uutils_term_grid from unmaintained term_grid\n- Release eza v0.15.0\n\n### Build\n\n- Bump DeterminateSystems/nix-installer-action from 5 to 6\n\n### Ci\n\n- Remove stalebot, is super annoying\n- Adjust test case to icons=auto (no icons should show due to tty)\n\n## [0.14.2] - 2023-10-12\n\n### Bug Fixes\n\n- Comment out redundant static musl build\n- Refactor sed command to build manpages\n- Update additional completions for help, almost-all, dereference\n- Fix zsh completions\n\n### Documentation\n\n- Add missing options to man page and CLI --help info\n\n### Features\n\n- Add missing nu shell completions\n- Adding the EZA_OVERRIDE_GIT env var\n\n### Miscellaneous Tasks\n\n- Release eza v0.14.2\n\n### Refactor\n\n- Use musl target for amd64 deb package\n- Directly use one \"big\" awk command\n\n### Styling\n\n- Remove trailing spaces and trailing line\n\n### Build\n\n- Bump libc from 0.2.148 to 0.2.149\n- Bump DeterminateSystems/nix-installer-action from 4 to 5\n\n## [0.14.1] - 2023-10-08\n\n### Bug Fixes\n\n- Replace left-over exa in fish completion\n- Diabling static linked binaries due to segfault\n- Make os error 13 fail loud\n- Root group not painted as expected when eza used by root\n- Adjust change width calculations for hyperlink and classify\n\n### Documentation\n\n- Correct CONTRIBUTING.md on commit message type\n- Fix typos\n- Add zsh with homebrew part to completions section\n- Installation on fedora updated\n\n### Features\n\n- Add basic nushell completion file\n- Add codeowner for nu completions\n- Readded musl static bin as it works\n\n### Miscellaneous Tasks\n\n- Release eza v0.14.1\n\n### Refactor\n\n- Align completions\n- Do not match for numbers and remove single-use fn\n- Consistent argument order\n\n### Testing\n\n- Classify-hyperlink test case for width 50\n- Move classify tests to local\n\n### Build\n\n- Bump trycmd from 0.14.17 to 0.14.19\n- Make checksums easier to copy-paste\n- Improve release automation\n- Fix version bump\n- Fix double echo\n- Automate gh release\n- Add `codegen-units = 1` and remove `opt-level = 3`\n- Add back `opt-level = 3`\n\n### Ci\n\n- Treat warnings as errors\n\n## [0.14.0] - 2023-10-02\n\n### Bug Fixes\n\n- Ignore refs for blame\n- Avoid unstable inner attributes\n- Merge conflict with main\n- Merge conflict with main\n- Fix manpage generation of default package\n- Changed dll icon\n- Changed readme and Added README icon\n- New R lang icon\n- README is sorted and formatted\n- Fix large_enum_variant warning with explanation\n- Query stdout terminal size to see if the output gose to a tty.\n- Use windows-specific API for terminal size query on windows\n- Add `windows-sys` dependency for targeting windows\n- Use `std::io::IsTerminal` to eliminate compatibility issue\n- Terminal size query should only check `stdout`\n- Prefix unused binding name with underscore\n\n### Documentation\n\n- Add completions + manpage for --no-quotes flag\n- Leave nix install instructions open-ended\n- Adding termux section\n- Leave nix install instructions open-ended\n- Added the new colors option to the man\n- Documenting custom time-style\n- Time-format supporting custom formats\n- Updated man to add new colors\n- Description of `--color` in README, manpage, and completions\n- Change `color` to `colo[u]r` in the option description.\n\n### Features\n\n- Add rustfmt.toml file to prevent flags.rs fmt on save\n- Add quotations around filenames with spaces. exa pr#1165\n- Replace hardcoded version by version variable\n- Add header to colors-explanation page\n- Revise man rule to use for loop and insert version\n- Adding the possibility to change git-repos colors\n- [**breaking**] Separated root from other users\n- New Rust icon\n- Added bdf,psf icons\n- Added lib icon\n- Added Contacts,Favorites icons\n- Added home icon\n- Added fdmdownload icon\n- Added statically linked binaries\n\n### Miscellaneous Tasks\n\n- Release 0.14.0\n\n### Refactor\n\n- Ignore options/flags.rs\n- Renamed and reintended some code\n- Reformatted a line\n\n### Styling\n\n- Format some parts correctly\n\n### Build\n\n- Bump unicode-width from 0.1.10 to 0.1.11\n- Bump git2 from 0.18.0 to 0.18.1\n- Temporarily disable aarch64-unknown-linux-gnu\n- Name static binaries\n\n## [0.13.1] - 2023-09-25\n\n### Bug Fixes\n\n- Typo `this` -> `that`\n- Don’t show color when color is disabled\n- Respect spec on Windows and make it for with Konsole\n- Major and minor device on MacOS\n- Linux uses u32 for major/minor device numbers\n- Error for missed semicolon\n- More than 3 bools in a struct\n- Enable rustfmt by removing .rustfmt.toml which disables it\n- Replace rustfmt::skip on expressions because experimental\n- Remove unnecessary rustfmt::skip's in windows code\n- Add src/options/flags.rs to rustfmt.excludes\n- Left-over merge conflict in src/output/table\n\n### Documentation\n\n- Update README.md\n- Update --mounts option to include MacOS\n- Documenting --only-files\n\n### Features\n\n- Add EXA_COLOR bindings for un-themed items\n- Add EZA_ environment variables with fallback to EXA_\n- Listing files only using '--only-files' flag\n- Add rustfmt check to unit-tests workflow\n\n### Miscellaneous Tasks\n\n- Add completion for --only-fies (zsh,fish)\n- Release 0.13.1\n\n### Refactor\n\n- Fix rustfmt issues and place skips where needed\n- Reorder unit-tests to fmt, clippy and tests\n\n### Styling\n\n- Formatted using treefmt\n- Fix clippy warning after rustfmt\n- Fix treefmt issues in options module\n- Reapply rustfmt after rebase from main\n\n### Testing\n\n- Add unit tests for new style abbreviations\n- Regen git_repos_no_status\n- Test for listing files only\n\n### Build\n\n- Bump actions/checkout from 2 to 4\n- Bump chrono from 0.4.30 to 0.4.31\n- Bump timeago from 0.4.1 to 0.4.2\n- Bump libc from 0.2.147 to 0.2.148\n- Bump terminal_size from 0.2.6 to 0.3.0\n\n### Ci\n\n- Added formatters to treefmt\n- Make various improvements\n- Only apply labels when opening a PR\n\n## [0.13.0] - 2023-09-18\n\n### Bug Fixes\n\n- Crate can't contain broken symlink\n- Remove executable flag from fish completion file\n- Use proc_mounts only on linux\n- Hotfix harmful documentation\n- Fix hyperlinks on Windows\n- Needless_borrow\n- Nix flake check also builds the package\n- [**breaking**] Change number_huge and unit_huge to match the man page short codes\n\n### Documentation\n\n- Added instructions to install completions of eza to the readme\n- Added cafkafk suggestions\n- Fix codeblocks in zsh completions\n- Update README.md\n- Add Winget install info\n- Link directly to space\n- Document new file type two letter codes in man page\n- Document filetypes theme and rename trait\n- Update deb instructions to use keyring\n- Fix chmod in deb installation instructions\n- Add potential gpg install to deb installation instructions\n- Add install instructions for Void Linux\n- Document dimmed and italic style codes\n- Document character style pairs in the code and match with man page\n- Documentation of 'sn' and 'sb' conflicted with later docs\n\n### Features\n\n- Add completion files in deb packaging script\n- Adds filtering for Windows hidden files\n- Make file types themeable\n- Lazy loading of a files extended attributes and absolute path\n\n### Miscellaneous Tasks\n\n- Augment gitter size in README\n- Release 0.13.0\n\n### Performance\n\n- Add criterion for benchmarking\n\n### Refactor\n\n- Refactor just in crossfile\n- DRY up justfile\n- Ignore missing MSVC docker image\n- Removed unused imports, mark mods as allow unused\n- Format code\n- Move ALL_MOUNTS to fs::mounts\n- Migrate ALL_MOUNTS from lazy_static to OnceLock\n- Rename FileType::Immediate to more obvious FileType::Build\n\n### Testing\n\n- Autogenerate testing dir\n- Stabalised unit-tests.yml\n- Autogenerate test dirs\n- Generate device files\n- Add unit tests that test both exa and ls style codes together\n- Address variable names\n\n### Build\n\n- Set optlevel to 3\n- Add musl binary for linux\n- Fix checksums\n- Add TODOs to targets\n\n### Ci\n\n- Add Winget Releaser workflow\n- Add nix Flake check to flake.yml\n- Removed nix build in favor of nix flake check\n- Include bash completion script in treefmt and fixed shellcheck formatting in completion script\n- Fix spelling attemps -> attempts\n\n## [0.12.0] - 2023-09-14\n\n### Bug Fixes\n\n- RUSTSEC-2020-0071\n- Expand `--all` help\n- Generalize gitignore to ignore all eza deb packages\n- Change trycmd config to use test/itest folder for testing\n- Revert to old apt install command suggestion and add hint\n- Canonicalize errors when the destination of a symbolic link is bad\n- Handle other canonicalize errors in hyperlinks and git\n- Fix windows build when canonicalize returns an error\n- Is_some_and is an unstable Rust feature until 1.70\n- Remove stray backslashes\n- Exit 13 on os error 13\n- Rewrite comment\n- Improve trace strings\n- Tracing typo\n- Revert \"Support for Windows Hidden Files\"\n- Shellcheck warnings\n- Revert \"Support for Windows Hidden Files\"\n- Shellcheck warnings\n\n### Documentation\n\n- Expand `--all` documentation\n- Add gentoo\n- Fix gentoo install\n- Add MacPorts install info\n- Add pthorpe92 gist\n- Add docs for --git-repos & --git-repos-no-status\n- Fix gpg armor flag for deb release in readme\n- Add scoop install info\n- Add Mac support for the --mount option in the man page\n- Add SAFETY comments to unsafe code blocks\n- Remove license from developemnt section\n- Update rust badge\n- Add better explanation of git repos + no status\n- Remove color specifications. change unknown git repo status to `~`\n- Fix missing color specification from man page\n- Add missing man page for debian release\n\n### Features\n\n- Add audit workflow\n- Add trycmd as dev-dependency\n- Add minimal trycmd binary\n- Add a few trycmd tests as example\n- Add apt installation workflow\n- Support --mount option on Mac\n- Support --mount option on Mac\n- Adds filtering on Windows hidden files\n- Document and change output for --git-repos\n- Add PERMISSION_DENIED exit code\n- Adds filtering on Windows hidden files\n- Adds filtering on Windows hidden files\n- Added shellcheck to treefmt\n- Adds filtering on Windows hidden files\n\n### Miscellaneous Tasks\n\n- Bump uzers to v0.11.3\n- Bump chrono from 0.4.27 to 0.4.30\n- Removal of xtests\n- Removal of vagrant\n- Remove deprecated devtools\n- [**breaking**] MSRV 1.70\n- Run spellcheck\n- Release 0.12.0\n\n### Refactor\n\n- Over-engineer deb-package.sh\n- Hide xtests folder\n- Split trycmd into tests for all, unix and windows\n- Limit unit-tests run on workflow change to unit-tests itself\n- Add tracing to various code parts\n- Make std::process::exit global\n- Moved generateTest.sh to devtools/\n- Renamed the file\n\n### Revert\n\n- \"Support for Windows Hidden Files\"\n\n### Styling\n\n- Remove TODO message on the absolute_path property\n- Fix shellcheck issues in deb-package.sh\n- Fix shellcheck issues in deb-package.sh\n- Fix shellcheck issues in deb-package.sh\n\n### Testing\n\n- Remove vhs from flake\n- Remove vhs-runner files\n- Dump trycmd from nix sandbox\n- Fix name of trydump\n- Add trycmd\n- Add nix feature\n- Add example long tests for sandbox\n- Set itests files to unix epoch\n- Set itest files to unix epoch\n- Refactor setting unix epoch\n- Auto discard old definitions\n- Fix test reference\n- Add long_all_nix.toml\n- Add long_blocksize_nix.toml\n- Add long_extended_nix.toml\n- Add long_git_nix.toml\n- Add long_git_repos_nix.toml\n- Add long_git_repos_no_status_nix.toml\n- Add long_grid_nix.toml\n- Add long_header_nix.toml\n- Add long_icons_nix.toml\n- Add long_octal_nix.toml\n- Add long_time_style_relative_nix.toml\n- Freeze nix tests\n- Fix trydump when no files to delete\n- Adding more content to test\n- Modified unix and all tests\n- Regenerate nix tests\n- Convert windows tests with new itest dir\n- Fixed windows tests being wrong\n- Added a test generator\n- Add more unix_tests\n- Fixed unix tests to remove any distro specific\n- Removed git test breaking on nix\n- Remove non-deterministic test\n\n### Build\n\n- Add compression, checksum gen for bin\n- Add deny.toml\n- Update flake.lock, cargo.lock\n- Remove org warnings\n- Remove itest\n- Update flake.lock\n- Add itest, idump\n- Make trycmd part of checks\n\n### Ci\n\n- Don't use nix feature on ci\n- Fix windows build\n- 1.65 -> 1.70\n- Enforce conventional commits\n- Enforce conventional commits\n\n### Doc\n\n- Remove xtests section from readme\n- Add deprecation warning to xtests/readme\n- Add deprecation warning to just xtest commands\n- Add deprecation warning to vagrantfile\n- Add guidelines for commit messages\n\n## [0.11.1] - 2023-09-11\n\n### Bug Fixes\n\n- Add vendored-libgit2 feature to git2 dependency\n- Filename escaping (last character lost sometimes, no hyperlink)\n- Build for Windows with chrono\n\n### Documentation\n\n- Explain vendored-libgit2\n- Add homebrew, misc fixes\n- Fix code of conduct link\n- Update archlinux\n- Remove broken dependabot link\n- Add informaton about lazy_static\n- Add star history\n- Add bright color options in man pages\n- Add bright color support in readme changelog\n\n### Features\n\n- Add highlighting of mounted directories (Linux only)\n- Mark `.git` as ignored, which hides it when using `--git-ignore`\n- Expose git2 feature vendored-libgit2\n- Add build commands to deb-package.sh\n- Add bright colour options, change punctuation default\n- Support the MSRV of Rust (1.65.0)\n- Use chrono crate to handle datetime-related features\n\n### Miscellaneous Tasks\n\n- Bump actions/checkout from 3 to 4\n- Release 0.11.1\n\n### Testing\n\n- Stabilize testing without sandbox\n- Disable gif rendering\n\n### Build\n\n- Add release binaries\n- Fix binary gen\n- Add armhf binary\n\n### Deps\n\n- Change ansi_term to ansiterm from rustadopt\n\n## [0.11.0] - 2023-09-04\n\n### Bug Fixes\n\n- Add windows implementation of is_empty_dir\n- Re-align `--git-ignore` in help message\n- Avoid direnv error if nix isn't installed\n\n### Documentation\n\n- Empty dir functions\n- Document is_empty_dir functions\n- Add function documentation for get_file_type and icon_for_file.\n\n### Features\n\n- Optimize checking for empty directories when a directory has subdirectories\n- Use perfect hash tables for file types and icons\n- Add backlog of icons from various exa pull requests and others\n- Add backlog of icons from various exa issues\n\n### Miscellaneous Tasks\n\n- Bump git2 from 0.17.2 to 0.18.0\n- Bump uzers from 0.11.1 to 0.11.2\n- Bump DeterminateSystems/flake-checker-action from 4 to 5\n- Bump DeterminateSystems/nix-installer-action from 3 to 4\n- Bump glob from 0.3.0 to 0.3.1\n- Bump actions/stale from 5 to 8\n- Bump terminal_size from 0.1.16 to 0.2.6\n- Bump timeago from 0.3.1 to 0.4.1\n- Release 0.11.0\n\n### Refactor\n\n- Use phf macros instead of codegen to create icon and filetype tables\n- Add constants for most of the commonly used icons\n- Add constants for the rest of icons used multiple times\n- Rename class FileExtension to FileTypeClassifier to better reflect the purpose\n- Move get_file_type to FileType enum\n\n### Styling\n\n- Is_empty_dir() was put between the unix size() and windows size()\n\n### Build\n\n- Use rust stable\n- Add unstable package\n- Disable clippy check 'unreadable_literal' in generated files\n\n## [0.10.9] - 2023-08-28\n\n### Bug Fixes\n\n- Respect git-repos flags\n\n### Documentation\n\n- Add badge for eza gitter/matrix room\n- Fix matrix link\n- Add ignored flags to readme\n- Add ignored flags to manual\n- Add ignored flags to help\n- Add ignored flags to xtest\n\n### Features\n\n- `--no-git` option\n\n### Miscellaneous Tasks\n\n- Add funding.yml\n- Release 0.10.9\n\n### Tree-wide\n\n- Fix Windows build\n\n### Build\n\n- Add convco to dev\n\n### Ci\n\n- Create flakehub-publish-tagged.yml\n- Add workflow_dispatch to flakehub-pub\n- Edit workflow_dispath\n- Refactor workflow_dispath\n- Refactor workflow_dispath\n- Remove broken dispatch\n- Add flakehub-backfill\n- Add codeowners\n- Add gierens as .deb codeowner\n- Add windows to CI\n\n## [0.10.8] - 2023-08-22\n\n### Bug Fixes\n\n- TextCell building of detailed grid view for  hyperlink and icon options\n- Block's Colours trait as for file sizes\n- --blocksize completion, new description\n- Option.views unit tests use --blocksize\n- Add missing colon before -w/--width\n- Replace exa by eza in help string\n- Change exa to eza in invalid option error\n- Add missing name section to eza_colors-explanation manpage\n- Replace exa by eza in .gitignore\n\n### Documentation\n\n- Update issue templates\n- Cafkafk -> eza-community\n\n### Features\n\n- Add git-ignored color/style option\n- Add `just` and `pandoc` to devShell bc they are necessary for man\n- Add `.envrc` so direnv automatically opens the nix dev environment\n- Match folder icon to reflect contents\n- Match folder icon to reflect contents\n- --blocksize completion, new description\n- Add script deb-package.sh\n\n### Miscellaneous Tasks\n\n- Bump git2 from 0.16.1 to 0.17.2\n- Bump unicode-width from 0.1.8 to 0.1.10\n- Bump libc from 0.2.93 to 0.2.147\n- Bump num_cpus from 1.13.0 to 1.16.0\n- Release 0.10.8\n\n### Refactor\n\n- Fs::fields::Blocks\n- File::blocks() name, revise calculation\n- Rendering Blocksize like file sizes\n- Rename Blocks column to Blocksize\n- Use -S/--blocksize and, var BLOCKSIZE\n- Unit tests for output.render.blocks\n- Flip if (as suggested/demanded by clippy)\n- Migrate to uzers lib\n\n### Build\n\n- Add charm to nix develop\n- Add tests/tmp to gitignore\n- Add initial tape\n- Add test runner sketch\n- Add test runner to justfile\n- Add out.gif to .gitignore\n- Add run_tests  NAME arg\n- Add reference main.txt\n- Add gen_test\n- Fix typo\n- Handle arbitrary NAMES\n- Remove commented out code\n- Fix code formatting\n- Add vhs-runner main function\n- Gen_test support automatic gen\n- Automatic tape detection\n- Add print_msg with ansi color\n- Slight documentation/refactor\n- Use ansi output on all output\n- Disable vhs publish ad\n- Add better tracing\n- Remove defective sed\n- Add color variables\n- Add eza-long test\n- Add itest testing dir\n- Add parallel runner\n\n### Ci\n\n- Help text in xtests\n- Nix flake check\n- Add labeler for flake\n- Add flake description\n\n### Deps\n\n- Change users depedency to uzers\n\n### Doc\n\n- Add git-ignore style/color information to manpage\n- --blocksize, new description\n- --blocksize, new description\n- --blocksize, new description\n- Add gpg public key for the deb repository\n- Add section about debian and ubuntu installation\n\n### Git\n\n- Add deb package to .gitignore\n\n## [0.10.7] - 2023-08-13\n\n### Bug Fixes\n\n- Respect GIT_CEILING_DIRECTORIES\n- MacOS flake support\n- Broken zsh completion syntax\n\n### Features\n\n- Add gitlab-ci.yml\n- Improve icon for Earthfile\n- Better.ps1, add .psd1, .psm1 icons\n- Replace .bat icon by windows cli icon\n- Use TeX icons and add .bib, .bst icon\n- Use Ocaml logo, add .mli, .mll, .mly\n- Add many more icons\n- Add -w/--width to help string\n- Add -w/--width to README\n- Add -w/--width to flags\n- Add -w/--width to manpage\n- Fish -w/--width\n- Zsh -w/--width\n\n### Miscellaneous Tasks\n\n- Add PR template\n- Bump log from 0.4.14 to 0.4.20\n- Release 0.10.7\n\n### Refactor\n\n- GIT_DIR handling\n- Turn unused var into value\n- Fix borrowed trait implements required\n- Simplify format strings\n- Consistent style\n- Clippy::explicit_auto_deref\n- Clippy::explicit_auto_deref\n- Clippy::redundant_else\n- Clippy::manual_map\n- Clippy::semicolon_if_nothing_returned\n- Clippy::extra_unused_lifetimes\n- Allow clippy::wildcard_in_or_patterns\n- Clippy::uninlined_format_args\n- Allow Colours::new call with self\n- Clippy::explicit_iter_loop\n- Clippy::uninlined_format_args\n- Clippy::needless_late_init\n- Clippy::useless_conversion\n- Clippy::implicit_clone\n- Clippy::uninlined_format_args\n- Clippy::into-iter-on-ref\n- Clippy::semicolon_if_nothing_returned\n- Clippy::into_iter_on_ref\n- Clippy::needless_lifetimes\n- Clippy::uninlined_format_args\n- Trivial clippy lints\n- Clippy::semicolon_if_nothing_returned\n- Clippy::semicolon_if_nothing_returned\n- Clippy::manual_let_else\n- Clippy::semicolon_if_nothing_returned\n- Clippy::semicolon_if_nothing_returned\n- Clippy::uninlined_format_args\n- Clippy::manual_let_else\n- Clippy::manual_let_else\n- Clippy::manual_let_else\n- Clippy::manual_let_else\n- Clippy::manual_let_else\n- Fix trivial cast\n- Clippy::needless-borrow\n- TerminalWidth::deduce to -w/--width\n\n### Ci\n\n- Create pull_request_template.md\n- Add clippy check\n- Add dependabot updater\n\n### Doc\n\n- Create SECURITY.md\n- Create CONTRIBUTING.md\n\n## [0.10.6] - 2023-08-07\n\n### Bug Fixes\n\n- Rename eza-colors-explanation\n- Exa -> eza in manpage\n\n### Documentation\n\n- Adding --git-repos to help.\n\n### Features\n\n- Use GIT_DIR env var to find the repo\n- Add color explanations\n\n### Miscellaneous Tasks\n\n- Release 0.10.6\n\n### Doc\n\n- Add aur, nixpkgs installation\n\n### Git\n\n- Use GIT_DIR env var to find the repo\n- Use open_from_env before discover\n\n## [0.10.5] - 2023-08-03\n\n### Bug Fixes\n\n- Output wraps in terminal\n- Respect icon spacing\n\n### Miscellaneous Tasks\n\n- Release 0.10.5\n\n## [0.10.4] - 2023-08-02\n\n### Bug Fixes\n\n- Syntax error\n\n### Features\n\n- Added \".out\" files for latex\n- Add changelog generation\n\n### Miscellaneous Tasks\n\n- Release 0.10.4\n\n## [0.10.3] - 2023-07-31\n\n### Bug Fixes\n\n- More JPG extensions\n- Add compression icon to .tXX files #930\n- Dereferencing linksfile size.\n- Dereferencing links users.\n- Dereferencing links groups.\n- Dereferencing links permissions.\n- Dereferencing links timestamps.\n- Add Svelte icon\n- Fish completion for -i/--inode option\n- Typo\n- Use eprintln instead\n- Use stderr on no timezone info\n- Bump openssl-src from 111.15.0+1.1.1k to 111.26.0+1.1.1u\n- Bump openssl-src from 111.15.0+1.1.1k to 111.26.0+1.1.1u\n- Changed bin name via cargo.toml\n- Change man pages to reffer to new binary name\n- Change completions to new binary name\n- Change completion file names\n- Change name to eza\n- Bump git2 from 0.13.20 to 0.16.1\n- Fixed grid bug\n- Fixed grid bug\n- Bump rust to 1.71.0\n- Take -a and -A equally serious\n- Changed default folder icon\n- Add clippy as part of the toolchain\n- Change license icon\n- Change gpg icons to keys\n- Add icon for ocaml (.ml extension)\n- Better license icon\n- Replace obsolete icons\n- Add Emacs icon for .el and org-mode for .org\n- Added icons for .rmeta\n- Add icon support for .mjs, .cjs, .mts, .cts files\n- Add webpack.config.cjs to immediate files list\n- .ipynb icon comment\n- Removed result\n- Update --version info\n- Sort is_immediate\n- Add flake, autoconf, cargo lock\n- Added trailing commas\n- Update snapscraft.yaml\n- Remove accidentally commited test files\n\n### Feat\n\n- Add JPF to image filetype\n\n### Features\n\n- Add support Typescript and ReasonML projects\n- New Icons and CLI argument to suppress icons\n- Add sty file\n- Add julia file extension icon\n- Add symlink dereferencing flag\n- Add -X/--dereference completions\n- Add -X/--dereference completions\n- Symlinks report their target's valid size\n- Update Cargo.toml to optimise binaries for size\n- Add status for git repos\n- Add selinux contexts support\n- Add -o shorcut to --octal-permissions\n- Hyperlink flag\n- Update Cargo.toml to optimise binaries for size \n- Add git-status-.* completions\n- Zsh add git-status-.* completions\n- Add git-status-.* completions\n- Add Zig module icons\n- Add icon for Vagrantfile\n- Add git icon to .gitignore_global file\n- Left align relative time\n- Add support for --time-style=relative\n- Add vim icon\n- Add justfile\n- Add pxm\n- Add compressed types\n- Add compressed icons\n\n### Fixup\n\n- Split prefix tests by property\n\n### Improve\n\n- Vim icon\n\n### Makefile\n\n- Be compatible with BSD and OS X\n\n### Miscellaneous Tasks\n\n- Update zoneinfo_compiled, datetime to 0.5\n- Update users to 0.10\n- PR feedback\n- Bump to v0.10.2\n- Bump to v0.10.3\n- Update cargo lock\n\n### Refactor\n\n- Use shorthand fields\n- Removed commented code\n- Sorted file types, color table\n\n### StatResult\n\n- :Path -> Dir\n\n### Styling\n\n- Add icon for reStructuredText (src) files\n\n### Testing\n\n- Change to /usr/bin/env bash\n\n### ToStr\n\n- :to_str -> ToString::to_string\n\n### Add\n\n- Mp2 audio format icon\n\n### Build\n\n- Use binary name only\n\n### Ci\n\n- Remove unused .github files\n- Remove unused .github files\n- Create unit-tests.yml\n- Create unit-tests.yml\n- Add trivial nix flake\n- Add treefmt, rust-toolchain, nixfmt\n- Add .#test, .#clippy, .#check\n- Add nix flake\n- Change branch\n- Bump rust to 1.71.0\n- Automatically mark issues/PRs stale\n- Run tests when building with nix\n- Moving actions to dtolnay's version\n- Update Cargo.toml\n- Create labeler.yml\n- Add snap to labeler.yml\n- Add filetype.rs autolabel\n\n### Details\n\n- `filter` is only used when recursing\n\n### Doc\n\n- Add -X/--dereference flag\n- Change name in README.md\n- Add `nix run` to readme\n- Fix flow issue\n- Fix typos\n- Add mandatory snowflake emoji\n- Document nix flake development\n- Document nix flakew\n- Update README.md\n- Update README.md\n- Update README.md\n- Update README.md\n- Update README.md\n- Readme change screenshot to eza\n- Add CoC badge to readme\n- Add CODE_OF_CONDUCT.md\n- Add crates.io badge, license badge\n- Fix links\n- Update README.md\n- Update README.md\n\n### Documentation\n\n- Add hint how to install exa on Android / Termux\n\n### Git-feature\n\n- Display if a file is updated but unmerged (conflicted)\n\n### Icons\n\n- Add Gentoo for .ebuild\n\n### Io\n\n- :Result -> IOResult\n\n### Src/main.rs\n\n- Remove clippy::unnested_or_patterns\n\n### Vagrant\n\n- Update apt before installing\n\n\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "<!--\nSPDX-FileCopyrightText: 2014 Coraline Ada Ehmke\n\nSPDX-License-Identifier: CC-BY-4.0\n-->\n# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, caste, color, religion, or sexual\nidentity and orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the overall\n  community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or advances of\n  any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email address,\n  without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at:\n\nmatrix: @cafkafk:nixos.dev\n\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series of\nactions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or permanent\nban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within the\ncommunity.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.1, available at\n[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].\n\nCommunity Impact Guidelines were inspired by\n[Mozilla's code of conduct enforcement ladder][Mozilla CoC].\n\nFor answers to common questions about this code of conduct, see the FAQ at\n[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at\n[https://www.contributor-covenant.org/translations][translations].\n\n[homepage]: https://www.contributor-covenant.org\n[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html\n[Mozilla CoC]: https://github.com/mozilla/diversity\n[FAQ]: https://www.contributor-covenant.org/faq\n[translations]: https://www.contributor-covenant.org/translations\n\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "<!--\nSPDX-FileCopyrightText: 2023-2024 Christina Sørensen\nSPDX-FileContributor: Christina Sørensen\n\nSPDX-License-Identifier: EUPL-1.2\n-->\n# Contributing to eza\n\nIf you'd like to contribute to eza, there are several things you should make\nsure to familiarize yourself with first.\n\n- Code of conduct [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md)\n- Requirement of conformance to [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)\n- Requirement of conformance to [Semantic Versioning](https://semver.org/)\n- The [Security Policy](SECURITY.md)\n- [Free and Open Source (FOSS) software](https://www.gnu.org/philosophy/free-sw.en.html)\n\n## Hacking on eza\n\nIt is strongly recommended that you install Nix for hacking on eza. We leverage\nnix  as a way to easily test and distribute eza to many users, and it allows us\nto provide multiple tools easily for developers. Instead of having to install\neach dependency manually and setting up a development environment, Nix allows\nyou  to use the same environment as the devs use.\n\nTherefore, it is useful that you have a version of Nix installed with the\n\"experimental\" feature flakes enabled. Further, to make hacking on eza as easy\nas possible for yourself, you'd do yourself a favor to install\n[direnv](https://direnv.net/).\n\nWhen you enter the eza repository, if you have `direnv` installed, you'll be\nprompted to allow it with `direnv allow`. Doing this will save you from having\nto manually enter the development environment each time you open the folder. If\nyou don't have direnv installed however, you can run `nix develop` in a pinch,\nto enter the direnv.\n\nThe development environment includes basic checks of conformance to conventional\ncommits, cargo clippy lints, and much more.\n\nIt also contains a pre-commit-hook making it a lot easier not to make potential\nmistakes that will unnecessarily delay getting your PRs accepted. Most\nimportantly, it ensures your commits are conforming to conventional commits.\n\nSome useful commands include:\n- `nix flake check`: checks everything is correct.\n- `nix build`: build eza.\n- `nix build .#test`: runs eza's cargo tests\n- `nix build .#clippy`: runs clippy on eza\n- `nix fmt`: automatically formats your code as required by flake checks and\n  pre-commit-hooks.nix\n- `just itest`: runs integration tests\n\n**For non-nix users,**\nThere are traditional `pre-commit` hooks, which you can install with your system package manager or\n`brew|pip install pre-commit`, and run `pre-commit install -c .pre-commit-config-non-nix.yaml` in the root of the repository.\nThen these hooks will run automatically when you commit.\n\nThe [just](https://github.com/casey/just) command runner can be used to run some\nhelpful development commands, in a manner similar to `make`.  Run `just --list`\nto get an overview of what’s available.\n\nTo compile the manual pages, you will need [pandoc](https://pandoc.org/), which\nthe nix flake should have installed for you.  The `just man` command will\ncompile the Markdown into manual pages, which it will place in the `target/man`\ndirectory.\n\neza depends on [libgit2](https://github.com/rust-lang/git2-rs) for certain\nfeatures.  If you’re unable to compile libgit2, you can opt out of Git support\nby running `cargo build --no-default-features`. Again, the nix flake should\nhave taken care of this for you, if not, please file an issue.\n\nIf you intend to compile for musl, you will need to use the flag\n`vendored-openssl` if you want to get the Git feature working.  The full command\nis `cargo build --release --target=x86_64-unknown-linux-musl --features\nvendored-openssl,git`.\n\nIf you want more information on the tests please read:\n[testing on eza](https://github.com/eza-community/eza/blob/main/TESTING.md)\n\n## Creating a PR\n\nFirst, use the pull request template.\n\nPlease make sure that the thing you worked on... actually works. Make sure to\nalso add how you ensured this in the PR description. Further, it's expected\nthat you do your best to check for regressions.\n\nIf your PR introduces a flag, you MUST:\n- Add completions for bash, zsh, fish, nushell\n- Add documentation to the man page\n- Add your option to the help flag\n- Add your option to the README.md\n\nBefore submitting, you SHOULD have run `nix flake check` and ensured that all\nissues are addressed. For formatting issues, `nix fmt` will format the code for\nyou. Most clippy issues can be resolved with `cargo clippy --fix` (although it\nmight be educational to fix them yourself). If you have reuse issues, you can\nrun the following command to annotate your code:\n\nHere are the absolute basics:\n- your commit summary MUST follow conventional commits.\n- your commits SHOULD be separated into small, logical chunks.\n- reviewers may ask you to rebase your commits into more sensible chunks.\n- your PR will need to pass CI and local `cargo test`.\n- you may be asked to refactor parts of your code by reviewers.\n\nRemember that no one here is an employee, and treat everyone with respect, as\nthe code of conduct specifies. Also remember to be patient if it takes a while\nto get a response on your PR. Usually it doesn't, but there's only so many\nhours in a day, and if possible, there would be no delay. The delay alone is\nevidence of it's own necessity.\n\n## Commit Messages\nA common commit message contains at least a summary and reference with\nclosing action to the corresponding issue if any, and may also include a\ndescription and signature.\n\n### Summary\nFor you commit messages, please use the first line for a brief summary what\nthe commit changes. Try to stay within the 72 char limit and prepend what type\nof change. See the following list for some guidance:\n- feat: adds a new feature to eza\n- feat(zsh): adds something to zsh completion\n- refactor: revises parts of the code\n- docs(readme): revise the README\n- docs(man): revision of the man pages\n- fix: bugfix in the code base\n- fix(ci): bugfix in the continuous integration\n- ...\n\nNote that this list is not complete and there may be cases where a commit\ncould be characterized by different types, so just try to make your best\nguess. This spares the maintainers a lot of work when merging your PR.\n\n### Description\nIf you commit warrants it due to complexity or external information required\nto follow it, you should add a more detailed description of the changes,\nreasoning and also link external documentation if necessary. This description\nshould go two lines below the summary and except for links stay in the 80 char\nlimit.\n\n### Issue Reference\nIf the commit resolves an issue add: `Resolves: #abc` where `abc` is the issue\nnumber. In case of a bugfix you can also use `Fixes: #abc`.\n\n### Signature\nYou may add a signature at the end two lines below the description or\nissue reference.\n\n### Example\nHere is an example of a commit message for a breaking change that follows these rules:\n\n```\nfix(hyperlinks)!: TextCell building of detailed grid view, hyperlink, icon options\n\nThe hyperlink option adds an escape sequence which in the normal TextCell\ncreation also becomes part of the length calculation. This patch applies\nthe same logic the normal grid already did, by using the filenames bare\nwidth when a hyperlink is embedded. It also respects the ShowIcons\noption just like the normal grid view.\n\nBREAKING CHANGE: The style codes for huge file and units where\ndocumented to be `nt` and `ut` but the code was using `nh` and `uh`.\nThe code has been updated to match the documented style codes.\nEXA_COLORS using style codes `nh` and `uh` will need to be updated to\nuse `nt` and `ut`.\n\nResolves: #129\nRef: #473, #319\n\nCo-authored-by: 9glenda <plan9git@proton.me>\nSigned-off-by: Christina Sørensen <christina@cafkafk.com>\n```\n\n### Additional Examples\n\n- feat: add column selection\n- fix(output): fix width issue with columns\n- test(fs): add tests for filesystem metadata\n- feat!: breaking change / feat(config)!: implement config file\n- chore(deps): update dependencies\n\n### Commit types\n\n- build: Changes that affect the build system or external dependencies (example libgit2)\n- ci: Changes to CI configuration files and scripts (example scopes: Nix, Vagrant, Docker)\n- chore: Changes which do not change source code or tests (example: changes to the build process, auxiliary tools, libraries)\n- docs: Documentation, README, completions, manpage only\n- feat: A new feature\n- fix: A bug fix\n- perf: A code change that improves or addresses a performance issue\n- refactor: A code change that neither fixes a bug nor adds a feature\n- revert: Revert something\n- style: Changes that do not affect the meaning of the code (example: clippy)\n- test: Adding missing tests or correcting existing tests\n"
  },
  {
    "path": "Cargo.toml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n[package]\nname = \"eza\"\ndescription = \"A modern replacement for ls\"\nauthors = [\"Christina Sørensen <christina@cafkafk.com>\"]\ncategories = [\"command-line-utilities\"]\nedition = \"2024\"\nrust-version = \"1.90\"\nexclude = [\n  \"/docs/\",\n  \"/devtools/\",\n  \"/snap/\",\n  \"/tests/\",\n  \"/.config/\",\n  \"/.github/\",\n  \"/deb.asc\",\n  \"/deny.toml\",\n  \"/flake.*\",\n  \"/justfile\",\n  \"/powertest.yaml\",\n  \"/rust-toolchain.toml\",\n  \"/.envrc\",\n  \"/.gitignore\",\n  \"/.git-blame-ignore-revs\",\n  \"/.pre-commit-config-non-nix.yaml\",\n]\nreadme = \"README.md\"\nhomepage = \"https://github.com/eza-community/eza\"\nlicense = \"EUPL-1.2\"\nrepository = \"https://github.com/eza-community/eza\"\nversion = \"0.23.4\"\n\n\n[package.metadata.deb]\nlicense-file = [\"LICENSE.txt\", \"4\"]\ndepends = \"$auto\"\nextended-description = \"\"\"\neza is a modern, maintained replacement for ls\n\"\"\"\nsection = \"utils\"\npriority = \"optional\"\nassets = [\n  [\n    \"target/release/eza\",\n    \"/usr/bin/eza\",\n    \"0755\",\n  ],\n  [\n    \"target/release/../man/eza.1\",\n    \"/usr/share/man/man1/eza.1\",\n    \"0644\",\n  ],\n  [\n    \"target/release/../man/eza_colors.5\",\n    \"/usr/share/man/man5/eza_colors.5\",\n    \"0644\",\n  ],\n  [\n    \"target/release/../man/eza_colors-explanation.5\",\n    \"/usr/share/man/man5/eza_colors-explanation.5\",\n    \"0644\",\n  ],\n  [\n    \"completions/bash/eza\",\n    \"/usr/share/bash-completion/completions/eza\",\n    \"0644\",\n  ],\n  [\n    \"completions/zsh/_eza\",\n    \"/usr/share/zsh/site-functions/_eza\",\n    \"0644\",\n  ],\n  [\n    \"completions/fish/eza.fish\",\n    \"/usr/share/fish/vendor_completions.d/eza.fish\",\n    \"0644\",\n  ],\n]\n\n\n[[bin]]\nname = \"eza\"\n\n\n[dependencies]\nrayon = \"1.10.0\"\nchrono = { version = \"0.4.40\", default-features = false, features = [\"clock\"] }\nnu-ansi-term = { version = \"0.50.1\", features = [\n  \"serde\",\n  \"derive_serde_style\",\n] }\nglob = \"0.3\"\nlibc = \"0.2\"\nlocale = \"0.2\"\nlog = \"0.4\"\nnatord-plus-plus = \"2.0\"\npath-clean = \"1.0.1\"\nunit-prefix = \"0.5.2\"\n# palette 0.7.6 is broken: https://github.com/eza-community/eza/pull/1207\npalette = { version = \"=0.7.5\", default-features = false, features = [\"std\"] }\npercent-encoding = \"2.3.1\"\nphf = { version = \"0.13.1\", features = [\"macros\"] }\nplist = { version = \"1.7.0\", default-features = false }\nuutils_term_grid = \"0.7.0\"\nterminal_size = \"0.4.2\"\ntimeago = { version = \"0.6.0\", default-features = false }\nunicode-width = \"0.2\"\nansi-width = \"0.1.0\"\nserde = { version = \"1.0.219\", features = [\"derive\"] }\ndirs = \"6.0.0\"\nserde_norway = \"0.9\"\nbacktrace = \"0.3\"\nclap = { version = \"4.5.38\", features = [\"cargo\", \"derive\"] }\n\n[dependencies.git2]\nversion = \"0.20\"\noptional = true\ndefault-features = false\n\n[target.'cfg(target_os = \"linux\")'.dependencies]\nproc-mounts = \"0.3\"\n\n[target.'cfg(unix)'.dependencies]\nuzers = \"0.12.1\"\n\n[target.'cfg(target_os = \"windows\")'.dependencies]\nwindows-sys = { version = \"0.61.2\", features = [\n  \"Win32_System_Console\",\n  \"Win32_Foundation\",\n] }\n\n[build-dependencies]\nchrono = { version = \"0.4.40\", default-features = false, features = [\"clock\"] }\n\n[dev-dependencies]\ncriterion = { version = \"0.8.2\", features = [\"html_reports\"] }\ntrycmd = \"1.0\"\n\n[features]\ndefault = [\"git\"]\ngit = [\"git2\"]\nvendored-openssl = [\"git2/vendored-openssl\"]\nvendored-libgit2 = [\"git2/vendored-libgit2\"]\n# Should only be used inside of flake.nix\nnix = []\n# Should only be used inside of flake.nix locally (not on CI)\nnix-local = []\n# Should only be used inside of flake.nix\n# Shouldn't ever be used in CI (slow!)\npowertest = []\nnix-generated = []\n\n# use LTO for smaller binaries (that take longer to build)\n[profile.release]\nlto = true\nstrip = true\nopt-level = 3\ncodegen-units = 1\npanic = 'abort'\n\n[[bench]]\nname = \"my_benchmark\"\nharness = false\n"
  },
  {
    "path": "INSTALL.md",
    "content": "<!--\nSPDX-FileCopyrightText: 2023-2024 Christina Sørensen\nSPDX-FileContributor: Christina Sørensen\n\nSPDX-License-Identifier: EUPL-1.2\n-->\n# Installation\n\neza is available for Windows, macOS and Linux.\n\n### Cargo (crates.io)\n\n![Crates.io](https://img.shields.io/crates/v/eza?link=https%3A%2F%2Fcrates.io%2Fcrates%2Feza)\n\nIf you already have a Rust environment set up, you can use the `cargo install` command:\n\n    cargo install eza\n\nCargo will build the `eza` binary and place it in your `CARGO_INSTALL_ROOT`.\nFor more details on installation location see [the cargo\nbook](https://doc.rust-lang.org/cargo/commands/cargo-install.html#description).\n\n### Cargo (git)\n\nIf you already have a Rust environment set up, you can use the `cargo install` command in your local clone of the repo:\n\n    git clone https://github.com/eza-community/eza.git\n    cd eza\n    cargo install --path .\n\nCargo will build the `eza` binary and place it in `$HOME/.cargo`.\n\n### Arch Linux\n\n[![Arch Linux package](https://repology.org/badge/version-for-repo/arch/eza.svg)](https://repology.org/project/eza/versions)\n\nEza is available in the [\\[extra\\]](https://archlinux.org/packages/extra/x86_64/eza/) repository of Arch Linux.\n\n```bash\npacman -S eza\n```\n\n### Debian and Ubuntu\n\nEza is available from [deb.gierens.de](http://deb.gierens.de). The GPG public\nkey is in this repo under [deb.asc](/deb.asc).\n\nFirst make sure you have the `gpg` command, and otherwise install it via:\n\n```bash\nsudo apt update\nsudo apt install -y gpg\n```\n\nThen install eza via:\n\n```bash\nsudo mkdir -p /etc/apt/keyrings\nwget -qO- https://raw.githubusercontent.com/eza-community/eza/main/deb.asc | sudo gpg --dearmor -o /etc/apt/keyrings/gierens.gpg\necho \"deb [signed-by=/etc/apt/keyrings/gierens.gpg] http://deb.gierens.de stable main\" | sudo tee /etc/apt/sources.list.d/gierens.list\nsudo chmod 644 /etc/apt/keyrings/gierens.gpg /etc/apt/sources.list.d/gierens.list\nsudo apt update\nsudo apt install -y eza\n```\n_Note_: In strict apt environments, you may need to add the target: `echo \"deb [arch=amd64 signed-by=...` \n\n### Nix (Linux, MacOS)\n\n[![nixpkgs unstable package](https://repology.org/badge/version-for-repo/nix_unstable/eza.svg)](https://repology.org/project/eza/versions)\n\n> **Note**\n> Installing packages imperatively isn't idiomatic Nix, as this can lead to [many issues](https://stop-using-nix-env.privatevoid.net/).\n\nEza is available from [Nixpkgs](https://github.com/NixOS/nixpkgs) and from the\nflake in this repository.\n\nFor `nix profile` users:\n\n```shell\nnix profile install nixpkgs#eza\n```\n\nFor `nix-env` users:\n\n```shell\nnix-env -i eza\n```\n\n**Declarative Nix Installations**\n\n- Simple NixOS installation: [rfaulhaber/dotfiles](https://github.com/rfaulhaber/dotfiles/blob/a8d084d178efd0592b7ac02d34a450fb58913aca/nix/modules/programs/eza/default.nix#L15)\n- Using the flake via NixOS: [hallettj/home.nix](https://github.com/hallettj/home.nix/blob/a8388483e5d78e110be73c5af0e7f0e3ca8f8aa3/flake.nix#L19)\n- Using home-manager on NixOS: [Misterio77/nix-config](https://github.com/Misterio77/nix-config/blob/6867d66a2fe7899c608b9c8e5a8f9aee279d188b/home/misterio/features/cli/fish.nix#L6)\n\n### Gentoo\n\n[![Gentoo package](https://repology.org/badge/version-for-repo/gentoo/eza.svg)](https://repology.org/project/eza/versions)\n\nOn Gentoo, eza is available as a package [`sys-apps/eza`](https://packages.gentoo.org/packages/sys-apps/eza):\n\n```bash\nemerge --ask sys-apps/eza\n```\n\n### openSUSE\n\nEza is available at [openSUSE:Factory/eza](https://build.opensuse.org/package/show/openSUSE:Factory/eza):\n\n```bash\nzypper ar https://download.opensuse.org/tumbleweed/repo/oss/ factory-oss\nzypper in eza\n```\n\nThe preceding repository also contains the Bash, Fish, and Zsh completions.\n\n### Fedora\n\n[![Fedora package](https://repology.org/badge/version-for-repo/fedora_39/rust:eza.svg)](https://repology.org/project/eza/versions)\n\n> ⚠️ **Note:** As of **Fedora 42**, `eza` is **no longer available** in the official Fedora repositories due to the absence of an active maintainer.\n>\n> If you're using Fedora 42 or newer, consider one of these options:\n>\n> - **Use a pre-built binary** from the [Releases](https://github.com/eza-community/eza/releases) page\n> - **Build from source** by following the [Cargo (git)](#cargo-git) instructions above\n>\n> 💬 Interested in helping? [Become a Fedora package maintainer](https://docs.fedoraproject.org/en-US/package-maintainers/) or reach out via [Matrix](https://matrix.to/#/#eza-community:gitter.im).\n\nFor Fedora versions **prior to 42**, `eza` is available in the official repository:\n\n```bash\nsudo dnf install eza\n```\n\n### Void Linux\n\n[![Void Linux package](https://repology.org/badge/version-for-repo/void_x86_64/eza.svg)](https://repology.org/project/eza/versions)\n\nEza is available as the [eza](https://github.com/void-linux/void-packages/tree/master/srcpkgs/eza) package in the official Void Linux repository.\n\n```bash\nsudo xbps-install eza\n```\n\n### Termux\n\nEza is available as the [eza](https://github.com/termux/termux-packages/tree/master/packages/eza) package in the official Termux repository.\n\n```bash\npkg install eza\n```\n\n### Manual (Linux)\n\nExample is for x86_64 GNU, replaces the file names if downloading for a different arch.\n\n```shell\nwget -c https://github.com/eza-community/eza/releases/latest/download/eza_x86_64-unknown-linux-gnu.tar.gz -O - | tar xz\nsudo chmod +x eza\nsudo chown root:root eza\nsudo mv eza /usr/local/bin/eza\n```\n\nIf `exa` was installed before, replace it with `eza`:\n```shell\nsudo rm -f /usr/local/bin/exa\nsudo ln -s /usr/local/bin/eza /usr/local/bin/exa\n```\n\n### Pixi (Linux, MacOS, and Windows)\n\n[![conda-forge package](https://img.shields.io/conda/vn/conda-forge/eza)](https://prefix.dev/channels/conda-forge/packages/eza)\n\nEza is available in the conda-forge repository and can be installed using [Pixi](https://pixi.sh/latest/):\n\n```shell\npixi global install eza\n```\n\n### Brew (MacOS)\n\n[![Homebrew package](https://repology.org/badge/version-for-repo/homebrew/eza.svg)](https://repology.org/project/eza/versions)\n\nEza is available from [Homebrew](https://formulae.brew.sh/formula/eza#default).\n\nTo install eza, run:\n\n```shell\nbrew install eza\n```\n\n### MacPorts (macOS)\n\n[![MacPorts port](https://repology.org/badge/version-for-repo/macports/eza.svg)](https://repology.org/project/eza/versions)\n\nOn macOS, eza is also available via [MacPorts](https://ports.macports.org/port/eza/).\n\nTo install eza, run:\n\n```shell\nsudo port install eza\n```\n\n### Winget (Windows)\n\n[![Windows package](https://repology.org/badge/version-for-repo/winget/eza.svg)](https://repology.org/project/eza/versions)\n\nEza is available on Winget.\n\nTo install eza, run:\n\n```shell\nwinget install eza-community.eza\n```\n\n### Scoop (Windows)\n\n[![Windows package](https://repology.org/badge/version-for-repo/scoop/eza.svg)](https://repology.org/project/eza/versions)\n\nEza is available from [Scoop](https://scoop.sh/#/apps?q=eza&id=a52070d25f94bbcc884f80bef53eb47ed1268198).\n\nTo install eza, run:\n\n```shell\nscoop install eza\n```\n\n### Flox (Linux, macOS, Windows WSL)\n\nEza is available from [Flox](https://flox.dev).\n\nTo install eza, run:\n\n```shell\nflox install eza\n```\n\n### X-CMD (Linux, macOS, Windows WSL, Windows GitBash)\n\nEza is available from [x-cmd](https://www.x-cmd.com).\n\nTo install eza, run:\n\n```shell\nx env use eza\n# or\nx eza\n```\n\n### fox (Linux, macOS)\n\nEza is available from [fox](https://www.getfox.sh/).\n\nTo install eza, run:\n\n```shell\nfox install eza\n```\n\n### Completions\n\n#### For zsh:\n\n> **Note**\n> Change `~/.zshrc` to your preferred zsh config file.\n\n##### Clone the repository:\n\n```sh\ngit clone https://github.com/eza-community/eza.git\n```\n\n##### Add the completion path to your zsh configuration:\n\nReplace `<path_to_eza>` with the actual path where you cloned the `eza` repository.\n\n```sh\necho 'export FPATH=\"<path_to_eza>/completions/zsh:$FPATH\"' >> ~/.zshrc\n```\n\n##### Reload your zsh configuration:\n\n```sh\nsource ~/.zshrc\n```\n\n\n#### For zsh with homebrew:\n\nIn case zsh completions don't work out of the box with homebrew, add the\nfollowing to your `~/.zshrc`:\n\n```bash\nif type brew &>/dev/null; then\n    FPATH=\"$(brew --prefix)/share/zsh/site-functions:${FPATH}\"\n    autoload -Uz compinit\n    compinit\nfi\n```\n\nFor reference:\n- https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh\n- https://github.com/Homebrew/brew/issues/8984\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "EUROPEAN UNION PUBLIC LICENCE v. 1.2\nEUPL © the European Union 2007, 2016\n\nThis European Union Public Licence (the ‘EUPL’) applies to the Work (as defined below) which is provided under the\nterms of this Licence. Any use of the Work, other than as authorised under this Licence is prohibited (to the extent such\nuse is covered by a right of the copyright holder of the Work).\nThe Work is provided under the terms of this Licence when the Licensor (as defined below) has placed the following\nnotice immediately following the copyright notice for the Work:\n                          Licensed under the EUPL\nor has expressed by any other means his willingness to license under the EUPL.\n\n1.Definitions\nIn this Licence, the following terms have the following meaning:\n— ‘The Licence’:this Licence.\n— ‘The Original Work’:the work or software distributed or communicated by the Licensor under this Licence, available\nas Source Code and also as Executable Code as the case may be.\n— ‘Derivative Works’:the works or software that could be created by the Licensee, based upon the Original Work or\nmodifications thereof. This Licence does not define the extent of modification or dependence on the Original Work\nrequired in order to classify a work as a Derivative Work; this extent is determined by copyright law applicable in\nthe country mentioned in Article 15.\n— ‘The Work’:the Original Work or its Derivative Works.\n— ‘The Source Code’:the human-readable form of the Work which is the most convenient for people to study and\nmodify.\n— ‘The Executable Code’:any code which has generally been compiled and which is meant to be interpreted by\na computer as a program.\n— ‘The Licensor’:the natural or legal person that distributes or communicates the Work under the Licence.\n— ‘Contributor(s)’:any natural or legal person who modifies the Work under the Licence, or otherwise contributes to\nthe creation of a Derivative Work.\n— ‘The Licensee’ or ‘You’:any natural or legal person who makes any usage of the Work under the terms of the\nLicence.\n— ‘Distribution’ or ‘Communication’:any act of selling, giving, lending, renting, distributing, communicating,\ntransmitting, or otherwise making available, online or offline, copies of the Work or providing access to its essential\nfunctionalities at the disposal of any other natural or legal person.\n\n2.Scope of the rights granted by the Licence\nThe Licensor hereby grants You a worldwide, royalty-free, non-exclusive, sublicensable licence to do the following, for\nthe duration of copyright vested in the Original Work:\n— use the Work in any circumstance and for all usage,\n— reproduce the Work,\n— modify the Work, and make Derivative Works based upon the Work,\n— communicate to the public, including the right to make available or display the Work or copies thereof to the public\nand perform publicly, as the case may be, the Work,\n— distribute the Work or copies thereof,\n— lend and rent the Work or copies thereof,\n— sublicense rights in the Work or copies thereof.\nThose rights can be exercised on any media, supports and formats, whether now known or later invented, as far as the\napplicable law permits so.\nIn the countries where moral rights apply, the Licensor waives his right to exercise his moral right to the extent allowed\nby law in order to make effective the licence of the economic rights here above listed.\nThe Licensor grants to the Licensee royalty-free, non-exclusive usage rights to any patents held by the Licensor, to the\nextent necessary to make use of the rights granted on the Work under this Licence.\n\n3.Communication of the Source Code\nThe Licensor may provide the Work either in its Source Code form, or as Executable Code. If the Work is provided as\nExecutable Code, the Licensor provides in addition a machine-readable copy of the Source Code of the Work along with\neach copy of the Work that the Licensor distributes or indicates, in a notice following the copyright notice attached to\nthe Work, a repository where the Source Code is easily and freely accessible for as long as the Licensor continues to\ndistribute or communicate the Work.\n\n4.Limitations on copyright\nNothing in this Licence is intended to deprive the Licensee of the benefits from any exception or limitation to the\nexclusive rights of the rights owners in the Work, of the exhaustion of those rights or of other applicable limitations\nthereto.\n\n5.Obligations of the Licensee\nThe grant of the rights mentioned above is subject to some restrictions and obligations imposed on the Licensee. Those\nobligations are the following:\n\nAttribution right: The Licensee shall keep intact all copyright, patent or trademarks notices and all notices that refer to\nthe Licence and to the disclaimer of warranties. The Licensee must include a copy of such notices and a copy of the\nLicence with every copy of the Work he/she distributes or communicates. The Licensee must cause any Derivative Work\nto carry prominent notices stating that the Work has been modified and the date of modification.\n\nCopyleft clause: If the Licensee distributes or communicates copies of the Original Works or Derivative Works, this\nDistribution or Communication will be done under the terms of this Licence or of a later version of this Licence unless\nthe Original Work is expressly distributed only under this version of the Licence — for example by communicating\n‘EUPL v. 1.2 only’. The Licensee (becoming Licensor) cannot offer or impose any additional terms or conditions on the\nWork or Derivative Work that alter or restrict the terms of the Licence.\n\nCompatibility clause: If the Licensee Distributes or Communicates Derivative Works or copies thereof based upon both\nthe Work and another work licensed under a Compatible Licence, this Distribution or Communication can be done\nunder the terms of this Compatible Licence. For the sake of this clause, ‘Compatible Licence’ refers to the licences listed\nin the appendix attached to this Licence. Should the Licensee's obligations under the Compatible Licence conflict with\nhis/her obligations under this Licence, the obligations of the Compatible Licence shall prevail.\n\nProvision of Source Code: When distributing or communicating copies of the Work, the Licensee will provide\na machine-readable copy of the Source Code or indicate a repository where this Source will be easily and freely available\nfor as long as the Licensee continues to distribute or communicate the Work.\nLegal Protection: This Licence does not grant permission to use the trade names, trademarks, service marks, or names\nof the Licensor, except as required for reasonable and customary use in describing the origin of the Work and\nreproducing the content of the copyright notice.\n\n6.Chain of Authorship\nThe original Licensor warrants that the copyright in the Original Work granted hereunder is owned by him/her or\nlicensed to him/her and that he/she has the power and authority to grant the Licence.\nEach Contributor warrants that the copyright in the modifications he/she brings to the Work are owned by him/her or\nlicensed to him/her and that he/she has the power and authority to grant the Licence.\nEach time You accept the Licence, the original Licensor and subsequent Contributors grant You a licence to their contributions\nto the Work, under the terms of this Licence.\n\n7.Disclaimer of Warranty\nThe Work is a work in progress, which is continuously improved by numerous Contributors. It is not a finished work\nand may therefore contain defects or ‘bugs’ inherent to this type of development.\nFor the above reason, the Work is provided under the Licence on an ‘as is’ basis and without warranties of any kind\nconcerning the Work, including without limitation merchantability, fitness for a particular purpose, absence of defects or\nerrors, accuracy, non-infringement of intellectual property rights other than copyright as stated in Article 6 of this\nLicence.\nThis disclaimer of warranty is an essential part of the Licence and a condition for the grant of any rights to the Work.\n\n8.Disclaimer of Liability\nExcept in the cases of wilful misconduct or damages directly caused to natural persons, the Licensor will in no event be\nliable for any direct or indirect, material or moral, damages of any kind, arising out of the Licence or of the use of the\nWork, including without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, loss\nof data or any commercial damage, even if the Licensor has been advised of the possibility of such damage. However,\nthe Licensor will be liable under statutory product liability laws as far such laws apply to the Work.\n\n9.Additional agreements\nWhile distributing the Work, You may choose to conclude an additional agreement, defining obligations or services\nconsistent with this Licence. However, if accepting obligations, You may act only on your own behalf and on your sole\nresponsibility, not on behalf of the original Licensor or any other Contributor, and only if You agree to indemnify,\ndefend, and hold each Contributor harmless for any liability incurred by, or claims asserted against such Contributor by\nthe fact You have accepted any warranty or additional liability.\n\n10.Acceptance of the Licence\nThe provisions of this Licence can be accepted by clicking on an icon ‘I agree’ placed under the bottom of a window\ndisplaying the text of this Licence or by affirming consent in any other similar way, in accordance with the rules of\napplicable law. Clicking on that icon indicates your clear and irrevocable acceptance of this Licence and all of its terms\nand conditions.\nSimilarly, you irrevocably accept this Licence and all of its terms and conditions by exercising any rights granted to You\nby Article 2 of this Licence, such as the use of the Work, the creation by You of a Derivative Work or the Distribution\nor Communication by You of the Work or copies thereof.\n\n11.Information to the public\nIn case of any Distribution or Communication of the Work by means of electronic communication by You (for example,\nby offering to download the Work from a remote location) the distribution channel or media (for example, a website)\nmust at least provide to the public the information requested by the applicable law regarding the Licensor, the Licence\nand the way it may be accessible, concluded, stored and reproduced by the Licensee.\n\n12.Termination of the Licence\nThe Licence and the rights granted hereunder will terminate automatically upon any breach by the Licensee of the terms\nof the Licence.\nSuch a termination will not terminate the licences of any person who has received the Work from the Licensee under\nthe Licence, provided such persons remain in full compliance with the Licence.\n\n13.Miscellaneous\nWithout prejudice of Article 9 above, the Licence represents the complete agreement between the Parties as to the\nWork.\nIf any provision of the Licence is invalid or unenforceable under applicable law, this will not affect the validity or\nenforceability of the Licence as a whole. Such provision will be construed or reformed so as necessary to make it valid\nand enforceable.\nThe European Commission may publish other linguistic versions or new versions of this Licence or updated versions of\nthe Appendix, so far this is required and reasonable, without reducing the scope of the rights granted by the Licence.\nNew versions of the Licence will be published with a unique version number.\nAll linguistic versions of this Licence, approved by the European Commission, have identical value. Parties can take\nadvantage of the linguistic version of their choice.\n\n14.Jurisdiction\nWithout prejudice to specific agreement between parties,\n— any litigation resulting from the interpretation of this License, arising between the European Union institutions,\nbodies, offices or agencies, as a Licensor, and any Licensee, will be subject to the jurisdiction of the Court of Justice\nof the European Union, as laid down in article 272 of the Treaty on the Functioning of the European Union,\n— any litigation arising between other parties and resulting from the interpretation of this License, will be subject to\nthe exclusive jurisdiction of the competent court where the Licensor resides or conducts its primary business.\n\n15.Applicable Law\nWithout prejudice to specific agreement between parties,\n— this Licence shall be governed by the law of the European Union Member State where the Licensor has his seat,\nresides or has his registered office,\n— this licence shall be governed by Belgian law if the Licensor has no seat, residence or registered office inside\na European Union Member State.\n\n\n                                                         Appendix\n\n‘Compatible Licences’ according to Article 5 EUPL are:\n— GNU General Public License (GPL) v. 2, v. 3\n— GNU Affero General Public License (AGPL) v. 3\n— Open Software License (OSL) v. 2.1, v. 3.0\n— Eclipse Public License (EPL) v. 1.0\n— CeCILL v. 2.0, v. 2.1\n— Mozilla Public Licence (MPL) v. 2\n— GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3\n— Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for works other than software\n— European Union Public Licence (EUPL) v. 1.1, v. 1.2\n— Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong Reciprocity (LiLiQ-R+).\n\nThe European Commission may update this Appendix to later versions of the above licences without producing\na new version of the EUPL, as long as they provide the rights granted in Article 2 of this Licence and protect the\ncovered Source Code from exclusive appropriation.\nAll other changes or additions to this Appendix require the production of a new EUPL version.\n"
  },
  {
    "path": "LICENSES/CC-BY-4.0.txt",
    "content": "Creative Commons Attribution 4.0 International\n\n Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible.\n\nUsing Creative Commons Public Licenses\n\nCreative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses.\n\nConsiderations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors.\n\nConsiderations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public.\n\nCreative Commons Attribution 4.0 International Public License\n\nBy exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License (\"Public License\"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.\n\nSection 1 – Definitions.\n\n     a.\tAdapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.\n\n     b.\tAdapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.\n\n     c.\tCopyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.\n\n     d.\tEffective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.\n\n     e.\tExceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.\n\n     f.\tLicensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.\n\n     g.\tLicensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.\n\n     h.\tLicensor means the individual(s) or entity(ies) granting rights under this Public License.\n\n     i.\tShare means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.\n\n     j.\tSui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.\n\n     k.\tYou means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.\n\nSection 2 – Scope.\n\n     a.\tLicense grant.\n\n          1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:\n\n               A. reproduce and Share the Licensed Material, in whole or in part; and\n\n               B. produce, reproduce, and Share Adapted Material.\n\n          2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.\n\n          3. Term. The term of this Public License is specified in Section 6(a).\n\n          4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.\n\n          5. Downstream recipients.\n\n               A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.\n\n               B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.\n\n          6.  No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).\n\nb. Other rights.\n\n          1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.\n\n          2. Patent and trademark rights are not licensed under this Public License.\n\n          3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties.\n\nSection 3 – License Conditions.\n\nYour exercise of the Licensed Rights is expressly made subject to the following conditions.\n\n     a.\tAttribution.\n\n          1. If You Share the Licensed Material (including in modified form), You must:\n\n               A. retain the following if it is supplied by the Licensor with the Licensed Material:\n\n                    i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);\n\n                    ii. a copyright notice;\n\n                    iii. a notice that refers to this Public License;\n\n                    iv.\ta notice that refers to the disclaimer of warranties;\n\n                    v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;\n\n               B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and\n\n               C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.\n\n          2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.\n\n          3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.\n\n          4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License.\n\nSection 4 – Sui Generis Database Rights.\n\nWhere the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:\n\n     a.\tfor the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database;\n\n     b.\tif You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and\n\n     c.\tYou must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.\nFor the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.\n\nSection 5 – Disclaimer of Warranties and Limitation of Liability.\n\n     a.\tUnless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.\n\n     b.\tTo the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.\n\n     c.\tThe disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.\n\nSection 6 – Term and Termination.\n\n     a.\tThis Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.\n\n     b.\tWhere Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:\n\n          1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or\n\n          2. upon express reinstatement by the Licensor.\n\n     c.\tFor the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.\n\n     d.\tFor the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.\n\n     e.\tSections 1, 5, 6, 7, and 8 survive termination of this Public License.\n\nSection 7 – Other Terms and Conditions.\n\n     a.\tThe Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.\n\n     b.\tAny arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.\n\nSection 8 – Interpretation.\n\n     a.\tFor the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.\n\n     b.\tTo the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.\n\n     c.\tNo term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.\n\n     d.\tNothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.\n\nCreative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.\n\nCreative Commons may be contacted at creativecommons.org.\n"
  },
  {
    "path": "LICENSES/EUPL-1.2.txt",
    "content": "EUROPEAN UNION PUBLIC LICENCE v. 1.2\nEUPL © the European Union 2007, 2016\n\nThis European Union Public Licence (the ‘EUPL’) applies to the Work (as defined below) which is provided under the\nterms of this Licence. Any use of the Work, other than as authorised under this Licence is prohibited (to the extent such\nuse is covered by a right of the copyright holder of the Work).\nThe Work is provided under the terms of this Licence when the Licensor (as defined below) has placed the following\nnotice immediately following the copyright notice for the Work:\n                          Licensed under the EUPL\nor has expressed by any other means his willingness to license under the EUPL.\n\n1.Definitions\nIn this Licence, the following terms have the following meaning:\n— ‘The Licence’:this Licence.\n— ‘The Original Work’:the work or software distributed or communicated by the Licensor under this Licence, available\nas Source Code and also as Executable Code as the case may be.\n— ‘Derivative Works’:the works or software that could be created by the Licensee, based upon the Original Work or\nmodifications thereof. This Licence does not define the extent of modification or dependence on the Original Work\nrequired in order to classify a work as a Derivative Work; this extent is determined by copyright law applicable in\nthe country mentioned in Article 15.\n— ‘The Work’:the Original Work or its Derivative Works.\n— ‘The Source Code’:the human-readable form of the Work which is the most convenient for people to study and\nmodify.\n— ‘The Executable Code’:any code which has generally been compiled and which is meant to be interpreted by\na computer as a program.\n— ‘The Licensor’:the natural or legal person that distributes or communicates the Work under the Licence.\n— ‘Contributor(s)’:any natural or legal person who modifies the Work under the Licence, or otherwise contributes to\nthe creation of a Derivative Work.\n— ‘The Licensee’ or ‘You’:any natural or legal person who makes any usage of the Work under the terms of the\nLicence.\n— ‘Distribution’ or ‘Communication’:any act of selling, giving, lending, renting, distributing, communicating,\ntransmitting, or otherwise making available, online or offline, copies of the Work or providing access to its essential\nfunctionalities at the disposal of any other natural or legal person.\n\n2.Scope of the rights granted by the Licence\nThe Licensor hereby grants You a worldwide, royalty-free, non-exclusive, sublicensable licence to do the following, for\nthe duration of copyright vested in the Original Work:\n— use the Work in any circumstance and for all usage,\n— reproduce the Work,\n— modify the Work, and make Derivative Works based upon the Work,\n— communicate to the public, including the right to make available or display the Work or copies thereof to the public\nand perform publicly, as the case may be, the Work,\n— distribute the Work or copies thereof,\n— lend and rent the Work or copies thereof,\n— sublicense rights in the Work or copies thereof.\nThose rights can be exercised on any media, supports and formats, whether now known or later invented, as far as the\napplicable law permits so.\nIn the countries where moral rights apply, the Licensor waives his right to exercise his moral right to the extent allowed\nby law in order to make effective the licence of the economic rights here above listed.\nThe Licensor grants to the Licensee royalty-free, non-exclusive usage rights to any patents held by the Licensor, to the\nextent necessary to make use of the rights granted on the Work under this Licence.\n\n3.Communication of the Source Code\nThe Licensor may provide the Work either in its Source Code form, or as Executable Code. If the Work is provided as\nExecutable Code, the Licensor provides in addition a machine-readable copy of the Source Code of the Work along with\neach copy of the Work that the Licensor distributes or indicates, in a notice following the copyright notice attached to\nthe Work, a repository where the Source Code is easily and freely accessible for as long as the Licensor continues to\ndistribute or communicate the Work.\n\n4.Limitations on copyright\nNothing in this Licence is intended to deprive the Licensee of the benefits from any exception or limitation to the\nexclusive rights of the rights owners in the Work, of the exhaustion of those rights or of other applicable limitations\nthereto.\n\n5.Obligations of the Licensee\nThe grant of the rights mentioned above is subject to some restrictions and obligations imposed on the Licensee. Those\nobligations are the following:\n\nAttribution right: The Licensee shall keep intact all copyright, patent or trademarks notices and all notices that refer to\nthe Licence and to the disclaimer of warranties. The Licensee must include a copy of such notices and a copy of the\nLicence with every copy of the Work he/she distributes or communicates. The Licensee must cause any Derivative Work\nto carry prominent notices stating that the Work has been modified and the date of modification.\n\nCopyleft clause: If the Licensee distributes or communicates copies of the Original Works or Derivative Works, this\nDistribution or Communication will be done under the terms of this Licence or of a later version of this Licence unless\nthe Original Work is expressly distributed only under this version of the Licence — for example by communicating\n‘EUPL v. 1.2 only’. The Licensee (becoming Licensor) cannot offer or impose any additional terms or conditions on the\nWork or Derivative Work that alter or restrict the terms of the Licence.\n\nCompatibility clause: If the Licensee Distributes or Communicates Derivative Works or copies thereof based upon both\nthe Work and another work licensed under a Compatible Licence, this Distribution or Communication can be done\nunder the terms of this Compatible Licence. For the sake of this clause, ‘Compatible Licence’ refers to the licences listed\nin the appendix attached to this Licence. Should the Licensee's obligations under the Compatible Licence conflict with\nhis/her obligations under this Licence, the obligations of the Compatible Licence shall prevail.\n\nProvision of Source Code: When distributing or communicating copies of the Work, the Licensee will provide\na machine-readable copy of the Source Code or indicate a repository where this Source will be easily and freely available\nfor as long as the Licensee continues to distribute or communicate the Work.\nLegal Protection: This Licence does not grant permission to use the trade names, trademarks, service marks, or names\nof the Licensor, except as required for reasonable and customary use in describing the origin of the Work and\nreproducing the content of the copyright notice.\n\n6.Chain of Authorship\nThe original Licensor warrants that the copyright in the Original Work granted hereunder is owned by him/her or\nlicensed to him/her and that he/she has the power and authority to grant the Licence.\nEach Contributor warrants that the copyright in the modifications he/she brings to the Work are owned by him/her or\nlicensed to him/her and that he/she has the power and authority to grant the Licence.\nEach time You accept the Licence, the original Licensor and subsequent Contributors grant You a licence to their contributions\nto the Work, under the terms of this Licence.\n\n7.Disclaimer of Warranty\nThe Work is a work in progress, which is continuously improved by numerous Contributors. It is not a finished work\nand may therefore contain defects or ‘bugs’ inherent to this type of development.\nFor the above reason, the Work is provided under the Licence on an ‘as is’ basis and without warranties of any kind\nconcerning the Work, including without limitation merchantability, fitness for a particular purpose, absence of defects or\nerrors, accuracy, non-infringement of intellectual property rights other than copyright as stated in Article 6 of this\nLicence.\nThis disclaimer of warranty is an essential part of the Licence and a condition for the grant of any rights to the Work.\n\n8.Disclaimer of Liability\nExcept in the cases of wilful misconduct or damages directly caused to natural persons, the Licensor will in no event be\nliable for any direct or indirect, material or moral, damages of any kind, arising out of the Licence or of the use of the\nWork, including without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, loss\nof data or any commercial damage, even if the Licensor has been advised of the possibility of such damage. However,\nthe Licensor will be liable under statutory product liability laws as far such laws apply to the Work.\n\n9.Additional agreements\nWhile distributing the Work, You may choose to conclude an additional agreement, defining obligations or services\nconsistent with this Licence. However, if accepting obligations, You may act only on your own behalf and on your sole\nresponsibility, not on behalf of the original Licensor or any other Contributor, and only if You agree to indemnify,\ndefend, and hold each Contributor harmless for any liability incurred by, or claims asserted against such Contributor by\nthe fact You have accepted any warranty or additional liability.\n\n10.Acceptance of the Licence\nThe provisions of this Licence can be accepted by clicking on an icon ‘I agree’ placed under the bottom of a window\ndisplaying the text of this Licence or by affirming consent in any other similar way, in accordance with the rules of\napplicable law. Clicking on that icon indicates your clear and irrevocable acceptance of this Licence and all of its terms\nand conditions.\nSimilarly, you irrevocably accept this Licence and all of its terms and conditions by exercising any rights granted to You\nby Article 2 of this Licence, such as the use of the Work, the creation by You of a Derivative Work or the Distribution\nor Communication by You of the Work or copies thereof.\n\n11.Information to the public\nIn case of any Distribution or Communication of the Work by means of electronic communication by You (for example,\nby offering to download the Work from a remote location) the distribution channel or media (for example, a website)\nmust at least provide to the public the information requested by the applicable law regarding the Licensor, the Licence\nand the way it may be accessible, concluded, stored and reproduced by the Licensee.\n\n12.Termination of the Licence\nThe Licence and the rights granted hereunder will terminate automatically upon any breach by the Licensee of the terms\nof the Licence.\nSuch a termination will not terminate the licences of any person who has received the Work from the Licensee under\nthe Licence, provided such persons remain in full compliance with the Licence.\n\n13.Miscellaneous\nWithout prejudice of Article 9 above, the Licence represents the complete agreement between the Parties as to the\nWork.\nIf any provision of the Licence is invalid or unenforceable under applicable law, this will not affect the validity or\nenforceability of the Licence as a whole. Such provision will be construed or reformed so as necessary to make it valid\nand enforceable.\nThe European Commission may publish other linguistic versions or new versions of this Licence or updated versions of\nthe Appendix, so far this is required and reasonable, without reducing the scope of the rights granted by the Licence.\nNew versions of the Licence will be published with a unique version number.\nAll linguistic versions of this Licence, approved by the European Commission, have identical value. Parties can take\nadvantage of the linguistic version of their choice.\n\n14.Jurisdiction\nWithout prejudice to specific agreement between parties,\n— any litigation resulting from the interpretation of this License, arising between the European Union institutions,\nbodies, offices or agencies, as a Licensor, and any Licensee, will be subject to the jurisdiction of the Court of Justice\nof the European Union, as laid down in article 272 of the Treaty on the Functioning of the European Union,\n— any litigation arising between other parties and resulting from the interpretation of this License, will be subject to\nthe exclusive jurisdiction of the competent court where the Licensor resides or conducts its primary business.\n\n15.Applicable Law\nWithout prejudice to specific agreement between parties,\n— this Licence shall be governed by the law of the European Union Member State where the Licensor has his seat,\nresides or has his registered office,\n— this licence shall be governed by Belgian law if the Licensor has no seat, residence or registered office inside\na European Union Member State.\n\n\n                                                         Appendix\n\n‘Compatible Licences’ according to Article 5 EUPL are:\n— GNU General Public License (GPL) v. 2, v. 3\n— GNU Affero General Public License (AGPL) v. 3\n— Open Software License (OSL) v. 2.1, v. 3.0\n— Eclipse Public License (EPL) v. 1.0\n— CeCILL v. 2.0, v. 2.1\n— Mozilla Public Licence (MPL) v. 2\n— GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3\n— Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for works other than software\n— European Union Public Licence (EUPL) v. 1.1, v. 1.2\n— Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong Reciprocity (LiLiQ-R+).\n\nThe European Commission may update this Appendix to later versions of the above licences without producing\na new version of the EUPL, as long as they provide the rights granted in Article 2 of this Licence and protect the\ncovered Source Code from exclusive appropriation.\nAll other changes or additions to this Appendix require the production of a new EUPL version.\n"
  },
  {
    "path": "LICENSES/MIT.txt",
    "content": "MIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<!--\nSPDX-FileCopyrightText: 2023-2024 Christina Sørensen\nSPDX-FileContributor: Christina Sørensen\n\nSPDX-License-Identifier: EUPL-1.2\n-->\n\n<div align=\"center\">\n<div align=\"center\" markdown=\"1\">\n   <sup>Special thanks to:</sup>\n   <br>\n   <br>\n   <a href=\"https://www.warp.dev/eza\">\n      <img alt=\"Warp sponsorship\" width=\"400\" src=\"https://github.com/user-attachments/assets/ab8dd143-b0fd-4904-bdc5-dd7ecac94eae\">\n   </a>\n\n### [Warp, the AI terminal for developers](https://www.warp.dev/eza)\n[Available for MacOS, Linux, & Windows](https://www.warp.dev/eza)<br>\n\n</div>\n    \n# eza\n\nA modern replacement for ls.\n\n<a href=\"https://matrix.to/#/#eza-community:gitter.im\"><img alt=\"Gitter\" src=\"https://img.shields.io/gitter/room/eza-community/eza?logo=element&link=https%3A%2F%2Fapp.gitter.im%2F%23%2Froom%2F%23eza%3Agitter.im&link=Gitter%20matrix%20room%20for%20Eza\" width=200></a>\n\n[![Built with Nix](https://img.shields.io/badge/Built_With-Nix-5277C3.svg?logo=nixos&labelColor=73C3D5)](https://nixos.org)\n[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)\n\n[![Unit tests](https://github.com/eza-community/eza/actions/workflows/unit-tests.yml/badge.svg)](https://github.com/eza-community/eza/actions/workflows/unit-tests.yml)\n[![Crates.io](https://img.shields.io/crates/v/eza?link=https%3A%2F%2Fcrates.io%2Fcrates%2Feza)](https://crates.io/crates/eza)\n![Crates.io](https://img.shields.io/crates/l/eza?link=https%3A%2F%2Fgithub.com%2Feza-community%2Feza%2Fblob%2Fmain%2FLICENCE)\n\n</div>\n\n![eza demo gif](docs/images/screenshots.png)\n\n---\n\n**eza** is a modern alternative for the venerable file-listing command-line program `ls` that ships with Unix and Linux operating systems, giving it more features and better defaults.\nIt uses colours to distinguish file types and metadata.\nIt knows about symlinks, extended attributes, and Git.\nAnd it’s **small**, **fast**, and just **one single binary**.\n\nBy deliberately making some decisions differently, eza attempts to be a more featureful, more user-friendly version of `ls`.\n\n---\n\n**eza** features not in exa (non-exhaustive):\n\n- Fixes [“The Grid Bug”](https://github.com/eza-community/eza/issues/66#issuecomment-1656758327) introduced in exa 2021.\n- Hyperlink support.\n- Mount point details.\n- Selinux context output.\n- Git repo status output.\n- Human readable relative dates.\n- Several security fixes.\n- Support for `bright` terminal colours.\n- Many smaller bug fixes/changes!\n- Configuration `theme.yml` file for customization of colors and icons.\n\n...and like, so much more that it became exhausting to update this all the time.\nLike seriously, we have a lot of good stuff.\n\n---\n\n<a id=\"try-it\">\n<h1>Try it!</h1>\n</a>\n\n### Nix ❄️\n\nIf you already have Nix setup with flake support, you can try out eza with the `nix run` command:\n\n    nix run github:eza-community/eza\n\nNix will build eza and run it.\n\nIf you want to pass arguments this way, use e.g. `nix run github:eza-community/eza -- -ol`.\n\n# Installation\n\neza is available for Windows, macOS and Linux. Platform and distribution\nspecific installation instructions can be found in [INSTALL.md](INSTALL.md).\n\n[![Packaging status](https://repology.org/badge/vertical-allrepos/eza.svg?columns=3)](https://repology.org/project/eza/versions)\n\n---\n\n<a id=\"options\">\n<h1>Command-line options</h1>\n</a>\n\neza’s options are almost, but not quite, entirely unlike `ls`’s. Quick overview:\n\n## Display options\n\n<details>\n<summary>Click to expand</summary>\n\n- **-1**, **--oneline**: display one entry per line\n- **-G**, **--grid**: display entries as a grid (default)\n- **-l**, **--long**: display extended details and attributes\n- **-R**, **--recurse**: recurse into directories\n- **-T**, **--tree**: recurse into directories as a tree\n- **-x**, **--across**: sort the grid across, rather than downwards\n- **-F**, **--classify=(when)**: display type indicator by file names (always, auto, never)\n- **--colo[u]r=(when)**: when to use terminal colours (always, auto, never)\n- **--colo[u]r-scale=(field)**: highlight levels of `field` distinctly(all, age, size)\n- **--color-scale-mode=(mode)**: use gradient or fixed colors in --color-scale. valid options are `fixed` or `gradient`\n- **--icons=(when)**: when to display icons (always, auto, never)\n- **--hyperlink**: display entries as hyperlinks\n- **--absolute=(mode)**: display entries with their absolute path (on, follow, off)\n- **-w**, **--width=(columns)**: set screen width in columns\n\n</details>\n\n## Filtering options\n\n<details>\n<summary>Click to expand</summary>\n\n- **-a**, **--all**: show hidden and 'dot' files\n- **-d**, **--treat-dirs-as-files**: list directories like regular files\n- **-L**, **--level=(depth)**: limit the depth of recursion\n- **-r**, **--reverse**: reverse the sort order\n- **-s**, **--sort=(field)**: which field to sort by\n- **--group-directories-first**: list directories before other files\n- **--group-directories-last**: list directories after other files\n- **-D**, **--only-dirs**: list only directories\n- **-f**, **--only-files**: list only files\n- **--no-symlinks**: don't show symbolic links\n- **--show-symlinks**: explicitly show links (with `--only-dirs`, `--only-files`, to show symlinks that match the filter)\n- **--git-ignore**: ignore files mentioned in `.gitignore`\n- **-I**, **--ignore-glob=(globs)**: glob patterns (pipe-separated) of files to ignore\n\nPass the `--all` option twice to also show the `.` and `..` directories.\n\n</details>\n\n## Long view options\n\n<details>\n<summary>Click to expand</summary>\n\nThese options are available when running with `--long` (`-l`):\n\n- **-b**, **--binary**: list file sizes with binary prefixes\n- **-B**, **--bytes**: list file sizes in bytes, without any prefixes\n- **-g**, **--group**: list each file’s group\n- **--smart-group**: only show group if it has a different name from owner\n- **-h**, **--header**: add a header row to each column\n- **-H**, **--links**: list each file’s number of hard links\n- **-i**, **--inode**: list each file’s inode number\n- **-m**, **--modified**: use the modified timestamp field\n- **-M**, **--mounts**: Show mount details (Linux and MacOS only).\n- **-S**, **--blocksize**: show size of allocated file system blocks\n- **-t**, **--time=(field)**: which timestamp field to use\n- **-u**, **--accessed**: use the accessed timestamp field\n- **-U**, **--created**: use the created timestamp field\n- **-X**, **--dereference**: dereference symlinks for file information\n- **-Z**, **--context**: list each file’s security context\n- **-@**, **--extended**: list each file’s extended attributes and sizes\n- **--changed**: use the changed timestamp field\n- **--git**: list each file’s Git status, if tracked or ignored\n- **--git-repos**: list each directory’s Git status, if tracked\n- **--git-repos-no-status**: list whether a directory is a Git repository, but not its status (faster)\n- **--no-git**: suppress Git status (always overrides `--git`, `--git-repos`, `--git-repos-no-status`)\n- **--time-style**: how to format timestamps. valid timestamp styles are ‘`default`’, ‘`iso`’, ‘`long-iso`’, ‘`full-iso`’, ‘`relative`’, or a custom style ‘`+<FORMAT>`’ (E.g., ‘`+%Y-%m-%d %H:%M`’ => ‘`2023-09-30 13:00`’. For more specifications on the format string, see the _`eza(1)` manual page_ and [chrono documentation](https://docs.rs/chrono/latest/chrono/format/strftime/index.html).).\n- **--total-size**: show recursive directory size\n- **--no-permissions**: suppress the permissions field\n- **-o**, **--octal-permissions**: list each file's permission in octal format\n- **--no-filesize**: suppress the filesize field\n- **--no-user**: suppress the user field\n- **--no-time**: suppress the time field\n- **--stdin**: read file names from stdin\n\nSome of the options accept parameters:\n\n- Valid **--colo\\[u\\]r** options are **always**, **automatic** (or **auto** for short), and **never**.\n- Valid sort fields are **accessed**, **changed**, **created**, **extension**, **Extension**, **inode**, **modified**, **name**, **Name**, **size**, **type**, and **none**. Fields starting with a capital letter sort uppercase before lowercase. The modified field has the aliases **date**, **time**, and **newest**, while its reverse has the aliases **age** and **oldest**.\n- Valid time fields are **modified**, **changed**, **accessed**, and **created**.\n- Valid time styles are **default**, **iso**, **long-iso**, **full-iso**, and **relative**.\n\n\n\nSee the `man` pages for further documentation of usage. They are available\n- online [in the repo](https://github.com/eza-community/eza/tree/main/man)\n- in your terminal via `man eza`, as of version [`[0.18.13] - 2024-04-25`](https://github.com/eza-community/eza/blob/main/CHANGELOG.md#01813---2024-04-25)\n</details>\n\n\n## Custom Themes\n<details>\n<summary>Click to expand</summary>\n\n**Eza** has recently added support for a `theme.yml` file, where you can specify all of the existing theme-ing options\navailable for the `LS_COLORS` and `EXA_COLORS` environment variables, as well as the option to specify different icons\nfor different file types and extensions. Any existing environment variables set will continue to work and will take\nprecedence for backwards compatibility.\n\n#### **New** Pre-made themes\nCheck out the themes available in the official [eza-themes](https://github.com/eza-community/eza-themes) repository, or contribute your own.\n\nAn example theme file is available in `docs/theme.yml`, and needs to either be placed in a directory specified by the \nenvironment variable `EZA_CONFIG_DIR`, or will looked for by default in `$XDG_CONFIG_HOME/eza`.\n\nFull details are available on the [man page](https://github.com/eza-community/eza/tree/main/man/eza_colors-explanation.5.md) and an example theme file is included [here](https://github.com/eza-community/eza/tree/main/docs/theme.yml)\n\n</details>\n\n\n# Hacking on eza\n\nIf you wanna contribute to eza, firstly, you're expected to follow our \n[code of conduct](https://github.com/eza-community/eza/blob/main/CODE_OF_CONDUCT.md). \nAfter having understood the code of conduct, you can have a look at our\n[CONTRIBUTING.md](https://github.com/eza-community/eza/blob/main/CONTRIBUTING.md) \nfor more info about actual hacking.\n\n[![Star History Chart](https://api.star-history.com/svg?repos=eza-community/eza&type=Date)](https://star-history.com/#eza-community/eza&Date)\n"
  },
  {
    "path": "REUSE.toml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n#\n# SPDX-License-Identifier: EUPL-1.2\n\nversion = 1\nSPDX-PackageName = \"eza\"\nSPDX-PackageSupplier = \"Christina Sørensen <christina@cafkafk.com>\"\n\n[[annotations]]\npath = \"flake.lock\"\nprecedence = \"aggregate\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n\n[[annotations]]\npath = \"Cargo.lock\"\nprecedence = \"aggregate\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n\n[[annotations]]\npath = \".envrc\"\nprecedence = \"aggregate\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n\n[[annotations]]\npath = \"tests/**\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n\n[[annotations]]\npath = \"completions/**\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n\n[[annotations]]\npath = \"man/**\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n\n[[annotations]]\npath = \"deb.asc\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n\n[[annotations]]\npath = \"devtools/**\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n\n[[annotations]]\npath = \"docs/**\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n\n[[annotations]]\npath = \".github/**.md\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n\n# pre-commit-hooks.nix cause these to appear in commit check:(\n\n[[annotations]]\npath = \".cache/pre-commit/README\"\nprecedence = \"aggregate\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n\n[[annotations]]\npath = \".cache/pre-commit/db.db\"\nprecedence = \"aggregate\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n\n[[annotations]]\npath = \".gitconfig\"\nprecedence = \"aggregate\"\nSPDX-FileCopyrightText = \"2024 Christina Sørensen\"\nSPDX-License-Identifier = \"EUPL-1.2\"\n"
  },
  {
    "path": "SECURITY.md",
    "content": "<!--\nSPDX-FileCopyrightText: 2023-2024 Christina Sørensen\nSPDX-FileContributor: Christina Sørensen\n\nSPDX-License-Identifier: EUPL-1.2\n-->\n# Security Policy\n\n## Supported Versions\n\nThis section shows which versions of eza are\ncurrently being supported with security updates.\n\n| Version | Supported          |\n| ------- | ------------------ |\n| latest    | :white_check_mark: |\n| < 0.10.6  | :x:                |\n\n## Reporting a Vulnerability\n\nPlease email all vulnerabilities to christina@cafkafk.com, with PGP encryption and signature, and ideally send along plaintext public key or instructions on where to find public key (keyserver etc.). \n"
  },
  {
    "path": "TESTING.md",
    "content": "<!--\nSPDX-FileCopyrightText: 2024 Christina Sørensen, Martin Fillon\nSPDX-FileContributor: Christina Sørensen\n\nSPDX-License-Identifier: EUPL-1.2\n-->\n# Testing eza\n\n## Running tests\n\nIn order to run the tests in eza you need:\n- [just](https://github.com/casey/just)\n- [nix](https://nixos.org)\n\nthen either run:\n- `just itest`\n- `nix build -L trycmd-local`\n\n## Modifying tests\n\nIn order to test your changes on eza, you will need to do one or multiple things in different cases.\nYou will need the additional tool\n- [powertest](https://github.com/eza-community/powertest)\n\nYou will also need to modify the `devtools/dir-generator.sh` file if you want to add some test cases\n\n### You added/modified an option\n\nPlease run `just regen` to regenerate powertesting. Then look into `tests/gen` or `tests/cmd` for any tests not passing\n\n### You changed the output of eza\n\nPlease run `nix build -L trydump` or `just idump`\nAnd lookout for any test no longer passing\n"
  },
  {
    "path": "benches/my_benchmark.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse std::hint::black_box;\n\nuse criterion::{Criterion, criterion_group, criterion_main};\n\npub fn criterion_benchmark(c: &mut Criterion) {\n    c.bench_function(\"logger\", |b| {\n        b.iter(|| {\n            eza::logger::configure(black_box(std::env::var_os(eza::options::vars::EZA_DEBUG)));\n        });\n    });\n}\n\ncriterion_group!(benches, criterion_benchmark);\ncriterion_main!(benches);\n"
  },
  {
    "path": "build.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n/// The version string isn’t the simplest: we want to show the version,\n/// current Git hash, and compilation date when building *debug* versions, but\n/// just the version for *release* versions so the builds are reproducible.\n///\n/// This script generates the string from the environment variables that Cargo\n/// adds (<http://doc.crates.io/environment-variables.html>) and runs `git` to\n/// get the SHA1 hash. It then writes the string into a file, which exa then\n/// includes at build-time.\n///\n/// - <https://stackoverflow.com/q/43753491/3484614>\n/// - <https://crates.io/crates/vergen>\nuse std::env;\nuse std::fs::File;\nuse std::io::{self, Write};\nuse std::path::PathBuf;\n\nuse chrono::prelude::*;\n\n/// The build script entry point.\nfn main() -> io::Result<()> {\n    #![allow(clippy::write_with_newline)]\n\n    let tagline = \"eza - A modern, maintained replacement for ls\";\n    let url = \"https://github.com/eza-community/eza\";\n\n    let ver = if is_debug_build() {\n        format!(\n            \"{}\\nv{} \\\\1;31m(pre-release debug build!)\\\\0m\\n\\\\1;4;34m{}\\\\0m\",\n            tagline,\n            version_string(),\n            url\n        )\n    } else if is_development_version() {\n        format!(\n            \"{}\\nv{} [{}] built on {} \\\\1;31m(pre-release!)\\\\0m\\n\\\\1;4;34m{}\\\\0m\",\n            tagline,\n            version_string(),\n            git_hash(),\n            build_date(),\n            url\n        )\n    } else {\n        format!(\"{}\\nv{}\\n\\\\1;4;34m{}\\\\0m\", tagline, version_string(), url)\n    };\n\n    // We need to create these files in the Cargo output directory.\n    let out = PathBuf::from(env::var(\"OUT_DIR\").unwrap());\n    let path = &out.join(\"version_string.txt\");\n\n    // Bland version text\n    let mut f =\n        File::create(path).unwrap_or_else(|_| panic!(\"{}\", path.to_string_lossy().to_string()));\n    writeln!(f, \"{}\", strip_codes(&ver))?;\n\n    Ok(())\n}\n\n/// Removes escape codes from a string.\nfn strip_codes(input: &str) -> String {\n    input\n        .replace(\"\\\\0m\", \"\")\n        .replace(\"\\\\1;31m\", \"\")\n        .replace(\"\\\\1;4;34m\", \"\")\n}\n\n/// Retrieve the project’s current Git hash, as a string.\nfn git_hash() -> String {\n    use std::process::Command;\n\n    String::from_utf8_lossy(\n        &Command::new(\"git\")\n            .args([\"rev-parse\", \"--short\", \"HEAD\"])\n            .output()\n            .unwrap()\n            .stdout,\n    )\n    .trim()\n    .to_string()\n}\n\n/// Whether we should show pre-release info in the version string.\n///\n/// Both weekly releases and actual releases are --release releases,\n/// but actual releases will have a proper version number.\nfn is_development_version() -> bool {\n    cargo_version().ends_with(\"-pre\") || env::var(\"PROFILE\").unwrap() == \"debug\"\n}\n\n/// Whether we are building in debug mode.\nfn is_debug_build() -> bool {\n    env::var(\"PROFILE\").unwrap() == \"debug\"\n}\n\n/// Retrieves the [package] version in Cargo.toml as a string.\nfn cargo_version() -> String {\n    env::var(\"CARGO_PKG_VERSION\").unwrap()\n}\n\n/// Returns the version and build parameters string.\nfn version_string() -> String {\n    let mut ver = cargo_version();\n\n    let feats = nonstandard_features_string();\n    if !feats.is_empty() {\n        ver.push_str(&format!(\" [{}]\", &feats));\n    }\n\n    ver\n}\n\n/// Finds whether a feature is enabled by examining the Cargo variable.\nfn feature_enabled(name: &str) -> bool {\n    env::var(format!(\"CARGO_FEATURE_{name}\"))\n        .map(|e| !e.is_empty())\n        .unwrap_or(false)\n}\n\n/// A comma-separated list of non-standard feature choices.\nfn nonstandard_features_string() -> String {\n    let mut s = Vec::new();\n\n    if feature_enabled(\"GIT\") {\n        s.push(\"+git\");\n    } else {\n        s.push(\"-git\");\n    }\n\n    s.join(\", \")\n}\n\n/// Formats the current date as an ISO 8601 string.\nfn build_date() -> String {\n    let now = Local::now();\n    now.date_naive().format(\"%Y-%m-%d\").to_string()\n}\n"
  },
  {
    "path": "completions/bash/eza",
    "content": "# shellcheck shell=bash\n_eza() {\n    cur=${COMP_WORDS[COMP_CWORD]}\n    prev=${COMP_WORDS[COMP_CWORD-1]}\n\n    case \"$prev\" in\n        --help|-v|--version|--smart-group)\n            return\n            ;;\n\n        --colour)\n            mapfile -t COMPREPLY < <(compgen -W 'always automatic auto never' -- \"$cur\")\n            return\n            ;;\n\n        --icons)\n            mapfile -t COMPREPLY < <(compgen -W 'always automatic auto never' -- \"$cur\")\n            return\n            ;;\n\n        -L|--level)\n            mapfile -t COMPREPLY < <(compgen -W '{0..9}' -- \"$cur\")\n            return\n            ;;\n\n        -s|--sort)\n            mapfile -t COMPREPLY < <(compgen -W 'name filename Name Filename size filesize extension Extension date time modified changed accessed created type inode oldest newest age none --' -- \"$cur\")\n            return\n            ;;\n\n        -t|--time)\n            mapfile -t COMPREPLY < <(compgen -W 'modified changed accessed created --' -- \"$cur\")\n            return\n            ;;\n\n        --time-style)\n            mapfile -t COMPREPLY < <(compgen -W 'default iso long-iso full-iso relative +FORMAT --' -- \"$cur\")\n            return\n            ;;\n\n        --color-scale)\n            mapfile -t COMPREPLY < <(compgen -W 'all age size --' -- \"$cur\")\n            return\n            ;;\n\n        --color-scale-mode)\n            mapfile -t COMPREPLY < <(compgen -W 'fixed gradient --' -- \"$cur\")\n            return\n            ;;\n\n        --absolute)\n            mapfile -t COMPREPLY < <(compgen -W 'on follow off --' -- \"$cur\")\n            return\n            ;;\n    esac\n\n    case \"$cur\" in\n        # _parse_help doesn’t pick up short options when they are on the same line than long options\n        --*)\n            # colo[u]r isn’t parsed correctly so we filter these options out and add them by hand\n            parse_help=$(eza --help | grep -oE ' (--[[:alnum:]@-]+)' | tr -d ' ' | grep -v '\\--colo')\n            completions=$(echo '--color --colour --color-scale --colour-scale --color-scale-mode --colour-scale-mode' \"$parse_help\")\n            mapfile -t COMPREPLY < <(compgen -W \"$completions\" -- \"$cur\")\n            ;;\n\n        -*)\n            completions=$(eza --help | grep -oE ' (-[[:alnum:]@])' | tr -d ' ')\n            mapfile -t COMPREPLY < <(compgen -W \"$completions\" -- \"$cur\")\n            ;;\n\n        *)\n            _filedir\n            ;;\n    esac\n} &&\ncomplete -o filenames -o bashdefault -F _eza eza\n"
  },
  {
    "path": "completions/fish/eza.fish",
    "content": "# Meta-stuff\ncomplete -c eza -s v -l version -d \"Show version of eza\"\ncomplete -c eza -l help -d \"Show list of command-line options\"\n\n# Display options\ncomplete -c eza -s 1 -l oneline -d \"Display one entry per line\"\ncomplete -c eza -s l -l long -d \"Display extended file metadata as a table\"\ncomplete -c eza -s G -l grid -d \"Display entries in a grid\"\ncomplete -c eza -s x -l across -d \"Sort the grid across, rather than downwards\"\ncomplete -c eza -s R -l recurse -d \"Recurse into directories\"\ncomplete -c eza -s T -l tree -d \"Recurse into directories as a tree\"\ncomplete -c eza -s X -l dereference -d \"Dereference symbolic links when displaying file information\"\ncomplete -c eza -s F -l classify -d \"Display type indicator by file names\"\ncomplete -c eza -l color \\\n    -l colour -d \"When to use terminal colours\" -x -a \"\n    always\\t'Always use colour'\n    auto\\t'Use colour if standard output is a terminal'\n    automatic\\t'Use colour if standard output is a terminal'\n    never\\t'Never use colour'\n\"\ncomplete -c eza -l color-scale \\\n    -l colour-scale -d \"Highlight levels 'field' distinctly\" -x -a \"\n    all\\t''\n    age\\t''\n    size\\t''\n\"\ncomplete -c eza -l color-scale-mode \\\n    -l colour-scale-mode \\\n    -d \"Use gradient or fixed colors in --color-scale\" -x -a \"\n    fixed\\t'Highlight based on fixed colors'\n    gradient\\t'Highlight based \\'field\\' in relation to other files'\n\"\ncomplete -c eza -l icons -d \"When to display icons\" -x -a \"\n  always\\t'Always display icons'\n  auto\\t'Display icons if standard output is a terminal'\n  automatic\\t'Display icons if standard output is a terminal'\n  never\\t'Never display icons'\n\"\ncomplete -c eza -l no-quotes -d \"Don't quote file names with spaces\"\ncomplete -c eza -l hyperlink -d \"Display entries as hyperlinks\"\ncomplete -c eza -l follow-symlinks -d \"Drill down into symbolic links that point to directories\"\ncomplete -c eza -l absolute -d \"Display entries with their absolute path\" -x -a \"\n  on\\t'Show absolute path for listed entries'\n  follow\\t'Show absolute path with followed symlinks'\n  off\\t'Do not show the absolute path'\n\"\ncomplete -c eza -l smart-group -d \"Only show group if it has a different name from owner\"\n\n# Filtering and sorting options\ncomplete -c eza -l group-directories-first -d \"Sort directories before other files\"\ncomplete -c eza -l group-directories-last -d \"Sort directories after other files\"\ncomplete -c eza -l git-ignore -d \"Ignore files mentioned in '.gitignore'\"\ncomplete -c eza -s a -l all -d \"Show hidden and 'dot' files. Use this twice to also show the '.' and '..' directories\"\ncomplete -c eza -s A -l almost-all -d \"Equivalent to --all; included for compatibility with `ls -A`\"\ncomplete -c eza -s d -l treat-dirs-as-files -d \"List directories like regular files\"\ncomplete -c eza -s L -l level -d \"Limit the depth of recursion\" -x -a \"1 2 3 4 5 6 7 8 9\"\ncomplete -c eza -s w -l width -d \"Limits column output of grid, 0 implies auto-width\"\ncomplete -c eza -s r -l reverse -d \"Reverse the sort order\"\ncomplete -c eza -s s -l sort -d \"Which field to sort by\" -x -a \"\n    accessed\\t'Sort by file accessed time'\n    age\\t'Sort by file modified time (newest first)'\n    changed\\t'Sort by changed time'\n    created\\t'Sort by file modified time'\n    date\\t'Sort by file modified time'\n    ext\\t'Sort by file extension'\n    Ext\\t'Sort by file extension (uppercase first)'\n    extension\\t'Sort by file extension'\n    Extension\\t'Sort by file extension (uppercase first)'\n    filename\\t'Sort by filename'\n    Filename\\t'Sort by filename (uppercase first)'\n    inode\\t'Sort by file inode'\n    modified\\t'Sort by file modified time'\n    name\\t'Sort by filename'\n    Name\\t'Sort by filename (uppercase first)'\n    newest\\t'Sort by file modified time (newest first)'\n    none\\t'Do not sort files at all'\n    oldest\\t'Sort by file modified time'\n    size\\t'Sort by file size'\n    time\\t'Sort by file modified time'\n    type\\t'Sort by file type'\n\"\n\ncomplete -c eza -s I -l ignore-glob -d \"Ignore files that match these glob patterns\" -r\ncomplete -c eza -s D -l only-dirs -d \"List only directories\"\ncomplete -c eza -s f -l only-files -d \"List only files\"\ncomplete -c eza -l show-symlinks -d \"Explicitly show symbolic links (For use with --only-dirs | --only-files)\"\ncomplete -c eza -l no-symlinks -d \"Do not show symbolic links\"\n\n# Long view options\ncomplete -c eza -s b -l binary -d \"List file sizes with binary prefixes\"\ncomplete -c eza -s B -l bytes -d \"List file sizes in bytes, without any prefixes\"\ncomplete -c eza -s g -l group -d \"List each file's group\"\ncomplete -c eza -s h -l header -d \"Add a header row to each column\"\ncomplete -c eza -s H -l links -d \"List each file's number of hard links\"\ncomplete -c eza -s i -l inode -d \"List each file's inode number\"\ncomplete -c eza -s S -l blocksize -d \"List each file's size of allocated file system blocks\"\ncomplete -c eza -s t -l time -d \"Which timestamp field to list\" -x -a \"\n    modified\\t'Display modified time'\n    changed\\t'Display changed time'\n    accessed\\t'Display accessed time'\n    created\\t'Display created time'\n\"\ncomplete -c eza -s m -l modified -d \"Use the modified timestamp field\"\ncomplete -c eza -s n -l numeric -d \"List numeric user and group IDs.\"\ncomplete -c eza -l changed -d \"Use the changed timestamp field\"\ncomplete -c eza -s u -l accessed -d \"Use the accessed timestamp field\"\ncomplete -c eza -s U -l created -d \"Use the created timestamp field\"\ncomplete -c eza -l time-style -d \"How to format timestamps\" -x -a \"\n    default\\t'Use the default time style'\n    iso\\t'Display brief ISO timestamps'\n    long-iso\\t'Display longer ISO timestamps, up to the minute'\n    full-iso\\t'Display full ISO timestamps, up to the nanosecond'\n    relative\\t'Display relative timestamps'\n    +FORMAT\\t'Use custom time style'\n\"\ncomplete -c eza -l total-size -d \"Show recursive directory size (unix only)\"\ncomplete -c eza -l no-permissions -d \"Suppress the permissions field\"\ncomplete -c eza -s o -l octal-permissions -d \"List each file's permission in octal format\"\ncomplete -c eza -l no-filesize -d \"Suppress the filesize field\"\ncomplete -c eza -l no-user -d \"Suppress the user field\"\ncomplete -c eza -l no-time -d \"Suppress the time field\"\ncomplete -c eza -s M -l mounts -d \"Show mount details\"\ncomplete -c eza -l stdin -d \"When piping to eza. Read file names from stdin\"\n\n# Optional extras\ncomplete -c eza -l git -d \"List each file's Git status, if tracked\"\ncomplete -c eza -l no-git -d \"Suppress Git status\"\ncomplete -c eza -l git-repos -d \"List each git-repos status and branch name\"\ncomplete -c eza -l git-repos-no-status -d \"List each git-repos branch name (much faster)\"\ncomplete -c eza -s '@' -l extended -d \"List each file's extended attributes and sizes\"\ncomplete -c eza -s Z -l context -d \"List each file's security context\"\n"
  },
  {
    "path": "completions/nush/eza.nu",
    "content": "export extern \"eza\" [\n    --version(-v)              # Show version of eza\n    --help                     # Show list of command-line options\n    --oneline(-1)              # Display one entry per line\n    --long(-l)                 # Display extended file metadata as a table\n    --grid(-G)                 # Display entries in a grid\n    --across(-x)               # Sort the grid across, rather than downwards\n    --recurse(-R)              # Recurse into directories\n    --tree(-T)                 # Recurse into directories as a tree\n    --dereference(-X)          # Dereference symbolic links when displaying file information\n    --classify(-F)             # Display type indicator by file names\n    --color                    # When to use terminal colours\n    --colour                   # When to use terminal colours\n    --color-scale              # Highlight levels of file sizes distinctly\n    --colour-scale             # Highlight levels of file sizes distinctly\n    --color-scale-mode         # Use gradient or fixed colors in --color-scale\n    --colour-scale-mode        # Use gradient or fixed colors in --colour-scale\n    --icons                    # When to display icons\n    --no-quotes                # Don't quote file names with spaces\n    --hyperlink                # Display entries as hyperlinks\n    --absolute                 # Display entries with their absolute path\n    --follow-symlinks          # Drill down into symbolic links that point to directories\n    --group-directories-first  # Sort directories before other files\n    --group-directories-last   # Sort directories after other files\n    --git-ignore               # Ignore files mentioned in '.gitignore'\n    --all(-a)                  # Show hidden and 'dot' files. Use this twice to also show the '.' and '..' directories\n    --almost-all(-A)           # Equivalent to --all; included for compatibility with `ls -A`\n    --treat-dirs-as-files(-d)  # List directories like regular files\n    --level(-L): string        # Limit the depth of recursion\n    --width(-w)                # Limits column output of grid, 0 implies auto-width\n    --reverse(-r)              # Reverse the sort order\n    --sort(-s)                 # Which field to sort by\n    --only-dirs(-D)            # List only directories\n    --only-files(-f)           # List only files\n    --show-symlinks            # Explicitly show symbolic links (for use with --only-dirs | --only-files)\n    --no-symlinks              # Do not show symbolic links\n    --binary(-b)               # List file sizes with binary prefixes\n    --bytes(-B)                # List file sizes in bytes, without any prefixes\n    --group(-g)                # List each file's group\n    --header(-h)               # Add a header row to each column\n    --links(-H)                # List each file's number of hard links\n    --inode(-i)                # List each file's inode number\n    --blocksize(-S)            # List each file's size of allocated file system blocks\n    --time(-t) -d              # Which timestamp field to list\n    --modified(-m)             # Use the modified timestamp field\n    --numeric(-n)              # List numeric user and group IDs.\n    --changed                  # Use the changed timestamp field\n    --accessed(-u)             # Use the accessed timestamp field\n    --created(-U)              # Use the created timestamp field\n    --time-style               # How to format timestamps\n    --total-size               # Show recursive directory size (unix only)\n    --no-permissions           # Suppress the permissions field\n    --octal-permissions(-o)    # List each file's permission in octal format\n    --no-filesize              # Suppress the filesize field\n    --no-user                  # Suppress the user field\n    --no-time                  # Suppress the time field\n    --mounts(-M)               # Show mount details\n    --git                      # List each file's Git status, if tracked\n    --no-git                   # Suppress Git status\n    --git-repos                # List each git-repos status and branch name\n    --git-repos-no-status      # List each git-repos branch name (much faster)\n    --extended(-@)             # List each file's extended attributes and sizes\n    --context(-Z)              # List each file's security context\n    --smart-group              # Only show group if it has a different name from owner\n    --stdin                    # When piping to eza. Read file paths from stdin\n]\n"
  },
  {
    "path": "completions/pwsh/_eza.ps1",
    "content": "using namespace System.Management.Automation\nusing namespace System.Management.Automation.Language\n\nRegister-ArgumentCompleter -Native -CommandName 'eza' -ScriptBlock {\n    param($wordToComplete, $commandAst, $cursorPosition)\n\n    $ArrayWhen           = @('always', 'auto', 'never')\n    $ArraySort           = @('name', 'extension', 'size', 'type', 'created', 'modified', 'accessed', 'changed', 'inode', 'none')\n    $ArrayColorScaleMode = @('fixed', 'gradient')\n    $ArrayColorScale     = @('all', 'age', 'size')\n    $ArrayAbsolute       = @('on', 'follow', 'off')\n    $ArrayTime           = @('modified', 'accessed', 'created')\n    $ArrayTimeStyle      = @('default', 'iso', 'long-iso', 'full-iso', 'relative', '+%Y-%m-%d %H:%M', '+%Y.%m.%d %H:$M:$s')\n\n    $commandElements = $commandAst.CommandElements\n    $command = @(\n        'eza'\n        for ($i = 1; $i -lt $commandElements.Count; $i++) {\n            $element = $commandElements[$i]\n            if ($element -isnot [StringConstantExpressionAst] -or\n                $element.StringConstantType -ne [StringConstantType]::BareWord -or\n                $element.Value -eq $wordToComplete) {\n                break\n        }\n        $element.Value\n    }) -join ';'\n\n    $completions = @(switch  -Wildcard ($command) {\n        '*;--help' {\n            break\n        }\n        '*;--version' {\n            break\n        }\n        '*;--absolute' {\n            $ArrayAbsolute | \n            ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, \"ParameterValue\", $_)}\n            break\n        }\n        '*;--sort' {\n            $ArraySort | \n            ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, \"ParameterValue\", $_)}\n            break\n        }\n        '*;--color-scale' {\n            $ArrayColorScale | \n            ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, \"ParameterValue\", $_)}\n            break\n        }\n        '*;--color-scale-mode' {\n            $ArrayColorScaleMode | \n            ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, \"ParameterValue\", $_)}\n            break\n        }\n        '*--long;*--time-style' {\n            $ArrayTimeStyle | \n            ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, \"ParameterValue\", $_)}\n            break\n        }\n        '*--long;*--time' {\n            $ArrayTime | \n            ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, \"ParameterValue\", $_)}\n            break\n        }\n        '*;--classify' {\n            $ArrayWhen | \n            ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, \"ParameterValue\", $_)}\n            break\n        }\n        '*;--color' {\n            $ArrayWhen | \n            ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, \"ParameterValue\", $_)}\n            break\n        }\n        '*;--icons' {\n            $ArrayWhen | \n            ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, \"ParameterValue\", $_)}\n            break\n        }\n        '*;--all' {\n            [CompletionResult]::new('--show-symlinks'            ,'listfilessyl'        , [CompletionResultType]::ParameterName, 'explicitly show symbolic links (for use with --only-dirs | --only-files)')\n            [CompletionResult]::new('--no-symlinks'              ,'listfilessyl'        , [CompletionResultType]::ParameterName, 'do not show symbolic links')\n            break\n        }\n        '*long*' {\n        #   [CompletionResult]::new('-b'                         ,'binary'              , [CompletionResultType]::ParameterName, 'list file sizes with binary prefixes')\n            [CompletionResult]::new('--binary'                   ,'binary'              , [CompletionResultType]::ParameterName, 'list file sizes with binary prefixes')\n        #   [CompletionResult]::new('-B'                         ,'bytes'               , [CompletionResultType]::ParameterName, 'list file sizes in bytes, without any prefixes')\n            [CompletionResult]::new('--bytes'                    ,'bytes'               , [CompletionResultType]::ParameterName, 'list file sizes in bytes, without any prefixes') \n        #   [CompletionResult]::new('-g'                         ,'group'               , [CompletionResultType]::ParameterName, 'list each file''s group')\n            [CompletionResult]::new('--smart-group'              ,'smart-group'         , [CompletionResultType]::ParameterName, 'only show group if it has a different name from owner') \n            [CompletionResult]::new('--group'                    ,'group'               , [CompletionResultType]::ParameterName, 'list each file''s group')\n        #   [CompletionResult]::new('-h'                         ,'header'              , [CompletionResultType]::ParameterName, 'add a header row to each column')\n            [CompletionResult]::new('--header'                   ,'header'              , [CompletionResultType]::ParameterName, 'add a header row to each column') \n        #   [CompletionResult]::new('-H'                         ,'links'               , [CompletionResultType]::ParameterName, 'list each file''s number of hard links')\n            [CompletionResult]::new('--links'                    ,'links'               , [CompletionResultType]::ParameterName, 'list each file''s number of hard links') \n        #   [CompletionResult]::new('-i'                         ,'inode'               , [CompletionResultType]::ParameterName, 'list each file''s inode number')\n            [CompletionResult]::new('--inode'                    ,'inode'               , [CompletionResultType]::ParameterName, 'list each file''s inode number') \n        #   [CompletionResult]::new('-M'                         ,'mounts'              , [CompletionResultType]::ParameterName, 'show mount details (Linux and Mac only)')\n        #   [CompletionResult]::new('--mounts'                   ,'mounts'              , [CompletionResultType]::ParameterName, 'show mount details (Linux and Mac only)') \n        #   [CompletionResult]::new('-n'                         ,'numeric'             , [CompletionResultType]::ParameterName, 'list numeric user and group IDs')\n            [CompletionResult]::new('--numeric'                  ,'numeric'             , [CompletionResultType]::ParameterName, 'list numeric user and group IDs') \n        #   [CompletionResult]::new('-O'                         ,'flags'               , [CompletionResultType]::ParameterName, 'list file flags (Mac, BSD, and Windows only)')\n            [CompletionResult]::new('--flags'                    ,'flags'               , [CompletionResultType]::ParameterName, 'list file flags (Mac, BSD, and Windows only)') \n        #   [CompletionResult]::new('-S'                         ,'blocksize'           , [CompletionResultType]::ParameterName, 'show size of allocated file system blocks')\n            [CompletionResult]::new('--blocksize'                ,'blocksize'           , [CompletionResultType]::ParameterName, 'show size of allocated file system blocks') \n        #   [CompletionResult]::new('-t'                         ,'time'                , [CompletionResultType]::ParameterName, 'which timestamp field to list (modified, accessed, created)')\n            [CompletionResult]::new('--time'                     ,'time'                , [CompletionResultType]::ParameterName, 'which timestamp field to list (modified, accessed, created)') \n        #   [CompletionResult]::new('-m'                         ,'modified'            , [CompletionResultType]::ParameterName, 'use the modified timestamp field')\n            [CompletionResult]::new('--modified'                 ,'modified'            , [CompletionResultType]::ParameterName, 'use the modified timestamp field') \n        #   [CompletionResult]::new('-u'                         ,'accessed'            , [CompletionResultType]::ParameterName, 'use the accessed timestamp field')\n            [CompletionResult]::new('--accessed'                 ,'accessed'            , [CompletionResultType]::ParameterName, 'use the accessed timestamp field') \n        #   [CompletionResult]::new('-U'                         ,'created'             , [CompletionResultType]::ParameterName, 'use the created timestamp field')\n            [CompletionResult]::new('--changed'                  ,'changed'             , [CompletionResultType]::ParameterName, 'use the changed timestamp field') \n            [CompletionResult]::new('--created'                  ,'created'             , [CompletionResultType]::ParameterName, 'use the created timestamp field')\n            [CompletionResult]::new('--time-style'               ,'time-style'          , [CompletionResultType]::ParameterName, 'how to format timestamps (default, iso, long-iso,full-iso, relative, or a custom style ''+<FORMAT>'' like ''+%Y-%m-%d %H:%M'')')\n        #   [CompletionResult]::new('--total-size'               ,'total-size'          , [CompletionResultType]::ParameterName, 'show the size of a directory as the size of all files and directories inside (unix only)')\n        #   [CompletionResult]::new('-o'                         ,'octal-permissions'   , [CompletionResultType]::ParameterName, 'list each file''s permission in octal format')\n            [CompletionResult]::new('--no-permissions'           ,'no-permissions'      , [CompletionResultType]::ParameterName, 'suppress the permissions field') \n            [CompletionResult]::new('--octal-permissions'        ,'octal-permissions'   , [CompletionResultType]::ParameterName, 'list each file''s permission in octal format')\n            [CompletionResult]::new('--no-filesize'              ,'no-filesize'         , [CompletionResultType]::ParameterName, 'suppress the filesize field')\n            [CompletionResult]::new('--no-user'                  ,'no-user'             , [CompletionResultType]::ParameterName, 'suppress the user field')\n            [CompletionResult]::new('--no-time'                  ,'no-time'             , [CompletionResultType]::ParameterName, 'suppress the time field')\n            [CompletionResult]::new('--stdin'                    ,'stdin'               , [CompletionResultType]::ParameterName, 'read file names from stdin, one per line or other separator specified in environment')\n            [CompletionResult]::new('--git'                      ,'git'                 , [CompletionResultType]::ParameterName, 'list each file''s Git status, if tracked or ignored')\n            [CompletionResult]::new('--no-git'                   ,'no-git'              , [CompletionResultType]::ParameterName, 'suppress Git status (always overrides -git, --git-repos, --git-repos-no-status)')\n            [CompletionResult]::new('--git-repos'                ,'git-repos'           , [CompletionResultType]::ParameterName, 'list root of git-tree status')\n            [CompletionResult]::new('--git-repos-no-status'      ,'git-repos-no-status' , [CompletionResultType]::ParameterName, 'list each git-repos branch name (much faster)')\n\n            break\n        }\n        default {\n        #   [CompletionResult]::new('-?'                         ,'help'                , [CompletionResultType]::ParameterName, 'show list of command-line options')\n            [CompletionResult]::new('--help'                     ,'help'                , [CompletionResultType]::ParameterName, 'show list of command-line options')\n        #   [CompletionResult]::new('-v'                         ,'version'             , [CompletionResultType]::ParameterName, 'show version of eza')\n            [CompletionResult]::new('--version'                  ,'version'             , [CompletionResultType]::ParameterName, 'show version of eza')\n        #   [CompletionResult]::new('-1'                         ,'oneline'             , [CompletionResultType]::ParameterName, 'display one entry per line')\n            [CompletionResult]::new('--oneline'                  ,'oneline'             , [CompletionResultType]::ParameterName, 'display one entry per line')\n        #   [CompletionResult]::new('-l'                         ,'long'                , [CompletionResultType]::ParameterName, 'display extended file metadata as a table')\n            [CompletionResult]::new('--long'                     ,'long'                , [CompletionResultType]::ParameterName, 'display extended file metadata as a table')\n        #   [CompletionResult]::new('-G'                         ,'grid'                , [CompletionResultType]::ParameterName, 'display entries as a grid (default)')\n            [CompletionResult]::new('--grid'                     ,'grid'                , [CompletionResultType]::ParameterName, 'display entries as a grid (default)')\n        #   [CompletionResult]::new('-x'                         ,'across'              , [CompletionResultType]::ParameterName, 'sort the grid across, rather than downwards')\n            [CompletionResult]::new('--across'                   ,'across'              , [CompletionResultType]::ParameterName, 'sort the grid across, rather than downwards')\n        #   [CompletionResult]::new('-R'                         ,'recurse'             , [CompletionResultType]::ParameterName, 'recurse into directories')\n            [CompletionResult]::new('--recurse'                  ,'recurse'             , [CompletionResultType]::ParameterName, 'recurse into directories')\n        #   [CompletionResult]::new('-T'                         ,'tree'                , [CompletionResultType]::ParameterName, 'recurse into directories as a tree')\n            [CompletionResult]::new('--tree'                     ,'tree'                , [CompletionResultType]::ParameterName, 'recurse into directories as a tree')\n        #   [CompletionResult]::new('-X'                         ,'dereference'         , [CompletionResultType]::ParameterName, 'dereference symbolic links when displaying information')\n            [CompletionResult]::new('--dereference'              ,'dereference'         , [CompletionResultType]::ParameterName, 'dereference symbolic links when displaying information')\n        #   [CompletionResult]::new('-F'                         ,'classify'            , [CompletionResultType]::ParameterName, 'display type indicator by file names (always, auto, never)')\n            [CompletionResult]::new('--classify'                 ,'classify'            , [CompletionResultType]::ParameterName, 'display type indicator by file names (always, auto, never)')\n            [CompletionResult]::new('--color'                    ,'color'               , [CompletionResultType]::ParameterName, 'when to use terminal colours (always, auto, never)')\n        #   [CompletionResult]::new('--colour'                   ,'color'               , [CompletionResultType]::ParameterName, 'when to use terminal colours (always, auto, never)')\n            [CompletionResult]::new('--color-scale'              ,'colorscale'          , [CompletionResultType]::ParameterName, 'highlight levels of ''field'' distinctly(all, age, size)')\n        #   [CompletionResult]::new('--colour-scale'             ,'colorscale'          , [CompletionResultType]::ParameterName, 'highlight levels of ''field'' distinctly(all, age, size)')\n            [CompletionResult]::new('--color-scale-mode'         ,'colorscalemode'      , [CompletionResultType]::ParameterName, 'use gradient or fixed colors in --color-scale (fixed, gradient)')\n        #   [CompletionResult]::new('--colour-scale-mode'        ,'colorscalemode'      , [CompletionResultType]::ParameterName, 'use gradient or fixed colors in --color-scale (fixed, gradient)')\n            [CompletionResult]::new('--icons'                    ,'icons'               , [CompletionResultType]::ParameterName, 'when to display icons (always, auto, never)')\n            [CompletionResult]::new('--no-quotes'                ,'noquotes'            , [CompletionResultType]::ParameterName, 'don''t quote file names with spaces')\n            [CompletionResult]::new('--hyperlink'                ,'hyperlink'           , [CompletionResultType]::ParameterName, 'display entries as hyperlinks')\n            [CompletionResult]::new('--absolute'                 ,'absolute'            , [CompletionResultType]::ParameterName, 'display entries with their absolute path (on, follow, off)')\n            [CompletionResult]::new('--follow-symlinks'          ,'followsymlinks'      , [CompletionResultType]::ParameterName, 'drill down into symbolic links that point to directories')\n        #   [CompletionResult]::new('-w'                         ,'widths'              , [CompletionResultType]::ParameterName, 'set screen width in columns')\n            [CompletionResult]::new('--width'                    ,'widths'              , [CompletionResultType]::ParameterName, 'set screen width in columns')\n        #   [CompletionResult]::new('-a'                         ,'filter'              , [CompletionResultType]::ParameterName, 'show hidden and ''dot'' files. Use this twice to also show the ''.'' and ''..'' directories')\n            [CompletionResult]::new('--all'                      ,'filter'              , [CompletionResultType]::ParameterName, 'show hidden and ''dot'' files. Use this twice to also show the ''.'' and ''..'' directories')\n        #   [CompletionResult]::new('-A'                         ,'filter'              , [CompletionResultType]::ParameterName, 'equivalent to --all; included for compatibility with `ls -A`')\n        #   [CompletionResult]::new('--almost-all'               ,'filter'              , [CompletionResultType]::ParameterName, 'equivalent to --all; included for compatibility with `ls -A`')\n        #   [CompletionResult]::new('-d'                         ,'filter'              , [CompletionResultType]::ParameterName, 'list directories as files; don''t list their contents')\n            [CompletionResult]::new('--treat-dirs-as-files'      ,'filter'              , [CompletionResultType]::ParameterName, 'list directories as files; don''t list their contents')\n        #   [CompletionResult]::new('-D'                         ,'filter'              , [CompletionResultType]::ParameterName, 'list only directories')\n            [CompletionResult]::new('--only-dirs'                ,'filter'              , [CompletionResultType]::ParameterName, 'list only directories')\n        #   [CompletionResult]::new('-f'                         ,'filter'              , [CompletionResultType]::ParameterName, 'list only files')\n            [CompletionResult]::new('--only-files'               ,'filter'              , [CompletionResultType]::ParameterName, 'list only files')\n        #   [CompletionResult]::new('-L'                         ,'level'               , [CompletionResultType]::ParameterName, 'limit the depth of recursion')\n            [CompletionResult]::new('--level'                    ,'level'               , [CompletionResultType]::ParameterName, 'limit the depth of recursion')\n        #   [CompletionResult]::new('-r'                         ,'reverse'             , [CompletionResultType]::ParameterName, 'reverse the sort order')\n            [CompletionResult]::new('--reverse'                  ,'reverse'             , [CompletionResultType]::ParameterName, 'reverse the sort order')\n        #   [CompletionResult]::new('-s'                         ,'sort'                , [CompletionResultType]::ParameterName, 'which field to sort by SORT_FIELD')\n            [CompletionResult]::new('--sort'                     ,'sort'                , [CompletionResultType]::ParameterName, 'which field to sort by SORT_FIELD')\n            [CompletionResult]::new('--group-directories-first'  ,'gdf'                 , [CompletionResultType]::ParameterName, 'list directories before other files')\n            [CompletionResult]::new('--group-directories-last'   ,'gdl'                 , [CompletionResultType]::ParameterName, 'list directories after other files')\n        #   [CompletionResult]::new('-I'                         ,'ignore-glob'         , [CompletionResultType]::ParameterName, 'glob patterns (pipe-separated) of files to ignore GLOBS')\n            [CompletionResult]::new('--ignore-glob'              ,'ignore-glob'         , [CompletionResultType]::ParameterName, 'glob patterns (pipe-separated) of files to ignore GLOBS')\n            [CompletionResult]::new('--git-ignore'               ,'git-ignore'          , [CompletionResultType]::ParameterName, 'ignore files mentioned in ''.gitignore''')\n            break\n        }\n        \n    })\n        $completions.Where{ $_.CompletionText -like \"$wordToComplete*\" } |\n        Sort-Object -Property completionText\n}\n"
  },
  {
    "path": "completions/zsh/_eza",
    "content": "#compdef eza\n\n# Save this file as _eza in /usr/local/share/zsh/site-functions or in any\n# other folder in $fpath.  E.g. save it in a folder called ~/.zfunc and add a\n# line containing `fpath=(~/.zfunc $fpath)` somewhere before `compinit` in your\n# ~/.zshrc.\n\n__eza() {\n    # Give completions using the `_arguments` utility function with\n    # `-s` for option stacking like `eza -ab` for `eza -a -b` and\n    # `-S` for delimiting options with `--` like in `eza -- -a`.\n    _arguments -s -S \\\n        \"(- *)\"{-v,--version}\"[Show version of eza]\" \\\n        \"(- *)\"--help\"[Show list of command-line options]\" \\\n        {-1,--oneline}\"[Display one entry per line]\" \\\n        {-l,--long}\"[Display extended file metadata as a table]\" \\\n        {-G,--grid}\"[Display entries as a grid]\" \\\n        {-x,--across}\"[Sort the grid across, rather than downwards]\" \\\n        {-R,--recurse}\"[Recurse into directories]\" \\\n        {-T,--tree}\"[Recurse into directories as a tree]\" \\\n        {-X,--dereference}\"[Dereference symbolic links when displaying file information]\" \\\n        {-F,--classify}\"[Display type indicator by file names]:(when):(always auto automatic never)\" \\\n        --colo{,u}r=\"[When to use terminal colours]:(when):(always auto automatic never)\" \\\n        --colo{,u}r-scale\"[highlight levels of 'field' distinctly]:(fields):(all age size)\" \\\n        --colo{,u}r-scale-mode\"[Use gradient or fixed colors in --color-scale]:(mode):(fixed gradient)\" \\\n        --icons=\"[When to display icons]:(when):(always auto automatic never)\" \\\n        --no-quotes\"[Don't quote filenames with spaces]\" \\\n        --hyperlink\"[Display entries as hyperlinks]\" \\\n        --absolute\"[Display entries with their absolute path]:(mode):(on follow off)\" \\\n        --follow-symlinks\"[Drill down into symbolic links that point to directories]\" \\\n        --group-directories-first\"[Sort directories before other files]\" \\\n        --group-directories-last\"[Sort directories after other files]\" \\\n        --git-ignore\"[Ignore files mentioned in '.gitignore']\" \\\n        {-a,--all}\"[Show hidden and 'dot' files. Use this twice to also show the '.' and '..' directories]\" \\\n        {-A,--almost-all}\"[Equivalent to --all; included for compatibility with \\'ls -A\\']\" \\\n        {-d,--treat-dirs-as-files}\"[List directories like regular files]\" \\\n        {-D,--only-dirs}\"[List only directories]\" \\\n        --no-symlinks\"[Do not show symbolic links]\" \\\n        --show-symlinks\"[Explictly show symbolic links: for use with '--only-dirs'| '--only-files']\" \\\n        {-f,--only-files}\"[List only files]\" \\\n        {-L,--level}\"+[Limit the depth of recursion]\" \\\n        {-w,--width}\"+[Limits column output of grid, 0 implies auto-width]\" \\\n        {-r,--reverse}\"[Reverse the sort order]\" \\\n        {-s,--sort}=\"[Which field to sort by]:(sort field):(accessed age changed created date extension Extension filename Filename inode modified oldest name Name newest none size time type)\" \\\n        {-I,--ignore-glob}\"[Ignore files that match these glob patterns]\" \\\n        {-b,--binary}\"[List file sizes with binary prefixes]\" \\\n        {-B,--bytes}\"[List file sizes in bytes, without any prefixes]\" \\\n        --changed\"[Use the changed timestamp field]\" \\\n        {-g,--group}\"[List each file's group]\" \\\n        {-h,--header}\"[Add a header row to each column]\" \\\n        {-H,--links}\"[List each file's number of hard links]\" \\\n        {-i,--inode}\"[List each file's inode number]\" \\\n        {-m,--modified}\"[Use the modified timestamp field]\" \\\n        {-n,--numeric}\"[List numeric user and group IDs.]\" \\\n        {-S,--blocksize}\"[List each file's size of allocated file system blocks.]\" \\\n        {-t,--time}=\"[Which time field to show]:(time field):(accessed changed created modified)\" \\\n        --time-style=\"[How to format timestamps]:(time style):(default iso long-iso full-iso relative +FORMAT)\" \\\n        --total-size\"[Show recursive directory size (unix only)]\" \\\n        --no-permissions\"[Suppress the permissions field]\" \\\n        {-o,--octal-permissions}\"[List each file's permission in octal format]\" \\\n        --no-filesize\"[Suppress the filesize field]\" \\\n        --no-user\"[Suppress the user field]\" \\\n        --no-time\"[Suppress the time field]\" \\\n        {-u,--accessed}\"[Use the accessed timestamp field]\" \\\n        {-U,--created}\"[Use the created timestamp field]\" \\\n        --git\"[List each file's Git status, if tracked]\" \\\n        --no-git\"[Suppress Git status]\" \\\n        --git-repos\"[List each git-repos status and branch name]\" \\\n        --git-repos-no-status\"[List each git-repos branch name (much faster)]\" \\\n        {-@,--extended}\"[List each file's extended attributes and sizes]\" \\\n        {-Z,--context}\"[List each file's security context]\" \\\n        {-M,--mounts}\"[Show mount details (long mode only)]\" \\\n        '*:filename:_files' \\\n        --smart-group\"[Only show group if it has a different name from owner]\" \\\n        --stdin\"[When piping to eza. Read file names from stdin]\"\n}\n\n__eza\n"
  },
  {
    "path": "deb.asc",
    "content": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGTejj8BEAC3Qdi6up8rkFvekeuZiGpuC5OTic+Nd/x6zacrtDKJwdVa6fw3\ntVydFW1ELcw33ifWDztvgENqvgMuhcB/lnoDnaAhK8nzT0l+r0gQ7JptPH+8XsZx\nPuIFRxgUkS6M45jrZApu/c3/PX3akiBuBnibd+sik72pVSi9pYm00I/yY/+u9Vvo\nu4vy/PG/y4Kp1+ewbVyOnaTQoiJXgqceUYqNfhShcN7dssa/Td6G0xPhS1XeQZ81\nQWwPNEzGWomGJ/igZPcm31qtIwcHXn3m8UZbCxUHHzseZ0hOOYqVSrSIj+U1RIma\nrmcbdAAi1wQei0P142/Gkq1fLdscrZPc0b0L8JbZnymAvg2WWE6SQ3/7Ux0Y9hc3\nwsXuiwU38Qg0EaDMSXyUKAbK+4/tuP9mbx4PyKuDUmjJnPTCvbJxe2kC8rdZrOgn\n4qbwHY7FCEBpG28VhV07dwueZcFC/VCqGrbmrJC7rl6avT5xpOIRslUTJGmifx3Z\n0hmL6rzTQz00FVNSXyxLnz1XYUTLm7QyzywTv8HTTfy5o21N2eOHqbMkBA9MJiic\nlnVSH1vCn/5rd+fwRQ/7yLKAdeUcRyxkdVWTUYDnVtQF199MAuXWv4nudjvS3046\nY9WpJGiZEi9PqeIxmYYHOZ/jYVF1RpMOyVnZhzRhn4Yy+uzJtUeW45nGyQARAQAB\ntDZTYW5kcm8tQWxlc3NpbyBHaWVyZW5zIChhcHRseSBrZXkpIDxzYW5kcm9AZ2ll\ncmVucy5kZT6JAk4EEwEKADgWIQQVSLyKS00miPmw2vfsKeIJDOP9QwUCZN6OPwIb\nLwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDsKeIJDOP9Q26qEACkbm29cF5f\n7J95TAMOzNfjwfgEEPTZt9YUQxmYYlO3LGOShx/hogoWGhpw6qXQP0/lRlXcmNWD\n3J5rN+YmQSIYRP0VvOVJ/XYpgsoS90JwmukbJte4Wu1Goomh1dPv1z/ag4jToSzu\nfaSbwoUa46BmdRBOrOH/w/Ro7U6jLhH9saIivJfexksYeMprXahgoWsFGurl7mt0\nOaN3C6YSMkoJjpufCTfHKagBRT4ZYRw1JpTF+oap0VZgKtg33pnxVvSKdZJEY9BG\nsu47/eZM0bOCMll1upitF8TQ5DFING6+SRrmT8xAyUOCQBIid/9hBxX5mTYTjKW2\nZVteOkCowJwMwx134BffTMWMAMRw27Vxtuuugn6a9yd9pbK95aug62VpbvO8xWM+\nRocqeuQvh0Ii8kpH+sLjdpceMf1c01cYu97DjtdQ54FGtI4r1kOyh/BO7mI0omoJ\nhFunhQKKM8q1xUyIs3RvYALuM5VzEWCHwXBYdiNWYDVBC/sNje67A8SXXXjJLhcr\n9cCpJ5AUmkrLoQvgdewMpuIlmtPRbdv8hkmOUDPkD58AcDirvggXp63IiWlFYQ9C\nEoDLfUYQ6aJmw1fRI8/QsP3Q50aN6dkZRsDCcpxoNX9YzuU6+o1ha+ZNRpmfJvZg\nULP33eq15gJlsGrxo2HZ+f6w4pFFy4juDQ==\n=MX5x\n-----END PGP PUBLIC KEY BLOCK-----\n"
  },
  {
    "path": "deny.toml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n[graph]\n# This template contains all of the possible sections and their default values\n\n# Note that all fields that take a lint level have these possible values:\n# * deny - An error will be produced and the check will fail\n# * warn - A warning will be produced, but the check will not fail\n# * allow - No warning or error will be produced, though in some cases a note\n# will be\n\n# The values provided in this template are the default values that will be used\n# when any section or field is not specified in your own configuration\n\n# Root options\n\n# If 1 or more target triples (and optionally, target_features) are specified,\n# only the specified targets will be checked when running `cargo deny check`.\n# This means, if a particular package is only ever used as a target specific\n# dependency, such as, for example, the `nix` crate only being used via the\n# `target_family = \"unix\"` configuration, that only having windows targets in\n# this list would mean the nix crate, as well as any of its exclusive\n# dependencies not shared by any other crates, would be ignored, as the target\n# list here is effectively saying which targets you are building for.\ntargets = [\n  # The triple can be any string, but only the target triples built in to\n  # rustc (as of 1.40) can be checked against actual config expressions\n  #{ triple = \"x86_64-unknown-linux-musl\" },\n  # You can also specify which target_features you promise are enabled for a\n  # particular target. target_features are currently not validated against\n  # the actual valid features supported by the target architecture.\n  #{ triple = \"wasm32-unknown-unknown\", features = [\"atomics\"] },\n]\n# When creating the dependency graph used as the source of truth when checks are\n# executed, this field can be used to prune crates from the graph, removing them\n# from the view of cargo-deny. This is an extremely heavy hammer, as if a crate\n# is pruned from the graph, all of its dependencies will also be pruned unless\n# they are connected to another crate in the graph that hasn't been pruned,\n# so it should be used with care. The identifiers are [Package ID Specifications]\n# (https://doc.rust-lang.org/cargo/reference/pkgid-spec.html)\n#exclude = []\n# If true, metadata will be collected with `--all-features`. Note that this can't\n# be toggled off if true, if you want to conditionally enable `--all-features` it\n# is recommended to pass `--all-features` on the cmd line instead\nall-features = true\n# If true, metadata will be collected with `--no-default-features`. The same\n# caveat with `all-features` applies\nno-default-features = false\n\n[output]\n# If set, these feature will be enabled when collecting metadata. If `--features`\n# is specified on the cmd line they will take precedence over this option.\n#features = []\n# When outputting inclusion graphs in diagnostics that include features, this\n# option can be used to specify the depth at which feature edges will be added.\n# This option is included since the graphs can be quite large and the addition\n# of features from the crate(s) to all of the graph roots can be far too verbose.\n# This option can be overridden via `--feature-depth` on the cmd line\nfeature-depth = 1\n\n# This section is considered when running `cargo deny check advisories`\n# More documentation for the advisories section can be found here:\n# https://embarkstudios.github.io/cargo-deny/checks/advisories/cfg.html\n[advisories]\nversion = 2\n# The path where the advisory database is cloned/fetched into\ndb-path = \"~/.cargo/advisory-db\"\n# The url(s) of the advisory databases to use\ndb-urls = [\"https://github.com/rustsec/advisory-db\"]\n# The lint level for crates that have been yanked from their source registry\nyanked = \"warn\"\n# A list of advisory IDs to ignore. Note that ignored advisories will still\n# output a note when they are encountered.\nignore = [\n  #\"RUSTSEC-0000-0000\",\n]\n# Threshold for security vulnerabilities, any vulnerability with a CVSS score\n# lower than the range specified will be ignored. Note that ignored advisories\n# will still output a note when they are encountered.\n# * None - CVSS Score 0.0\n# * Low - CVSS Score 0.1 - 3.9\n# * Medium - CVSS Score 4.0 - 6.9\n# * High - CVSS Score 7.0 - 8.9\n# * Critical - CVSS Score 9.0 - 10.0\n#severity-threshold =\n\n# If this is true, then cargo deny will use the git executable to fetch advisory database.\n# If this is false, then it uses a built-in git library.\n# Setting this to true can be helpful if you have special authentication requirements that cargo-deny does not support.\n# See Git Authentication for more information about setting up git authentication.\n#git-fetch-with-cli = true\n\n# This section is considered when running `cargo deny check licenses`\n# More documentation for the licenses section can be found here:\n# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html\n[licenses]\nversion = 2\n# List of explicitly allowed licenses\n# See https://spdx.org/licenses/ for list of possible licenses\n# [possible values: any SPDX 3.11 short identifier (+ optional exception)].\nallow = [\n  \"EUPL-1.2\",\n  \"MIT\",\n  \"Unicode-DFS-2016\",\n  \"Apache-2.0\",\n  \"MPL-2.0\",\n  \"Unicode-3.0\",\n  #\"Apache-2.0 WITH LLVM-exception\",\n]\n# The confidence threshold for detecting a license from license text.\n# The higher the value, the more closely the license text must be to the\n# canonical license text of a valid SPDX license file.\n# [possible values: any between 0.0 and 1.0].\nconfidence-threshold = 0.8\n# Allow 1 or more licenses on a per-crate basis, so that particular licenses\n# aren't accepted for every possible crate as with the normal allow list\nexceptions = [\n  # Each entry is the crate and version constraint, and its specific allow\n  # list\n  #{ allow = [\"Zlib\"], name = \"adler32\", version = \"*\" },\n]\n\n# Some crates don't have (easily) machine readable licensing information,\n# adding a clarification entry for it allows you to manually specify the\n# licensing information\n#[[licenses.clarify]]\n# The name of the crate the clarification applies to\n#name = \"ring\"\n# The optional version constraint for the crate\n#version = \"*\"\n# The SPDX expression for the license requirements of the crate\n#expression = \"MIT AND ISC AND OpenSSL\"\n# One or more files in the crate's source used as the \"source of truth\" for\n# the license expression. If the contents match, the clarification will be used\n# when running the license check, otherwise the clarification will be ignored\n# and the crate will be checked normally, which may produce warnings or errors\n# depending on the rest of your configuration\n#license-files = [\n# Each entry is a crate relative path, and the (opaque) hash of its contents\n#{ path = \"LICENSE\", hash = 0xbd0eed23 }\n#]\n\n[licenses.private]\n# If true, ignores workspace crates that aren't published, or are only\n# published to private registries.\n# To see how to mark a crate as unpublished (to the official registry),\n# visit https://doc.rust-lang.org/cargo/reference/manifest.html#the-publish-field.\nignore = false\n# One or more private registries that you might publish crates to, if a crate\n# is only published to private registries, and ignore is true, the crate will\n# not have its license(s) checked\nregistries = [\n  #\"https://sekretz.com/registry\n]\n\n# This section is considered when running `cargo deny check bans`.\n# More documentation about the 'bans' section can be found here:\n# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html\n[bans]\n# Lint level for when multiple versions of the same crate are detected\nmultiple-versions = \"warn\"\n# Lint level for when a crate version requirement is `*`\nwildcards = \"allow\"\n# The graph highlighting used when creating dotgraphs for crates\n# with multiple versions\n# * lowest-version - The path to the lowest versioned duplicate is highlighted\n# * simplest-path - The path to the version with the fewest edges is highlighted\n# * all - Both lowest-version and simplest-path are used\nhighlight = \"all\"\n# The default lint level for `default` features for crates that are members of\n# the workspace that is being checked. This can be overridden by allowing/denying\n# `default` on a crate-by-crate basis if desired.\nworkspace-default-features = \"allow\"\n# The default lint level for `default` features for external crates that are not\n# members of the workspace. This can be overridden by allowing/denying `default`\n# on a crate-by-crate basis if desired.\nexternal-default-features = \"allow\"\n# List of crates that are allowed. Use with care!\nallow = [\n  #{ name = \"ansi_term\", version = \"=0.11.0\" },\n]\n# List of crates to deny\ndeny = [\n  # Each entry the name of a crate and a version range. If version is\n  # not specified, all versions will be matched.\n  #{ name = \"ansi_term\", version = \"=0.11.0\" },\n  #\n  # Wrapper crates can optionally be specified to allow the crate when it\n  # is a direct dependency of the otherwise banned crate\n  #{ name = \"ansi_term\", version = \"=0.11.0\", wrappers = [] },\n]\n\n# List of features to allow/deny\n# Each entry the name of a crate and a version range. If version is\n# not specified, all versions will be matched.\n#[[bans.features]]\n#name = \"reqwest\"\n# Features to not allow\n#deny = [\"json\"]\n# Features to allow\n#allow = [\n#    \"rustls\",\n#    \"__rustls\",\n#    \"__tls\",\n#    \"hyper-rustls\",\n#    \"rustls\",\n#    \"rustls-pemfile\",\n#    \"rustls-tls-webpki-roots\",\n#    \"tokio-rustls\",\n#    \"webpki-roots\",\n#]\n# If true, the allowed features must exactly match the enabled feature set. If\n# this is set there is no point setting `deny`\n#exact = true\n\n# Certain crates/versions that will be skipped when doing duplicate detection.\nskip = [\n  #{ name = \"ansi_term\", version = \"=0.11.0\" },\n]\n# Similarly to `skip` allows you to skip certain crates during duplicate\n# detection. Unlike skip, it also includes the entire tree of transitive\n# dependencies starting at the specified crate, up to a certain depth, which is\n# by default infinite.\nskip-tree = [\n  #{ name = \"ansi_term\", version = \"=0.11.0\", depth = 20 },\n]\n\n# This section is considered when running `cargo deny check sources`.\n# More documentation about the 'sources' section can be found here:\n# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html\n[sources]\n# Lint level for what to happen when a crate from a crate registry that is not\n# in the allow list is encountered\nunknown-registry = \"warn\"\n# Lint level for what to happen when a crate from a git repository that is not\n# in the allow list is encountered\nunknown-git = \"warn\"\n# List of URLs for allowed crate registries. Defaults to the crates.io index\n# if not specified. If it is specified but empty, no registries are allowed.\nallow-registry = [\"https://github.com/rust-lang/crates.io-index\"]\n# List of URLs for allowed Git repositories\nallow-git = []\n\n[sources.allow-org]\n# 1 or more github.com organizations to allow git sources for\n# github = [\"\"]\n# # 1 or more gitlab.com organizations to allow git sources for\n# gitlab = [\"\"]\n# # 1 or more bitbucket.org organizations to allow git sources for\n# bitbucket = [\"\"]\n"
  },
  {
    "path": "devtools/deb-package.sh",
    "content": "#!/bin/bash -e\n\nREPO_URL=\"https://github.com/eza-community/eza\"\nNAME=\"eza\"\nDESTDIR=/usr/bin\nDOCDIR=/usr/share/man/\n\nCOMMIT=$(git rev-parse --abbrev-ref HEAD)\n\nTAG=$(git describe --tags \"$(git rev-list --tags --max-count=1)\")\nif [ -n \"$1\" ]; then\n    TAG=$1\nfi\n\nVERSION=${TAG:1}\n\necho \"checkout tag ${TAG}\"\ngit checkout --quiet \"${TAG}\"\n\necho \"build man pages\"\njust man\n\ndeclare -A TARGETS\nTARGETS[\"amd64\"]=\"x86_64-unknown-linux-musl\"\nTARGETS[\"arm64\"]=\"aarch64-unknown-linux-gnu\"\nTARGETS[\"armhf\"]=\"arm-unknown-linux-gnueabihf\"\n\necho \"download release notes\"\nRELEASE_NOTES=$(curl -s \"${REPO_URL}/releases/tag/${TAG}\")\n\nfor ARCH in \"${!TARGETS[@]}\"; do\n    echo \"building ${ARCH} package:\"\n\n    DEB_TMP_DIR=\"${NAME}_${VERSION}_${ARCH}\"\n    DEB_PACKAGE=\"${NAME}_${VERSION}_${ARCH}.deb\"\n\n    TARGET=${TARGETS[$ARCH]}\n    echo \" -> downloading ${TARGET} archive\"\n    wget -q -O \"${ARCH}.tar.gz\" \"${REPO_URL}/releases/download/${TAG}/${NAME}_${TARGET}.tar.gz\"\n\n    echo \" -> verifying ${TARGET} archive\"\n    CHECKSUM=$(md5sum \"${ARCH}.tar.gz\" | cut -d ' ' -f 1)\n    echo \"    checksum: ${CHECKSUM}\"\n    grep -q \"${CHECKSUM}\" <<< \"${RELEASE_NOTES}\" \\\n        || (echo \"checksum mismatch\" && exit 1)\n    echo \"    checksum ok\"\n\n    echo \" -> creating directory structure\"\n    mkdir -p \"${DEB_TMP_DIR}\"\n    mkdir -p \"${DEB_TMP_DIR}${DESTDIR}\"\n    mkdir -p \"${DEB_TMP_DIR}${DOCDIR}\"\n    mkdir -p \"${DEB_TMP_DIR}${DOCDIR}/man1\"\n    mkdir -p \"${DEB_TMP_DIR}${DOCDIR}/man5\"\n    mkdir -p \"${DEB_TMP_DIR}/DEBIAN\"\n    mkdir -p \"${DEB_TMP_DIR}/usr/share/doc/${NAME}\"\n    mkdir -p \"${DEB_TMP_DIR}/usr/share/bash-completion/completions/\"\n    mkdir -p \"${DEB_TMP_DIR}/usr/share/fish/vendor_completions.d/\"\n    mkdir -p \"${DEB_TMP_DIR}/usr/share/zsh/vendor-completions/\"\n    chmod 755 -R \"${DEB_TMP_DIR}\"\n\n    echo \" -> extract executable\"\n    tar -xzf \"${ARCH}.tar.gz\"\n    cp ${NAME} \"${DEB_TMP_DIR}${DESTDIR}\"\n    chmod 755 \"${DEB_TMP_DIR}${DESTDIR}/${NAME}\"\n\n    echo \" -> compress man pages\"\n    gzip -cn9 target/man/eza.1 > \"${DEB_TMP_DIR}${DOCDIR}man1/eza.1.gz\"\n    gzip -cn9 target/man/eza_colors.5 > \"${DEB_TMP_DIR}${DOCDIR}man5/eza_colors.5.gz\"\n    gzip -cn9 target/man/eza_colors-explanation.5 > \"${DEB_TMP_DIR}${DOCDIR}man5/eza_colors-explanation.5.gz\"\n    chmod 644 \"${DEB_TMP_DIR}${DOCDIR}\"/**/*.gz\n\n    echo \" -> copy completions\"\n    cp completions/bash/eza \"${DEB_TMP_DIR}/usr/share/bash-completion/completions/\"\n    cp completions/fish/eza.fish \"${DEB_TMP_DIR}/usr/share/fish/vendor_completions.d/\"\n    cp completions/zsh/_eza \"${DEB_TMP_DIR}/usr/share/zsh/vendor-completions/\"\n\n    echo \" -> create control file\"\n    touch \"${DEB_TMP_DIR}/DEBIAN/control\"\n    cat > \"${DEB_TMP_DIR}/DEBIAN/control\" <<EOM\nPackage: ${NAME}\nVersion: ${VERSION}\nSection: utils\nPriority: optional\nArchitecture: ${ARCH}\nDepends: libc6\nMaintainer: Sandro-Alessio Gierens <sandro@gierens.de>\nDescription: Modern replacement for ls\n eza is a modern replacement for ls.  It uses colours for information by\n default, helping you distinguish between many types of files, such as whether\n you are the owner, or in the owning group.\n .\n It also has extra features not present in the original ls, such as viewing the\n Git status for a directory, or recursing into directories with a tree view.\nEOM\n    chmod 644 \"${DEB_TMP_DIR}/DEBIAN/control\"\n\n    echo \" -> copy changelog\"\n    cp CHANGELOG.md \"${DEB_TMP_DIR}/usr/share/doc/${NAME}/changelog\"\n    gzip -cn9 \"${DEB_TMP_DIR}/usr/share/doc/${NAME}/changelog\" > \"${DEB_TMP_DIR}/usr/share/doc/${NAME}/changelog.gz\"\n    rm \"${DEB_TMP_DIR}/usr/share/doc/${NAME}/changelog\"\n    chmod 644 \"${DEB_TMP_DIR}/usr/share/doc/${NAME}/changelog.gz\"\n\n    echo \" -> create copyright file\"\n    touch \"${DEB_TMP_DIR}/usr/share/doc/${NAME}/copyright\"\n    cat > \"${DEB_TMP_DIR}/usr/share/doc/${NAME}/copyright\" << EOM\nFormat: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\nUpstream-Name: ${NAME}\nUpstream-Contact: Christina Sørensen <christina@cafkafk.com>\nSource: https://github.com/eza-community/eza/releases\n\nFiles: *\nLicense: MIT\nCopyright: 2023 Christina Sørensen <christina@cafkafk.com>\n\nFiles: debian/*\nLicense: MIT\nCopyright: 2023 Christina Sørensen <christina@cafkafk.com>\n\nLicense: MIT\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n .\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n .\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\nEOM\n    chmod 644 \"${DEB_TMP_DIR}/usr/share/doc/${NAME}/copyright\"\n\n    echo \" -> build ${ARCH} package\"\n    dpkg-deb --build --root-owner-group \"${DEB_TMP_DIR}\" > /dev/null\n\n    echo \" -> cleanup\"\n    rm -rf \"${DEB_TMP_DIR}\" \"${ARCH}.tar.gz\" \"${NAME}\"\n\n    # gierens: this does not work on my arch at the moment and\n    #          i'm verifying on the repo host anyway thus the || true\n    echo \" -> lint ${ARCH} package\"\n    lintian \"${DEB_PACKAGE}\" || true\ndone\n\necho \"return to original commit\"\ngit checkout --quiet \"${COMMIT}\"\n"
  },
  {
    "path": "devtools/dir-generator.sh",
    "content": "#!/usr/bin/env bash\n\nif [ -z \"$1\" ]; then\n    echo \"Usage: $0 <output_dir>\";\n    exit 1;\nfi\n\nrm \"$1\" -rf;\nmkdir -p \"$1\";\ncd \"$1\" || exit;\n\nsudo groupadd -f eza_test\n\n# BEGIN grid\nmkdir -p grid\ncd grid || exit\n\nmkdir $(seq -w 001 1000);\nseq 0001 1000 | split -l 1 -a 3 -d - file_\n\n# Set time to unix epoch\ntouch --date=@0 ./*;\n\ncd .. || exit\n\n# END grid\n\n# BEGIN git\n\nmkdir -p git\ncd git || exit\n\nmkdir $(seq -w 001 10);\nfor f in ./*\ndo\n    cd \"$f\" || exit\n    git init\n    seq 01 10 | split -l 1 -a 3 -d - file_\n    cd .. || exit\ndone\n\ncd ..\n\n# END git\n\n# BEGIN test_root\n\nsudo mkdir root\nsudo chmod 777 root\nsudo mkdir root/empty\n\n# END test_root\n\n# BEGIN mknod\n\nmkdir -p specials\n\nsudo mknod specials/block-device b  3 60\nsudo mknod specials/char-device  c 14 40\nsudo mknod specials/named-pipe   p\n\n# END test_root\n\n# BEGIN test_symlinks\n\nmkdir -p symlinks\ntouch symlinks/file --date=@0\nln -s file symlinks/symlink\nln -s symlink symlinks/symlink2\nmkdir -p symlinks/dir\nln -s dir symlinks/symlink3\nln -s pipitek symlinks/symlink4\ntouch \"symlinks/ lorem ipsum\" --date=@0\nln -s \"lorem ipsum\" \"symlinks/ lorem ipsum\"\n\n# END test_symlinks\n\n# BEGIN test_perms\n\nmkdir -p perms\ntouch perms/file --date=@0\ntouch perms/file2 --date=@0\nchmod 777 perms/file\nchmod 001 perms/file2\n\n# END test_perms\n\n# BEGIN test_group\nmkdir -p group\ntouch group/file --date=@0\nsudo chgrp eza_test group/file\n# END test_group\n\n# BEGIN test_size\nmkdir -p size\ntouch size/1M --date=@0\ndd if=/dev/zero of=size/1M bs=1 count=0 seek=1M\ntouch size/1K --date=@0\ndd if=/dev/zero of=size/1K bs=1 count=0 seek=1K\ntouch size/1B --date=@0\ndd if=/dev/zero of=size/1B bs=1 count=0 seek=1\ntouch size/1337 --date=@0\ndd if=/dev/zero of=size/1337 bs=1 count=0 seek=1337\n# END test_size\n\n# BEGIN test_time\nmkdir -p time\ntouch time/epoch --date=@0\ntouch time/1s --date=@1\ntouch time/1m --date=@60\ntouch time/1h --date=@3600\ntouch time/1d --date=@86400\ntouch time/1y --date=@31536000\n# END test_time\n\n# BEGIN test_icons\nmkdir -p icons\ntouch icons/file --date=@0\ntouch icons/go.go --date=@0\ntouch icons/rust.rs --date=@0\ntouch icons/c.c --date=@0\ntouch icons/c++.cpp --date=@0\ntouch icons/python.py --date=@0\ntouch icons/java.java --date=@0\ntouch icons/javascript.js --date=@0\ntouch icons/html.html --date=@0\ntouch icons/css.css --date=@0\ntouch icons/php.php --date=@0\ntouch icons/ruby.rb --date=@0\ntouch icons/shell.sh --date=@0\ntouch icons/unknown.unknown --date=@0\ntouch icons/man.1 --date=@0\ntouch icons/marked.md --date=@0\n# END test_icons\n\n# BEGIN set date\ntouch --date=@0 ./*;\n# END set date\n"
  },
  {
    "path": "devtools/generate-timestamp-test-dir.sh",
    "content": "#!/usr/bin/env bash\n\nif [ -z \"$1\" ]; then\n    echo \"Usage: $0 <output_dir>\";\n    exit 1;\nfi\n\nrm \"$1\" -rf;\nmkdir -p \"$1\";\ncd \"$1\" || exit;\n\n# generate files of various age\n# TODO: some are commented out due to undeterministic behavior, see:\n# https://github.com/eza-community/eza/issues/574\n\ntouch --date=\"13 month ago\"  ./13_month\n#touch --date=\"11 month ago\"  ./11_month\n#touch --date=\"7 month ago\"   ./07_month\n#touch --date=\"5 month ago\"   ./05_month\ntouch --date=\"now\"           ./now\n#touch --date=\"next hour\"     ./next_hour\n#touch --date=\"next month\"    ./next_month\n#touch --date=\"next year\"     ./next_year\n"
  },
  {
    "path": "devtools/generate-trycmd-test.sh",
    "content": "#!/usr/bin/env bash\n\n# Generate test data for the program\n\nif [ $# -le 1 ]; then\n    echo \"Usage: $0 <test name> <test argument>\"\n    exit 1\nfi\n\ntest_name=$1\nshift\n\n# Clean up previous test data\n\nif [ -f tests/cmd/\"$test_name\".toml ]; then\n    rm tests/cmd/\"$test_name\".toml\nfi\n\nif [ -f tests/cmd/\"$test_name\".stdout ]; then\n    rm tests/cmd/\"$test_name\".stdout\nfi\n\nif [ -f tests/cmd/\"$test_name\".stderr ]; then\n    rm tests/cmd/\"$test_name\".stderr\nfi\n\n# Generate test data\n\ntouch tests/cmd/\"$test_name\".toml\n\necho 'bin.name = \"eza\"' >> tests/cmd/\"$test_name\".toml\necho 'args = \"'\"$*\"'\"' >> tests/cmd/\"$test_name\".toml\n\n# Generate expected output\n\nif [ -f target/debug/eza ]; then\n    target/debug/eza \"$@\" > tests/cmd/\"$test_name\".stdout 2> tests/cmd/\"$test_name\".stderr\n    returncode=$?\n    if [ $returncode -ne 0 ]; then\n        echo -e 'status.code = '$returncode'' >> tests/cmd/\"$test_name\".toml\n        exit 0\n    fi\nelse\n    echo \"Please build the program first\"\n    exit 1\nfi\n"
  },
  {
    "path": "docs/tapes/demo.tape",
    "content": "Output docs/images/demo.gif\nSet Width 1536\nSet Height 512\nSet Shell fish\nSet FontFamily \"FantasqueSansM Nerd Font Mono\"\nSet FontSize 13\n\nType \"# eza is a modern, maintained replacement for ls.\"\nEnter\nType \"# \"\nEnter\nType \"# It has too many features to cover in a gif, but we'll\"\nEnter\nType \"# try to show off some cool stuff :3\"\nEnter\nType \"# \"\nEnter\nSleep 4s\nEnter\n\nType \"# Let's start with the basics.\"\nEnter\nType \"eza src/\"\nSleep 2s\nEnter\nSleep 4s\n\nType \"# ...but add some icons.\"\nEnter\nType \"eza -l --icons src/\"\nSleep 2s\nEnter\nSleep 4s\n\nType \"# ...and how about a grid view.\"\nEnter\nType \"eza -l --icons --grid\"\nSleep 2s\nEnter\nSleep 4s\n\nType \"# ...with headers.\"\nEnter\nType \"eza -l --icons --grid --header\"\nSleep 2s\nEnter\nSleep 4s\n\nType \"# ...and perhaps some octal permissions.\"\nEnter\nType \"eza -l --icons --grid --header --octal-permissions\"\nSleep 2s\nEnter\nSleep 4s\n\nType \"# ...or what about blocksize.\"\nEnter\nType \"eza -l --icons --grid --header --blocksize\"\nSleep 2s\nEnter\nSleep 4s\n\nType \"# ...or hyperlinks.\"\nEnter\nType \"eza -l --icons --grid --header --hyperlink\"\nSleep 2s\nEnter\nSleep 4s\nType \"# Admittedly, those aren't really very visual in a\"\nEnter\nType \"# gif like this >_<\"\nEnter\n\nType \"# ...what about a custom time style?\"\nEnter\nType 'eza -l --icons --grid --header --time-style \"+%Y/%m/%d - week %W\"'\nSleep 2s\nEnter\nSleep 4s\n\nType \"# ...or a bit of git status.\"\nEnter\nType 'eza -l --icons --grid --header --git'\nSleep 2s\nEnter\nSleep 4s\n\nType \"# ...or a lot of git.\"\nEnter\nType 'eza -l --icons --grid --header --git --git-repos'\nSleep 2s\nEnter\nSleep 4s\n\nType \"# Of course, this was only a glimpse off all \"\nEnter\nType \"# the features that eza has to offer.\"\nEnter\nType \"# \"\nEnter\nType \"# For more info, checkout the README.md or check\"\nEnter\nType \"# out the github repo or the website at https://eza.rocks\"\nEnter\nType \"# \"\nEnter\nType \"# Thanks for watching <3\"\nEnter\nSleep 4s\n\n# Type 'eza -l --icons --grid --blocksize -l --hyperlink --grid --git-repos -x --time-style \"+%Y, %Y, %d%d%d - %a %u\" --git --header --icons -Z -@ -o --group --smart-group --no-quotes'\n# Sleep 500ms\n# Enter\n# Sleep 2s\n"
  },
  {
    "path": "docs/theme.yml",
    "content": "filekinds:\n  normal:\n    foreground: Blue\n  directory:\n    foreground: Blue\n  symlink:\n    foreground: Cyan\n  executable:\n    foreground: Green\nperms:\n  user_read:\n    foreground: Yellow\n    is_bold: true\n  user_write:\n    foreground: Red\n    is_bold: true\n  user_execute_file:\n    foreground: Green\n    is_bold: true\n  user_execute_other:\n    foreground: Green\n    is_bold: true\n  group_read:\n    foreground: Yellow\n  group_write:\n    foreground: Red\n  group_execute:\n    foreground: Green\n  other_read:\n    foreground: Yellow\n  other_write:\n    foreground: Red\n  other_execute:\n    foreground: Green\nfilenames:\n  # Just change the icon glyph\n  Cargo.toml: {icon: {glyph: 🦀}}\n  Cargo.lock: {icon: {glyph: 🦀}}\nextensions:\n  # Change the filename color and icon\n  # NOTE: not all unicode glyphs support color changes\n  rs: {filename: {foreground: Red}, icon: {glyph: 🦀}}\n  # Change the icon glyph and color\n  nix: {icon: {glyph: ❄, style: {foreground: White}}}\n"
  },
  {
    "path": "flake.nix",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n#\n# SPDX-FileCopyrightText: 2014-2024 Christina Sørensen, eza contributors\n# SPDX-License-Identifier: MIT\n{\n  description = \"eza: a modern, maintained replacement for ls\";\n\n  inputs = {\n    nixpkgs.url = \"github:NixOS/nixpkgs/nixpkgs-unstable\";\n    systems.url = \"github:nix-systems/default\";\n\n    flake-utils = {\n      url = \"github:numtide/flake-utils\";\n      inputs = {\n        systems.follows = \"systems\";\n      };\n    };\n\n    naersk = {\n      url = \"github:nix-community/naersk\";\n      inputs.nixpkgs.follows = \"nixpkgs\";\n    };\n\n    rust-overlay = {\n      url = \"github:oxalica/rust-overlay\";\n      inputs = {\n        nixpkgs.follows = \"nixpkgs\";\n      };\n    };\n\n    treefmt-nix = {\n      url = \"github:numtide/treefmt-nix\";\n      inputs = {\n        nixpkgs.follows = \"nixpkgs\";\n      };\n    };\n\n    powertest = {\n      url = \"github:eza-community/powertest\";\n      inputs = {\n        nixpkgs.follows = \"nixpkgs\";\n        flake-utils.follows = \"flake-utils\";\n        naersk.follows = \"naersk\";\n        treefmt-nix.follows = \"treefmt-nix\";\n        rust-overlay.follows = \"rust-overlay\";\n      };\n    };\n\n    pre-commit-hooks = {\n      url = \"github:cachix/pre-commit-hooks.nix\";\n      inputs.nixpkgs.follows = \"nixpkgs\";\n    };\n\n    advisory-db = {\n      url = \"github:rustsec/advisory-db\";\n      flake = false;\n    };\n  };\n  outputs =\n    {\n      self,\n      flake-utils,\n      naersk,\n      nixpkgs,\n      treefmt-nix,\n      rust-overlay,\n      powertest,\n      pre-commit-hooks,\n      ...\n    }:\n    flake-utils.lib.eachDefaultSystem (\n      system:\n      let\n        overlays = [ (import rust-overlay) ];\n\n        pkgs = (import nixpkgs) {\n          inherit system overlays;\n        };\n\n        toolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;\n\n        naersk' = pkgs.callPackage naersk {\n          cargo = toolchain;\n          rustc = toolchain;\n          clippy = toolchain;\n        };\n\n        treefmtEval = treefmt-nix.lib.evalModule pkgs .config/treefmt.nix;\n\n        darwinBuildInputs = pkgs.lib.optionals pkgs.stdenv.isDarwin [\n          pkgs.libiconv\n          pkgs.darwin.apple_sdk.frameworks.Security\n        ];\n\n        buildInputs = [ pkgs.zlib ] ++ darwinBuildInputs;\n      in\n      rec {\n        # For `nix fmt`\n        formatter = treefmtEval.config.build.wrapper;\n\n        packages = {\n          default = import ./nix/eza.nix { inherit pkgs naersk' buildInputs; };\n\n          check = naersk'.buildPackage {\n            inherit buildInputs;\n            src = ./.;\n            mode = \"check\";\n          };\n\n          test = naersk'.buildPackage {\n            inherit buildInputs;\n            src = ./.;\n            mode = \"test\";\n          };\n\n          clippy = naersk'.buildPackage {\n            inherit buildInputs;\n            src = ./.;\n            mode = \"clippy\";\n          };\n        }\n        // (import ./nix/trycmd.nix { inherit pkgs naersk' buildInputs; });\n\n        devShells.default = pkgs.mkShell {\n          inherit (self.checks.${system}.pre-commit-check) shellHook;\n          nativeBuildInputs =\n            with pkgs;\n            [\n              # cargo\n              # clippy\n              rustup\n              toolchain\n              just\n              pandoc\n              convco\n              zip\n              reuse\n\n              # For releases\n              b3sum\n              cargo-bump\n\n              # For generating demo\n              vhs\n\n              powertest.packages.${pkgs.system}.default\n\n              cargo-hack\n              cargo-udeps\n              cargo-outdated\n            ]\n            ++ darwinBuildInputs;\n        };\n\n        checks = {\n          pre-commit-check =\n            let\n              toFilter = [\n                \"yamlfmt\"\n                \"nixfmt\"\n                \"taplo\"\n                \"shellcheck\" # this doesn't respect our excludes:w\n              ];\n              filterFn = n: _v: (!builtins.elem n toFilter);\n              treefmtFormatters = pkgs.lib.mapAttrs (_n: v: { inherit (v) enable; }) (\n                pkgs.lib.filterAttrs filterFn (import .config/treefmt.nix).programs\n              );\n            in\n            pre-commit-hooks.lib.${system}.run {\n              src = ./.;\n              hooks = treefmtFormatters // {\n                nixfmt-rfc-style.enable = true;\n                convco.enable = true;\n                reuse = {\n                  enable = true;\n                  name = \"reuse\";\n                  entry = with pkgs; \"${reuse}/bin/reuse lint\";\n                  pass_filenames = false;\n                };\n              };\n            };\n          formatting = treefmtEval.config.build.check self;\n          build = packages.check;\n          inherit (packages)\n            default\n            test\n            trycmd\n            ;\n          lint = packages.clippy;\n        };\n      }\n    );\n}\n"
  },
  {
    "path": "justfile",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n_default:\n    @just -l\n\nall: build test\nall-release: build-release test-release\n\n[group('house-keeping')]\ngenDemo:\n    fish_prompt=\"> \" fish_history=\"eza_history\" vhs < docs/tapes/demo.tape\n    nsxiv -a docs/images/demo.gif\n\n#----------#\n# building #\n#----------#\n\n# compile the exa binary\n[group('building')]\n@build:\n    cargo build\n\n# compile the exa binary (in release mode)\n[group('building')]\n@build-release:\n    cargo build --release --verbose\n\n# produce an HTML chart of compilation timings\n[group('building')]\n@build-time:\n    cargo +nightly clean\n    cargo +nightly build -Z timings\n\n# check that the exa binary can compile\n[group('building')]\n@check:\n    cargo check\n\n\n#---------------#\n# running tests #\n#---------------#\n\n# run unit tests\n[group('testing')]\n@test:\n    cargo test --workspace -- --quiet\n\n# run unit tests (in release mode)\n[group('testing')]\n@test-release:\n    cargo test --workspace --release --verbose\n\n#-----------------------#\n# code quality and misc #\n#-----------------------#\n\n# lint the code\n[group('house-keeping')]\n@clippy:\n    touch src/main.rs\n    cargo clippy\n\n# update dependency versions, and checks for outdated ones\n[group('house-keeping')]\n@update-deps:\n    cargo update\n    command -v cargo-outdated >/dev/null || (echo \"cargo-outdated not installed\" && exit 1)\n    cargo outdated\n\n# list unused dependencies\n[group('house-keeping')]\n@unused-deps:\n    command -v cargo-udeps >/dev/null || (echo \"cargo-udeps not installed\" && exit 1)\n    cargo +nightly udeps\n\n# check that every combination of feature flags is successful\n[group('house-keeping')]\n@check-features:\n    command -v cargo-hack >/dev/null || (echo \"cargo-hack not installed\" && exit 1)\n    cargo hack check --feature-powerset\n\n# print versions of the necessary build tools\n[group('house-keeping')]\n@versions:\n    rustc --version\n    cargo --version\n\n\n#---------------#\n# documentation #\n#---------------#\n\n# build the man pages\n[group('documentation')]\n@man:\n    mkdir -p \"${CARGO_TARGET_DIR:-target}/man\"\n    version=$(awk 'BEGIN { FS = \"\\\"\" } ; /^version/ { print $2 ; exit }' Cargo.toml); \\\n    for page in eza.1 eza_colors.5 eza_colors-explanation.5; do \\\n        sed \"s/\\$version/v${version}/g\" \"man/${page}.md\" | pandoc --standalone -f markdown -t man > \"${CARGO_TARGET_DIR:-target}/man/${page}\"; \\\n    done;\n\n# build and preview the main man page (eza.1)\n[group('documentation')]\n@man-1-preview: man\n    man \"${CARGO_TARGET_DIR:-target}/man/eza.1\"\n\n# build and preview the colour configuration man page (eza_colors.5)\n[group('documentation')]\n@man-5-preview: man\n    man \"${CARGO_TARGET_DIR:-target}/man/eza_colors.5\"\n\n# build and preview the colour configuration man page (eza_colors.5)\n[group('documentation')]\n@man-5-explanations-preview: man\n    man \"${CARGO_TARGET_DIR:-target}/man/eza_colors-explanation.5\"\n\n#---------------#\n#    release    #\n#---------------#\n\n# To override the version, pass it as an argument before the recipe:\n# e.g. just version=1.2.3 release\n# If version is not set, it will be determined by convco.\nversion := \"\"\nnew_version := if version == \"\" { \"$(convco version --bump)\" } else { version }\n\n# If you're not cafkafk and she isn't dead, don't run this!\n#\n# usage: release major, release minor, release patch\n[group('release')]\nrelease:\n    cargo bump \"{{new_version}}\"\n    git cliff -c .config/cliff.toml -t \"{{new_version}}\" > CHANGELOG.md\n    cargo check\n    nix build -L ./#clippy\n    git checkout -b \"cafk-release-v{{new_version}}\"\n    git commit -asm \"chore: eza v{{new_version}} changelogs, version bump\"\n    git push\n    @echo \"waiting 10 seconds for github to catch up...\"\n    sleep 10\n    gh pr create --draft --title \"chore: release v{{new_version}}\" --body \"This PR was auto-generated by our lovely just file\" --reviewer cafkafk\n    @echo \"Now go review that and come back and run gh-release\"\n\n[group('release')]\n@gh-release:\n    git tag -d \"v{{new_version}}\" || echo \"tag not found, creating\";\n    git tag --sign -a \"v{{new_version}}\" -m \"auto generated by the justfile for eza v$(convco version)\"\n    just cross\n    just mangen\n    just completions\n    mkdir -p ./target/\"release-notes-$(convco version)\"\n    git cliff -c .config/cliff.toml -t \"v$(convco version)\" --current > ./target/\"release-notes-$(convco version)/RELEASE.md\"\n    just checksum >> ./target/\"release-notes-$(convco version)/RELEASE.md\"\n\n    git push origin \"v{{new_version}}\"\n    gh release create \"v$(convco version)\" --target \"$(git rev-parse HEAD)\" --title \"eza v$(convco version)\" -d -F ./target/\"release-notes-$(convco version)/RELEASE.md\" ./target/\"bin-$(convco version)\"/* ./target/\"man-$(convco version).tar.gz\" ./target/\"completions-$(convco version).tar.gz\"\n\n#----------------#\n#    binaries    #\n#----------------#\n\n# TODO: make static/no_static DRY\n# TODO: add name prefix/suffix arguments\n\n[group('binaries')]\ntar BINARY TARGET:\n    tar czvf ./target/\"bin-$(convco version)\"/{{BINARY}}_{{TARGET}}.tar.gz -C ./target/{{TARGET}}/release/ ./{{BINARY}}\n\n[group('binaries')]\nzip BINARY TARGET:\n    zip -j ./target/\"bin-$(convco version)\"/{{BINARY}}_{{TARGET}}.zip ./target/{{TARGET}}/release/{{BINARY}}\n\n[group('binaries')]\ntar_static BINARY TARGET:\n    tar czvf ./target/\"bin-$(convco version)\"/{{BINARY}}_{{TARGET}}_static.tar.gz -C ./target/{{TARGET}}/release/ ./{{BINARY}}\n\n[group('binaries')]\nzip_static BINARY TARGET:\n    zip -j ./target/\"bin-$(convco version)\"/{{BINARY}}_{{TARGET}}_static.zip ./target/{{TARGET}}/release/{{BINARY}}\n\n[group('binaries')]\ntar_no_libgit BINARY TARGET:\n    tar czvf ./target/\"bin-$(convco version)\"/{{BINARY}}_{{TARGET}}_no_libgit.tar.gz -C ./target/{{TARGET}}/release/ ./{{BINARY}}\n\n[group('binaries')]\nzip_no_libgit BINARY TARGET:\n    zip -j ./target/\"bin-$(convco version)\"/{{BINARY}}_{{TARGET}}_no_libgit.zip ./target/{{TARGET}}/release/{{BINARY}}\n\n[group('binaries')]\ntar_static_no_libgit BINARY TARGET:\n    tar czvf ./target/\"bin-$(convco version)\"/{{BINARY}}_{{TARGET}}_static_no_libgit.tar.gz -C ./target/{{TARGET}}/release/ ./{{BINARY}}\n\n[group('binaries')]\nzip_static_no_libgit BINARY TARGET:\n    zip -j ./target/\"bin-$(convco version)\"/{{BINARY}}_{{TARGET}}_static_no_libgit.zip ./target/{{TARGET}}/release/{{BINARY}}\n\n[group('binaries')]\nbinary BINARY TARGET:\n    rustup target add {{TARGET}}\n    cross build --release --target {{TARGET}}\n    just tar {{BINARY}} {{TARGET}}\n    just zip {{BINARY}} {{TARGET}}\n\n[group('binaries')]\nbinary_static BINARY TARGET:\n    rustup target add {{TARGET}}\n    RUSTFLAGS='-C target-feature=+crt-static' cross build --release --target {{TARGET}}\n    just tar_static {{BINARY}} {{TARGET}}\n    just zip_static {{BINARY}} {{TARGET}}\n\n[group('binaries')]\nbinary_no_libgit BINARY TARGET:\n    rustup target add {{TARGET}}\n    cross build --no-default-features --release --target {{TARGET}}\n    just tar_no_libgit {{BINARY}} {{TARGET}}\n    just zip_no_libgit {{BINARY}} {{TARGET}}\n\n[group('binaries')]\nbinary_static_no_libgit BINARY TARGET:\n    rustup target add {{TARGET}}\n    RUSTFLAGS='-C target-feature=+crt-static' cross build --no-default-features --release --target {{TARGET}}\n    just tar_static_no_libgit {{BINARY}} {{TARGET}}\n    just zip_static_no_libgit {{BINARY}} {{TARGET}}\n\n[group('binaries')]\nchecksum:\n    @echo \"# Checksums\"\n    @echo \"## sha256sum\"\n    @echo '```'\n    @sha256sum ./target/\"bin-$(convco version)\"/*\n    @echo '```'\n    @echo \"## md5sum\"\n    @echo '```'\n    @md5sum ./target/\"bin-$(convco version)\"/*\n    @echo '```'\n    @echo \"## blake3sum\"\n    @echo '```'\n    @b3sum ./target/\"bin-$(convco version)\"/*\n    @echo '```'\n\nalias c := cross\n\n# Generate release binaries for EZA\n#\n# usage: cross\n[group('binaries')]\n@cross:\n    # Setup Output Directory\n    mkdir -p ./target/\"bin-$(convco version)\"\n\n    # Install Toolchains/Targets\n    rustup toolchain install stable\n\n    ## Linux\n    ### x86\n    just binary eza x86_64-unknown-linux-gnu\n    # just binary_static eza x86_64-unknown-linux-gnu\n    just binary eza x86_64-unknown-linux-musl\n    # just binary_static eza x86_64-unknown-linux-musl\n\n    ### aarch\n    just binary eza aarch64-unknown-linux-gnu\n    just binary_no_libgit eza aarch64-unknown-linux-gnu\n    # BUG: just binary_static eza aarch64-unknown-linux-gnu\n\n    ### arm\n    just binary eza arm-unknown-linux-gnueabihf\n    just binary_no_libgit eza arm-unknown-linux-gnueabihf\n    # just binary_static eza arm-unknown-linux-gnueabihf\n\n    ## MacOS\n    # TODO: just binary eza x86_64-apple-darwin\n\n    ## Windows\n    ### x86\n    just binary eza.exe x86_64-pc-windows-gnu\n    # just binary_static eza.exe x86_64-pc-windows-gnu\n    # TODO: just binary eza.exe x86_64-pc-windows-gnullvm\n    # TODO: just binary eza.exe x86_64-pc-windows-msvc\n\n    # Generate Checksums\n    # TODO: moved to gh-release just checksum\n\n[group('documentation')]\n@mangen:\n    # Setup Output Directory\n    mkdir -p ./target/\"man-$(convco version)\"\n    pandoc --standalone -f markdown -t man man/eza.1.md > ./target/\"man-$(convco version)\"/eza.1\n    pandoc --standalone -f markdown -t man man/eza_colors.5.md > ./target/\"man-$(convco version)\"/eza_colors.5\n    pandoc --standalone -f markdown -t man man/eza_colors-explanation.5.md > ./target/\"man-$(convco version)\"/eza_colors-explanation.5\n    tar czvf ./target/\"man-$(convco version)\".tar.gz ./target/\"man-$(convco version)\"\n\n[group('documentation')]\n[group('binaries')]\n@completions:\n    # Setup Output Directory\n    mkdir -p ./target/\"completions-$(convco version)\"\n    cp completions/*/* ./target/\"completions-$(convco version)\"/\n    tar czvf ./target/\"completions-$(convco version)\".tar.gz ./target/\"completions-$(convco version)\"\n\n\n#---------------------#\n# Integration testing #\n#---------------------#\n\nalias gen := gen_test_dir\n\ntest_dir := \"tests/test_dir\"\n\n[group('testing')]\ngen_test_dir:\n    bash devtools/dir-generator.sh {{ test_dir }}\n\n# Runs integration tests in nix sandbox\n#\n# Required nix, likely won't work on windows.\n[group('testing')]\n@itest:\n    nix build -L ./#trycmd-local\n\n# Runs integration tests in nix sandbox, and dumps outputs.\n#\n# WARNING: this can cause loss of work\n[group('testing')]\n@idump:\n    rm ./tests/gen/*_nix.stderr -f || echo\n    rm ./tests/gen/*_nix.stdout -f || echo\n    rm ./tests/gen/*_unix.stderr -f || echo\n    rm ./tests/gen/*_unix.stdout -f || echo\n    rm ./tests/ptests/ptest_*.stderr -f || echo\n    rm ./tests/ptests/ptest_*.stdout -f || echo\n\n    nix build -L ./#trydump\n\n    find result/dump -type f \\( -name \"*.stdout\" -o -name \"*.stderr\" \\) -exec sh -c 'base=$(basename {}); if [ -e \"tests/gen/${base%.*}.toml\" ]; then cp {} tests/gen/; elif [ -e \"tests/cmd/${base%.*}.toml\" ]; then cp {} tests/cmd/; elif [ -e \"tests/ptests/${base%.*}.toml\" ]; then cp {} tests/ptests/; fi' \\;\n\n[group('testing')]\n@itest-gen:\n    nix build -L ./#trycmd\n\n# Fully re-generates the integration tests using powertest\n[group('testing')]\n@regen:\n    which powertest >&- 2>&- || (echo -e \"Powertest not installed. Please Clone the repo and run:\\n\\tcargo install --path . --locked\" && exit 1)\n    echo \"WARNING: this will delete all tests in tests/ptest\"\n    sleep 5\n    echo \"Deleting tests/ptests\"\n    rm -rf tests/ptests\n    echo \"Generating tests/ptests\"\n    powertest\n    nix build -L ./#trydump\n    find result/dump -type f \\( -name \"*.stdout\" -o -name \"*.stderr\" \\) -exec sh -c 'base=$(basename {}); if [ -e \"tests/ptests/${base%.*}.toml\" ]; then cp {} tests/ptests/; fi' \\;\n\n"
  },
  {
    "path": "man/eza.1.md",
    "content": "% eza(1) $version\n\n<!-- This is the eza(1) man page, written in Markdown. -->\n<!-- To generate the roff version, run `just man`, -->\n<!-- and the man page will appear in the ‘target’ directory. -->\n\n\nNAME\n====\n\neza — a modern replacement for ls\n\n\nSYNOPSIS\n========\n\n`eza [options] [files...]`\n\n**eza** is a modern replacement for `ls`.\nIt uses colours for information by default, helping you distinguish between many types of files, such as whether you are the owner, or in the owning group.\n\nIt also has extra features not present in the original `ls`, such as viewing the Git status for a directory, or recursing into directories with a tree view.\n\n\nEXAMPLES\n========\n\n`eza`\n: Lists the contents of the current directory in a grid.\n\n`eza --oneline --reverse --sort=size`\n: Displays a list of files with the largest at the top.\n\n`eza --long --header --inode --git`\n: Displays a table of files with a header, showing each file’s metadata, inode, and Git status.\n\n`eza --long --tree --level=3`\n: Displays a tree of files, three levels deep, as well as each file’s metadata.\n\n\nMETA OPTIONS\n===============\n\n`--help`\n: Show list of command-line options.\n\n`-v`, `--version`\n: Show version of eza.\n\nDISPLAY OPTIONS\n===============\n\n`-1`, `--oneline`\n: Display one entry per line.\n\n`--absolute=WHEN`\n: Display entries with their absolute path.\n\nValid settings are '`on`', '`follow`', and '`off`'.\nWhen used without a value, defaults to '`on`'.\n\n'`on`': Show absolute paths for all entries.\n'`follow`': Show absolute paths and resolve symbolic links to their targets.\n'`off`': Show relative paths (default behavior).\n\n`-F`, `--classify=WHEN`\n: Display file kind indicators next to file names.\n\nValid settings are ‘`always`’, ‘`automatic`’ (or ‘`auto`’ for short), and ‘`never`’.\nWhen used without a value, defaults to ‘`automatic`’.\n\n`automatic` or `auto` will display file kind indicators only when the standard output is connected to a real terminal. If `eza` is ran while in a `tty`, or the output of `eza` is either redirected to a file or piped into another program, file kind indicators will not be used. Setting this option to ‘`always`’ causes `eza` to always display file kind indicators, while ‘`never`’ disables the use of file kind indicators.\n\n`-G`, `--grid`\n: Display entries as a grid (default).\n\n`-l`, `--long`\n: Display extended file metadata as a table.\n\n`-R`, `--recurse`\n: Recurse into directories.\n\n`-T`, `--tree`\n: Recurse into directories as a tree.\n\n`--follow-symlinks`\n: Drill down into symbolic links that point to directories.\n\n`-X`, `--dereference`\n: Dereference symbolic links when displaying information.\n\n`-x`, `--across`\n: Sort the grid across, rather than downwards.\n\n`--color=WHEN`, `--colour=WHEN`\n: When to use terminal colours (using ANSI escape code to colorize the output).\n\nValid settings are ‘`always`’, ‘`automatic`’ (or ‘`auto`’ for short), and ‘`never`’.\nWhen used without a value, defaults to ‘`automatic`’.\n\nThe default behavior (‘`automatic`’ or ‘`auto`’) is to colorize the output only when the standard output is connected to a real terminal. If the output of `eza` is redirected to a file or piped into another program, terminal colors will not be used. Setting this option to ‘`always`’ causes `eza` to always output terminal color, while ‘`never`’ disables the use of terminal color.\n\nManually setting this option overrides `NO_COLOR` environment.\n\n`--color-scale`, `--colour-scale`\n: highlight levels of `field` distinctly.\nUse comma(,) separated list of all, age, size\n\n`--color-scale-mode=MODE`, `--colour-scale-mode=MODE`\n: Use gradient or fixed colors in `--color-scale`.\n\nValid options are `fixed` or `gradient`.\nWhen used without a value, defaults to `gradient`.\n\n`--icons=WHEN`\n: Display icons next to file names.\n\nValid settings are ‘`always`’, ‘`automatic`’ (‘`auto`’ for short), and ‘`never`’.\nWhen used without a value, defaults to ‘`automatic`’.\n\n`automatic` or `auto` will display icons only when the standard output is connected to a real terminal. If `eza` is ran while in a `tty`, or the output of `eza` is either redirected to a file or piped into another program, icons will not be used. Setting this option to ‘`always`’ causes `eza` to always display icons, while ‘`never`’ disables the use of icons.\n\n`--no-quotes`\n: Don't quote file names with spaces.\n\n`--hyperlink`\n: Display entries as hyperlinks\n\n`-w`, `--width=COLS`\n: Set screen width in columns.\n\nFILTERING AND SORTING OPTIONS\n=============================\n\n`-a`, `--all`\n: Show hidden and “dot” files.\nUse this twice to also show the ‘`.`’ and ‘`..`’ directories.\n\n`-A`, `--almost-all`\n: Equivalent to --all; included for compatibility with `ls -A`.\n\n`-d`, `--treat-dirs-as-files`\n: This flag, inherited from `ls`, changes how `eza` handles directory arguments.\n\n: Instead of recursing into directories and listing their contents (the default behavior), it treats directories as regular files and lists information about the directory entry itself.\n\n: This is useful when you want to see metadata about the directory (e.g., permissions, size, modification time) rather than its contents.\n\n: For simply listing only directories and not files, consider using the `--only-dirs` (`-D`) option as an alternative.\n\n`-L`, `--level=DEPTH`\n: Limit the depth of recursion.\n\n`-r`, `--reverse`\n: Reverse the sort order.\n\n`-s`, `--sort=SORT_FIELD`\n: Which field to sort by.\n\nValid sort fields are ‘`name`’, ‘`Name`’, ‘`extension`’, ‘`Extension`’, ‘`size`’, ‘`modified`’, ‘`changed`’, ‘`accessed`’, ‘`created`’, ‘`inode`’, ‘`type`’, and ‘`none`’.\n\nThe `modified` sort field has the aliases ‘`date`’, ‘`time`’, and ‘`newest`’, and its reverse order has the aliases ‘`age`’ and ‘`oldest`’.\n\nSort fields starting with a capital letter will sort uppercase before lowercase: ‘A’ then ‘B’ then ‘a’ then ‘b’. Fields starting with a lowercase letter will mix them: ‘A’ then ‘a’ then ‘B’ then ‘b’.\n\n`-I`, `--ignore-glob=GLOBS`\n: Glob patterns, pipe-separated, of files to ignore.\n\n`--git-ignore` [if eza was built with git support]\n: Do not list files that are ignored by Git.\n\n`--group-directories-first`\n: List directories before other files.\n\n`--group-directories-last`\n: List directories after other files.\n\n`-D`, `--only-dirs`\n: List only directories, not files.\n\n`-f`, `--only-files`\n: List only files, not directories.\n\n`--show-symlinks`\n: Explicitly show symbolic links (when used with `--only-files` | `--only-dirs`)\n\n`--no-symlinks`\n: Do not show symbolic links\n\nLONG VIEW OPTIONS\n=================\n\nThese options are available when running with `--long` (`-l`):\n\n`-b`, `--binary`\n: List file sizes with binary prefixes.\n\n`-B`, `--bytes`\n: List file sizes in bytes, without any prefixes.\n\n`--changed`\n: Use the changed timestamp field.\n\n`-g`, `--group`\n: List each file’s group.\n\n`--smart-group`\n: Only show group if it has a different name from owner\n\n`-h`, `--header`\n: Add a header row to each column.\n\n`-H`, `--links`\n: List each file’s number of hard links.\n\n`-i`, `--inode`\n: List each file’s inode number.\n\n`-m`, `--modified`\n: Use the modified timestamp field.\n\n`-M`, `--mounts`\n: Show mount details (Linux and Mac only)\n\n`-n`, `--numeric`\n: List numeric user and group IDs.\n\n`-O`, `--flags`\n: List file flags on Mac and BSD systems and file attributes on Windows systems.  By default, Windows attributes are displayed in a long form.  To display in attributes as single character set the environment variable `EZA_WINDOWS_ATTRIBUTES=short`.  On BSD systems see chflags(1) for a list of file flags and their meanings.\n\n`-S`, `--blocksize`\n: List each file’s size of allocated file system blocks.\n\n`-t`, `--time=WORD`\n: Which timestamp field to list.\n\n: Valid timestamp fields are ‘`modified`’, ‘`changed`’, ‘`accessed`’, and ‘`created`’.\n\n`--time-style=STYLE`\n: How to format timestamps.\n\n: Valid timestamp styles are ‘`default`’, ‘`iso`’, ‘`long-iso`’, ‘`full-iso`’, ‘`relative`’, or a custom style ‘`+<FORMAT>`’ (e.g., ‘`+%Y-%m-%d %H:%M`’ => ‘`2023-09-30 13:00`’).\n\n`<FORMAT>` should be a chrono format string.  For details on the chrono format syntax, please read: https://docs.rs/chrono/latest/chrono/format/strftime/index.html .\n\nAlternatively, `<FORMAT>` can be a two line string, the first line will be used for non-recent files and the second for recent files.  E.g., if `<FORMAT>` is \"`%Y-%m-%d %H<newline>--%m-%d %H:%M`\", non-recent files => \"`2022-12-30 13`\", recent files => \"`--09-30 13:34`\".\n\n`--total-size`\n: Show recursive directory size (unix only).\n\n`-u`, `--accessed`\n: Use the accessed timestamp field.\n\n`-U`, `--created`\n: Use the created timestamp field.\n\n`--no-permissions`\n: Suppress the permissions field.\n\n`-o`, `--octal-permissions`\n: List each file's permissions in octal format.\n\n`--no-filesize`\n: Suppress the file size field.\n\n`--no-user`\n: Suppress the user field.\n\n`--no-time`\n: Suppress the time field.\n\n`--stdin`\n: When you wish to pipe directories to eza/read from stdin. Separate one per line or define custom separation char in `EZA_STDIN_SEPARATOR` env variable.\n\n`-@`, `--extended`\n: List each file’s extended attributes and sizes.\n\n`-Z`, `--context`\n: List each file's security context.\n\n`--git`  [if eza was built with git support]\n: List each file’s Git status, if tracked.\nThis adds a two-character column indicating the staged and unstaged statuses respectively. The status character can be ‘`-`’ for not modified, ‘`M`’ for a modified file, ‘`N`’ for a new file, ‘`D`’ for deleted, ‘`R`’ for renamed, ‘`T`’ for type-change, ‘`I`’ for ignored, and ‘`U`’ for conflicted. Directories will be shown to have the status of their contents, which is how ‘deleted’ is possible if a directory contains a file that has a certain status, it will be shown to have that status.\n\n`--git-repos` [if eza was built with git support]\n: List each directory’s Git status, if tracked.\nSymbols shown are `|`= clean, `+`= dirty, and `~`= for unknown.\n\n`--git-repos-no-status` [if eza was built with git support]\n: List if a directory is a Git repository, but not its status.\nAll Git repository directories will be shown as (themed) `-` without status indicated.\n\n\n`--no-git`\n: Don't show Git status (always overrides `--git`, `--git-repos`, `--git-repos-no-status`)\n\n\nENVIRONMENT VARIABLES\n=====================\n\nIf an environment variable prefixed with `EZA_` is not set, for backward compatibility, it will default to its counterpart starting with `EXA_`.\n\neza responds to the following environment variables:\n\n## `COLUMNS`\n\nOverrides the width of the terminal, in characters, however, `-w` takes precedence.\n\nFor example, ‘`COLUMNS=80 eza`’ will show a grid view with a maximum width of 80 characters.\n\nThis option won’t do anything when eza’s output doesn’t wrap, such as when using the `--long` view.\n\n## `EZA_STRICT`\n\nEnables _strict mode_, which will make eza error when two command-line options are incompatible.\n\nUsually, options can override each other going right-to-left on the command line, so that eza can be given aliases: creating an alias ‘`eza=eza --sort=ext`’ then running ‘`eza --sort=size`’ with that alias will run ‘`eza --sort=ext --sort=size`’, and the sorting specified by the user will override the sorting specified by the alias.\n\nIn strict mode, the two options will not co-operate, and eza will error.\n\nThis option is intended for use with automated scripts and other situations where you want to be certain you’re typing in the right command.\n\n## `EZA_GRID_ROWS`\n\nLimits the grid-details view (‘`eza --grid --long`’) so it’s only activated when at least the given number of rows of output would be generated.\n\nWith widescreen displays, it’s possible for the grid to look very wide and sparse, on just one or two lines with none of the columns lining up.\nBy specifying a minimum number of rows, you can only use the view if it’s going to be worth using.\n\n## `EZA_ICON_SPACING`\n\nSpecifies the number of spaces to print between an icon (see the ‘`--icons`’ option) and its file name.\n\nDifferent terminals display icons differently, as they usually take up more than one character width on screen, so there’s no “standard” number of spaces that eza can use to separate an icon from text. One space may place the icon too close to the text, and two spaces may place it too far away. So the choice is left up to the user to configure depending on their terminal emulator.\n\n## `NO_COLOR`\n\nDisables colours in the output (regardless of its value). Can be overridden by `--color` option.\n\nSee `https://no-color.org/` for details.\n\n## `LS_COLORS`, `EZA_COLORS`\n\nSpecifies the colour scheme used to highlight files based on their name and kind, as well as highlighting metadata and parts of the UI.\n\nFor more information on the format of these environment variables, see the [eza_colors.5.md](eza_colors.5.md) manual page.\n\n## `EZA_OVERRIDE_GIT`\n\nOverrides any `--git` or `--git-repos` argument\n\n## `EZA_MIN_LUMINANCE`\nSpecifies the minimum luminance to use when color-scale is active. It's value can be between -100 to 100.\n\n## `EZA_ICONS_AUTO`\n\nIf set, automates the same behavior as using `--icons` or `--icons=auto`. Useful for if you always want to have icons enabled.\n\nAny explicit use of the `--icons=WHEN` flag overrides this behavior.\n\n## `EZA_STDIN_SEPARATOR`\n\nSpecifies the separator to use when file names are piped from stdin. Defaults to newline.\n\n## `EZA_CONFIG_DIR`\n\nSpecifies the directory where eza will look for its configuration and theme files. Defaults to `$XDG_CONFIG_HOME/eza` or `$HOME/.config/eza` if `XDG_CONFIG_HOME` is not set.\n\nEXIT STATUSES\n=============\n\n0\n: If everything goes OK.\n\n1\n: If there was an I/O error during operation.\n\n3\n: If there was a problem with the command-line arguments.\n\n13\n: If permission is denied to access a path.\n\n\nAUTHOR\n======\n\neza is maintained by Christina Sørensen and many other contributors.\n\n**Source code:** `https://github.com/eza-community/eza` \\\n**Contributors:** `https://github.com/eza-community/eza/graphs/contributors`\n\nOur infinite thanks to Benjamin ‘ogham’ Sago and all the other contributors of exa, from which eza was forked.\n\nSEE ALSO\n========\n\n- [**eza_colors**(5)](eza_colors.5.md)\n- [**eza_colors-explanation**(5)](eza_colors-explanation.5.md)\n"
  },
  {
    "path": "man/eza_colors-explanation.5.md",
    "content": "% eza_colors-explanation(5) $version\n\n<!-- This is the eza_colors-explanation(5) man page, written in Markdown. -->\n<!-- To generate the roff version, run `just man`, -->\n<!-- and the man page will appear in the ‘target’ directory. -->\n\n# Name\n\neza_colors-explanation — more details on customizing eza colors\n\n# Eza Color Explanation\n\neza provides its own built\\-in set of file extension mappings that cover a large range of common file extensions, including documents, archives, media, and temporary files. \nAny mappings in the environment variables will override this default set: running eza with `LS_COLORS=\"*.zip=32\"` will turn zip files green but leave the colours of other compressed files alone.\n\nYou can also disable this built\\-in set entirely by including a\n`reset` entry at the beginning of `EZA_COLORS`.\nSo setting `EZA_COLORS=\"reset:*.txt=31\"` will highlight only text\nfiles; setting `EZA_COLORS=\"reset\"` will highlight nothing.\n\n## Examples\n\n- Disable the \"current user\" highlighting: `EZA_COLORS=\"uu=0:gu=0\"`\n- Turn the date column green: `EZA_COLORS=\"da=32\"`\n- Highlight Vagrantfiles: `EZA_COLORS=\"Vagrantfile=1;4;33\"`\n- Override the existing zip colour: `EZA_COLORS=\"*.zip=38;5;125\"`\n- Markdown files a shade of green, log files a shade of grey:\n`EZA_COLORS=\"*.md=38;5;121:*.log=38;5;248\"`\n\n## BUILT\\-IN EXTENSIONS\n\n- eza now supports bright colours! As supported by most modern 256\\-colour terminals, you can now choose from `bright` colour codes when selecting your custom colours in your `#EZA_COLORS` environment variable.\n\n- Build (Makefile, Cargo.toml, package.json) are yellow and underlined.\n- Images (png, jpeg, gif) are purple.\n- Videos (mp4, ogv, m2ts) are a slightly purpler purple.\n- Music (mp3, m4a, ogg) is a faint blue.\n- Lossless music (flac, alac, wav) is a less faint blue.\n- Cryptographic files (asc, enc, p12) are bright green.\n- Documents (pdf, doc, dvi) are a fainter green.\n- Compressed files (zip, tgz, Z) are red.\n- Temporary files (tmp, swp, ~) are dimmed default foreground color.\n- Compiled files (class, o, pyc) are yellow. A file is also counted as compiled if it uses a common extension and is\nin the same directory as one of its source files: styles.css will count as compiled when next to styles.less or styles.sass, and scripts.js when next to scripts.ts or scripts.coffee.\n- Source files (cpp, js, java) are bright yellow.\n\n\n## Theme Configuration file\n\nNow you can specify these options and more in a `theme.yml` file with convenient syntax for defining your styles.\n\nSet `EZA_CONFIG_DIR` to specify which directory you would like eza to look for your `theme.yml` file,\notherwise eza will look for `$XDG_CONFIG_HOME/eza/theme.yml`.\n\n\nThese are the available options:\n\nLIST OF THEME OPTIONS\n=====================\n\n```yaml\nfilekinds:\n  normal\n  directory\n  symlink\n  pipe\n  block_device\n  char_device\n  socket\n  special\n  executable\n  mount_point\n\nperms:\n  user_read\n  user_write\n  user_execute_file\n  user_execute_other\n  group_read\n  group_write\n  group_execute\n  other_read\n  other_write\n  other_execute\n  special_user_file\n  special_other\n  attribute\n\nsize:\n  major\n  minor\n  number_byte\n  number_kilo\n  number_mega\n  number_giga\n  number_huge\n  unit_byte\n  unit_kilo\n  unit_mega\n  unit_giga\n  unit_huge\n\nusers:\n  user_you\n  user_root\n  user_other\n  group_yours\n  group_other\n  group_root\n\nlinks:\n  normal\n  multi_link_file\n\ngit:\n  new\n  modified\n  deleted\n  renamed\n  ignored\n  conflicted\n\ngit_repo:\n  branch_main\n  branch_other\n  git_clean\n  git_dirty\n\nsecurity_context:\n  none:\n  selinux:\n    colon\n    user\n    role\n    typ\n    range\n\nfile_type:\n  image\n  video\n  music\n  crypto\n  document\n  compressed\n  temp\n  compiled\n  build\n  source\n\npunctuation:\n\ndate:\n\ninode:\n\nblocks:\n\nheader:\n\noctal:\n\nflags:\n\ncontrol_char:\n\nbroken_symlink:\n\nbroken_path_overlay:\n\n```\n\nEach of those fields/sub fields can have the following styling properties defined beneath it\n\n```yaml\n    foreground: Blue\n    background: null\n    is_bold: false\n    is_dimmed: false\n    is_italic: false\n    is_underline: false\n    is_blink: false\n    is_reverse: false\n    is_hidden: false\n    is_strikethrough: true\n    prefix_with_reset: false\n```\n\nExample:\n\n```yaml\n\nfile_type:\n  image:\n    foreground: Blue\n    is_italic: true\ndate:\n  foreground: White\n\nsecurity_context:\n  selinux:\n    role:\n      is_hidden: true\n```\n\nIcons can now be customized as well in the `filenames` and `extensions` fields\n\n```yaml\n\nfilenames:\n  # Just change the icon glyph\n  Cargo.toml: {icon: {glyph: 🦀}}\n  Cargo.lock: {icon: {glyph: 🦀}}\n\nextensions:\n  rs: {  filename: {foreground: Red}, icon: {glyph: 🦀}}\n\n```\n\n**NOTES:** \n\nNot all glyphs support changing colors.\n\nIf your theme is not working properly, double check the syntax in the config file, as\na syntax issue can cause multiple properties to not be applied.\n\nYou must name the file `theme.yml`, no matter the directory you specify.\n\n\n## See also\n\n- [**eza**(1)](eza.1.md)\n- [**eza_colors**(5)](eza_colors.5.md)\n"
  },
  {
    "path": "man/eza_colors.5.md",
    "content": "% eza_colors(5) $version\n\n<!-- This is the eza_colors(5) man page, written in Markdown. -->\n<!-- To generate the roff version, run `just man`, -->\n<!-- and the man page will appear in the ‘target’ directory. -->\n\n\nNAME\n====\n\neza_colors — customising the file and UI colours of eza\n\n\nSYNOPSIS\n========\n\nThe `EZA_COLORS` environment variable can be used to customise the colours that `eza` uses to highlight file names, file metadata, and parts of the UI.\n\nYou can use the `dircolors` program to generate a script that sets the variable from an input file, or if you don’t mind editing long strings of text, you can just type it out directly. These variables have the following structure:\n\n- A list of key-value pairs separated by ‘`=`’, such as ‘`*.txt=32`’.\n- Multiple ANSI formatting codes are separated by ‘`;`’, such as ‘`*.txt=32;1;4`’.\n- Finally, multiple pairs are separated by ‘`:`’, such as ‘`*.txt=32:*.mp3=1;35`’.\n\nThe key half of the pair can either be a two-letter code or a file glob, and anything that’s not a valid code will be treated as a glob, including keys that happen to be two letters long.\n\nFor backwards compatibility `EXA_COLORS` environment variables is checked if `EZA_COLORS` is unset.\n\n\nEXAMPLES\n========\n\n`EZA_COLORS=\"uu=0:gu=0\"`\n: Disable the “current user” highlighting\n\n`EZA_COLORS=\"da=32\"`\n: Turn the date column green\n\n`EZA_COLORS=\"Vagrantfile=1;4;33\"`\n: Highlight Vagrantfiles\n\n`EZA_COLORS=\"*.zip=38;5;125\"`\n: Override the existing zip colour\n\n`EZA_COLORS=\"*.md=38;5;121:*.log=38;5;248\"`\n: Markdown files a shade of green, log files a shade of grey\n\n\nLIST OF CODES\n=============\n\n`LS_COLORS` can use these ten codes:\n\n`di`\n: directories\n\n`ex`\n: executable files\n\n`fi`\n: regular files\n\n`pi`\n: named pipes\n\n`so`\n: sockets\n\n`bd`\n: block devices\n\n`cd`\n: character devices\n\n`ln`\n: symlinks\n\n`or`\n: symlinks with no target\n\n\n`EZA_COLORS` can use many more:\n\n`oc`\n: the permissions displayed as octal\n\n`ur`\n: the user-read permission bit\n\n`uw`\n: the user-write permission bit\n\n`ux`\n: the user-execute permission bit for regular files\n\n`ue`\n: the user-execute for other file kinds\n\n`gr`\n: the group-read permission bit\n\n`gw`\n: the group-write permission bit\n\n`gx`\n: the group-execute permission bit\n\n`tr`\n: the others-read permission bit\n\n`tw`\n: the others-write permission bit\n\n`tx`\n: the others-execute permission bit\n\n`su`\n: setuid, setgid, and sticky permission bits for files\n\n`sf`\n: setuid, setgid, and sticky for other file kinds\n\n`xa`\n: the extended attribute indicator\n\n`sn`\n: the numbers of a file’s size (sets `nb`, `nk`, `nm`, `ng` and `nt`)\n\n`nb`\n: the numbers of a file’s size if it is lower than 1 KB/Kib\n\n`nk`\n: the numbers of a file’s size if it is between 1 KB/KiB and 1 MB/MiB\n\n`nm`\n: the numbers of a file’s size if it is between 1 MB/MiB and 1 GB/GiB\n\n`ng`\n: the numbers of a file’s size if it is between 1 GB/GiB and 1 TB/TiB\n\n`nt`\n: the numbers of a file’s size if it is 1 TB/TiB or higher\n\n`sb`\n: the units of a file’s size (sets `ub`, `uk`, `um`, `ug` and `ut`)\n\n`ub`\n: the units of a file’s size if it is lower than 1 KB/Kib\n\n`uk`\n: the units of a file’s size if it is between 1 KB/KiB and 1 MB/MiB\n\n`um`\n: the units of a file’s size if it is between 1 MB/MiB and 1 GB/GiB\n\n`ug`\n: the units of a file’s size if it is between 1 GB/GiB and 1 TB/TiB\n\n`ut`\n: the units of a file’s size if it is 1 TB/TiB or higher\n\n`df`\n: a device’s major ID\n\n`ds`\n: a device’s minor ID\n\n`uu`\n: a user that’s you\n\n`uR`\n: a user that's root\n\n`un`\n: a user that’s someone else\n\n`gu`\n: a group that you belong to\n\n`gR`\n: a group related to root\n\n`gn`\n: a group you aren’t a member of\n\n`lc`\n: a number of hard links\n\n`lm`\n: a number of hard links for a regular file with at least two\n\n`ga`\n: a new flag in Git\n\n`gm`\n: a modified flag in Git\n\n`gd`\n: a deleted flag in Git\n\n`gv`\n: a renamed flag in Git\n\n`gt`\n: a modified metadata flag in Git\n\n`gi`\n: an ignored flag in Git\n\n`gc`\n: a conflicted flag in Git\n\n`Gm`\n: main branch of repo\n\n`Go`\n: other branch of repo\n\n`Gc`\n: clean branch of repo\n\n`Gd`\n: dirty branch of repo\n\n`xx`\n: “punctuation”, including many background UI elements\n\n`da`\n: a file’s date\n\n`in`\n: a file’s inode number\n\n`bl`\n: a file’s number of blocks\n\n`hd`\n: the header row of a table\n\n`lp`\n: the path of a symlink\n\n`cc`\n: an escaped character in a filename\n\n`bO`\n: the overlay style for broken symlink paths\n\n`sp`\n: special (not file, dir, mount, exec, pipe, socket, block device, char device, or link)\n\n`mp`\n: a mount point\n\n`im`\n: a regular file that is an image\n\n`vi`\n: a regular file that is a video\n\n`mu`\n: a regular file that is lossy music\n\n`lo`\n: a regular file that is lossless music\n\n`cr`\n: a regular file that is related to cryptography (ex: key or certificate)\n\n`do`\n: a regular file that is a document (ex: office suite document or PDF)\n\n`co`\n: a regular file that is compressed\n\n`tm`\n: a regular file that is temporary (ex: a text editor's backup file)\n\n`cm`\n: a regular file that is a compilation artifact (ex: Java class file)\n\n`bu`\n: a regular file that is used to build a project (ex: Makefile)\n\n`sc`\n: a regular file that is source code\n\n`ic`\n: the icon (this is optional, if not set the icon color matches the file name's)\n\n`Sn`\n: No security context on a file\n\n`Su`\n: SELinux user\n\n`Sr`\n: SELinux role\n\n`St`\n: SELinux type\n\n`Sl`\n: SELinux level\n\n`ff`\n: BSD file flags\n\nValues in `EXA_COLORS` override those given in `LS_COLORS`, so you don’t need to re-write an existing `LS_COLORS` variable with proprietary extensions.\n\n\nLIST OF STYLES\n==============\n\nUnlike some versions of `ls`, the given ANSI values must be valid colour codes: eza won’t just print out whichever characters are given.\n\nThe codes accepted by eza are:\n\n`1`\n: for bold\n\n`2`\n: for dimmed\n\n`3`\n: for italic\n\n`4`\n: for underline\n\n`31`\n: for red text\n\n`32`\n: for green text\n\n`33`\n: for yellow text\n\n`34`\n: for blue text\n\n`35`\n: for purple text\n\n`36`\n: for cyan text\n\n`37`\n: for white text\n\n`90`\n: for dark gray text\n\n`91`\n: for bright red text\n\n`92`\n: for bright green text\n\n`93`\n: for bright yellow text\n\n`94`\n: for bright blue text\n\n`95`\n: for bright purple text\n\n`96`\n: for bright cyan text\n\n`97`\n: for bright  text\n\n`38;5;nnn`\n: for a colour from 0 to 255 (replace the `nnn` part)\n\nMany terminals will treat bolded text as a different colour, or at least provide the option to.\n\neza provides its own built-in set of file extension mappings that cover a large range of common file extensions, including documents, archives, media, and temporary files.\nAny mappings in the environment variables will override this default set: running eza with `LS_COLORS=\"*.zip=32\"` will turn zip files green but leave the colours of other compressed files alone.\n\nYou can also disable this built-in set entirely by including a `reset` entry at the beginning of `EZA_COLORS`.\nSo setting `EZA_COLORS=\"reset:*.txt=31\"` will highlight only text files; setting `EZA_COLORS=\"reset\"` will highlight nothing.\n\n\nAUTHOR\n======\n\neza is maintained by Christina Sørensen and many other contributors.\n\n**Source code:** `https://github.com/eza-community/eza` \\\n**Contributors:** `https://github.com/eza-community/eza/graphs/contributors`\n\nOur infinite thanks to Benjamin ‘ogham’ Sago and all the other contributors of exa, from which eza was forked.\n\n\nSEE ALSO\n========\n\n- [**eza**(1)](eza.1.md)\n- [**eza_colors-explanation**(5)](eza_colors-explanation.5.md)\n"
  },
  {
    "path": "nix/eza.nix",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n{\n  pkgs,\n  naersk',\n  buildInputs,\n  ...\n}:\n\nnaersk'.buildPackage rec {\n  pname = \"eza\";\n  version = \"git\";\n\n  src = ../.;\n  doCheck = true;\n\n  inherit buildInputs;\n  nativeBuildInputs = with pkgs; [\n    cmake\n    pkg-config\n    installShellFiles\n    pandoc\n  ];\n\n  buildNoDefaultFeatures = true;\n  buildFeatures = \"git\";\n\n  postInstall = ''\n    for page in eza.1 eza_colors.5 eza_colors-explanation.5; do\n      sed \"s/\\$version/${version}/g\" \"man/$page.md\" |\n        pandoc --standalone -f markdown -t man >\"man/$page\"\n    done\n    installManPage man/eza.1 man/eza_colors.5 man/eza_colors-explanation.5\n    installShellCompletion \\\n      --bash completions/bash/eza \\\n      --fish completions/fish/eza.fish \\\n      --zsh completions/zsh/_eza\n  '';\n\n  meta = with pkgs.lib; {\n    description = \"A modern, maintained replacement for ls\";\n    longDescription = ''\n      eza is a modern replacement for ls. It uses colours for information by\n      default, helping you distinguish between many types of files, such as\n      whether you are the owner, or in the owning group. It also has extra\n      features not present in the original ls, such as viewing the Git status\n      for a directory, or recursing into directories with a tree view. eza is\n      written in Rust, so it’s small, fast, and portable.\n    '';\n    homepage = \"https://github.com/eza-community/eza\";\n    license = licenses.mit;\n    mainProgram = \"eza\";\n    maintainers = with maintainers; [ cafkafk ];\n  };\n}\n"
  },
  {
    "path": "nix/trycmd.nix",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n{\n  pkgs,\n  naersk',\n  buildInputs,\n  ...\n}:\n\n{\n  trycmd = naersk'.buildPackage {\n    src = ../.;\n    mode = \"test\";\n    doCheck = true;\n    # No reason to wait for release build\n    release = false;\n    # buildPhase files differ between dep and main phase\n    singleStep = true;\n    # generate testing files\n    buildPhase = ''\n      bash devtools/dir-generator.sh tests/test_dir && echo \"Dir generated\"\n      bash devtools/generate-timestamp-test-dir.sh tests/timestamp_test_dir\n    '';\n    cargoTestOptions = opts: opts ++ [ \"--features nix\" ];\n    inherit buildInputs;\n    nativeBuildInputs = with pkgs; [ git ];\n  };\n\n  # TODO: add conditionally to checks.\n  # Run `nix build .#trycmd` to run integration tests\n  trycmd-local = naersk'.buildPackage {\n    src = ../.;\n    mode = \"test\";\n    doCheck = true;\n    # No reason to wait for release build\n    release = false;\n    # buildPhase files differ between dep and main phase\n    singleStep = true;\n    # set itests files creation date to unix epoch\n    buildPhase = ''\n      bash devtools/dir-generator.sh tests/test_dir\n      bash devtools/generate-timestamp-test-dir.sh tests/timestamp_test_dir\n      touch --date=@0 tests/itest/*\n      touch --date=@0 tests/ptests/*;\n      fd -e stdout -e stderr -H -t file -X sed -i 's/[CWD]\\//\\/build\\/source\\//g'\n    '';\n    cargoTestOptions =\n      opts:\n      opts\n      ++ [\n        \"--features nix\"\n        \"--features nix-local\"\n        \"--features powertest\"\n      ];\n    inherit buildInputs;\n    nativeBuildInputs = with pkgs; [ git ];\n  };\n\n  # Run `nix build .#trydump` to dump testing files\n  trydump = naersk'.buildPackage {\n    src = ../.;\n    mode = \"test\";\n    doCheck = true;\n    # No reason to wait for release build\n    release = false;\n    # buildPhase files differ between dep and main phase\n    singleStep = true;\n    # set itests files creation date to unix epoch\n    buildPhase = ''\n      bash devtools/dir-generator.sh tests/test_dir\n      bash devtools/generate-timestamp-test-dir.sh tests/timestamp_test_dir\n      touch --date=@0 tests/itest/*;\n      rm tests/cmd/*.stdout || echo;\n      rm tests/cmd/*.stderr || echo;\n\n      touch --date=@0 tests/ptests/*;\n      rm tests/ptests/*.stdout || echo;\n      rm tests/ptests/*.stderr || echo;\n    '';\n    cargoTestOptions =\n      opts:\n      opts\n      ++ [\n        \"--features nix\"\n        \"--features nix-local\"\n        \"--features powertest\"\n        #\"-F trycmd/debug\"\n      ];\n    TRYCMD = \"dump\";\n    postInstall = ''\n      fd -e stdout -e stderr -H -t file -X sed -i 's/\\/build\\/source\\//[CWD]\\//g'\n\n      cp dump $out -r\n    '';\n    inherit buildInputs;\n    nativeBuildInputs = with pkgs; [\n      fd\n      gnused\n      git\n    ];\n  };\n}\n"
  },
  {
    "path": "powertest.yaml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\ndump_dir: tests/ptests\ndepth: 1\nbinary: eza\ngen_binary: target/debug/eza\nargs: tests/test_dir\ncommands:\n  ? - null # Meta options\n    - --help\n  :\n  ? - -v\n    - --version\n  :\n  ? - -1 # Display Options\n    - --oneline\n  :\n  ? - -l\n    - --long\n  :\n  ? - -G\n    - --grid\n  :\n  ? - -x\n    - --across\n  :\n  ? - -R\n    - --recurse\n  :\n  ? - -T\n    - --tree\n  :\n  ? - -X\n    - --dereference\n  :\n  ? - -F\n    - --classify\n  :\n  ? - -F\n    - --classify\n  : values:\n      - auto\n      - always\n      - never\n  ? - null\n    - --color\n  : values:\n      - auto\n      - always\n      - never\n  ? - null\n    - --colour\n  : values:\n      - auto\n      - always\n      - never\n  ? - null\n    - --icons\n  :\n  ? - null\n    - --icons\n  : values:\n      - auto\n      - always\n      - never\n  ? - null\n    - --no-quotes\n  :\n  ? - null\n    - --hyperlink\n  :\n  ? - null\n    - --absolute\n  : values:\n      - on\n      - follow\n      - off\n  ? - -w\n    - --width\n  : values:\n      - 15\n      - 30\n      - 200\n  ? - null\n    - --smart-group\n  :\n  ? - -a # Filtering and Sorting Options\n    - --all\n  :\n  ? - -A\n    - --almost-all\n  :\n  ? - -d\n    - --treat-dirs-as-files\n  :\n  ? - null\n    - --treat-dirs-as-files\n  :\n  ? - -L # Hidden alias\n    - --level\n  : prefix: -T\n    values:\n      - 0\n      - 1\n      - 2\n      - 3\n      - 4\n      - 5\n  ? - -r\n    - --reverse\n  :\n  ? - -s\n    - --sort\n  : short: -s\n    long: time-style\n    prefix: -l\n    values:\n      #- accessed\n      - age\n      #- changed\n      #- created\n      - date\n      - Ext\n      - ext\n      - Extension\n      - extension\n      - Filename\n      - filename\n      - inode\n      - modified\n      - Name\n      - name\n      - newest\n      #- none seems non-deterministic\n      - oldest\n      - size\n      - time\n      - type\n  ? - null\n    - --group-directories-first\n  :\n  ? - null\n    - --group-directories-last\n  :\n  ? - -D\n    - --only-dirs\n  :\n  ? - -f\n    - --only-files\n  :\n  ? - -f\n    - --only-files\n  :\n  ? - -I # TODO: add more globs\n    - --ignore-glob\n  : prefix: -l\n    values:\n      - \"*.toml\"\n  ? - null\n    - --git-ignore\n  :\n  ? - -b # Long View Options\n    - --binary\n  :\n  ? - -B\n    - --bytes\n  :\n  ? - -g\n    - --group\n  :\n  ? - -h\n    - --header\n  :\n  ? - -H\n    - --links\n  :\n  ? - -i\n    - --inode\n  :\n  ? - -m\n    - --modified\n  :\n  ? - -M\n    - --mounts\n  :\n  ? - -n\n    - --numeric\n  :\n  ? - -S\n    - --blocksize\n  :\n  ? - -t\n    - --time\n  : prefix: -l\n    values:\n      - modified\n      #- accessed BROKEN\n      #- changed\n      #- created\n  ? - -u\n    - --accessed\n  :\n  ? - -U\n    - --created\n  :\n  ? - null\n    - --changed\n  :\n  ? - null\n    - --time-style\n  : long: time-style\n    values:\n      - default\n      - iso\n      - long-iso\n      - full-iso\n      - relative\n  ? - null\n    - --total-size\n  :\n  ? - null\n    - --no-permissions\n  :\n  ? - -o\n    - --octal-permissions\n  :\n  ? - null\n    - --no-filesize\n  :\n  ? - null\n    - --no-user\n  :\n  ? - null\n    - --git\n  :\n  ? - null\n    - --no-git\n  :\n  ? - null\n    - --git-repos\n  :\n  ? - -@\n    - --extended\n  :\n  ? - -Z\n    - --context\n  :\n"
  },
  {
    "path": "rust-toolchain.toml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\n[toolchain]\n# NOTE: don't forget to also update Cargo.toml and .github/workflows/unit-tests.yml\n# At the time of writing, 1.90 is the latest version supported by OpenBSD\nchannel = \"1.90\"\ncomponents = [\n  \"rustfmt\",\n  \"rustc\",\n  \"rust-src\",\n  \"rust-analyzer\",\n  \"cargo\",\n  \"clippy\",\n]\nprofile = \"minimal\"\n"
  },
  {
    "path": "snap/snapcraft.yaml",
    "content": "# SPDX-FileCopyrightText: 2024 Christina Sørensen\n# SPDX-License-Identifier: EUPL-1.2\nname: eza\nbase: core24\nversion: 'latest'\nsummary: Replacement for 'ls' written in Rust\ndescription: |\n  It uses colours for information by default, helping you distinguish between\n  many types of files, such as whether you are the owner, or in the owning\n  group. It also has extra features not present in the original ls, such as\n  viewing the Git status for a directory, or recursing into directories with a\n  tree view. eza is written in Rust, and it's small, fast, and portable.\nissues: https://github.com/eza-community/eza/issues\nsource-code: https://github.com/eza-community/eza\ncontact: christina@cafkafk.com\nwebsite: https://eza.rocks/\nlicense: MIT\ngrade: stable\nconfinement: classic\napps:\n  eza:\n    command: bin/eza\nparts:\n  eza:\n    plugin: rust\n    source: .\n    build-attributes:\n      - enable-patchelf\n    stage-packages:\n      - cmake\n      - libz-dev\nplatforms:\n  amd64:\n    build-on: [amd64, arm64]\n  arm64:\n    build-on: [amd64, arm64]\n  armhf:\n    build-on: [amd64, arm64]\n"
  },
  {
    "path": "src/fs/dir.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse crate::fs::feature::git::GitCache;\nuse crate::fs::fields::GitStatus;\nuse std::fs;\nuse std::fs::DirEntry;\nuse std::io;\nuse std::path::{Path, PathBuf};\nuse std::slice::Iter as SliceIter;\n\nuse log::info;\n\nuse crate::fs::File;\n\n/// A **Dir** provides a cached list of the file paths in a directory that’s\n/// being listed.\n///\n/// This object gets passed to the Files themselves, in order for them to\n/// check the existence of surrounding files, then highlight themselves\n/// accordingly. (See `File#get_source_files`)\npub struct Dir {\n    /// A vector of the files that have been read from this directory.\n    contents: Vec<DirEntry>,\n\n    /// The path that was read.\n    pub path: PathBuf,\n}\n\nimpl Dir {\n    /// Create a new, empty `Dir` object representing the directory at the given path.\n    ///\n    /// This function does not attempt to read the contents of the directory; it merely\n    /// initializes an instance of `Dir` with an empty `DirEntry` list and the specified path.\n    /// To populate the `Dir` object with actual directory contents, use the `read` function.\n    pub fn new(path: PathBuf) -> Self {\n        Self {\n            contents: vec![],\n            path,\n        }\n    }\n\n    /// Reads the contents of the directory into `DirEntry`.\n    ///\n    /// It is recommended to use this method in conjunction with `new` in recursive\n    /// calls, rather than `read_dir`, to avoid holding multiple open file descriptors\n    /// simultaneously, which can lead to \"too many open files\" errors.\n    pub fn read(&mut self) -> io::Result<&Self> {\n        info!(\"Reading directory {:?}\", &self.path);\n\n        self.contents = fs::read_dir(&self.path)?.collect::<Result<Vec<_>, _>>()?;\n\n        info!(\"Read directory success {:?}\", &self.path);\n        Ok(self)\n    }\n\n    /// Create a new Dir object filled with all the files in the directory\n    /// pointed to by the given path. Fails if the directory can’t be read, or\n    /// isn’t actually a directory, or if there’s an IO error that occurs at\n    /// any point.\n    ///\n    /// The `read_dir` iterator doesn’t actually yield the `.` and `..`\n    /// entries, so if the user wants to see them, we’ll have to add them\n    /// ourselves after the files have been read.\n    pub fn read_dir(path: PathBuf) -> io::Result<Self> {\n        info!(\"Reading directory {:?}\", &path);\n\n        let contents = fs::read_dir(&path)?.collect::<Result<Vec<_>, _>>()?;\n\n        info!(\"Read directory success {:?}\", &path);\n        Ok(Self { contents, path })\n    }\n\n    /// Produce an iterator of IO results of trying to read all the files in\n    /// this directory.\n    #[must_use]\n    pub fn files<'dir, 'ig>(\n        &'dir self,\n        dots: DotFilter,\n        git: Option<&'ig GitCache>,\n        git_ignoring: bool,\n        deref_links: bool,\n        total_size: bool,\n    ) -> Files<'dir, 'ig> {\n        Files {\n            inner: self.contents.iter(),\n            dir: self,\n            dotfiles: dots.shows_dotfiles(),\n            dots: dots.dots(),\n            git,\n            git_ignoring,\n            deref_links,\n            total_size,\n        }\n    }\n\n    /// Whether this directory contains a file with the given path.\n    #[must_use]\n    pub fn contains(&self, path: &Path) -> bool {\n        self.contents.iter().any(|p| p.path().as_path() == path)\n    }\n\n    /// Append a path onto the path specified by this directory.\n    #[must_use]\n    pub fn join(&self, child: &Path) -> PathBuf {\n        self.path.join(child)\n    }\n}\n\n/// Iterator over reading the contents of a directory as `File` objects.\n#[allow(clippy::struct_excessive_bools)]\npub struct Files<'dir, 'ig> {\n    /// The internal iterator over the paths that have been read already.\n    inner: SliceIter<'dir, DirEntry>,\n\n    /// The directory that begat those paths.\n    dir: &'dir Dir,\n\n    /// Whether to include dotfiles in the list.\n    dotfiles: bool,\n\n    /// Whether the `.` or `..` directories should be produced first, before\n    /// any files have been listed.\n    dots: DotsNext,\n\n    git: Option<&'ig GitCache>,\n\n    git_ignoring: bool,\n\n    /// Whether symbolic links should be dereferenced when querying information.\n    deref_links: bool,\n\n    /// Whether to calculate the directory size recursively\n    total_size: bool,\n}\n\nimpl<'dir> Files<'dir, '_> {\n    fn parent(&self) -> PathBuf {\n        // We can’t use `Path#parent` here because all it does is remove the\n        // last path component, which is no good for us if the path is\n        // relative. For example, while the parent of `/testcases/files` is\n        // `/testcases`, the parent of `.` is an empty path. Adding `..` on\n        // the end is the only way to get to the *actual* parent directory.\n        self.dir.path.join(\"..\")\n    }\n\n    /// Go through the directory until we encounter a file we can list (which\n    /// varies depending on the dotfile visibility flag)\n    fn next_visible_file(&mut self) -> Option<File<'dir>> {\n        loop {\n            if let Some(entry) = self.inner.next() {\n                let path = entry.path();\n                let filename = File::filename(&path);\n                if !self.dotfiles && filename.starts_with('.') {\n                    continue;\n                }\n\n                // Also hide _prefix files on Windows because it's used by old applications\n                // as an alternative to dot-prefix files.\n                #[cfg(windows)]\n                if !self.dotfiles && filename.starts_with('_') {\n                    continue;\n                }\n\n                if self.git_ignoring {\n                    let git_status = self.git.map(|g| g.get(&path, false)).unwrap_or_default();\n                    if git_status.unstaged == GitStatus::Ignored {\n                        continue;\n                    }\n                }\n\n                let file = File::from_args(\n                    path,\n                    self.dir,\n                    filename,\n                    self.deref_links,\n                    self.total_size,\n                    entry.file_type().ok(),\n                );\n\n                // Windows has its own concept of hidden files, when dotfiles are\n                // hidden Windows hidden files should also be filtered out\n                #[cfg(windows)]\n                if !self.dotfiles && file.attributes().map_or(false, |a| a.hidden) {\n                    continue;\n                }\n\n                return Some(file);\n            }\n\n            return None;\n        }\n    }\n}\n\n/// The dot directories that need to be listed before actual files, if any.\n/// If these aren’t being printed, then `FilesNext` is used to skip them.\nenum DotsNext {\n    /// List the `.` directory next.\n    Dot,\n\n    /// List the `..` directory next.\n    DotDot,\n\n    /// Forget about the dot directories and just list files.\n    Files,\n}\n\nimpl<'dir> Iterator for Files<'dir, '_> {\n    type Item = File<'dir>;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        match self.dots {\n            DotsNext::Dot => {\n                self.dots = DotsNext::DotDot;\n                Some(File::new_aa_current(self.dir, self.total_size))\n            }\n\n            DotsNext::DotDot => {\n                self.dots = DotsNext::Files;\n                Some(File::new_aa_parent(\n                    self.parent(),\n                    self.dir,\n                    self.total_size,\n                ))\n            }\n\n            DotsNext::Files => self.next_visible_file(),\n        }\n    }\n}\n\n/// Usually files in Unix use a leading dot to be hidden or visible, but two\n/// entries in particular are “extra-hidden”: `.` and `..`, which only become\n/// visible after an extra `-a` option.\n#[derive(PartialEq, Eq, Debug, Default, Copy, Clone)]\npub enum DotFilter {\n    /// Shows files, dotfiles, and `.` and `..`.\n    DotfilesAndDots,\n\n    /// Show files and dotfiles, but hide `.` and `..`.\n    Dotfiles,\n\n    /// Just show files, hiding anything beginning with a dot.\n    #[default]\n    JustFiles,\n}\n\nimpl DotFilter {\n    /// Whether this filter should show dotfiles in a listing.\n    fn shows_dotfiles(self) -> bool {\n        match self {\n            Self::JustFiles => false,\n            Self::Dotfiles => true,\n            Self::DotfilesAndDots => true,\n        }\n    }\n\n    /// Whether this filter should add dot directories to a listing.\n    fn dots(self) -> DotsNext {\n        match self {\n            Self::JustFiles => DotsNext::Files,\n            Self::Dotfiles => DotsNext::Files,\n            Self::DotfilesAndDots => DotsNext::Dot,\n        }\n    }\n}\n"
  },
  {
    "path": "src/fs/dir_action.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! What to do when encountering a directory?\n\n/// The action to take when trying to list a file that turns out to be a\n/// directory.\n///\n/// By default, exa will display the information about files passed in as\n/// command-line arguments, with one file per entry. However, if a directory\n/// is passed in, exa assumes that the user wants to see its contents, rather\n/// than the directory itself.\n///\n/// This can get annoying sometimes: if a user does `exa ~/Downloads/img-*`\n/// to see the details of every file starting with `img-`, any directories\n/// that happen to start with the same will be listed after the files at\n/// the end in a separate block. By listing directories as files, their\n/// directory status will be ignored, and both will be listed side-by-side.\n///\n/// These two modes have recursive analogues in the “recurse” and “tree”\n/// modes. Here, instead of just listing the directories, exa will descend\n/// into them and print out their contents. The recurse mode does this by\n/// having extra output blocks at the end, while the tree mode will show\n/// directories inline, with their contents immediately underneath.\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum DirAction {\n    /// This directory should be listed along with the regular files, instead\n    /// of having its contents queried.\n    AsFile,\n\n    /// This directory should not be listed, and should instead be opened and\n    /// *its* files listed separately. This is the default behaviour.\n    List,\n\n    /// This directory should be listed along with the regular files, and then\n    /// its contents should be listed afterward. The recursive contents of\n    /// *those* contents are dictated by the options argument.\n    Recurse(RecurseOptions),\n}\n\nimpl DirAction {\n    /// Gets the recurse options, if this dir action has any.\n    #[must_use]\n    pub fn recurse_options(self) -> Option<RecurseOptions> {\n        match self {\n            Self::Recurse(o) => Some(o),\n            _ => None,\n        }\n    }\n\n    /// Whether to treat directories as regular files or not.\n    #[must_use]\n    pub fn treat_dirs_as_files(self) -> bool {\n        match self {\n            Self::AsFile => true,\n            Self::Recurse(o) => o.tree,\n            Self::List => false,\n        }\n    }\n}\n\n/// The options that determine how to recurse into a directory.\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub struct RecurseOptions {\n    /// Whether recursion should be done as a tree or as multiple individual\n    /// views of files.\n    pub tree: bool,\n\n    /// The maximum number of times that recursion should descend to, if one\n    /// is specified.\n    pub max_depth: Option<usize>,\n}\n\nimpl RecurseOptions {\n    /// Returns whether a directory of the given depth would be too deep.\n    #[must_use]\n    pub fn is_too_deep(self, depth: usize) -> bool {\n        match self.max_depth {\n            None => false,\n            Some(d) => d <= depth,\n        }\n    }\n}\n"
  },
  {
    "path": "src/fs/feature/git.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! Getting the Git status of files and directories.\n\nuse std::env;\nuse std::ffi::OsStr;\n#[cfg(target_family = \"unix\")]\nuse std::os::unix::ffi::OsStrExt;\nuse std::path::{Path, PathBuf};\nuse std::sync::Mutex;\n\nuse git2::StatusEntry;\nuse log::{debug, error, info, warn};\n\nuse crate::fs::fields as f;\n\n/// A **Git cache** is assembled based on the user’s input arguments.\n///\n/// This uses vectors to avoid the overhead of hashing: it’s not worth it when the\n/// expected number of Git repositories per exa invocation is 0 or 1...\npub struct GitCache {\n    /// A list of discovered Git repositories and their paths.\n    repos: Vec<GitRepo>,\n\n    /// Paths that we’ve confirmed do not have Git repositories underneath them.\n    misses: Vec<PathBuf>,\n}\n\nimpl GitCache {\n    #[must_use]\n    pub fn has_anything_for(&self, index: &Path) -> bool {\n        self.repos.iter().any(|e| e.has_path(index))\n    }\n\n    #[must_use]\n    pub fn get(&self, index: &Path, prefix_lookup: bool) -> f::Git {\n        self.repos\n            .iter()\n            .find(|repo| repo.has_path(index))\n            .map(|repo| repo.search(index, prefix_lookup))\n            .unwrap_or_default()\n    }\n}\n\nuse std::iter::FromIterator;\nimpl FromIterator<PathBuf> for GitCache {\n    fn from_iter<I>(iter: I) -> Self\n    where\n        I: IntoIterator<Item = PathBuf>,\n    {\n        let iter = iter.into_iter();\n        let mut git = Self {\n            repos: Vec::with_capacity(iter.size_hint().0),\n            misses: Vec::new(),\n        };\n\n        if let Ok(path) = env::var(\"GIT_DIR\") {\n            // These flags are consistent with how `git` uses GIT_DIR:\n            let flags = git2::RepositoryOpenFlags::NO_SEARCH | git2::RepositoryOpenFlags::NO_DOTGIT;\n            match GitRepo::discover(path.into(), flags) {\n                Ok(repo) => {\n                    debug!(\"Opened GIT_DIR repo\");\n                    git.repos.push(repo);\n                }\n                Err(miss) => {\n                    git.misses.push(miss);\n                }\n            }\n        }\n\n        for path in iter {\n            if git.misses.contains(&path) {\n                debug!(\"Skipping {path:?} because it already came back Gitless\");\n            } else if git.repos.iter().any(|e| e.has_path(&path)) {\n                debug!(\"Skipping {path:?} because we already queried it\");\n            } else {\n                let flags = git2::RepositoryOpenFlags::FROM_ENV;\n                match GitRepo::discover(path, flags) {\n                    Ok(r) => {\n                        if let Some(r2) = git.repos.iter_mut().find(|e| e.has_workdir(&r.workdir)) {\n                            debug!(\n                                \"Adding to existing repo (workdir matches with {:?})\",\n                                r2.workdir\n                            );\n                            r2.extra_paths.push(r.original_path);\n                            continue;\n                        }\n\n                        debug!(\"Discovered new Git repo\");\n                        git.repos.push(r);\n                    }\n                    Err(miss) => {\n                        git.misses.push(miss);\n                    }\n                }\n            }\n        }\n\n        git\n    }\n}\n\n/// A **Git repository** is one we’ve discovered somewhere on the filesystem.\npub struct GitRepo {\n    /// The queryable contents of the repository: either a `git2` repo, or the\n    /// cached results from when we queried it last time.\n    contents: Mutex<GitContents>,\n\n    /// The working directory of this repository.\n    /// This is used to check whether two repositories are the same.\n    workdir: PathBuf,\n\n    /// The path that was originally checked to discover this repository.\n    /// This is as important as the `extra_paths` (it gets checked first), but\n    /// is separate to avoid having to deal with a non-empty Vec.\n    original_path: PathBuf,\n\n    /// Any other paths that were checked only to result in this same\n    /// repository.\n    extra_paths: Vec<PathBuf>,\n}\n\n/// A repository’s queried state.\nenum GitContents {\n    /// All the interesting Git stuff goes through this.\n    Before { repo: git2::Repository },\n\n    /// Temporary value used in `repo_to_statuses` so we can move the\n    /// repository out of the `Before` variant.\n    Processing,\n\n    /// The data we’ve extracted from the repository, but only after we’ve\n    /// actually done so.\n    After { statuses: Git },\n}\n\nimpl GitRepo {\n    /// Searches through this repository for a path (to a file or directory,\n    /// depending on the prefix-lookup flag) and returns its Git status.\n    ///\n    /// Actually querying the `git2` repository for the mapping of paths to\n    /// Git statuses is only done once, and gets cached so we don’t need to\n    /// re-query the entire repository the times after that.\n    ///\n    /// The temporary `Processing` enum variant is used after the `git2`\n    /// repository is moved out, but before the results have been moved in!\n    /// See <https://stackoverflow.com/q/45985827/3484614>\n    fn search(&self, index: &Path, prefix_lookup: bool) -> f::Git {\n        use std::mem::replace;\n\n        let mut contents = self.contents.lock().unwrap();\n        if let GitContents::After { ref statuses } = *contents {\n            debug!(\"Git repo {:?} has been found in cache\", &self.workdir);\n            return statuses.status(index, prefix_lookup);\n        }\n\n        debug!(\"Querying Git repo {:?} for the first time\", &self.workdir);\n        let repo = replace(&mut *contents, GitContents::Processing).inner_repo();\n        let statuses = repo_to_statuses(&repo, &self.workdir);\n        let result = statuses.status(index, prefix_lookup);\n        let _processing = replace(&mut *contents, GitContents::After { statuses });\n        result\n    }\n\n    /// Whether this repository has the given working directory.\n    fn has_workdir(&self, path: &Path) -> bool {\n        self.workdir == path\n    }\n\n    /// Whether this repository cares about the given path at all.\n    fn has_path(&self, path: &Path) -> bool {\n        path.starts_with(&self.original_path)\n            || self.extra_paths.iter().any(|e| path.starts_with(e))\n    }\n\n    /// Open a Git repository. Depending on the flags, the path is either\n    /// the repository's \"gitdir\" (or a \"gitlink\" to the gitdir), or the\n    /// path is the start of a rootwards search for the repository.\n    fn discover(path: PathBuf, flags: git2::RepositoryOpenFlags) -> Result<Self, PathBuf> {\n        info!(\"Opening Git repository for {path:?} ({flags:?})\");\n        let unused: [&OsStr; 0] = [];\n        let repo = match git2::Repository::open_ext(&path, flags, unused) {\n            Ok(r) => r,\n            Err(e) => {\n                error!(\"Error opening Git repository for {path:?}: {e:?}\");\n                return Err(path);\n            }\n        };\n\n        if let Some(workdir) = repo.workdir() {\n            let workdir = workdir.to_path_buf();\n            let contents = Mutex::new(GitContents::Before { repo });\n            Ok(Self {\n                contents,\n                workdir,\n                original_path: path,\n                extra_paths: Vec::new(),\n            })\n        } else {\n            warn!(\"Repository has no workdir?\");\n            Err(path)\n        }\n    }\n}\n\nimpl GitContents {\n    /// Assumes that the repository hasn’t been queried, and extracts it\n    /// (consuming the value) if it has. This is needed because the entire\n    /// enum variant gets replaced when a repo is queried (see above).\n    fn inner_repo(self) -> git2::Repository {\n        if let Self::Before { repo } = self {\n            repo\n        } else {\n            unreachable!(\"Tried to extract a non-Repository\")\n        }\n    }\n}\n\n/// Iterates through a repository’s statuses, consuming it and returning the\n/// mapping of files to their Git status.\n/// We will have already used the working directory at this point, so it gets\n/// passed in rather than deriving it from the `Repository` again.\nfn repo_to_statuses(repo: &git2::Repository, workdir: &Path) -> Git {\n    let mut statuses = Vec::new();\n\n    info!(\"Getting Git statuses for repo with workdir {workdir:?}\");\n    match repo.statuses(None) {\n        Ok(es) => {\n            for e in es.iter() {\n                if let Some(p) = get_path_from_status_entry(&e) {\n                    let elem = (workdir.join(p), e.status());\n                    statuses.push(elem);\n                }\n            }\n            // We manually add the `.git` at the root of the repo as ignored, since it is in practice.\n            // Also we want to avoid `eza --tree --all --git-ignore` to display files inside `.git`.\n            statuses.push((workdir.join(\".git\"), git2::Status::IGNORED));\n        }\n        Err(e) => {\n            error!(\"Error looking up Git statuses: {e:?}\");\n        }\n    }\n\n    Git { statuses }\n}\n\n#[allow(clippy::unnecessary_wraps)]\nfn get_path_from_status_entry(e: &StatusEntry<'_>) -> Option<PathBuf> {\n    #[cfg(target_family = \"unix\")]\n    return Some(PathBuf::from(OsStr::from_bytes(e.path_bytes())));\n    #[cfg(not(target_family = \"unix\"))]\n    return if let Some(p) = e.path() {\n        Some(PathBuf::from(p))\n    } else {\n        info!(\"Git status ignored for non ASCII path {:?}\", e.path_bytes());\n        None\n    };\n}\n\n// The `repo.statuses` call above takes a long time. exa debug output:\n//\n//   20.311276  INFO:exa::fs::feature::git: Getting Git statuses for repo with workdir \"/vagrant/\"\n//   20.799610  DEBUG:exa::output::table: Getting Git status for file \"./Cargo.toml\"\n//\n// Even inserting another logging line immediately afterwards doesn’t make it\n// look any faster.\n\n/// Container of Git statuses for all the files in this folder’s Git repository.\nstruct Git {\n    statuses: Vec<(PathBuf, git2::Status)>,\n}\n\nimpl Git {\n    /// Get either the file or directory status for the given path.\n    /// “Prefix lookup” means that it should report an aggregate status of all\n    /// paths starting with the given prefix (in other words, a directory).\n    fn status(&self, index: &Path, prefix_lookup: bool) -> f::Git {\n        if prefix_lookup {\n            self.dir_status(index)\n        } else {\n            self.file_status(index)\n        }\n    }\n\n    /// Get the user-facing status of a file.\n    /// We check the statuses directly applying to a file, and for the ignored\n    /// status we check if any of its parents directories is ignored by git.\n    fn file_status(&self, file: &Path) -> f::Git {\n        let path = reorient(file);\n\n        let s = self\n            .statuses\n            .iter()\n            .filter(|p| {\n                if p.1 == git2::Status::IGNORED {\n                    path.starts_with(&p.0)\n                } else {\n                    p.0 == path\n                }\n            })\n            .fold(git2::Status::empty(), |a, b| a | b.1);\n\n        let staged = index_status(s);\n        let unstaged = working_tree_status(s);\n        f::Git { staged, unstaged }\n    }\n\n    /// Get the combined, user-facing status of a directory.\n    /// Statuses are aggregating (for example, a directory is considered\n    /// modified if any file under it has the status modified), except for\n    /// ignored status which applies to files under (for example, a directory\n    /// is considered ignored if one of its parent directories is ignored).\n    fn dir_status(&self, dir: &Path) -> f::Git {\n        let path = reorient(dir);\n\n        let s = self\n            .statuses\n            .iter()\n            .filter(|p| {\n                if p.1 == git2::Status::IGNORED {\n                    path.starts_with(&p.0)\n                } else {\n                    p.0.starts_with(&path)\n                }\n            })\n            .fold(git2::Status::empty(), |a, b| a | b.1);\n\n        let staged = index_status(s);\n        let unstaged = working_tree_status(s);\n        f::Git { staged, unstaged }\n    }\n}\n\n/// Converts a path to an absolute path based on the current directory.\n/// Paths need to be absolute for them to be compared properly, otherwise\n/// you’d ask a repo about “./README.md” but it only knows about\n/// “/vagrant/README.md”, prefixed by the workdir.\n#[cfg(unix)]\nfn reorient(path: &Path) -> PathBuf {\n    use std::env::current_dir;\n\n    // TODO: I’m not 100% on this func tbh\n    let path = match current_dir() {\n        Err(_) => Path::new(\".\").join(path),\n        Ok(dir) => dir.join(path),\n    };\n\n    path.canonicalize().unwrap_or(path)\n}\n\n#[cfg(windows)]\nfn reorient(path: &Path) -> PathBuf {\n    let unc_path = path.canonicalize().unwrap_or_else(|_| path.to_path_buf());\n    // On Windows UNC path is returned. We need to strip the prefix for it to work.\n    let normal_path = unc_path\n        .as_os_str()\n        .to_str()\n        .unwrap()\n        .trim_start_matches(\"\\\\\\\\?\\\\\");\n    PathBuf::from(normal_path)\n}\n\n/// The character to display if the file has been modified, but not staged.\nfn working_tree_status(status: git2::Status) -> f::GitStatus {\n    #[rustfmt::skip]\n    return match status {\n        s if s.contains(git2::Status::WT_NEW)         => f::GitStatus::New,\n        s if s.contains(git2::Status::WT_MODIFIED)    => f::GitStatus::Modified,\n        s if s.contains(git2::Status::WT_DELETED)     => f::GitStatus::Deleted,\n        s if s.contains(git2::Status::WT_RENAMED)     => f::GitStatus::Renamed,\n        s if s.contains(git2::Status::WT_TYPECHANGE)  => f::GitStatus::TypeChange,\n        s if s.contains(git2::Status::IGNORED)        => f::GitStatus::Ignored,\n        s if s.contains(git2::Status::CONFLICTED)     => f::GitStatus::Conflicted,\n        _                                             => f::GitStatus::NotModified,\n    };\n}\n\n/// The character to display if the file has been modified and the change\n/// has been staged.\nfn index_status(status: git2::Status) -> f::GitStatus {\n    #[rustfmt::skip]\n    return match status {\n        s if s.contains(git2::Status::INDEX_NEW)         => f::GitStatus::New,\n        s if s.contains(git2::Status::INDEX_MODIFIED)    => f::GitStatus::Modified,\n        s if s.contains(git2::Status::INDEX_DELETED)     => f::GitStatus::Deleted,\n        s if s.contains(git2::Status::INDEX_RENAMED)     => f::GitStatus::Renamed,\n        s if s.contains(git2::Status::INDEX_TYPECHANGE)  => f::GitStatus::TypeChange,\n        _                                                => f::GitStatus::NotModified,\n    };\n}\n\nfn current_branch(repo: &git2::Repository) -> Option<String> {\n    let head = match repo.head() {\n        Ok(head) => Some(head),\n        Err(ref e)\n            if e.code() == git2::ErrorCode::UnbornBranch\n                || e.code() == git2::ErrorCode::NotFound =>\n        {\n            return None;\n        }\n        Err(e) => {\n            error!(\"Error looking up Git branch: {e:?}\");\n            return None;\n        }\n    };\n\n    head.and_then(|h| h.shorthand().map(std::string::ToString::to_string))\n}\n\nimpl f::SubdirGitRepo {\n    #[must_use]\n    pub fn from_path(dir: &Path, status: bool) -> Self {\n        let path = &reorient(dir);\n\n        if let Ok(repo) = git2::Repository::open(path) {\n            let branch = current_branch(&repo);\n            if !status {\n                return Self {\n                    status: None,\n                    branch,\n                };\n            }\n            match repo.statuses(None) {\n                Ok(es) => {\n                    if es.iter().any(|s| s.status() != git2::Status::IGNORED) {\n                        return Self {\n                            status: Some(f::SubdirGitRepoStatus::GitDirty),\n                            branch,\n                        };\n                    }\n                    return Self {\n                        status: Some(f::SubdirGitRepoStatus::GitClean),\n                        branch,\n                    };\n                }\n                Err(e) => {\n                    error!(\"Error looking up Git statuses: {e:?}\");\n                }\n            }\n        }\n        f::SubdirGitRepo {\n            status: if status {\n                Some(f::SubdirGitRepoStatus::NoRepo)\n            } else {\n                None\n            },\n            branch: None,\n        }\n    }\n}\n"
  },
  {
    "path": "src/fs/feature/mod.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\npub mod xattr;\n\n#[cfg(feature = \"git\")]\npub mod git;\n\n#[cfg(not(feature = \"git\"))]\npub mod git {\n    use std::iter::FromIterator;\n    use std::path::{Path, PathBuf};\n\n    use crate::fs::fields as f;\n\n    pub struct GitCache;\n\n    impl FromIterator<PathBuf> for GitCache {\n        fn from_iter<I>(_iter: I) -> Self\n        where\n            I: IntoIterator<Item = PathBuf>,\n        {\n            Self\n        }\n    }\n\n    impl GitCache {\n        pub fn has_anything_for(&self, _index: &Path) -> bool {\n            false\n        }\n\n        pub fn get(&self, _index: &Path, _prefix_lookup: bool) -> f::Git {\n            unreachable!();\n        }\n    }\n\n    impl f::SubdirGitRepo {\n        pub fn from_path(_dir: &Path, _status: bool) -> Self {\n            panic!(\"Tried to get subdir Git status, but Git support is disabled\")\n        }\n    }\n}\n"
  },
  {
    "path": "src/fs/feature/xattr.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! Extended attribute support for `NetBSD`, `Darwin`, and `Linux` systems.\n\n#![allow(trivial_casts)] // for ARM\n\nuse std::fmt::{Display, Formatter};\nuse std::io;\nuse std::path::Path;\nuse std::str;\n\npub const ENABLED: bool = cfg!(any(\n    target_os = \"macos\",\n    target_os = \"linux\",\n    target_os = \"netbsd\",\n    target_os = \"freebsd\"\n));\n\n#[derive(Debug)]\npub struct Attribute {\n    pub name: String,\n    pub value: Option<Vec<u8>>,\n}\n\npub trait FileAttributes {\n    fn attributes(&self) -> io::Result<Vec<Attribute>>;\n    fn symlink_attributes(&self) -> io::Result<Vec<Attribute>>;\n}\n\n#[cfg(any(\n    target_os = \"macos\",\n    target_os = \"linux\",\n    target_os = \"netbsd\",\n    target_os = \"freebsd\"\n))]\nimpl FileAttributes for Path {\n    fn attributes(&self) -> io::Result<Vec<Attribute>> {\n        extended_attrs::attributes(self, true)\n    }\n\n    fn symlink_attributes(&self) -> io::Result<Vec<Attribute>> {\n        extended_attrs::attributes(self, false)\n    }\n}\n\n#[cfg(not(any(\n    target_os = \"macos\",\n    target_os = \"linux\",\n    target_os = \"netbsd\",\n    target_os = \"freebsd\"\n)))]\nimpl FileAttributes for Path {\n    fn attributes(&self) -> io::Result<Vec<Attribute>> {\n        Ok(Vec::new())\n    }\n\n    fn symlink_attributes(&self) -> io::Result<Vec<Attribute>> {\n        Ok(Vec::new())\n    }\n}\n\n#[cfg(any(\n    target_os = \"macos\",\n    target_os = \"linux\",\n    target_os = \"netbsd\",\n    target_os = \"freebsd\"\n))]\nmod extended_attrs {\n    use super::Attribute;\n    use libc::{ERANGE, c_char, c_void, size_t, ssize_t};\n    use std::ffi::{CStr, CString, OsStr, OsString};\n    use std::io;\n    use std::os::unix::ffi::OsStrExt;\n    use std::path::Path;\n    use std::ptr::null_mut;\n\n    #[cfg(target_os = \"macos\")]\n    mod os {\n        use libc::{\n            XATTR_NOFOLLOW, XATTR_SHOWCOMPRESSION, c_char, c_int, c_void, getxattr, listxattr,\n            size_t, ssize_t,\n        };\n\n        // Options to use for MacOS versions of getxattr and listxattr\n        fn get_options(follow_symlinks: bool) -> c_int {\n            if follow_symlinks {\n                XATTR_SHOWCOMPRESSION\n            } else {\n                XATTR_NOFOLLOW | XATTR_SHOWCOMPRESSION\n            }\n        }\n\n        // Wrapper around listxattr that handles symbolic links\n        pub(super) fn list_xattr(\n            follow_symlinks: bool,\n            path: *const c_char,\n            namebuf: *mut c_char,\n            size: size_t,\n        ) -> ssize_t {\n            // SAFETY: Calling C function\n            unsafe { listxattr(path, namebuf, size, get_options(follow_symlinks)) }\n        }\n\n        // Wrapper around getxattr that handles symbolic links\n        pub(super) fn get_xattr(\n            follow_symlinks: bool,\n            path: *const c_char,\n            name: *const c_char,\n            value: *mut c_void,\n            size: size_t,\n        ) -> ssize_t {\n            // SAFETY: Calling C function\n            unsafe { getxattr(path, name, value, size, 0, get_options(follow_symlinks)) }\n        }\n    }\n\n    #[cfg(target_os = \"linux\")]\n    mod os {\n        use libc::{c_char, c_void, size_t, ssize_t};\n\n        use libc::{getxattr, lgetxattr, listxattr, llistxattr};\n\n        // Wrapper around listxattr and llistattr for handling symbolic links\n        pub(super) fn list_xattr(\n            follow_symlinks: bool,\n            path: *const c_char,\n            namebuf: *mut c_char,\n            size: size_t,\n        ) -> ssize_t {\n            if follow_symlinks {\n                // SAFETY: Calling C function\n                unsafe { listxattr(path, namebuf, size) }\n            } else {\n                // SAFETY: Calling C function\n                unsafe { llistxattr(path, namebuf, size) }\n            }\n        }\n\n        // Wrapper around getxattr and lgetxattr for handling symbolic links\n        pub(super) fn get_xattr(\n            follow_symlinks: bool,\n            path: *const c_char,\n            name: *const c_char,\n            value: *mut c_void,\n            size: size_t,\n        ) -> ssize_t {\n            if follow_symlinks {\n                // SAFETY: Calling C function\n                unsafe { getxattr(path, name, value, size) }\n            } else {\n                // SAFETY: Calling C function\n                unsafe { lgetxattr(path, name, value, size) }\n            }\n        }\n    }\n\n    #[cfg(any(target_os = \"netbsd\", target_os = \"freebsd\"))]\n    mod os {\n        use libc::{\n            EXTATTR_NAMESPACE_SYSTEM, EXTATTR_NAMESPACE_USER, c_char, c_int, c_void,\n            extattr_get_file, extattr_get_link, extattr_list_file, extattr_list_link, size_t,\n            ssize_t,\n        };\n\n        // Wrapper around listxattr that handles symbolic links\n        fn list_xattr(\n            follow_symlinks: bool,\n            path: *const c_char,\n            namespace: c_int,\n            value: *mut c_void,\n            size: size_t,\n        ) -> ssize_t {\n            if follow_symlinks {\n                // SAFETY: Calling C function\n                unsafe { extattr_list_file(path, namespace, value, size) }\n            } else {\n                // SAFETY: Calling C function\n                unsafe { extattr_list_link(path, namespace, value, size) }\n            }\n        }\n\n        fn get_xattr(\n            follow_symlinks: bool,\n            path: *const c_char,\n            namespace: c_int,\n            name: *const c_char,\n            value: *mut c_void,\n            size: size_t,\n        ) -> ssize_t {\n            if follow_symlinks {\n                // SAFETY: Calling C function\n                unsafe { extattr_get_file(path, namespace, name, value, size) }\n            } else {\n                // SAFETY: Calling C function\n                unsafe { extattr_get_link(path, namespace, name, value, size) }\n            }\n        }\n\n        pub(super) fn list_system_xattr(\n            follow_symlinks: bool,\n            path: *const c_char,\n            namebuf: *mut c_char,\n            size: size_t,\n        ) -> ssize_t {\n            list_xattr(\n                follow_symlinks,\n                path,\n                EXTATTR_NAMESPACE_SYSTEM,\n                namebuf.cast(),\n                size,\n            )\n        }\n\n        pub(super) fn list_user_xattr(\n            follow_symlinks: bool,\n            path: *const c_char,\n            namebuf: *mut c_char,\n            size: size_t,\n        ) -> ssize_t {\n            list_xattr(\n                follow_symlinks,\n                path,\n                EXTATTR_NAMESPACE_USER,\n                namebuf.cast(),\n                size,\n            )\n        }\n\n        pub(super) fn get_system_xattr(\n            follow_symlinks: bool,\n            path: *const c_char,\n            name: *const c_char,\n            value: *mut c_void,\n            size: size_t,\n        ) -> ssize_t {\n            get_xattr(\n                follow_symlinks,\n                path,\n                EXTATTR_NAMESPACE_SYSTEM,\n                name,\n                value.cast(),\n                size,\n            )\n        }\n\n        pub(super) fn get_user_xattr(\n            follow_symlinks: bool,\n            path: *const c_char,\n            name: *const c_char,\n            value: *mut c_void,\n            size: size_t,\n        ) -> ssize_t {\n            get_xattr(\n                follow_symlinks,\n                path,\n                EXTATTR_NAMESPACE_USER,\n                name,\n                value.cast(),\n                size,\n            )\n        }\n    }\n\n    // Split attribute name list.  Each attribute name is null terminated in the\n    // list.\n    #[cfg(any(target_os = \"macos\", target_os = \"linux\"))]\n    fn split_attribute_list(buffer: &[u8]) -> Vec<OsString> {\n        buffer[..buffer.len() - 1] // Skip trailing null\n            .split(|&c| c == 0)\n            .filter(|&s| !s.is_empty())\n            .map(OsStr::from_bytes)\n            .map(std::borrow::ToOwned::to_owned)\n            .collect()\n    }\n\n    // Split attribute name list.  Each attribute is a one byte name length\n    // followed by the name.\n    #[cfg(any(target_os = \"netbsd\", target_os = \"freebsd\"))]\n    fn split_attribute_list(buffer: &[u8]) -> Vec<OsString> {\n        let mut result = Vec::new();\n        let mut index = 0;\n        let length = buffer.len();\n\n        while index < length {\n            let item_length = buffer[index] as usize;\n            let start = index + 1;\n            let end = start + item_length;\n            if end <= length {\n                result.push(OsStr::from_bytes(&buffer[start..end]).to_owned());\n            }\n            index = end;\n        }\n\n        result\n    }\n\n    // Calling getxattr and listxattr is a two part process.  The first call\n    // a null ptr for buffer and a zero buffer size is passed and the function\n    // returns the needed buffer size.  The second call the buffer ptr and the\n    // buffer size is passed and the buffer is filled.  Care must be taken if\n    // the buffer size changes between the first and second call.\n    fn get_loop<F: Fn(*mut u8, usize) -> ssize_t>(f: F) -> io::Result<Option<Vec<u8>>> {\n        let mut buffer: Vec<u8> = Vec::new();\n        loop {\n            let buffer_size = match f(null_mut(), 0) {\n                -1 => return Err(io::Error::last_os_error()),\n                0 => return Ok(None),\n                size => size as size_t,\n            };\n\n            buffer.resize(buffer_size, 0);\n\n            return match f(buffer.as_mut_ptr(), buffer_size) {\n                -1 => {\n                    let last_os_error = io::Error::last_os_error();\n                    if last_os_error.raw_os_error() == Some(ERANGE) {\n                        // Passed buffer was to small so retry again.\n                        continue;\n                    }\n                    Err(last_os_error)\n                }\n                0 => Ok(None),\n                len => {\n                    // Just in case the size shrunk\n                    buffer.truncate(len as usize);\n                    Ok(Some(buffer))\n                }\n            };\n        }\n    }\n\n    // Get a list of all attribute names on `path`\n    fn list_attributes(\n        path: &CStr,\n        follow_symlinks: bool,\n        lister: fn(\n            follow_symlinks: bool,\n            path: *const c_char,\n            namebuf: *mut c_char,\n            size: size_t,\n        ) -> ssize_t,\n    ) -> io::Result<Vec<OsString>> {\n        Ok(\n            get_loop(|buf, size| lister(follow_symlinks, path.as_ptr(), buf.cast(), size))?\n                .map_or_else(Vec::new, |buffer| split_attribute_list(&buffer)),\n        )\n    }\n\n    // Get the attribute value `name` on `path`\n    #[cfg(any(target_os = \"macos\", target_os = \"linux\"))]\n    fn get_attribute(\n        path: &CStr,\n        name: &CStr,\n        follow_symlinks: bool,\n        getter: fn(\n            follow_symlinks: bool,\n            path: *const c_char,\n            name: *const c_char,\n            value: *mut c_void,\n            size: size_t,\n        ) -> ssize_t,\n    ) -> io::Result<Option<Vec<u8>>> {\n        use libc::ENODATA;\n\n        get_loop(|buf, size| {\n            getter(\n                follow_symlinks,\n                path.as_ptr(),\n                name.as_ptr(),\n                buf.cast(),\n                size,\n            )\n        })\n        .or_else(|err| {\n            if err.raw_os_error() == Some(ENODATA) {\n                // This handles the case when the named attribute is not on the\n                // path.  This is for mainly handling the special case for the\n                // security.selinux attribute mentioned below.  This can\n                // also happen when an attribute is deleted between listing\n                // the attributes and getting its value.\n                Ok(None)\n            } else {\n                Err(err)\n            }\n        })\n    }\n\n    #[cfg(any(target_os = \"netbsd\", target_os = \"freebsd\"))]\n    fn get_attribute(\n        path: &CStr,\n        name: &CStr,\n        follow_symlinks: bool,\n        getter: fn(\n            follow_symlinks: bool,\n            path: *const c_char,\n            name: *const c_char,\n            value: *mut c_void,\n            size: size_t,\n        ) -> ssize_t,\n    ) -> io::Result<Option<Vec<u8>>> {\n        get_loop(|buf, size| {\n            getter(\n                follow_symlinks,\n                path.as_ptr(),\n                name.as_ptr(),\n                buf.cast(),\n                size,\n            )\n        })\n    }\n\n    // Specially handle security.linux for filesystem that do not list attributes.\n    #[cfg(target_os = \"linux\")]\n    fn get_selinux_attribute(path: &CStr, follow_symlinks: bool) -> io::Result<Vec<Attribute>> {\n        const SELINUX_XATTR_NAME: &str = \"security.selinux\";\n        let name = CString::new(SELINUX_XATTR_NAME).unwrap();\n\n        get_attribute(path, &name, follow_symlinks, os::get_xattr).map(|value| {\n            if value.is_some() {\n                vec![Attribute {\n                    name: String::from(SELINUX_XATTR_NAME),\n                    value,\n                }]\n            } else {\n                Vec::new()\n            }\n        })\n    }\n\n    // Get a vector of all attribute names and values on `path`\n    #[cfg(any(target_os = \"macos\", target_os = \"linux\"))]\n    pub fn attributes(path: &Path, follow_symlinks: bool) -> io::Result<Vec<Attribute>> {\n        let path = CString::new(path.as_os_str().as_bytes()).map_err(io::Error::other)?;\n        let attr_names = list_attributes(&path, follow_symlinks, os::list_xattr)?;\n\n        #[cfg(target_os = \"linux\")]\n        if attr_names.is_empty() {\n            // Some filesystems, like sysfs, return nothing on listxattr, even though the security\n            // attribute is set.\n            return get_selinux_attribute(&path, follow_symlinks);\n        }\n\n        let mut attrs = Vec::with_capacity(attr_names.len());\n        for attr_name in attr_names {\n            if let Some(name) = attr_name.to_str() {\n                let attr_name = CString::new(name).map_err(io::Error::other)?;\n                let value = get_attribute(&path, &attr_name, follow_symlinks, os::get_xattr)?;\n                attrs.push(Attribute {\n                    name: name.to_string(),\n                    value,\n                });\n            }\n        }\n\n        Ok(attrs)\n    }\n\n    #[cfg(any(target_os = \"netbsd\", target_os = \"freebsd\"))]\n    fn get_namespace_attributes(\n        path: &CStr,\n        follow_symlinks: bool,\n        attr_names: Vec<OsString>,\n        namespace: &str,\n        getter: fn(\n            follow_symlinks: bool,\n            path: *const c_char,\n            name: *const c_char,\n            value: *mut c_void,\n            size: size_t,\n        ) -> ssize_t,\n        attrs: &mut Vec<Attribute>,\n    ) -> io::Result<()> {\n        for attr_name in attr_names {\n            if let Some(name) = attr_name.to_str() {\n                let attr_name = CString::new(name).map_err(io::Error::other)?;\n                let value = get_attribute(path, &attr_name, follow_symlinks, getter)?;\n                attrs.push(Attribute {\n                    name: format!(\"{namespace}::{name}\"),\n                    value,\n                });\n            }\n        }\n        Ok(())\n    }\n\n    #[cfg(any(target_os = \"netbsd\", target_os = \"freebsd\"))]\n    pub fn attributes(path: &Path, follow_symlinks: bool) -> io::Result<Vec<Attribute>> {\n        use libc::EPERM;\n\n        let path = CString::new(path.as_os_str().as_bytes()).map_err(io::Error::other)?;\n        let attr_names_system = list_attributes(&path, follow_symlinks, os::list_system_xattr)\n            .or_else(|err| {\n                // Reading of attributes in the system namespace is only supported for root\n                if err.raw_os_error() == Some(EPERM) {\n                    Ok(Vec::new())\n                } else {\n                    Err(err)\n                }\n            })?;\n        let attr_names_user = list_attributes(&path, follow_symlinks, os::list_user_xattr)?;\n\n        let mut attrs = Vec::with_capacity(attr_names_system.len() + attr_names_user.len());\n\n        get_namespace_attributes(\n            &path,\n            follow_symlinks,\n            attr_names_system,\n            \"system\",\n            os::get_system_xattr,\n            &mut attrs,\n        )?;\n        get_namespace_attributes(\n            &path,\n            follow_symlinks,\n            attr_names_user,\n            \"user\",\n            os::get_user_xattr,\n            &mut attrs,\n        )?;\n\n        Ok(attrs)\n    }\n}\n\nconst ATTRIBUTE_VALUE_MAX_HEX_LENGTH: usize = 16;\n\n// Display for an attribute.  Attribute values that have a custom display are\n// enclosed in curley brackets.\nimpl Display for Attribute {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        f.write_fmt(format_args!(\"{}: \", self.name))?;\n        if let Some(value) = custom_attr_display(self) {\n            f.write_fmt(format_args!(\"<{value}>\"))\n        } else {\n            match &self.value {\n                None => f.write_str(\"<empty>\"),\n                Some(value) => {\n                    if let Some(val) = custom_value_display(value) {\n                        f.write_fmt(format_args!(\"<{val}>\"))\n                    } else if let Ok(v) = str::from_utf8(value) {\n                        f.write_fmt(format_args!(\"{:?}\", v.trim_end_matches(char::from(0))))\n                    } else if value.len() <= ATTRIBUTE_VALUE_MAX_HEX_LENGTH {\n                        f.write_fmt(format_args!(\"{value:02x?}\"))\n                    } else {\n                        f.write_fmt(format_args!(\"<length {}>\", value.len()))\n                    }\n                }\n            }\n        }\n    }\n}\n\nstruct AttributeDisplay {\n    pub attribute: &'static str,\n    pub display: fn(&Attribute) -> Option<String>,\n}\n\n// Check for a custom display by attribute name and call the display function\nfn custom_attr_display(attribute: &Attribute) -> Option<String> {\n    let name = attribute.name.as_str();\n    // Strip off MacOS Metadata Persistence Flags\n    // See https://eclecticlight.co/2020/11/02/controlling-metadata-tricks-with-persistence/\n    #[cfg(target_os = \"macos\")]\n    let name = name.rsplit_once('#').map_or(name, |n| n.0);\n\n    ATTRIBUTE_DISPLAYS\n        .iter()\n        .find(|c| c.attribute == name)\n        .and_then(|c| (c.display)(attribute))\n}\n\n#[cfg(target_os = \"macos\")]\nconst ATTRIBUTE_DISPLAYS: &[AttributeDisplay] = &[\n    AttributeDisplay {\n        attribute: \"com.apple.lastuseddate\",\n        display: display_lastuseddate,\n    },\n    AttributeDisplay {\n        attribute: \"com.apple.macl\",\n        display: display_macl,\n    },\n];\n\n#[cfg(not(target_os = \"macos\"))]\nconst ATTRIBUTE_DISPLAYS: &[AttributeDisplay] = &[];\n\n// com.apple.lastuseddate is two 64-bit values representing the seconds and nano seconds\n// from January 1, 1970\n#[cfg(target_os = \"macos\")]\nfn display_lastuseddate(attribute: &Attribute) -> Option<String> {\n    use chrono::{Local, SecondsFormat, TimeZone};\n\n    attribute\n        .value\n        .as_ref()\n        .filter(|value| value.len() == 16)\n        .and_then(|value| {\n            let sec = i64::from_le_bytes(value[0..8].try_into().unwrap());\n            let n_sec = i64::from_le_bytes(value[8..].try_into().unwrap());\n            Local\n                .timestamp_opt(sec, n_sec as u32)\n                .map(|dt| dt.to_rfc3339_opts(SecondsFormat::Nanos, true))\n                .single()\n        })\n}\n\n// com.apple.macl is a two byte flag followed by a uuid for the application\n#[cfg(target_os = \"macos\")]\nfn format_macl(value: &[u8]) -> String {\n    const HEX: [u8; 16] = [\n        b'0', b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8', b'9', b'a', b'b', b'c', b'd', b'e',\n        b'f',\n    ];\n    const GROUPS: [(usize, usize, u8); 6] = [\n        (0, 4, b';'),\n        (5, 13, b'-'),\n        (14, 18, b'-'),\n        (19, 23, b'-'),\n        (24, 28, b'-'),\n        (29, 41, 0),\n    ];\n\n    let mut dst = [0; 41];\n    let mut i = 0;\n\n    for (start, end, sep) in GROUPS {\n        for j in (start..end).step_by(2) {\n            let x = value[i];\n            i += 1;\n            dst[j] = HEX[(x >> 4) as usize];\n            dst[j + 1] = HEX[(x & 0x0f) as usize];\n        }\n        if sep != 0 {\n            dst[end] = sep;\n        }\n    }\n\n    // SAFETY: Vector generated above with only ASCII characters.\n    unsafe { String::from_utf8_unchecked(dst.to_vec()) }\n}\n\n// See https://book.hacktricks.xyz/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc\n#[cfg(target_os = \"macos\")]\nfn display_macl(attribute: &Attribute) -> Option<String> {\n    attribute\n        .value\n        .as_ref()\n        .filter(|v| v.len() % 18 == 0)\n        .map(|v| {\n            let macls = v\n                .as_slice()\n                .chunks(18)\n                .filter(|c| c[0] != 0 || c[1] != 0)\n                .map(format_macl)\n                .collect::<Vec<String>>()\n                .join(\", \");\n            format!(\"[{macls}]\")\n        })\n}\n\n// plist::XmlWriter takes the writer instead of borrowing it.  This is a\n// wrapper around a borrowed vector that just forwards the Write trait\n// calls to the borrowed vector.\nstruct BorrowedWriter<'a> {\n    pub buffer: &'a mut Vec<u8>,\n}\n\nimpl io::Write for BorrowedWriter<'_> {\n    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {\n        self.buffer.write(buf)\n    }\n\n    fn flush(&mut self) -> io::Result<()> {\n        self.buffer.flush()\n    }\n\n    fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {\n        self.buffer.write_all(buf)\n    }\n}\n\nfn custom_value_display(value: &[u8]) -> Option<String> {\n    if value.starts_with(b\"bplist\") {\n        plist_value_display(value)\n    } else {\n        None\n    }\n}\n\n// Convert a binary plist to a XML plist.\nfn plist_value_display(value: &[u8]) -> Option<String> {\n    let reader = io::Cursor::new(value);\n    plist::Value::from_reader(reader).ok().and_then(|v| {\n        let mut buffer = Vec::new();\n        v.to_writer_xml_with_options(\n            BorrowedWriter {\n                buffer: &mut buffer,\n            },\n            &plist::XmlWriteOptions::default()\n                .indent(b' ', 0)\n                .root_element(false),\n        )\n        .ok()\n        .and_then(|()| str::from_utf8(&buffer).ok())\n        .map(|s| format!(\"<plist version=\\\"1.0\\\">{}</plist>\", s.replace('\\n', \"\")))\n    })\n}\n"
  },
  {
    "path": "src/fs/fields.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! Wrapper types for the values returned from `File`s.\n//!\n//! The methods of `File` that return information about the entry on the\n//! filesystem -- size, modification date, block count, or Git status -- used\n//! to just return these as formatted strings, but this became inflexible once\n//! customisable output styles landed.\n//!\n//! Instead, they will return a wrapper type from this module, which tags the\n//! type with what field it is while containing the actual raw value.\n//!\n//! The `output::details` module, among others, uses these types to render and\n//! display the information as formatted strings.\n\n#![allow(non_camel_case_types)]\n#![allow(clippy::struct_excessive_bools)]\n\n/// The type of a file’s group ID.\n#[cfg(unix)]\npub type gid_t = u32;\n\n/// The type of a file’s inode.\n#[cfg(unix)]\npub type ino_t = u64;\n\n/// The type of a file’s number of links.\n#[cfg(unix)]\npub type nlink_t = u64;\n\n/// The type of a file’s user ID.\n#[cfg(unix)]\npub type uid_t = u32;\n\n/// The type of user file flags\npub type flag_t = u32;\n\n/// The file’s base type, which gets displayed in the very first column of the\n/// details output.\n///\n/// This type is set entirely by the filesystem, rather than relying on a\n/// file’s contents. So “link” is a type, but “image” is just a type of\n/// regular file. (See the `filetype` module for those checks.)\n///\n/// Its ordering is used when sorting by type.\n#[derive(PartialEq, Eq, PartialOrd, Ord, Copy, Clone)]\npub enum Type {\n    Directory,\n    File,\n    Link,\n    Pipe,\n    Socket,\n    CharDevice,\n    BlockDevice,\n    Special,\n}\n\nimpl Type {\n    #[must_use]\n    pub fn is_regular_file(self) -> bool {\n        matches!(self, Self::File)\n    }\n}\n\n/// The file’s Unix permission bitfield, with one entry per bit.\n#[derive(Copy, Clone)]\n#[rustfmt::skip]\n#[cfg(unix)]\npub struct Permissions {\n    pub user_read:      bool,\n    pub user_write:     bool,\n    pub user_execute:   bool,\n\n    pub group_read:     bool,\n    pub group_write:    bool,\n    pub group_execute:  bool,\n\n    pub other_read:     bool,\n    pub other_write:    bool,\n    pub other_execute:  bool,\n\n    pub sticky:         bool,\n    pub setgid:         bool,\n    pub setuid:         bool,\n}\n\n/// The file's `FileAttributes` field, available only on Windows.\n#[derive(Copy, Clone)]\n#[rustfmt::skip]\n#[cfg(windows)]\npub struct Attributes {\n    pub archive:         bool,\n    pub directory:       bool,\n    pub readonly:        bool,\n    pub hidden:          bool,\n    pub system:          bool,\n    pub reparse_point:   bool,\n}\n\n/// The three pieces of information that are displayed as a single column in\n/// the details view. These values are fused together to make the output a\n/// little more compressed.\n#[derive(Copy, Clone)]\npub struct PermissionsPlus {\n    #[allow(unused)]\n    pub file_type: Type,\n    #[cfg(unix)]\n    pub permissions: Permissions,\n    #[cfg(windows)]\n    pub attributes: Attributes,\n    #[allow(unused)]\n    pub xattrs: bool,\n}\n\n/// The permissions encoded as octal values\n#[derive(Copy, Clone)]\n#[cfg(unix)]\npub struct OctalPermissions {\n    pub permissions: Permissions,\n}\n\n/// A file’s number of hard links on the filesystem.\n///\n/// Under Unix, a file can exist on the filesystem only once but appear in\n/// multiple directories. However, it’s rare (but occasionally useful!) for a\n/// regular file to have a link count greater than 1, so we highlight the\n/// block count specifically for this case.\n#[cfg(unix)]\n#[derive(Copy, Clone)]\npub struct Links {\n    /// The actual link count.\n    pub count: nlink_t,\n\n    /// Whether this file is a regular file with more than one hard link.\n    pub multiple: bool,\n}\n\n/// A file’s inode. Every directory entry on a Unix filesystem has an inode,\n/// including directories and links, so this is applicable to everything exa\n/// can deal with.\n#[cfg(unix)]\n#[derive(Copy, Clone)]\npub struct Inode(pub ino_t);\n\n/// A file's size of allocated file system blocks.\n#[derive(Copy, Clone)]\n#[cfg(unix)]\npub enum Blocksize {\n    /// This file has the given number of blocks.\n    Some(u64),\n\n    /// This file isn’t of a type that can take up blocks.\n    None,\n}\n\n/// The ID of the user that owns a file. This will only ever be a number;\n/// looking up the username is done in the `display` module.\n#[cfg(unix)]\n#[derive(Copy, Clone)]\npub struct User(pub uid_t);\n\n/// The ID of the group that a file belongs to.\n#[cfg(unix)]\n#[derive(Copy, Clone)]\npub struct Group(pub gid_t);\n\n/// A file’s size, in bytes. This is usually formatted by the `unit_prefix`\n/// crate into something human-readable.\n#[derive(Copy, Clone)]\npub enum Size {\n    /// This file has a defined size.\n    Some(u64),\n\n    /// This file has no size, or has a size but we aren’t interested in it.\n    ///\n    /// Under Unix, directory entries that aren’t regular files will still\n    /// have a file size. For example, a directory will just contain a list of\n    /// its files as its “contents” and will be specially flagged as being a\n    /// directory, rather than a file. However, seeing the “file size” of this\n    /// data is rarely useful — I can’t think of a time when I’ve seen it and\n    /// learnt something. So we discard it and just output “-” instead.\n    ///\n    /// See this answer for more: <https://unix.stackexchange.com/a/68266>\n    None,\n\n    /// This file is a block or character device, so instead of a size, print\n    /// out the file’s major and minor device IDs.\n    ///\n    /// This is what ls does as well. Without it, the devices will just have\n    /// file sizes of zero.\n    DeviceIDs(DeviceIDs),\n}\n\n/// The major and minor device IDs that gets displayed for device files.\n///\n/// You can see what these device numbers mean:\n/// - <http://www.lanana.org/docs/device-list/>\n/// - <http://www.lanana.org/docs/device-list/devices-2.6+.txt>\n#[derive(Copy, Clone)]\npub struct DeviceIDs {\n    pub major: u32,\n    pub minor: u32,\n}\n\n/// A file’s status in a Git repository. Whether a file is in a repository or\n/// not is handled by the Git module, rather than having a “null” variant in\n/// this enum.\n#[derive(PartialEq, Eq, Copy, Clone)]\npub enum GitStatus {\n    /// This file hasn’t changed since the last commit.\n    NotModified,\n\n    /// This file didn’t exist for the last commit, and is not specified in\n    /// the ignored files list.\n    New,\n\n    /// A file that’s been modified since the last commit.\n    Modified,\n\n    /// A deleted file. This can’t ever be shown, but it’s here anyway!\n    Deleted,\n\n    /// A file that Git has tracked a rename for.\n    Renamed,\n\n    /// A file that’s had its type (such as the file permissions) changed.\n    TypeChange,\n\n    /// A file that’s ignored (that matches a line in .gitignore)\n    Ignored,\n\n    /// A file that’s updated but unmerged.\n    Conflicted,\n}\n\n/// A file’s complete Git status. It’s possible to make changes to a file, add\n/// it to the staging area, then make *more* changes, so we need to list each\n/// file’s status for both of these.\n#[derive(Copy, Clone)]\npub struct Git {\n    pub staged: GitStatus,\n    pub unstaged: GitStatus,\n}\n\nimpl Default for Git {\n    /// Create a Git status for a file with nothing done to it.\n    fn default() -> Self {\n        Self {\n            staged: GitStatus::NotModified,\n            unstaged: GitStatus::NotModified,\n        }\n    }\n}\n\npub enum SecurityContextType<'a> {\n    SELinux(&'a str),\n    None,\n}\n\npub struct SecurityContext<'a> {\n    pub context: SecurityContextType<'a>,\n}\n\n#[allow(dead_code)]\n#[derive(PartialEq, Copy, Clone)]\npub enum SubdirGitRepoStatus {\n    NoRepo,\n    GitClean,\n    GitDirty,\n}\n\n#[derive(Clone)]\npub struct SubdirGitRepo {\n    pub status: Option<SubdirGitRepoStatus>,\n    pub branch: Option<String>,\n}\n\nimpl Default for SubdirGitRepo {\n    fn default() -> Self {\n        Self {\n            status: Some(SubdirGitRepoStatus::NoRepo),\n            branch: None,\n        }\n    }\n}\n\n/// The user file flags on the file. This will only ever be a number;\n/// looking up the flags is done in the `display` module.\npub struct Flags(pub flag_t);\n"
  },
  {
    "path": "src/fs/file.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! Files, and methods and fields to access their metadata.\n\n#[cfg(unix)]\nuse std::collections::HashMap;\nuse std::fs::FileType;\nuse std::io;\n#[cfg(unix)]\nuse std::os::unix::fs::{FileTypeExt, MetadataExt, PermissionsExt};\n#[cfg(windows)]\nuse std::os::windows::fs::MetadataExt;\nuse std::path::{Path, PathBuf};\n#[cfg(unix)]\nuse std::str;\n#[cfg(unix)]\nuse std::sync::Mutex;\nuse std::sync::OnceLock;\nuse std::time::SystemTime;\n\nuse chrono::prelude::*;\n\nuse log::{debug, error, trace};\n#[cfg(unix)]\nuse std::sync::LazyLock;\n\nuse crate::fs::dir::Dir;\nuse crate::fs::feature::xattr;\nuse crate::fs::feature::xattr::{Attribute, FileAttributes};\nuse crate::fs::fields as f;\nuse crate::fs::fields::SecurityContextType;\nuse crate::fs::recursive_size::RecursiveSize;\n\nuse super::mounts::MountedFs;\nuse super::mounts::all_mounts;\n\n// Maps (device_id, inode) => (size_in_bytes, size_in_blocks)\n// Mutex::new is const but HashMap::new is not const requiring us to use lazy\n// initialization.\n#[allow(clippy::type_complexity)]\n#[cfg(unix)]\nstatic DIRECTORY_SIZE_CACHE: LazyLock<Mutex<HashMap<(u64, u64), (u64, u64)>>> =\n    LazyLock::new(|| Mutex::new(HashMap::new()));\n\n/// A **File** is a wrapper around one of Rust’s `PathBuf` values, along with\n/// associated data about the file.\n///\n/// Each file is definitely going to have its filename displayed at least\n/// once, have its file extension extracted at least once, and have its metadata\n/// information queried at least once, so it makes sense to do all this at the\n/// start and hold on to all the information.\npub struct File<'dir> {\n    /// The filename portion of this file’s path, including the extension.\n    ///\n    /// This is used to compare against certain filenames (such as checking if\n    /// it’s “Makefile” or something) and to highlight only the filename in\n    /// colour when displaying the path.\n    pub name: String,\n\n    /// The file’s name’s extension, if present, extracted from the name.\n    ///\n    /// This is queried many times over, so it’s worth caching it.\n    pub ext: Option<String>,\n\n    /// The path that begat this file.\n    ///\n    /// Even though the file’s name is extracted, the path needs to be kept\n    /// around, as certain operations involve looking up the file’s absolute\n    /// location (such as searching for compiled files) or using its original\n    /// path (following a symlink).\n    pub path: PathBuf,\n\n    /// The cached filetype for this file\n    pub filetype: OnceLock<Option<std::fs::FileType>>,\n\n    /// A cached `metadata` (`stat`) call for this file.\n    ///\n    /// This too is queried multiple times, and is *not* cached by the OS, as\n    /// it could easily change between invocations — but exa is so short-lived\n    /// it’s better to just cache it.\n    pub metadata: OnceLock<io::Result<std::fs::Metadata>>,\n\n    /// A reference to the directory that contains this file, if any.\n    ///\n    /// Filenames that get passed in on the command-line directly will have no\n    /// parent directory reference — although they technically have one on the\n    /// filesystem, we’ll never need to look at it, so it’ll be `None`.\n    /// However, *directories* that get passed in will produce files that\n    /// contain a reference to it, which is used in certain operations (such\n    /// as looking up compiled files).\n    pub parent_dir: Option<&'dir Dir>,\n\n    /// Whether this is one of the two `--all all` directories, `.` and `..`.\n    ///\n    /// Unlike all other entries, these are not returned as part of the\n    /// directory’s children, and are in fact added specifically by exa; this\n    /// means that they should be skipped when recursing.\n    pub is_all_all: bool,\n\n    /// Whether to dereference symbolic links when querying for information.\n    ///\n    /// For instance, when querying the size of a symbolic link, if\n    /// dereferencing is enabled, the size of the target will be displayed\n    /// instead.\n    pub deref_links: bool,\n\n    /// The recursive directory size when `total_size` is used.\n    recursive_size: RecursiveSize,\n\n    /// The extended attributes of this file.\n    extended_attributes: OnceLock<Vec<Attribute>>,\n\n    /// The absolute value of this path, used to look up mount points.\n    absolute_path: OnceLock<Option<PathBuf>>,\n}\n\nimpl<'dir> File<'dir> {\n    pub fn from_args<PD, FN>(\n        path: PathBuf,\n        parent_dir: PD,\n        filename: FN,\n        deref_links: bool,\n        total_size: bool,\n        filetype: Option<std::fs::FileType>,\n    ) -> File<'dir>\n    where\n        PD: Into<Option<&'dir Dir>>,\n        FN: Into<Option<String>>,\n    {\n        let parent_dir = parent_dir.into();\n        let name = filename.into().unwrap_or_else(|| File::filename(&path));\n        let ext = File::ext(&path);\n\n        let is_all_all = false;\n        let recursive_size = if total_size {\n            RecursiveSize::Unknown\n        } else {\n            RecursiveSize::None\n        };\n\n        debug!(\"deref_links {deref_links}\");\n\n        let filetype = match filetype {\n            Some(f) => OnceLock::from(Some(f)),\n            None => OnceLock::new(),\n        };\n\n        debug!(\"deref_links {deref_links}\");\n\n        let mut file = File {\n            name,\n            ext,\n            path,\n            parent_dir,\n            is_all_all,\n            deref_links,\n            recursive_size,\n            filetype,\n            metadata: OnceLock::new(),\n            extended_attributes: OnceLock::new(),\n            absolute_path: OnceLock::new(),\n        };\n\n        if total_size {\n            file.recursive_size = file.recursive_directory_size();\n        }\n\n        file\n    }\n\n    fn new_aa(\n        path: PathBuf,\n        parent_dir: &'dir Dir,\n        name: &'static str,\n        total_size: bool,\n    ) -> File<'dir> {\n        let ext = File::ext(&path);\n\n        let is_all_all = true;\n        let parent_dir = Some(parent_dir);\n        let recursive_size = if total_size {\n            RecursiveSize::Unknown\n        } else {\n            RecursiveSize::None\n        };\n\n        let mut file = File {\n            name: name.into(),\n            ext,\n            path,\n            parent_dir,\n            is_all_all,\n            deref_links: false,\n            recursive_size,\n            metadata: OnceLock::new(),\n            absolute_path: OnceLock::new(),\n            extended_attributes: OnceLock::new(),\n            filetype: OnceLock::new(),\n        };\n\n        if total_size {\n            file.recursive_size = file.recursive_directory_size();\n        }\n\n        file\n    }\n\n    #[must_use]\n    pub fn new_aa_current(parent_dir: &'dir Dir, total_size: bool) -> File<'dir> {\n        File::new_aa(parent_dir.path.clone(), parent_dir, \".\", total_size)\n    }\n\n    #[must_use]\n    pub fn new_aa_parent(path: PathBuf, parent_dir: &'dir Dir, total_size: bool) -> File<'dir> {\n        File::new_aa(path, parent_dir, \"..\", total_size)\n    }\n\n    /// A file’s name is derived from its string. This needs to handle directories\n    /// such as `/` or `..`, which have no `file_name` component. So instead, just\n    /// use the last component as the name.\n    #[must_use]\n    pub fn filename(path: &Path) -> String {\n        if let Some(back) = path.components().next_back() {\n            back.as_os_str().to_string_lossy().to_string()\n        } else {\n            // use the path as fallback\n            error!(\"Path {path:?} has no last component\");\n            path.display().to_string()\n        }\n    }\n\n    /// Extract an extension from a file path, if one is present, in lowercase.\n    ///\n    /// The extension is the series of characters after the last dot. This\n    /// deliberately counts dotfiles, so the “.git” folder has the extension “git”.\n    ///\n    /// ASCII lowercasing is used because these extensions are only compared\n    /// against a pre-compiled list of extensions which are known to only exist\n    /// within ASCII, so it’s alright.\n    fn ext(path: &Path) -> Option<String> {\n        let name = path.file_name().map(|f| f.to_string_lossy().to_string())?;\n\n        name.rfind('.').map(|p| name[p + 1..].to_ascii_lowercase())\n    }\n\n    /// Read the extended attributes of a file path.\n    fn gather_extended_attributes(&self) -> Vec<Attribute> {\n        if xattr::ENABLED {\n            let attributes = if self.deref_links {\n                self.path.attributes()\n            } else {\n                self.path.symlink_attributes()\n            };\n            match attributes {\n                Ok(xattrs) => xattrs,\n                Err(e) => {\n                    error!(\n                        \"Error looking up extended attributes for {}: {}\",\n                        self.path.display(),\n                        e\n                    );\n                    Vec::new()\n                }\n            }\n        } else {\n            Vec::new()\n        }\n    }\n\n    fn filetype(&self) -> Option<&std::fs::FileType> {\n        self.filetype\n            .get_or_init(|| self.metadata().as_ref().ok().map(|md| md.file_type()))\n            .as_ref()\n    }\n\n    pub fn metadata(&self) -> Result<&std::fs::Metadata, &io::Error> {\n        self.metadata\n            .get_or_init(|| {\n                debug!(\"Statting file {:?}\", &self.path);\n                std::fs::symlink_metadata(&self.path)\n            })\n            .as_ref()\n    }\n\n    /// Get the extended attributes of a file path on demand.\n    pub fn extended_attributes(&self) -> &Vec<Attribute> {\n        self.extended_attributes\n            .get_or_init(|| self.gather_extended_attributes())\n    }\n\n    /// Whether this file is a directory on the filesystem.\n    pub fn is_directory(&self) -> bool {\n        self.filetype().is_some_and(std::fs::FileType::is_dir)\n    }\n\n    /// Whether this file is a directory, or a symlink pointing to a directory.\n    pub fn points_to_directory(&self) -> bool {\n        if self.is_directory() {\n            return true;\n        }\n\n        if self.is_link() {\n            let target = self.link_target();\n            if let FileTarget::Ok(target) = target {\n                return target.points_to_directory();\n            }\n        }\n\n        false\n    }\n\n    /// Initializes a new `Dir` object using the `PathBuf` of\n    /// the current file. It does not perform any validation to check if the\n    /// file is actually a directory. To verify that, use `is_directory()`.\n    pub fn to_dir(&self) -> Dir {\n        trace!(\"read_dir: initializating dir from path\");\n        Dir::new(self.path.clone())\n    }\n\n    /// If this file is a directory on the filesystem, then clone its\n    /// `PathBuf` for use in one of our own `Dir` values, and read a list of\n    /// its contents.\n    ///\n    /// Returns an IO error upon failure, but this shouldn’t be used to check\n    /// if a `File` is a directory or not! For that, just use `is_directory()`.\n    pub fn read_dir(&self) -> io::Result<Dir> {\n        trace!(\"read_dir: reading dir\");\n        Dir::read_dir(self.path.clone())\n    }\n\n    /// Whether this file is a regular file on the filesystem — that is, not a\n    /// directory, a link, or anything else treated specially.\n    pub fn is_file(&self) -> bool {\n        self.filetype().is_some_and(std::fs::FileType::is_file)\n    }\n\n    /// Whether this file is both a regular file *and* executable for the\n    /// current user. An executable file has a different purpose from an\n    /// executable directory, so they should be highlighted differently.\n    #[cfg(unix)]\n    pub fn is_executable_file(&self) -> bool {\n        let bit = modes::USER_EXECUTE;\n        if !self.is_file() {\n            return false;\n        }\n        let Ok(md) = self.metadata() else {\n            return false;\n        };\n        (md.permissions().mode() & bit) == bit\n    }\n\n    /// Whether this file is a symlink on the filesystem.\n    pub fn is_link(&self) -> bool {\n        self.filetype().is_some_and(FileType::is_symlink)\n    }\n\n    /// Whether this file is a named pipe on the filesystem.\n    #[cfg(unix)]\n    pub fn is_pipe(&self) -> bool {\n        self.filetype().is_some_and(FileTypeExt::is_fifo)\n    }\n\n    /// Whether this file is a char device on the filesystem.\n    #[cfg(unix)]\n    pub fn is_char_device(&self) -> bool {\n        self.filetype().is_some_and(FileTypeExt::is_char_device)\n    }\n\n    /// Whether this file is a block device on the filesystem.\n    #[cfg(unix)]\n    pub fn is_block_device(&self) -> bool {\n        self.filetype().is_some_and(FileTypeExt::is_block_device)\n    }\n\n    /// Whether this file is a socket on the filesystem.\n    #[cfg(unix)]\n    pub fn is_socket(&self) -> bool {\n        self.filetype().is_some_and(FileTypeExt::is_socket)\n    }\n\n    /// Determine the full path resolving all symbolic links on demand.\n    pub fn absolute_path(&self) -> Option<&PathBuf> {\n        self.absolute_path\n            .get_or_init(|| {\n                if self.is_link() && self.link_target().is_broken() {\n                    // workaround for broken symlinks to get absolute path for parent and then\n                    // append name of file; std::fs::canonicalize requires all path components\n                    // (including the last one) to exist\n                    self.path\n                        .parent()\n                        .and_then(|parent| std::fs::canonicalize(parent).ok())\n                        .map(|p| p.join(self.name.clone()))\n                } else {\n                    std::fs::canonicalize(&self.path).ok()\n                }\n            })\n            .as_ref()\n    }\n\n    /// Whether this file is a mount point\n    pub fn is_mount_point(&self) -> bool {\n        cfg!(any(target_os = \"linux\", target_os = \"macos\"))\n            && self.is_directory()\n            && self\n                .absolute_path()\n                .is_some_and(|p| all_mounts().contains_key(p))\n    }\n\n    /// The filesystem device and type for a mount point\n    pub fn mount_point_info(&self) -> Option<&MountedFs> {\n        if cfg!(any(target_os = \"linux\", target_os = \"macos\")) {\n            return self.absolute_path().and_then(|p| all_mounts().get(p));\n        }\n        None\n    }\n\n    /// Re-prefixes the path pointed to by this file, if it’s a symlink, to\n    /// make it an absolute path that can be accessed from whichever\n    /// directory exa is being run from.\n    fn reorient_target_path(&self, path: &Path) -> PathBuf {\n        if path.is_absolute() {\n            path.to_path_buf()\n        } else if let Some(dir) = self.parent_dir {\n            dir.join(path)\n        } else if let Some(parent) = self.path.parent() {\n            parent.join(path)\n        } else {\n            self.path.join(path)\n        }\n    }\n\n    /// Again assuming this file is a symlink, follows that link and returns\n    /// the result of following it.\n    ///\n    /// For a working symlink that the user is allowed to follow,\n    /// this will be the `File` object at the other end, which can then have\n    /// its name, colour, and other details read.\n    ///\n    /// For a broken symlink, returns where the file *would* be, if it\n    /// existed. If this file cannot be read at all, returns the error that\n    /// we got when we tried to read it.\n    pub fn link_target(&self) -> FileTarget<'dir> {\n        // We need to be careful to treat the path actually pointed to by\n        // this file — which could be absolute or relative — to the path\n        // we actually look up and turn into a `File` — which needs to be\n        // absolute to be accessible from any directory.\n        debug!(\"Reading link {:?}\", &self.path);\n        let path = match std::fs::read_link(&self.path) {\n            Ok(p) => p,\n            Err(e) => return FileTarget::Err(e),\n        };\n\n        let absolute_path = self.reorient_target_path(&path);\n\n        // Use plain `metadata` instead of `symlink_metadata` - we *want* to\n        // follow links.\n        match std::fs::metadata(&absolute_path) {\n            Ok(metadata) => {\n                let ext = File::ext(&path);\n                let name = File::filename(&path);\n                let extended_attributes = OnceLock::new();\n                let absolute_path_cell = OnceLock::from(Some(absolute_path));\n                let file = File {\n                    parent_dir: None,\n                    path,\n                    ext,\n                    filetype: OnceLock::from(Some(metadata.file_type())),\n                    metadata: OnceLock::from(Ok(metadata)),\n                    name,\n                    is_all_all: false,\n                    deref_links: self.deref_links,\n                    extended_attributes,\n                    absolute_path: absolute_path_cell,\n                    recursive_size: RecursiveSize::None,\n                };\n                FileTarget::Ok(Box::new(file))\n            }\n            Err(e) => {\n                error!(\"Error following link {:?}: {:#?}\", &path, e);\n                FileTarget::Broken(path)\n            }\n        }\n    }\n\n    /// Assuming this file is a symlink, follows that link and any further\n    /// links recursively, returning the result from following the trail.\n    ///\n    /// For a working symlink that the user is allowed to follow,\n    /// this will be the `File` object at the other end, which can then have\n    /// its name, colour, and other details read.\n    ///\n    /// For a broken symlink, returns where the file *would* be, if it\n    /// existed. If this file cannot be read at all, returns the error that\n    /// we got when we tried to read it.\n    pub fn link_target_recurse(&self) -> FileTarget<'dir> {\n        let target = self.link_target();\n        if let FileTarget::Ok(f) = target {\n            if f.is_link() {\n                return f.link_target_recurse();\n            }\n            return FileTarget::Ok(f);\n        }\n        target\n    }\n\n    /// This file’s number of hard links.\n    ///\n    /// It also reports whether this is both a regular file, and a file with\n    /// multiple links. This is important, because a file with multiple links\n    /// is uncommon, while you come across directories and other types\n    /// with multiple links much more often. Thus, it should get highlighted\n    /// more attentively.\n    #[cfg(unix)]\n    pub fn links(&self) -> f::Links {\n        let count = self.metadata().map_or(0, MetadataExt::nlink);\n\n        f::Links {\n            count,\n            multiple: self.is_file() && count > 1,\n        }\n    }\n\n    /// This file’s inode.\n    #[cfg(unix)]\n    pub fn inode(&self) -> f::Inode {\n        f::Inode(self.metadata().map_or(0, MetadataExt::ino))\n    }\n\n    /// This actual size the file takes up on disk, in bytes.\n    #[cfg(unix)]\n    pub fn blocksize(&self) -> f::Blocksize {\n        if self.deref_links && self.is_link() {\n            match self.link_target() {\n                FileTarget::Ok(f) => f.blocksize(),\n                _ => f::Blocksize::None,\n            }\n        } else if self.is_directory() {\n            self.recursive_size.map_or(f::Blocksize::None, |_, blocks| {\n                f::Blocksize::Some(blocks * 512)\n            })\n        } else if self.is_file() {\n            // Note that metadata.blocks returns the number of blocks\n            // for 512 byte blocks according to the POSIX standard\n            // even though the physical block size may be different.\n            f::Blocksize::Some(self.metadata().map_or(0, |md| md.blocks() * 512))\n        } else {\n            // directory or symlinks\n            f::Blocksize::None\n        }\n    }\n\n    /// The ID of the user that own this file. If dereferencing links, the links\n    /// may be broken, in which case `None` will be returned.\n    #[cfg(unix)]\n    pub fn user(&self) -> Option<f::User> {\n        if self.is_link() && self.deref_links {\n            return match self.link_target_recurse() {\n                FileTarget::Ok(f) => f.user(),\n                _ => None,\n            };\n        }\n        Some(f::User(self.metadata().map_or(0, MetadataExt::uid)))\n    }\n\n    /// The ID of the group that owns this file.\n    #[cfg(unix)]\n    pub fn group(&self) -> Option<f::Group> {\n        if self.is_link() && self.deref_links {\n            return match self.link_target_recurse() {\n                FileTarget::Ok(f) => f.group(),\n                _ => None,\n            };\n        }\n        Some(f::Group(self.metadata().map_or(0, MetadataExt::gid)))\n    }\n\n    /// This file’s size, if it’s a regular file.\n    ///\n    /// For directories, the recursive size or no size is given depending on\n    /// flags. Although they do have a size on some filesystems, I’ve never\n    /// looked at one of those numbers and gained any information from it.\n    ///\n    /// Block and character devices return their device IDs, because they\n    /// usually just have a file size of zero.\n    ///\n    /// Links will return the size of their target (recursively through other\n    /// links) if dereferencing is enabled, otherwise None.\n    #[cfg(unix)]\n    pub fn size(&self) -> f::Size {\n        if self.deref_links && self.is_link() {\n            match self.link_target() {\n                FileTarget::Ok(f) => f.size(),\n                _ => f::Size::None,\n            }\n        } else if self.is_directory() {\n            self.recursive_size\n                .map_or(f::Size::None, |bytes, _| f::Size::Some(bytes))\n        } else if self.is_char_device() || self.is_block_device() {\n            let device_id = self.metadata().map_or(0, MetadataExt::rdev);\n\n            // MacOS and Linux have different arguments and return types for the\n            // functions major and minor.  On Linux the try_into().unwrap() and\n            // the \"as u32\" cast are not needed.  We turn off the warning to\n            // allow it to compile cleanly on Linux.\n            //\n            // On illumos and Solaris, major and minor are extern \"C\" fns and\n            // therefore unsafe; on other platforms the functions are defined as\n            // macros and copied as const fns in the libc crate.\n            #[allow(trivial_numeric_casts, unused_unsafe)]\n            #[allow(clippy::unnecessary_cast, clippy::useless_conversion)]\n            {\n                let device_id = device_id\n                    .try_into()\n                    .expect(\"Malformed device major ID when getting filesize\");\n                f::Size::DeviceIDs(f::DeviceIDs {\n                    major: unsafe { libc::major(device_id) as u32 },\n                    minor: unsafe { libc::minor(device_id) as u32 },\n                })\n            }\n        } else if self.is_file() {\n            f::Size::Some(self.metadata().map_or(0, std::fs::Metadata::len))\n        } else {\n            // symlink\n            f::Size::None\n        }\n    }\n\n    /// Returns the size of the file or indicates no size if it's a directory.\n    ///\n    /// For Windows platforms, the size of directories is not computed and will\n    /// return `Size::None`.\n    #[cfg(windows)]\n    pub fn size(&self) -> f::Size {\n        if self.is_directory() {\n            f::Size::None\n        } else {\n            f::Size::Some(self.metadata().map_or(0, std::fs::Metadata::len))\n        }\n    }\n\n    /// Calculate the total directory size recursively.  If not a directory `None`\n    /// will be returned.  The directory size is cached for recursive directory\n    /// listing.\n    #[cfg(unix)]\n    fn recursive_directory_size(&self) -> RecursiveSize {\n        if self.is_directory() {\n            let key = (\n                self.metadata().map_or(0, MetadataExt::dev),\n                self.metadata().map_or(0, MetadataExt::ino),\n            );\n            if let Some(size) = DIRECTORY_SIZE_CACHE.lock().unwrap().get(&key) {\n                return RecursiveSize::Some(size.0, size.1);\n            }\n            Dir::read_dir(self.path.clone()).map_or(RecursiveSize::Unknown, |dir| {\n                let mut size = 0;\n                let mut blocks = 0;\n                for file in dir.files(super::DotFilter::Dotfiles, None, false, false, true) {\n                    match file.recursive_directory_size() {\n                        RecursiveSize::Some(bytes, blks) => {\n                            size += bytes;\n                            blocks += blks;\n                        }\n                        RecursiveSize::Unknown => {}\n                        RecursiveSize::None => {\n                            size += file.metadata().map_or(0, MetadataExt::size);\n                            blocks += file.metadata().map_or(0, MetadataExt::blocks);\n                        }\n                    }\n                }\n                DIRECTORY_SIZE_CACHE\n                    .lock()\n                    .unwrap()\n                    .insert(key, (size, blocks));\n                RecursiveSize::Some(size, blocks)\n            })\n        } else {\n            RecursiveSize::None\n        }\n    }\n\n    /// Windows version always returns None.  The metadata for\n    /// `volume_serial_number` and `file_index` are marked unstable so we can\n    /// not cache the sizes.  Without caching we could end up walking the\n    /// directory structure several times.\n    #[cfg(windows)]\n    fn recursive_directory_size(&self) -> RecursiveSize {\n        RecursiveSize::None\n    }\n\n    /// Returns the same value as `self.metadata.len()` or the recursive size\n    /// of a directory when `total_size` is used.\n    #[inline]\n    pub fn length(&self) -> u64 {\n        self.recursive_size\n            .unwrap_bytes_or(self.metadata().map_or(0, std::fs::Metadata::len))\n    }\n\n    /// Is the file is using recursive size calculation\n    #[inline]\n    pub fn is_recursive_size(&self) -> bool {\n        !self.recursive_size.is_none()\n    }\n\n    /// Determines if the directory is empty or not.\n    ///\n    /// For Unix platforms, this function first checks the link count to quickly\n    /// determine non-empty directories. On most UNIX filesystems the link count\n    /// is two plus the number of subdirectories. If the link count is less than\n    /// or equal to 2, it then checks the directory contents to determine if\n    /// it's truly empty. The naive approach used here checks the contents\n    /// directly, as certain filesystems make it difficult to infer emptiness\n    /// based on directory size alone.\n    #[cfg(unix)]\n    pub fn is_empty_dir(&self) -> bool {\n        if self.is_directory() {\n            if self.metadata().map_or(0, MetadataExt::nlink) > 2 {\n                // Directories will have a link count of two if they do not have any subdirectories.\n                // The '.' entry is a link to itself and the '..' is a link to the parent directory.\n                // A subdirectory will have a link to its parent directory increasing the link count\n                // above two.  This will avoid the expensive read_dir call below when a directory\n                // has subdirectories.\n                false\n            } else {\n                self.is_empty_directory()\n            }\n        } else {\n            false\n        }\n    }\n\n    /// Determines if the directory is empty or not.\n    ///\n    /// For Windows platforms, this function checks the directory contents directly\n    /// to determine if it's empty. Since certain filesystems on Windows make it\n    /// challenging to infer emptiness based on directory size, this approach is used.\n    #[cfg(windows)]\n    pub fn is_empty_dir(&self) -> bool {\n        if self.is_directory() {\n            self.is_empty_directory()\n        } else {\n            false\n        }\n    }\n\n    /// Checks the contents of the directory to determine if it's empty.\n    ///\n    /// This function avoids counting '.' and '..' when determining if the directory is\n    /// empty. If any other entries are found, it returns `false`.\n    ///\n    /// The naive approach, as one would think that this info may have been cached.\n    /// but as mentioned in the size function comment above, different filesystems\n    /// make it difficult to get any info about a dir by it's size, so this may be it.\n    fn is_empty_directory(&self) -> bool {\n        trace!(\"is_empty_directory: reading dir\");\n        match Dir::read_dir(self.path.clone()) {\n            // . & .. are skipped, if the returned iterator has .next(), it's not empty\n            Ok(has_files) => has_files\n                .files(super::DotFilter::Dotfiles, None, false, false, false)\n                .next()\n                .is_none(),\n            Err(_) => false,\n        }\n    }\n\n    /// Converts a `SystemTime` to a `NaiveDateTime` without panicking.\n    ///\n    /// Fixes #655 and #667 in `Self::modified_time`, `Self::accessed_time` and\n    /// `Self::created_time`.\n    fn systemtime_to_naivedatetime(st: SystemTime) -> Option<NaiveDateTime> {\n        let duration = st.duration_since(SystemTime::UNIX_EPOCH).ok()?;\n\n        DateTime::from_timestamp(\n            duration.as_secs().try_into().ok()?,\n            (duration.as_nanos() % 1_000_000_000).try_into().ok()?,\n        )\n        .map(|dt| dt.naive_local())\n    }\n\n    /// This file’s last modified timestamp, if available on this platform.\n    pub fn modified_time(&self) -> Option<NaiveDateTime> {\n        if self.is_link() && self.deref_links {\n            return match self.link_target_recurse() {\n                FileTarget::Ok(f) => f.modified_time(),\n                _ => None,\n            };\n        }\n        self.metadata()\n            .ok()\n            .and_then(|md| md.modified().ok())\n            .and_then(Self::systemtime_to_naivedatetime)\n    }\n\n    /// This file’s last changed timestamp, if available on this platform.\n    #[cfg(unix)]\n    pub fn changed_time(&self) -> Option<NaiveDateTime> {\n        if self.is_link() && self.deref_links {\n            return match self.link_target_recurse() {\n                FileTarget::Ok(f) => f.changed_time(),\n                _ => None,\n            };\n        }\n        let md = self.metadata();\n        DateTime::from_timestamp(\n            md.map_or(0, MetadataExt::ctime),\n            md.map_or(0, |md| md.ctime_nsec() as u32),\n        )\n        .map(|dt| dt.naive_local())\n    }\n\n    #[cfg(windows)]\n    pub fn changed_time(&self) -> Option<NaiveDateTime> {\n        self.modified_time()\n    }\n\n    /// This file’s last accessed timestamp, if available on this platform.\n    pub fn accessed_time(&self) -> Option<NaiveDateTime> {\n        if self.is_link() && self.deref_links {\n            return match self.link_target_recurse() {\n                FileTarget::Ok(f) => f.accessed_time(),\n                _ => None,\n            };\n        }\n        self.metadata()\n            .ok()\n            .and_then(|md| md.accessed().ok())\n            .and_then(Self::systemtime_to_naivedatetime)\n    }\n\n    /// This file’s created timestamp, if available on this platform.\n    pub fn created_time(&self) -> Option<NaiveDateTime> {\n        if self.is_link() && self.deref_links {\n            return match self.link_target_recurse() {\n                FileTarget::Ok(f) => f.created_time(),\n                _ => None,\n            };\n        }\n        let btime = self.metadata().ok()?.created().ok()?;\n        Self::systemtime_to_naivedatetime(btime)\n    }\n\n    /// This file’s ‘type’.\n    ///\n    /// This is used a the leftmost character of the permissions column.\n    /// The file type can usually be guessed from the colour of the file, but\n    /// ls puts this character there.\n    #[cfg(unix)]\n    pub fn type_char(&self) -> f::Type {\n        if self.is_file() {\n            f::Type::File\n        } else if self.is_directory() {\n            f::Type::Directory\n        } else if self.is_pipe() {\n            f::Type::Pipe\n        } else if self.is_link() {\n            f::Type::Link\n        } else if self.is_char_device() {\n            f::Type::CharDevice\n        } else if self.is_block_device() {\n            f::Type::BlockDevice\n        } else if self.is_socket() {\n            f::Type::Socket\n        } else {\n            f::Type::Special\n        }\n    }\n\n    #[cfg(windows)]\n    pub fn type_char(&self) -> f::Type {\n        if self.is_file() {\n            f::Type::File\n        } else if self.is_directory() {\n            f::Type::Directory\n        } else {\n            f::Type::Special\n        }\n    }\n\n    /// This file’s permissions, with flags for each bit.\n    #[cfg(unix)]\n    pub fn permissions(&self) -> Option<f::Permissions> {\n        if self.is_link() && self.deref_links {\n            // If the chain of links is broken, we instead fall through and\n            // return the permissions of the original link, as would have been\n            // done if we were not dereferencing.\n            return match self.link_target_recurse() {\n                FileTarget::Ok(f) => f.permissions(),\n                _ => None,\n            };\n        }\n        let bits = self.metadata().map_or(0, MetadataExt::mode);\n        let has_bit = |bit| bits & bit == bit;\n\n        Some(f::Permissions {\n            user_read: has_bit(modes::USER_READ),\n            user_write: has_bit(modes::USER_WRITE),\n            user_execute: has_bit(modes::USER_EXECUTE),\n\n            group_read: has_bit(modes::GROUP_READ),\n            group_write: has_bit(modes::GROUP_WRITE),\n            group_execute: has_bit(modes::GROUP_EXECUTE),\n\n            other_read: has_bit(modes::OTHER_READ),\n            other_write: has_bit(modes::OTHER_WRITE),\n            other_execute: has_bit(modes::OTHER_EXECUTE),\n\n            sticky: has_bit(modes::STICKY),\n            setgid: has_bit(modes::SETGID),\n            setuid: has_bit(modes::SETUID),\n        })\n    }\n\n    #[cfg(windows)]\n    pub fn attributes(&self) -> Option<f::Attributes> {\n        let bits = self.metadata().ok()?.file_attributes();\n        let has_bit = |bit| bits & bit == bit;\n\n        // https://docs.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants\n        Some(f::Attributes {\n            directory: has_bit(0x10),\n            archive: has_bit(0x20),\n            readonly: has_bit(0x1),\n            hidden: has_bit(0x2),\n            system: has_bit(0x4),\n            reparse_point: has_bit(0x400),\n        })\n    }\n\n    /// This file’s security context field.\n    #[cfg(unix)]\n    pub fn security_context(&self) -> f::SecurityContext<'_> {\n        let context = match self\n            .extended_attributes()\n            .iter()\n            .find(|a| a.name == \"security.selinux\")\n        {\n            Some(attr) => match &attr.value {\n                None => SecurityContextType::None,\n                Some(value) => match str::from_utf8(value) {\n                    Ok(v) => SecurityContextType::SELinux(v.trim_end_matches(char::from(0))),\n                    Err(_) => SecurityContextType::None,\n                },\n            },\n            None => SecurityContextType::None,\n        };\n\n        f::SecurityContext { context }\n    }\n\n    #[cfg(windows)]\n    pub fn security_context(&self) -> f::SecurityContext<'_> {\n        f::SecurityContext {\n            context: SecurityContextType::None,\n        }\n    }\n\n    /// User file flags.\n    #[cfg(any(\n        target_os = \"macos\",\n        target_os = \"freebsd\",\n        target_os = \"netbsd\",\n        target_os = \"openbsd\",\n        target_os = \"dragonfly\"\n    ))]\n    pub fn flags(&self) -> f::Flags {\n        #[cfg(target_os = \"dragonfly\")]\n        use std::os::dragonfly::fs::MetadataExt;\n        #[cfg(target_os = \"freebsd\")]\n        use std::os::freebsd::fs::MetadataExt;\n        #[cfg(target_os = \"macos\")]\n        use std::os::macos::fs::MetadataExt;\n        #[cfg(target_os = \"netbsd\")]\n        use std::os::netbsd::fs::MetadataExt;\n        #[cfg(target_os = \"openbsd\")]\n        use std::os::openbsd::fs::MetadataExt;\n        f::Flags(\n            self.metadata()\n                .map(MetadataExt::st_flags)\n                .unwrap_or_default(),\n        )\n    }\n\n    #[cfg(windows)]\n    pub fn flags(&self) -> f::Flags {\n        f::Flags(self.metadata().map_or(0, |md| md.file_attributes()))\n    }\n\n    #[cfg(not(any(\n        target_os = \"macos\",\n        target_os = \"freebsd\",\n        target_os = \"netbsd\",\n        target_os = \"openbsd\",\n        target_os = \"dragonfly\",\n        target_os = \"windows\"\n    )))]\n    pub fn flags(&self) -> f::Flags {\n        f::Flags(0)\n    }\n}\n\nimpl<'a> AsRef<File<'a>> for File<'a> {\n    fn as_ref(&self) -> &File<'a> {\n        self\n    }\n}\n\n/// The result of following a symlink.\npub enum FileTarget<'dir> {\n    /// The symlink pointed at a file that exists.\n    Ok(Box<File<'dir>>),\n\n    /// The symlink pointed at a file that does not exist. Holds the path\n    /// where the file would be, if it existed.\n    Broken(PathBuf),\n\n    /// There was an IO error when following the link. This can happen if the\n    /// file isn’t a link to begin with, but also if, say, we don’t have\n    /// permission to follow it.\n    Err(io::Error),\n    // Err is its own variant, instead of having the whole thing be inside an\n    // `io::Result`, because being unable to follow a symlink is not a serious\n    // error — we just display the error message and move on.\n}\n\nimpl FileTarget<'_> {\n    /// Whether this link doesn’t lead to a file, for whatever reason. This\n    /// gets used to determine how to highlight the link in grid views.\n    #[must_use]\n    pub fn is_broken(&self) -> bool {\n        matches!(self, Self::Broken(_) | Self::Err(_))\n    }\n}\n\n/// More readable aliases for the permission bits exposed by libc.\n#[allow(trivial_numeric_casts)]\n#[cfg(unix)]\nmod modes {\n\n    // The `libc::mode_t` type’s actual type varies, but the value returned\n    // from `metadata.permissions().mode()` is always `u32`.\n    pub type Mode = u32;\n\n    pub const USER_READ: Mode = libc::S_IRUSR as Mode;\n    pub const USER_WRITE: Mode = libc::S_IWUSR as Mode;\n    pub const USER_EXECUTE: Mode = libc::S_IXUSR as Mode;\n\n    pub const GROUP_READ: Mode = libc::S_IRGRP as Mode;\n    pub const GROUP_WRITE: Mode = libc::S_IWGRP as Mode;\n    pub const GROUP_EXECUTE: Mode = libc::S_IXGRP as Mode;\n\n    pub const OTHER_READ: Mode = libc::S_IROTH as Mode;\n    pub const OTHER_WRITE: Mode = libc::S_IWOTH as Mode;\n    pub const OTHER_EXECUTE: Mode = libc::S_IXOTH as Mode;\n\n    pub const STICKY: Mode = libc::S_ISVTX as Mode;\n    pub const SETGID: Mode = libc::S_ISGID as Mode;\n    pub const SETUID: Mode = libc::S_ISUID as Mode;\n}\n\n#[cfg(test)]\nmod ext_test {\n    use super::File;\n    use std::path::Path;\n\n    #[test]\n    fn extension() {\n        assert_eq!(Some(\"dat\".to_string()), File::ext(Path::new(\"fester.dat\")));\n    }\n\n    #[test]\n    fn dotfile() {\n        assert_eq!(Some(\"vimrc\".to_string()), File::ext(Path::new(\".vimrc\")));\n    }\n\n    #[test]\n    fn no_extension() {\n        assert_eq!(None, File::ext(Path::new(\"jarlsberg\")));\n    }\n}\n\n#[cfg(test)]\nmod filename_test {\n    use super::File;\n    use std::path::Path;\n\n    #[test]\n    fn file() {\n        assert_eq!(\"fester.dat\", File::filename(Path::new(\"fester.dat\")));\n    }\n\n    #[test]\n    fn no_path() {\n        assert_eq!(\"foo.wha\", File::filename(Path::new(\"/var/cache/foo.wha\")));\n    }\n\n    #[test]\n    fn here() {\n        assert_eq!(\".\", File::filename(Path::new(\".\")));\n    }\n\n    #[test]\n    fn there() {\n        assert_eq!(\"..\", File::filename(Path::new(\"..\")));\n    }\n\n    #[test]\n    fn everywhere() {\n        assert_eq!(\"..\", File::filename(Path::new(\"./..\")));\n    }\n\n    #[test]\n    #[cfg(unix)]\n    fn topmost() {\n        assert_eq!(\"/\", File::filename(Path::new(\"/\")));\n    }\n}\n"
  },
  {
    "path": "src/fs/filter.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! Filtering and sorting the list of files before displaying them.\n\nuse std::cmp::Ordering;\nuse std::iter::FromIterator;\n#[cfg(unix)]\nuse std::os::unix::fs::MetadataExt;\n\nuse crate::fs::DotFilter;\nuse crate::fs::File;\n\n/// Flags used to manage the **file filter** process\n#[derive(PartialEq, Eq, Debug, Clone)]\npub enum FileFilterFlags {\n    /// Whether to reverse the sorting order. This would sort the largest\n    /// files first, or files starting with Z, or the most-recently-changed\n    /// ones, depending on the sort field.\n    Reverse,\n\n    /// Whether to only show directories.\n    OnlyDirs,\n\n    /// Whether to only show files.\n    OnlyFiles,\n\n    /// Whether to ignore symlinks\n    NoSymlinks,\n\n    /// Whether to explicitly show symlinks\n    ShowSymlinks,\n\n    /// Whether directories should be listed first, and other types of file\n    /// second. Some users prefer it like this.\n    ListDirsFirst,\n\n    /// Whether directories should be listed as the last items, after other\n    /// types of file. Some users prefer it like this.\n    ListDirsLast,\n}\n\n/// The **file filter** processes a list of files before displaying them to\n/// the user, by removing files they don’t want to see, and putting the list\n/// in the desired order.\n///\n/// Usually a user does not want to see *every* file in the list. The most\n/// common case is to remove files starting with `.`, which are designated\n/// as ‘hidden’ files.\n///\n/// The special files `.` and `..` files are not actually filtered out, but\n/// need to be inserted into the list, in a special case.\n///\n/// The filter also governs sorting the list. After being filtered, pairs of\n/// files are compared and sorted based on the result, with the sort field\n/// performing the comparison.\n#[derive(PartialEq, Eq, Debug, Clone)]\npub struct FileFilter {\n    /// The metadata field to sort by.\n    pub sort_field: SortField,\n\n    // Flags that the file filtering process follow\n    pub flags: Vec<FileFilterFlags>,\n\n    /// Which invisible “dot” files to include when listing a directory.\n    ///\n    /// Files starting with a single “.” are used to determine “system” or\n    /// “configuration” files that should not be displayed in a regular\n    /// directory listing, and the directory entries “.” and “..” are\n    /// considered extra-special.\n    ///\n    /// This came about more or less by a complete historical accident,\n    /// when the original `ls` tried to hide `.` and `..`:\n    ///\n    /// [Linux History: How Dot Files Became Hidden Files](https://linux-audit.com/linux-history-how-dot-files-became-hidden-files/)\n    pub dot_filter: DotFilter,\n\n    /// Glob patterns to ignore. Any file name that matches *any* of these\n    /// patterns won’t be displayed in the list.\n    pub ignore_patterns: IgnorePatterns,\n\n    /// Whether to ignore Git-ignored patterns.\n    pub git_ignore: GitIgnore,\n\n    /// Whether to ignore symlinks\n    pub no_symlinks: bool,\n\n    /// Whether to explicitly show symlinks\n    pub show_symlinks: bool,\n}\n\nimpl FileFilter {\n    /// Remove every file in the given vector that does *not* pass the\n    /// filter predicate for files found inside a directory.\n    #[rustfmt::skip]\n    pub fn filter_child_files(&self, is_recurse: bool, files: &mut Vec<File<'_>>) {\n        use FileFilterFlags::{NoSymlinks, OnlyDirs, OnlyFiles, ShowSymlinks};\n\n        files.retain(|f| !self.ignore_patterns.is_ignored(&f.name));\n        files.retain(|f| {\n            match (\n                self.flags.contains(&OnlyDirs),\n                self.flags.contains(&OnlyFiles),\n                self.flags.contains(&NoSymlinks),\n                self.flags.contains(&ShowSymlinks),\n            ) {\n                (true, false, false, false) => f.is_directory(),\n                (true, false, true, false) => f.is_directory(),\n                (true, false, false, true) => f.is_directory() || f.points_to_directory(),\n                (false, true, false, false) => if is_recurse { true } else {f.is_file() },\n                (false, true, false, true) => if is_recurse { true } else { f.is_file() || f.is_link() && !f.points_to_directory()\n                },\n                (false, false, true, false) => !f.is_link(),\n                _ => true,\n            }\n        });\n    }\n\n    /// Remove every file in the given vector that does *not* pass the\n    /// filter predicate for file names specified on the command-line.\n    ///\n    /// The rules are different for these types of files than the other\n    /// type because the ignore rules can be used with globbing. For\n    /// example, running `exa -I='*. tmp' .vimrc` shouldn’t filter out the\n    /// dotfile, because it’s been directly specified. But running\n    /// `exa -I='*.ogg' music/*` should filter out the ogg files obtained\n    /// from the glob, even though the globbing is done by the shell!\n    pub fn filter_argument_files(&self, files: &mut Vec<File<'_>>) {\n        files.retain(|f| !self.ignore_patterns.is_ignored(&f.name));\n    }\n\n    /// Sort the files in the given vector based on the sort field option.\n    pub fn sort_files<'a, F>(&self, files: &mut [F])\n    where\n        F: AsRef<File<'a>>,\n    {\n        files.sort_by(|a, b| self.sort_field.compare_files(a.as_ref(), b.as_ref()));\n\n        if self.flags.contains(&FileFilterFlags::Reverse) {\n            files.reverse();\n        }\n\n        if self.flags.contains(&FileFilterFlags::ListDirsFirst) {\n            // This relies on the fact that `sort_by` is *stable*: it will keep\n            // adjacent elements next to each other.\n            files.sort_by(|a, b| {\n                b.as_ref()\n                    .points_to_directory()\n                    .cmp(&a.as_ref().points_to_directory())\n            });\n        } else if self.flags.contains(&FileFilterFlags::ListDirsLast) {\n            files.sort_by(|a, b| {\n                a.as_ref()\n                    .points_to_directory()\n                    .cmp(&b.as_ref().points_to_directory())\n            });\n        }\n    }\n}\n\n/// User-supplied field to sort by.\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum SortField {\n    /// Don’t apply any sorting. This is usually used as an optimisation in\n    /// scripts, where the order doesn’t matter.\n    Unsorted,\n\n    /// The file name. This is the default sorting.\n    Name(SortCase),\n\n    /// The file’s extension, with extensionless files being listed first.\n    Extension(SortCase),\n\n    /// The file’s size, in bytes.\n    Size,\n\n    /// The file’s inode, which usually corresponds to the order in which\n    /// files were created on the filesystem, more or less.\n    #[cfg(unix)]\n    FileInode,\n\n    /// The time the file was modified (the “mtime”).\n    ///\n    /// As this is stored as a Unix timestamp, rather than a local time\n    /// instance, the time zone does not matter and will only be used to\n    /// display the timestamps, not compare them.\n    ModifiedDate,\n\n    /// The time the file was accessed (the “atime”).\n    ///\n    /// Oddly enough, this field rarely holds the *actual* accessed time.\n    /// Recording a read time means writing to the file each time it’s read\n    /// slows the whole operation down, so many systems will only update the\n    /// timestamp in certain circumstances. This has become common enough that\n    /// it’s now expected behaviour!\n    /// <https://unix.stackexchange.com/a/8842>\n    AccessedDate,\n\n    /// The time the file was changed (the “ctime”).\n    ///\n    /// This field is used to mark the time when a file’s metadata\n    /// changed — its permissions, owners, or link count.\n    ///\n    /// In original Unix, this was, however, meant as creation time.\n    /// <https://www.bell-labs.com/usr/dmr/www/cacm.html>\n    ChangedDate,\n\n    /// The time the file was created (the “btime” or “birthtime”).\n    CreatedDate,\n\n    /// The type of the file: directories, links, pipes, regular, files, etc.\n    ///\n    /// Files are ordered according to the `PartialOrd` implementation of\n    /// `fs::fields::Type`, so changing that will change this.\n    FileType,\n\n    /// The “age” of the file, which is the time it was modified sorted\n    /// backwards. The reverse of the `ModifiedDate` ordering!\n    ///\n    /// It turns out that listing the most-recently-modified files first is a\n    /// common-enough use case that it deserves its own variant. This would be\n    /// implemented by just using the modified date and setting the reverse\n    /// flag, but this would make reversing *that* output not work, which is\n    /// bad, even though that’s kind of nonsensical. So it’s its own variant\n    /// that can be reversed like usual.\n    ModifiedAge,\n\n    /// The file's name, however if the name of the file begins with `.`\n    /// ignore the leading `.` and then sort as Name\n    NameMixHidden(SortCase),\n}\n\n/// Whether a field should be sorted case-sensitively or case-insensitively.\n/// This determines which of the `natord` functions to use.\n///\n/// I kept on forgetting which one was sensitive and which one was\n/// insensitive. Would a case-sensitive sort put capital letters first because\n/// it takes the case of the letters into account, or intermingle them with\n/// lowercase letters because it takes the difference between the two cases\n/// into account? I gave up and just named these two variants after the\n/// effects they have.\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum SortCase {\n    /// Sort files case-sensitively with uppercase first, with ‘A’ coming\n    /// before ‘a’.\n    ABCabc,\n\n    /// Sort files case-insensitively, with ‘A’ being equal to ‘a’.\n    AaBbCc,\n}\n\nimpl SortField {\n    /// Compares two files to determine the order they should be listed in,\n    /// depending on the search field.\n    ///\n    /// The `natord` crate is used here to provide a more *natural* sorting\n    /// order than just sorting character-by-character. This splits filenames\n    /// into groups between letters and numbers, and then sorts those blocks\n    /// together, so `file10` will sort after `file9`, instead of before it\n    /// because of the `1`.\n    pub fn compare_files(self, a: &File<'_>, b: &File<'_>) -> Ordering {\n        use self::SortCase::{ABCabc, AaBbCc};\n\n        #[rustfmt::skip]\n        return match self {\n            Self::Unsorted  => Ordering::Equal,\n\n            Self::Name(ABCabc)  => natord::compare(&a.name, &b.name),\n            Self::Name(AaBbCc)  => natord::compare_ignore_case(&a.name, &b.name),\n\n            Self::Size          => a.length().cmp(&b.length()),\n\n            #[cfg(unix)]\n            Self::FileInode     => {\n                a.metadata().map_or(0, MetadataExt::ino)\n                    .cmp(&b.metadata().map_or(0, MetadataExt::ino))\n            }\n            Self::ModifiedDate  => a.modified_time().cmp(&b.modified_time()),\n            Self::AccessedDate  => a.accessed_time().cmp(&b.accessed_time()),\n            Self::ChangedDate   => a.changed_time().cmp(&b.changed_time()),\n            Self::CreatedDate   => a.created_time().cmp(&b.created_time()),\n            Self::ModifiedAge   => b.modified_time().cmp(&a.modified_time()),  // flip b and a\n            Self::FileType => match a.type_char().cmp(&b.type_char()) { // todo: this recomputes\n                Ordering::Equal  => natord::compare(&a.name, &b.name),\n                order            => order,\n            },\n\n            Self::Extension(ABCabc) => match a.ext.cmp(&b.ext) {\n                Ordering::Equal  => natord::compare(&a.name, &b.name),\n                order            => order,\n            },\n\n            Self::Extension(AaBbCc) => match a.ext.cmp(&b.ext) {\n                Ordering::Equal  => natord::compare_ignore_case(&a.name, &b.name),\n                order            => order,\n            },\n\n            Self::NameMixHidden(ABCabc) => natord::compare(\n                Self::strip_dot(&a.name),\n                Self::strip_dot(&b.name)\n            ),\n            Self::NameMixHidden(AaBbCc) => natord::compare_ignore_case(\n                Self::strip_dot(&a.name),\n                Self::strip_dot(&b.name)\n            ),\n        };\n    }\n\n    fn strip_dot(n: &str) -> &str {\n        match n.strip_prefix('.') {\n            Some(s) => s,\n            None => n,\n        }\n    }\n}\n\n/// The **ignore patterns** are a list of globs that are tested against\n/// each filename, and if any of them match, that file isn’t displayed.\n/// This lets a user hide, say, text files by ignoring `*.txt`.\n#[derive(PartialEq, Eq, Default, Debug, Clone)]\npub struct IgnorePatterns {\n    patterns: Vec<glob::Pattern>,\n}\n\nimpl FromIterator<glob::Pattern> for IgnorePatterns {\n    fn from_iter<I>(iter: I) -> Self\n    where\n        I: IntoIterator<Item = glob::Pattern>,\n    {\n        let patterns = iter.into_iter().collect();\n        Self { patterns }\n    }\n}\n\nimpl IgnorePatterns {\n    /// Create a new list from the input glob strings, turning the inputs that\n    /// are valid glob patterns into an `IgnorePatterns`. The inputs that\n    /// don’t parse correctly are returned separately.\n    pub fn parse_from_iter<'a, I: IntoIterator<Item = &'a str>>(\n        iter: I,\n    ) -> (Self, Vec<glob::PatternError>) {\n        let iter = iter.into_iter();\n\n        // Almost all glob patterns are valid, so it’s worth pre-allocating\n        // the vector with enough space for all of them.\n        let mut patterns = match iter.size_hint() {\n            (_, Some(count)) => Vec::with_capacity(count),\n            _ => Vec::new(),\n        };\n\n        // Similarly, assume there won’t be any errors.\n        let mut errors = Vec::new();\n\n        for input in iter {\n            match glob::Pattern::new(input) {\n                Ok(pat) => patterns.push(pat),\n                Err(e) => errors.push(e),\n            }\n        }\n\n        (Self { patterns }, errors)\n    }\n\n    /// Create a new empty set of patterns that matches nothing.\n    #[must_use]\n    pub fn empty() -> Self {\n        Self {\n            patterns: Vec::new(),\n        }\n    }\n\n    /// Test whether the given file should be hidden from the results.\n    fn is_ignored(&self, file: &str) -> bool {\n        self.patterns.iter().any(|p| p.matches(file))\n    }\n}\n\n/// Whether to ignore or display files that Git would ignore.\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum GitIgnore {\n    /// Ignore files that Git would ignore.\n    CheckAndIgnore,\n\n    /// Display files, even if Git would ignore them.\n    Off,\n}\n\n#[cfg(test)]\nmod test_ignores {\n    use super::*;\n\n    #[test]\n    fn empty_matches_nothing() {\n        let pats = IgnorePatterns::empty();\n        assert!(!pats.is_ignored(\"nothing\"));\n        assert!(!pats.is_ignored(\"test.mp3\"));\n    }\n\n    #[test]\n    fn ignores_a_glob() {\n        let (pats, fails) = IgnorePatterns::parse_from_iter(vec![\"*.mp3\"]);\n        assert!(fails.is_empty());\n        assert!(!pats.is_ignored(\"nothing\"));\n        assert!(pats.is_ignored(\"test.mp3\"));\n    }\n\n    #[test]\n    fn ignores_an_exact_filename() {\n        let (pats, fails) = IgnorePatterns::parse_from_iter(vec![\"nothing\"]);\n        assert!(fails.is_empty());\n        assert!(pats.is_ignored(\"nothing\"));\n        assert!(!pats.is_ignored(\"test.mp3\"));\n    }\n\n    #[test]\n    fn ignores_both() {\n        let (pats, fails) = IgnorePatterns::parse_from_iter(vec![\"nothing\", \"*.mp3\"]);\n        assert!(fails.is_empty());\n        assert!(pats.is_ignored(\"nothing\"));\n        assert!(pats.is_ignored(\"test.mp3\"));\n    }\n}\n"
  },
  {
    "path": "src/fs/mod.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nmod dir;\npub use self::dir::{Dir, DotFilter};\n\nmod file;\npub use self::file::{File, FileTarget};\n\npub mod dir_action;\npub mod feature;\npub mod fields;\npub mod filter;\npub mod mounts;\npub mod recursive_size;\n"
  },
  {
    "path": "src/fs/mounts/linux.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse crate::fs::mounts::{Error, MountedFs};\nuse proc_mounts::MountList;\n\n/// Get a list of all mounted filesystems\npub fn mounts() -> Result<Vec<MountedFs>, Error> {\n    Ok(MountList::new()\n        .map_err(Error::IOError)?\n        .0\n        .iter()\n        .map(|mount| MountedFs {\n            dest: mount.dest.clone(),\n            fstype: mount.fstype.clone(),\n            source: mount.source.to_string_lossy().into(),\n        })\n        .collect())\n}\n"
  },
  {
    "path": "src/fs/mounts/macos.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse crate::fs::mounts::{Error, MountedFs};\nuse libc::{__error, MNT_NOWAIT, getfsstat, statfs};\nuse std::ffi::{CStr, OsStr};\nuse std::os::raw::{c_char, c_int};\nuse std::os::unix::ffi::OsStrExt;\nuse std::path::PathBuf;\nuse std::{mem, ptr};\n\n/// Get a list of all mounted filesystem\npub fn mounts() -> Result<Vec<MountedFs>, Error> {\n    // SAFETY:\n    // Calling external \"C\" function getfsstat.  Passing a null pointer and zero\n    // bufsize will return the number of mounts.\n    let mut count: i32 = unsafe { getfsstat(ptr::null_mut(), 0, MNT_NOWAIT) };\n    let mut mntbuf = Vec::<statfs>::new();\n    if count > 0 {\n        // SAFETY: Zero out buffer memory as we allocate.\n        mntbuf.resize_with(count as usize, || unsafe { mem::zeroed() });\n        let bufsize = mntbuf.len() * mem::size_of::<statfs>();\n        // SAFETY:\n        // Calling external \"C\" function getfsstate with actual buffer now.  The\n        // function takes a buffer size to not overflow.  If the mount table\n        // changes size between calls we are protected by bufsize\n        count = unsafe { getfsstat(mntbuf.as_mut_ptr(), bufsize as c_int, MNT_NOWAIT) };\n        // Resize if the mount table has shrunk since last call\n        if count >= 0 {\n            mntbuf.truncate(count as usize);\n        }\n    }\n    if count < 0 {\n        // SAFETY: Calling external \"C\" errno function to get the error number\n        return Err(Error::GetFSStatError(unsafe { *__error() }));\n    }\n\n    let mut mounts = Vec::with_capacity(count as usize);\n    for mnt in &mntbuf {\n        let mount_point = OsStr::from_bytes(\n            // SAFETY: Converting null terminated \"C\" string\n            unsafe { CStr::from_ptr(mnt.f_mntonname.as_ptr().cast::<c_char>()) }.to_bytes(),\n        );\n        let dest = PathBuf::from(mount_point);\n        // SAFETY: Converting null terminated \"C\" string\n        let fstype = unsafe { CStr::from_ptr(mnt.f_fstypename.as_ptr().cast::<c_char>()) }\n            .to_string_lossy()\n            .into();\n        // SAFETY: Converting null terminated \"C\" string\n        let source = unsafe { CStr::from_ptr(mnt.f_mntfromname.as_ptr().cast::<c_char>()) }\n            .to_string_lossy()\n            .into();\n        mounts.push(MountedFs {\n            dest,\n            fstype,\n            source,\n        });\n    }\n\n    Ok(mounts)\n}\n"
  },
  {
    "path": "src/fs/mounts/mod.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse std::collections::HashMap;\nuse std::path::PathBuf;\nuse std::sync::OnceLock;\n\n#[cfg(target_os = \"linux\")]\nmod linux;\n#[cfg(target_os = \"macos\")]\nmod macos;\n\n#[cfg(target_os = \"linux\")]\nuse linux::mounts;\n#[cfg(target_os = \"macos\")]\nuse macos::mounts;\n\n/// Details of a mounted filesystem.\n#[derive(Clone)]\npub struct MountedFs {\n    pub dest: PathBuf,\n    pub fstype: String,\n    pub source: String,\n}\n\n#[derive(Debug)]\n#[cfg(any(target_os = \"macos\", target_os = \"linux\"))]\npub enum Error {\n    #[cfg(target_os = \"macos\")]\n    GetFSStatError(i32),\n    #[cfg(target_os = \"linux\")]\n    IOError(std::io::Error),\n}\n\n#[cfg(any(target_os = \"macos\", target_os = \"linux\"))]\nimpl std::error::Error for Error {}\n\n#[cfg(any(target_os = \"macos\", target_os = \"linux\"))]\nimpl std::fmt::Display for Error {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        // Allow unreachable_patterns for windows build\n        match self {\n            #[cfg(target_os = \"macos\")]\n            Error::GetFSStatError(err) => write!(f, \"getfsstat failed: {err}\"),\n            #[cfg(target_os = \"linux\")]\n            Error::IOError(err) => write!(f, \"failed to read /proc/mounts: {err}\"),\n        }\n    }\n}\n\n// A lazily initialised static map of all mounted file systems.\n//\n// The map contains a mapping from the mounted directory path to the\n// corresponding mount information. If there's an error retrieving the mount\n// list or if we're not running on Linux or Mac, the map will be empty.\n//\n// Initialise this at application start so we don't have to look the details\n// up for every directory. Ideally this would only be done if the --mounts\n// option is specified which will be significantly easier once the move\n// to `clap` is complete.\npub(super) fn all_mounts() -> &'static HashMap<PathBuf, MountedFs> {\n    static ALL_MOUNTS: OnceLock<HashMap<PathBuf, MountedFs>> = OnceLock::new();\n\n    ALL_MOUNTS.get_or_init(|| {\n        // Allow unused_mut for windows build\n        #[allow(unused_mut)]\n        let mut mount_map: HashMap<PathBuf, MountedFs> = HashMap::new();\n\n        #[cfg(any(target_os = \"linux\", target_os = \"macos\"))]\n        if let Ok(mounts) = mounts() {\n            for mount in mounts {\n                mount_map.insert(mount.dest.clone(), mount);\n            }\n        }\n\n        mount_map\n    })\n}\n"
  },
  {
    "path": "src/fs/recursive_size.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n/// Used to represent a the size of a recursive directory traversal.  `None`\n/// should be used when the file does not represent a directory or the recursive\n/// size should not be calculated.\n#[derive(Copy, Clone, Debug)]\npub enum RecursiveSize {\n    /// Size should not be computed\n    None,\n    /// Size should be computed but has not been computed yet\n    Unknown,\n    /// Size has been computed.  First field is size in bytes and second field\n    /// is size in blocks\n    #[cfg_attr(target_family = \"windows\", allow(dead_code))]\n    Some(u64, u64),\n}\n\nimpl RecursiveSize {\n    /// Returns `true` if `None`\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use eza::fs::recursive_size::RecursiveSize;\n    ///\n    /// let x = RecursiveSize::None;\n    /// assert_eq!(x.is_none(), true);\n    ///\n    /// let x = RecursiveSize::Unknown;\n    /// assert_eq!(x.is_none(), false);\n    ///\n    /// let x = RecursiveSize::Some(0, 0);\n    /// assert_eq!(x.is_none(), false);\n    /// ```\n    #[inline]\n    #[must_use]\n    pub const fn is_none(&self) -> bool {\n        matches!(*self, Self::None)\n    }\n\n    /// Returns the contained [`Some`] value or a provided default.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use eza::fs::recursive_size::RecursiveSize;\n    ///\n    /// assert_eq!(RecursiveSize::None.unwrap_bytes_or(1), 1);\n    /// assert_eq!(RecursiveSize::Unknown.unwrap_bytes_or(1), 1);\n    /// assert_eq!(RecursiveSize::Some(2, 3).unwrap_bytes_or(1), 2);\n    /// ```\n    #[inline]\n    #[must_use]\n    pub const fn unwrap_bytes_or(self, default: u64) -> u64 {\n        match self {\n            Self::Some(bytes, _blocks) => bytes,\n            _ => default,\n        }\n    }\n\n    /// Returns the provided default result (if None or Unknown),\n    /// or applies a function to the contained value (if Some).\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use eza::fs::recursive_size::RecursiveSize;\n    ///\n    /// assert_eq!(RecursiveSize::None.map_or(None, |s, _| Some(s * 2)), None);\n    /// assert_eq!(RecursiveSize::Unknown.map_or(None, |s, _| Some(s * 2)), None);\n    /// assert_eq!(RecursiveSize::Some(2, 3).map_or(None, |s, _| Some(s * 2)), Some(4));\n    /// ```\n    #[inline]\n    #[cfg_attr(target_family = \"windows\", allow(dead_code))]\n    pub fn map_or<U, F>(self, default: U, f: F) -> U\n    where\n        F: FnOnce(u64, u64) -> U,\n    {\n        match self {\n            RecursiveSize::Some(bytes, blocks) => f(bytes, blocks),\n            _ => default,\n        }\n    }\n}\n"
  },
  {
    "path": "src/info/filetype.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! Tests for various types of file (video, image, compressed, etc).\n//!\n//! Currently this is dependent on the file’s name and extension, because\n//! those are the only metadata that we have access to without reading the\n//! file’s contents.\n//!\n//! # Contributors\n//! Please keep these lists sorted. If you're using vim, :sort i\n\nuse phf::{Map, phf_map};\n\nuse crate::fs::File;\n\n#[derive(Debug, Clone)]\npub enum FileType {\n    Image,\n    Video,\n    Music,\n    Lossless, // Lossless music, rather than any other kind of data...\n    Crypto,\n    Document,\n    Compressed,\n    Temp,\n    Compiled,\n    Build, // A “build file is something that can be run or activated somehow in order to\n    // kick off the build of a project. It’s usually only present in directories full of\n    // source code.\n    Source,\n}\n\n/// Mapping from full filenames to file type.\nconst FILENAME_TYPES: Map<&'static str, FileType> = phf_map! {\n    /* Immediate file - kick off the build of a project */\n    \"Brewfile\"           => FileType::Build,\n    \"bsconfig.json\"      => FileType::Build,\n    \"BUILD\"              => FileType::Build,\n    \"BUILD.bazel\"        => FileType::Build,\n    \"build.gradle\"       => FileType::Build,\n    \"build.sbt\"          => FileType::Build,\n    \"build.xml\"          => FileType::Build,\n    \"Cargo.toml\"         => FileType::Build,\n    \"CMakeLists.txt\"     => FileType::Build,\n    \"composer.json\"      => FileType::Build,\n    \"configure\"          => FileType::Build,\n    \"Containerfile\"      => FileType::Build,\n    \"Dockerfile\"         => FileType::Build,\n    \"Earthfile\"          => FileType::Build,\n    \"flake.nix\"          => FileType::Build,\n    \"Gemfile\"            => FileType::Build,\n    \"GNUmakefile\"        => FileType::Build,\n    \"Gruntfile.coffee\"   => FileType::Build,\n    \"Gruntfile.js\"       => FileType::Build,\n    \"jsconfig.json\"      => FileType::Build,\n    \"Justfile\"           => FileType::Build,\n    \"justfile\"           => FileType::Build,\n    \"Makefile\"           => FileType::Build,\n    \"makefile\"           => FileType::Build,\n    \"meson.build\"        => FileType::Build,\n    \"mix.exs\"            => FileType::Build,\n    \"package.json\"       => FileType::Build,\n    \"Pipfile\"            => FileType::Build,\n    \"PKGBUILD\"           => FileType::Build,\n    \"Podfile\"            => FileType::Build,\n    \"pom.xml\"            => FileType::Build,\n    \"Procfile\"           => FileType::Build,\n    \"pyproject.toml\"     => FileType::Build,\n    \"Rakefile\"           => FileType::Build,\n    \"RoboFile.php\"       => FileType::Build,\n    \"SConstruct\"         => FileType::Build,\n    \"tsconfig.json\"      => FileType::Build,\n    \"Vagrantfile\"        => FileType::Build,\n    \"webpack.config.cjs\" => FileType::Build,\n    \"webpack.config.js\"  => FileType::Build,\n    \"WORKSPACE\"          => FileType::Build,\n    /* Cryptology files */\n    \"id_dsa\"             => FileType::Crypto,\n    \"id_ecdsa\"           => FileType::Crypto,\n    \"id_ecdsa_sk\"        => FileType::Crypto,\n    \"id_ed25519\"         => FileType::Crypto,\n    \"id_ed25519_sk\"      => FileType::Crypto,\n    \"id_rsa\"             => FileType::Crypto,\n};\n\n/// Mapping from lowercase file extension to file type.  If an image, video, music, or lossless\n/// extension is added also update the extension icon map.\nconst EXTENSION_TYPES: Map<&'static str, FileType> = phf_map! {\n    /* Immediate file - kick off the build of a project */\n    \"ninja\"      => FileType::Build,\n    /* Image files */\n    \"arw\"        => FileType::Image,\n    \"avif\"       => FileType::Image,\n    \"bmp\"        => FileType::Image,\n    \"cbr\"        => FileType::Image,\n    \"cbz\"        => FileType::Image,\n    \"cr2\"        => FileType::Image,\n    \"dvi\"        => FileType::Image,\n    \"eps\"        => FileType::Image,\n    \"fodg\"       => FileType::Image,\n    \"gif\"        => FileType::Image,\n    \"heic\"       => FileType::Image,\n    \"heif\"       => FileType::Image,\n    \"ico\"        => FileType::Image,\n    \"j2c\"        => FileType::Image,\n    \"j2k\"        => FileType::Image,\n    \"jfi\"        => FileType::Image,\n    \"jfif\"       => FileType::Image,\n    \"jif\"        => FileType::Image,\n    \"jp2\"        => FileType::Image,\n    \"jpe\"        => FileType::Image,\n    \"jpeg\"       => FileType::Image,\n    \"jpf\"        => FileType::Image,\n    \"jpg\"        => FileType::Image,\n    \"jpx\"        => FileType::Image,\n    \"jxl\"        => FileType::Image,\n    \"kra\"        => FileType::Image,\n    \"krz\"        => FileType::Image,\n    \"nef\"        => FileType::Image,\n    \"odg\"        => FileType::Image,\n    \"orf\"        => FileType::Image,\n    \"pbm\"        => FileType::Image,\n    \"pgm\"        => FileType::Image,\n    \"png\"        => FileType::Image,\n    \"pnm\"        => FileType::Image,\n    \"ppm\"        => FileType::Image,\n    \"ps\"         => FileType::Image,\n    \"psd\"        => FileType::Image,\n    \"pxm\"        => FileType::Image,\n    \"raw\"        => FileType::Image,\n    \"qoi\"        => FileType::Image,\n    \"svg\"        => FileType::Image,\n    \"tif\"        => FileType::Image,\n    \"tiff\"       => FileType::Image,\n    \"webp\"       => FileType::Image,\n    \"xcf\"        => FileType::Image,\n    \"xpm\"        => FileType::Image,\n    /* Video files */\n    \"avi\"        => FileType::Video,\n    \"flv\"        => FileType::Video,\n    \"h264\"       => FileType::Video,\n    \"heics\"      => FileType::Video,\n    \"m2ts\"       => FileType::Video,\n    \"m2v\"        => FileType::Video,\n    \"m4v\"        => FileType::Video,\n    \"mkv\"        => FileType::Video,\n    \"mov\"        => FileType::Video,\n    \"mp4\"        => FileType::Video,\n    \"mpeg\"       => FileType::Video,\n    \"mpg\"        => FileType::Video,\n    \"ogm\"        => FileType::Video,\n    \"ogv\"        => FileType::Video,\n    \"video\"      => FileType::Video,\n    \"vob\"        => FileType::Video,\n    \"webm\"       => FileType::Video,\n    \"wmv\"        => FileType::Video,\n    /* Music files */\n    \"aac\"        => FileType::Music, // Advanced Audio Coding\n    \"m4a\"        => FileType::Music,\n    \"mka\"        => FileType::Music,\n    \"mp2\"        => FileType::Music,\n    \"mp3\"        => FileType::Music,\n    \"ogg\"        => FileType::Music,\n    \"opus\"       => FileType::Music,\n    \"wma\"        => FileType::Music,\n    /* Lossless music, rather than any other kind of data... */\n    \"aif\"        => FileType::Lossless,\n    \"aifc\"       => FileType::Lossless,\n    \"aiff\"       => FileType::Lossless,\n    \"alac\"       => FileType::Lossless,\n    \"ape\"        => FileType::Lossless,\n    \"flac\"       => FileType::Lossless,\n    \"pcm\"        => FileType::Lossless,\n    \"wav\"        => FileType::Lossless,\n    \"wv\"         => FileType::Lossless,\n    /* Cryptology files */\n    \"age\"        => FileType::Crypto, // age encrypted file\n    \"asc\"        => FileType::Crypto, // GnuPG ASCII armored file\n    \"cer\"        => FileType::Crypto,\n    \"crt\"        => FileType::Crypto,\n    \"csr\"        => FileType::Crypto, // PKCS#10 Certificate Signing Request\n    \"gpg\"        => FileType::Crypto, // GnuPG encrypted file\n    \"kbx\"        => FileType::Crypto, // GnuPG keybox\n    \"md5\"        => FileType::Crypto, // MD5 checksum\n    \"p12\"        => FileType::Crypto, // PKCS#12 certificate (Netscape)\n    \"pem\"        => FileType::Crypto, // Privacy-Enhanced Mail certificate\n    \"pfx\"        => FileType::Crypto, // PKCS#12 certificate (Microsoft)\n    \"pgp\"        => FileType::Crypto, // PGP security key\n    \"pub\"        => FileType::Crypto, // Public key\n    \"sha1\"       => FileType::Crypto, // SHA-1 hash\n    \"sha224\"     => FileType::Crypto, // SHA-224 hash\n    \"sha256\"     => FileType::Crypto, // SHA-256 hash\n    \"sha384\"     => FileType::Crypto, // SHA-384 hash\n    \"sha512\"     => FileType::Crypto, // SHA-512 hash\n    \"sig\"        => FileType::Crypto, // GnuPG signed file\n    \"signature\"  => FileType::Crypto, // e-Filing Digital Signature File (India)\n    /* Document files */\n    \"djvu\"       => FileType::Document,\n    \"doc\"        => FileType::Document,\n    \"docx\"       => FileType::Document,\n    \"eml\"        => FileType::Document,\n    \"fodp\"       => FileType::Document,\n    \"fods\"       => FileType::Document,\n    \"fodt\"       => FileType::Document,\n    \"fotd\"       => FileType::Document,\n    \"gdoc\"       => FileType::Document,\n    \"key\"        => FileType::Document,\n    \"keynote\"    => FileType::Document,\n    \"numbers\"    => FileType::Document,\n    \"odp\"        => FileType::Document,\n    \"ods\"        => FileType::Document,\n    \"odt\"        => FileType::Document,\n    \"pages\"      => FileType::Document,\n    \"pdf\"        => FileType::Document,\n    \"ppt\"        => FileType::Document,\n    \"pptx\"       => FileType::Document,\n    \"rtf\"        => FileType::Document, // Rich Text Format\n    \"xls\"        => FileType::Document,\n    \"xlsm\"       => FileType::Document,\n    \"xlsx\"       => FileType::Document,\n    /* Compressed/archive files */\n    \"7z\"         => FileType::Compressed, // 7-Zip\n    \"ar\"         => FileType::Compressed,\n    \"arj\"        => FileType::Compressed,\n    \"br\"         => FileType::Compressed, // Brotli\n    \"bz\"         => FileType::Compressed, // bzip\n    \"bz2\"        => FileType::Compressed, // bzip2\n    \"bz3\"        => FileType::Compressed, // bzip3\n    \"cpio\"       => FileType::Compressed,\n    \"deb\"        => FileType::Compressed, // Debian\n    \"dmg\"        => FileType::Compressed,\n    \"gz\"         => FileType::Compressed, // gzip\n    \"iso\"        => FileType::Compressed,\n    \"lz\"         => FileType::Compressed,\n    \"lz4\"        => FileType::Compressed,\n    \"lzh\"        => FileType::Compressed,\n    \"lzma\"       => FileType::Compressed,\n    \"lzo\"        => FileType::Compressed,\n    \"phar\"       => FileType::Compressed, // PHP PHAR\n    \"qcow\"       => FileType::Compressed,\n    \"qcow2\"      => FileType::Compressed,\n    \"rar\"        => FileType::Compressed,\n    \"rpm\"        => FileType::Compressed,\n    \"tar\"        => FileType::Compressed,\n    \"taz\"        => FileType::Compressed,\n    \"tbz\"        => FileType::Compressed,\n    \"tbz2\"       => FileType::Compressed,\n    \"tc\"         => FileType::Compressed,\n    \"tgz\"        => FileType::Compressed,\n    \"tlz\"        => FileType::Compressed,\n    \"txz\"        => FileType::Compressed,\n    \"tz\"         => FileType::Compressed,\n    \"xz\"         => FileType::Compressed,\n    \"vdi\"        => FileType::Compressed,\n    \"vhd\"        => FileType::Compressed,\n    \"vhdx\"       => FileType::Compressed,\n    \"vmdk\"       => FileType::Compressed,\n    \"z\"          => FileType::Compressed,\n    \"zip\"        => FileType::Compressed,\n    \"zst\"        => FileType::Compressed, // Zstandard\n    /* Temporary files */\n    \"bak\"        => FileType::Temp,\n    \"bk\"         => FileType::Temp,\n    \"bkp\"        => FileType::Temp,\n    \"crdownload\" => FileType::Temp,\n    \"download\"   => FileType::Temp,\n    \"fcbak\"      => FileType::Temp,\n    \"fcstd1\"     => FileType::Temp,\n    \"fdmdownload\"=> FileType::Temp,\n    \"part\"       => FileType::Temp,\n    \"swn\"        => FileType::Temp,\n    \"swo\"        => FileType::Temp,\n    \"swp\"        => FileType::Temp,\n    \"tmp\"        => FileType::Temp,\n    /* Compiler output files */\n    \"a\"          => FileType::Compiled, // Unix static library\n    \"bundle\"     => FileType::Compiled, // macOS application bundle\n    \"class\"      => FileType::Compiled, // Java class file\n    \"cma\"        => FileType::Compiled, // OCaml bytecode library\n    \"cmi\"        => FileType::Compiled, // OCaml interface\n    \"cmo\"        => FileType::Compiled, // OCaml bytecode object\n    \"cmx\"        => FileType::Compiled, // OCaml bytecode object for inlining\n    \"dll\"        => FileType::Compiled, // Windows dynamic link library\n    \"dylib\"      => FileType::Compiled, // Mach-O dynamic library\n    \"elc\"        => FileType::Compiled, // Emacs compiled lisp\n    \"elf\"        => FileType::Compiled, // Executable and Linkable Format\n    \"ko\"         => FileType::Compiled, // Linux kernel module\n    \"lib\"        => FileType::Compiled, // Windows static library\n    \"o\"          => FileType::Compiled, // Compiled object file\n    \"obj\"        => FileType::Compiled, // Compiled object file\n    \"pyc\"        => FileType::Compiled, // Python compiled code\n    \"pyd\"        => FileType::Compiled, // Python dynamic module\n    \"pyo\"        => FileType::Compiled, // Python optimized code\n    \"so\"         => FileType::Compiled, // Unix shared library\n    \"zwc\"        => FileType::Compiled, // zsh compiled file\n    /* Source code files */\n    \"applescript\"=> FileType::Source, // Apple script\n    \"as\"         => FileType::Source, // Action script\n    \"asa\"        => FileType::Source, // asp\n    \"awk\"        => FileType::Source, // awk\n    \"c\"          => FileType::Source, // C/C++\n    \"c++\"        => FileType::Source, // C/C++\n    \"c++m\"       => FileType::Source, // C/C++ module\n    \"cabal\"      => FileType::Source, // Cabal\n    \"cc\"         => FileType::Source, // C/C++\n    \"ccm\"        => FileType::Source, // C/C++ module\n    \"clj\"        => FileType::Source, // Clojure\n    \"cp\"         => FileType::Source, // C/C++ Xcode\n    \"cpp\"        => FileType::Source, // C/C++\n    \"cppm\"       => FileType::Source, // C/C++ module\n    \"cr\"         => FileType::Source, // Crystal\n    \"cs\"         => FileType::Source, // C#\n    \"css\"        => FileType::Source, // css\n    \"csx\"        => FileType::Source, // C#\n    \"cu\"         => FileType::Source, // CUDA\n    \"cxx\"        => FileType::Source, // C/C++\n    \"cxxm\"       => FileType::Source, // C/C++ module\n    \"cypher\"     => FileType::Source, // Cypher (query language)\n    \"d\"          => FileType::Source, // D\n    \"dart\"       => FileType::Source, // Dart\n    \"di\"         => FileType::Source, // D\n    \"dpr\"        => FileType::Source, // Delphi Pascal\n    \"el\"         => FileType::Source, // Lisp\n    \"elm\"        => FileType::Source, // Elm\n    \"erl\"        => FileType::Source, // Erlang\n    \"ex\"         => FileType::Source, // Elixir\n    \"exs\"        => FileType::Source, // Elixir\n    \"f\"          => FileType::Source, // Fortran\n    \"f90\"        => FileType::Source, // Fortran\n    \"fcmacro\"    => FileType::Source, // FreeCAD macro\n    \"fcscript\"   => FileType::Source, // FreeCAD script\n    \"fnl\"        => FileType::Source, // Fennel\n    \"for\"        => FileType::Source, // Fortran\n    \"fs\"         => FileType::Source, // F#\n    \"fsh\"        => FileType::Source, // Fragment shader\n    \"fsi\"        => FileType::Source, // F#\n    \"fsx\"        => FileType::Source, // F#\n    \"gd\"         => FileType::Source, // GDScript\n    \"go\"         => FileType::Source, // Go\n    \"gradle\"     => FileType::Source, // Gradle\n    \"groovy\"     => FileType::Source, // Groovy\n    \"gvy\"        => FileType::Source, // Groovy\n    \"h\"          => FileType::Source, // C/C++ header\n    \"h++\"        => FileType::Source, // C/C++ header\n    \"hh\"         => FileType::Source, // C/C++ header\n    \"hpp\"        => FileType::Source, // C/C++ header\n    \"hc\"         => FileType::Source, // HolyC\n    \"hs\"         => FileType::Source, // Haskell\n    \"htc\"        => FileType::Source, // JavaScript\n    \"hxx\"        => FileType::Source, // C/C++ header\n    \"inc\"        => FileType::Source,\n    \"inl\"        => FileType::Source, // C/C++ Microsoft\n    \"ino\"        => FileType::Source, // Arduino\n    \"ipynb\"      => FileType::Source, // Jupyter Notebook\n    \"ixx\"        => FileType::Source, // C/C++ module\n    \"java\"       => FileType::Source, // Java\n    \"jl\"         => FileType::Source, // Julia\n    \"js\"         => FileType::Source, // JavaScript\n    \"jsx\"        => FileType::Source, // React\n    \"kt\"         => FileType::Source, // Kotlin\n    \"kts\"        => FileType::Source, // Kotlin\n    \"kusto\"      => FileType::Source, // Kusto (query language)\n    \"less\"       => FileType::Source, // less\n    \"lhs\"        => FileType::Source, // Haskell\n    \"lisp\"       => FileType::Source, // Lisp\n    \"ltx\"        => FileType::Source, // LaTeX\n    \"lua\"        => FileType::Source, // Lua\n    \"m\"          => FileType::Source, // Matlab\n    \"malloy\"     => FileType::Source, // Malloy (query language)\n    \"matlab\"     => FileType::Source, // Matlab\n    \"ml\"         => FileType::Source, // OCaml\n    \"mli\"        => FileType::Source, // OCaml\n    \"mn\"         => FileType::Source, // Matlab\n    \"nb\"         => FileType::Source, // Mathematica\n    \"p\"          => FileType::Source, // Pascal\n    \"pas\"        => FileType::Source, // Pascal\n    \"php\"        => FileType::Source, // PHP\n    \"pl\"         => FileType::Source, // Perl\n    \"pm\"         => FileType::Source, // Perl\n    \"pod\"        => FileType::Source, // Perl\n    \"pp\"         => FileType::Source, // Puppet\n    \"prql\"       => FileType::Source, // PRQL\n    \"ps1\"        => FileType::Source, // PowerShell\n    \"psd1\"       => FileType::Source, // PowerShell\n    \"psm1\"       => FileType::Source, // PowerShell\n    \"purs\"       => FileType::Source, // PureScript\n    \"py\"         => FileType::Source, // Python\n    \"r\"          => FileType::Source, // R\n    \"rb\"         => FileType::Source, // Ruby\n    \"rs\"         => FileType::Source, // Rust\n    \"rq\"         => FileType::Source, // SPARQL (query language)\n    \"sass\"       => FileType::Source, // Sass\n    \"scala\"      => FileType::Source, // Scala\n    \"scm\"        => FileType::Source, // Scheme\n    \"scad\"       => FileType::Source, // OpenSCAD\n    \"scss\"       => FileType::Source, // Sass\n    \"sld\"        => FileType::Source, // Scheme Library Definition\n    \"sql\"        => FileType::Source, // SQL\n    \"ss\"         => FileType::Source, // Scheme Source\n    \"swift\"      => FileType::Source, // Swift\n    \"tcl\"        => FileType::Source, // TCL\n    \"tex\"        => FileType::Source, // LaTeX\n    \"ts\"         => FileType::Source, // TypeScript\n    \"v\"          => FileType::Source, // V\n    \"vb\"         => FileType::Source, // Visual Basic\n    \"vsh\"        => FileType::Source, // Vertex shader\n    \"zig\"        => FileType::Source, // Zig\n};\n\nimpl FileType {\n    /// Lookup the file type based on the file's name, by the file name\n    /// lowercase extension, or if the file could be compiled from related\n    /// source code.\n    pub(crate) fn get_file_type(file: &File<'_>) -> Option<FileType> {\n        // Case-insensitive readme is checked first for backwards compatibility.\n        if file.name.to_lowercase().starts_with(\"readme\") {\n            return Some(Self::Build);\n        }\n        if let Some(file_type) = FILENAME_TYPES.get(&file.name) {\n            return Some(file_type.clone());\n        }\n        if let Some(file_type) = file.ext.as_ref().and_then(|ext| EXTENSION_TYPES.get(ext)) {\n            return Some(file_type.clone());\n        }\n        if file.name.ends_with('~') || (file.name.starts_with('#') && file.name.ends_with('#')) {\n            return Some(Self::Temp);\n        }\n        if let Some(dir) = file.parent_dir\n            && file\n                .get_source_files()\n                .iter()\n                .any(|path| dir.contains(path))\n        {\n            return Some(Self::Compiled);\n        }\n        None\n    }\n}\n"
  },
  {
    "path": "src/info/mod.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! The “info” module contains routines that aren’t about probing the\n//! filesystem nor displaying output to the user, but are internal “business\n//! logic” routines that are performed on a file’s already-read metadata.\n//! (This counts the file name as metadata.)\n\npub mod filetype;\nmod sources;\n"
  },
  {
    "path": "src/info/sources.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse std::path::PathBuf;\n\nuse crate::fs::File;\n\nimpl File<'_> {\n    /// For this file, return a vector of alternate file paths that, if any of\n    /// them exist, mean that *this* file should be coloured as “compiled”.\n    ///\n    /// The point of this is to highlight compiled files such as `foo.js` when\n    /// their source file `foo.coffee` exists in the same directory.\n    /// For example, `foo.js` is perfectly valid without `foo.coffee`, so we\n    /// don’t want to always blindly highlight `*.js` as compiled.\n    /// (See also `FileType`)\n    pub fn get_source_files(&self) -> Vec<PathBuf> {\n        if let Some(ext) = &self.ext {\n            match &ext[..] {\n                \"css\"   => vec![self.path.with_extension(\"sass\"), self.path.with_extension(\"scss\"),  // SASS, SCSS\n                                self.path.with_extension(\"styl\"), self.path.with_extension(\"less\")],  // Stylus, Less\n                \"mjs\"   => vec![self.path.with_extension(\"mts\")],  // JavaScript ES Modules source\n                \"cjs\"   => vec![self.path.with_extension(\"cts\")],  // JavaScript Commonjs Modules source\n                \"js\"    => vec![self.path.with_extension(\"coffee\"), self.path.with_extension(\"ts\")],  // CoffeeScript, TypeScript\n                \"aux\" |                                          // TeX: auxiliary file\n                \"bbl\" |                                          // BibTeX bibliography file\n                \"bcf\" |                                          // biblatex control file\n                \"blg\" |                                          // BibTeX log file\n                \"fdb_latexmk\" |                                  // TeX latexmk file\n                \"fls\" |                                          // TeX -recorder file\n                \"headfootlength\" |                               // TeX package autofancyhdr file\n                \"lof\" |                                          // TeX list of figures\n                \"log\" |                                          // TeX log file\n                \"lot\" |                                          // TeX list of tables\n                \"out\" |                                          // hyperref list of bookmarks\n                \"toc\" |                                          // TeX table of contents\n                \"xdv\" => vec![self.path.with_extension(\"tex\")],  // XeTeX dvi\n\n                _ => vec![],  // No source files if none of the above\n            }\n        } else {\n            vec![] // No source files if there’s no extension, either!\n        }\n    }\n}\n"
  },
  {
    "path": "src/lib.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n#[allow(unused)]\npub mod fs;\n#[allow(unused)]\npub mod info;\n#[allow(unused)]\npub mod logger;\n#[allow(unused)]\npub mod options;\n#[allow(unused)]\npub mod output;\n#[allow(unused)]\npub mod theme;\n"
  },
  {
    "path": "src/logger.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! Debug error logging.\n\nuse std::ffi::OsStr;\n\nuse nu_ansi_term::{AnsiString as ANSIString, Color as Colour};\n\n/// Sets the internal logger, changing the log level based on the value of an\n/// environment variable.\npub fn configure<T: AsRef<OsStr>>(ev: Option<T>) {\n    let Some(ev) = ev else { return };\n\n    let env_var = ev.as_ref();\n    if env_var.is_empty() {\n        return;\n    }\n\n    if env_var == \"trace\" {\n        log::set_max_level(log::LevelFilter::Trace);\n    } else {\n        log::set_max_level(log::LevelFilter::Debug);\n    }\n\n    let result = log::set_logger(GLOBAL_LOGGER);\n    if let Err(e) = result {\n        eprintln!(\"Failed to initialize logger: {e}\");\n    }\n}\n\n#[derive(Debug)]\nstruct Logger;\n\nconst GLOBAL_LOGGER: &Logger = &Logger;\n\nimpl log::Log for Logger {\n    fn enabled(&self, _: &log::Metadata<'_>) -> bool {\n        true // no need to filter after using ‘set_max_level’.\n    }\n\n    fn log(&self, record: &log::Record<'_>) {\n        let open = Colour::Fixed(243).paint(\"[\");\n        let level = level(record.level());\n        let close = Colour::Fixed(243).paint(\"]\");\n\n        eprintln!(\n            \"{}{} {}{} {}\",\n            open,\n            level,\n            record.target(),\n            close,\n            record.args()\n        );\n    }\n\n    fn flush(&self) {\n        // no need to flush with ‘eprintln!’.\n    }\n}\n\nfn level(level: log::Level) -> ANSIString<'static> {\n    #[rustfmt::skip]\n    return match level {\n        log::Level::Error => Colour::Red.paint(\"ERROR\"),\n        log::Level::Warn  => Colour::Yellow.paint(\"WARN\"),\n        log::Level::Info  => Colour::Cyan.paint(\"INFO\"),\n        log::Level::Debug => Colour::Blue.paint(\"DEBUG\"),\n        log::Level::Trace => Colour::Fixed(245).paint(\"TRACE\"),\n    };\n}\n"
  },
  {
    "path": "src/main.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n#![warn(future_incompatible)]\n#![warn(trivial_casts, trivial_numeric_casts)]\n#![warn(clippy::all)]\n#![allow(clippy::non_ascii_literal)]\n\nuse std::env;\nuse std::ffi::{OsStr, OsString};\nuse std::io::{self, ErrorKind, IsTerminal, Read, Write, stdin};\nuse std::path::{Component, PathBuf};\nuse std::process::exit;\n\nuse nu_ansi_term::{AnsiStrings as ANSIStrings, Style};\nuse options::parser::get_command;\n\nuse crate::fs::feature::git::GitCache;\nuse crate::fs::filter::{FileFilterFlags::OnlyFiles, GitIgnore};\nuse crate::fs::{Dir, File};\nuse crate::options::stdin::FilesInput;\nuse crate::options::{Options, Vars, vars};\nuse crate::output::{Mode, View, details, escape, file_name, grid, grid_details, lines};\nuse crate::theme::Theme;\nuse log::*;\n\nmod fs;\nmod info;\nmod logger;\nmod options;\nmod output;\nmod theme;\n\nfn main() {\n    #[cfg(unix)]\n    unsafe {\n        libc::signal(libc::SIGPIPE, libc::SIG_DFL);\n    }\n\n    logger::configure(env::var_os(vars::EZA_DEBUG).or_else(|| env::var_os(vars::EXA_DEBUG)));\n\n    let cli = get_command().get_matches();\n\n    let stdout_istty = io::stdout().is_terminal();\n    let mut input = String::new();\n    let mut input_paths: Vec<&OsStr> = match cli.get_many(\"FILE\") {\n        Some(x) => x.map(OsString::as_os_str).collect(),\n        None => vec![],\n    };\n    match Options::deduce(&cli, &LiveVars) {\n        Ok(options) => {\n            if input_paths.is_empty() {\n                match &options.stdin {\n                    FilesInput::Args => {\n                        input_paths = vec![OsStr::new(\".\")];\n                    }\n                    FilesInput::Stdin(separator) => {\n                        stdin()\n                            .read_to_string(&mut input)\n                            .expect(\"Failed to read from stdin\");\n                        input_paths.extend(\n                            input\n                                .split(&separator.clone().into_string().unwrap_or(\"\\n\".to_string()))\n                                .map(OsStr::new)\n                                .filter(|s| !s.is_empty())\n                                .collect::<Vec<_>>(),\n                        );\n                    }\n                }\n            }\n\n            let git = git_options(&options, &input_paths);\n            let writer = io::stdout();\n            let git_repos = git_repos(&options, &input_paths);\n\n            let console_width = options.view.width.actual_terminal_width();\n            let theme = options.theme.to_theme(stdout_istty);\n            let exa = Exa {\n                options,\n                writer,\n                input_paths,\n                theme,\n                console_width,\n                git,\n                git_repos,\n            };\n\n            info!(\"matching on exa.run\");\n            match exa.run() {\n                Ok(exit_status) => {\n                    trace!(\"exa.run: exit Ok({exit_status})\");\n                    exit(exit_status);\n                }\n\n                Err(e) if e.kind() == ErrorKind::BrokenPipe => {\n                    warn!(\"Broken pipe error: {e}\");\n                    exit(exits::SUCCESS);\n                }\n\n                Err(e) => {\n                    eprintln!(\"{e}\");\n                    trace!(\"exa.run: exit RUNTIME_ERROR\");\n                    exit(exits::RUNTIME_ERROR);\n                }\n            }\n        }\n        Err(error) => {\n            eprintln!(\"eza: {error}\");\n            exit(exits::OPTIONS_ERROR);\n        }\n    }\n}\n\n/// The main program wrapper.\npub struct Exa<'args> {\n    /// List of command-line options, having been successfully parsed.\n    pub options: Options,\n\n    /// The output handle that we write to.\n    pub writer: io::Stdout,\n\n    /// List of the free command-line arguments that should correspond to file\n    /// names (anything that isn’t an option).\n    pub input_paths: Vec<&'args OsStr>,\n\n    /// The theme that has been configured from the command-line options and\n    /// environment variables. If colours are disabled, this is a theme with\n    /// every style set to the default.\n    pub theme: Theme,\n\n    /// The detected width of the console. This is used to determine which\n    /// view to use.\n    pub console_width: Option<usize>,\n\n    /// A global Git cache, if the option was passed in.\n    /// This has to last the lifetime of the program, because the user might\n    /// want to list several directories in the same repository.\n    pub git: Option<GitCache>,\n\n    pub git_repos: bool,\n}\n\n/// The “real” environment variables type.\n/// Instead of just calling `var_os` from within the options module,\n/// the method of looking up environment variables has to be passed in.\nstruct LiveVars;\nimpl Vars for LiveVars {\n    fn get(&self, name: &'static str) -> Option<OsString> {\n        env::var_os(name)\n    }\n}\n\n/// Create a Git cache populated with the arguments that are going to be\n/// listed before they’re actually listed, if the options demand it.\nfn git_options(options: &Options, args: &[&OsStr]) -> Option<GitCache> {\n    if options.should_scan_for_git() {\n        Some(args.iter().map(PathBuf::from).collect())\n    } else {\n        None\n    }\n}\n\n#[cfg(not(feature = \"git\"))]\nfn git_repos(_options: &Options, _args: &[&OsStr]) -> bool {\n    return false;\n}\n\n#[cfg(feature = \"git\")]\nfn get_files_in_dir(paths: &mut Vec<PathBuf>, path: PathBuf) {\n    let temp_paths = if path.is_dir() {\n        match path.read_dir() {\n            Err(_) => {\n                vec![path]\n            }\n            Ok(d) => d\n                .filter_map(|entry| entry.ok().map(|e| e.path()))\n                .collect::<Vec<PathBuf>>(),\n        }\n    } else {\n        vec![path]\n    };\n    paths.extend(temp_paths);\n}\n\n#[cfg(feature = \"git\")]\nfn git_repos(options: &Options, args: &[&OsStr]) -> bool {\n    let option_enabled = match options.view.mode {\n        Mode::Details(details::Options {\n            table: Some(ref table),\n            ..\n        })\n        | Mode::GridDetails(grid_details::Options {\n            details:\n                details::Options {\n                    table: Some(ref table),\n                    ..\n                },\n            ..\n        }) => table.columns.subdir_git_repos || table.columns.subdir_git_repos_no_stat,\n        _ => false,\n    };\n    if option_enabled {\n        let paths: Vec<PathBuf> = args.iter().map(PathBuf::from).collect::<Vec<PathBuf>>();\n        let mut files: Vec<PathBuf> = Vec::new();\n        for path in paths {\n            get_files_in_dir(&mut files, path);\n        }\n        let repos: Vec<bool> = files\n            .iter()\n            .map(git2::Repository::open)\n            .map(|repo| repo.is_ok())\n            .collect();\n        repos.contains(&true)\n    } else {\n        false\n    }\n}\n\nimpl Exa<'_> {\n    /// # Errors\n    ///\n    /// Will return `Err` if printing to stderr fails.\n    pub fn run(mut self) -> io::Result<i32> {\n        debug!(\"Running with options: {:#?}\", self.options);\n\n        let mut files = Vec::new();\n        let mut dirs = Vec::new();\n        let mut exit_status = 0;\n\n        for file_path in &self.input_paths {\n            let f = File::from_args(\n                PathBuf::from(file_path),\n                None,\n                None,\n                self.options.view.deref_links,\n                self.options.view.total_size,\n                None,\n            );\n\n            // We don't know whether this file exists, so we have to try to get\n            // the metadata to verify.\n            if let Err(e) = f.metadata() {\n                exit_status = 2;\n                writeln!(io::stderr(), \"{file_path:?}: {e}\")?;\n                continue;\n            }\n\n            if f.points_to_directory() && !self.options.dir_action.treat_dirs_as_files() {\n                trace!(\"matching on new Dir\");\n                dirs.push(f.to_dir());\n            } else {\n                files.push(f);\n            }\n        }\n\n        // We want to print a directory’s name before we list it, *except* in\n        // the case where it’s the only directory, *except* if there are any\n        // files to print as well. (It’s a double negative)\n\n        let no_files = files.is_empty();\n        let is_only_dir = dirs.len() == 1 && no_files;\n\n        self.options.filter.filter_argument_files(&mut files);\n        self.print_files(None, files)?;\n\n        self.print_dirs(dirs, no_files, is_only_dir, exit_status)\n    }\n\n    fn print_dirs(\n        &mut self,\n        dir_files: Vec<Dir>,\n        mut first: bool,\n        is_only_dir: bool,\n        exit_status: i32,\n    ) -> io::Result<i32> {\n        let View {\n            file_style: file_name::Options { quote_style, .. },\n            ..\n        } = self.options.view;\n\n        let mut denied_dirs = vec![];\n\n        for mut dir in dir_files {\n            let dir = match dir.read() {\n                Ok(dir) => dir,\n                Err(e) => {\n                    if e.kind() == ErrorKind::PermissionDenied {\n                        eprintln!(\n                            \"Permission denied: {} - code: {}\",\n                            dir.path.display(),\n                            exits::PERMISSION_DENIED\n                        );\n                        denied_dirs.push(dir.path);\n                        continue;\n                    }\n\n                    eprintln!(\"{}: {}\", dir.path.display(), e);\n                    continue;\n                }\n            };\n\n            // Put a gap between directories, or between the list of files and\n            // the first directory.\n            if first {\n                first = false;\n            } else {\n                writeln!(&mut self.writer)?;\n            }\n\n            if !is_only_dir {\n                let mut bits = Vec::new();\n                escape(\n                    dir.path.display().to_string(),\n                    &mut bits,\n                    Style::default(),\n                    Style::default(),\n                    quote_style,\n                );\n                writeln!(&mut self.writer, \"{}:\", ANSIStrings(&bits))?;\n            }\n\n            let mut children = Vec::new();\n            let git_ignore = self.options.filter.git_ignore == GitIgnore::CheckAndIgnore;\n            for file in dir.files(\n                self.options.filter.dot_filter,\n                self.git.as_ref(),\n                git_ignore,\n                self.options.view.deref_links,\n                self.options.view.total_size,\n            ) {\n                children.push(file);\n            }\n            let recursing = self.options.dir_action.recurse_options().is_some();\n            self.options\n                .filter\n                .filter_child_files(recursing, &mut children);\n            self.options.filter.sort_files(&mut children);\n\n            if let Some(recurse_opts) = self.options.dir_action.recurse_options() {\n                let depth = dir\n                    .path\n                    .components()\n                    .filter(|&c| c != Component::CurDir)\n                    .count()\n                    + 1;\n                let follow_links = self.options.view.follow_links;\n                if !recurse_opts.tree && !recurse_opts.is_too_deep(depth) {\n                    let child_dirs = children\n                        .iter()\n                        .filter(|f| {\n                            (if follow_links {\n                                f.points_to_directory()\n                            } else {\n                                f.is_directory()\n                            }) && !f.is_all_all\n                        })\n                        .map(fs::File::to_dir)\n                        .collect::<Vec<Dir>>();\n\n                    self.print_files(Some(dir), children)?;\n                    match self.print_dirs(child_dirs, false, false, exit_status) {\n                        Ok(_) => (),\n                        Err(e) => return Err(e),\n                    }\n                    continue;\n                }\n            }\n\n            self.print_files(Some(dir), children)?;\n        }\n\n        if !denied_dirs.is_empty() {\n            eprintln!(\n                \"\\nSkipped {} directories due to permission denied: \",\n                denied_dirs.len()\n            );\n            for path in denied_dirs {\n                eprintln!(\"  {}\", path.display());\n            }\n        }\n\n        Ok(exit_status)\n    }\n\n    /// Prints the list of files using whichever view is selected.\n    fn print_files(&mut self, dir: Option<&Dir>, mut files: Vec<File<'_>>) -> io::Result<()> {\n        if files.is_empty() {\n            return Ok(());\n        }\n        let recursing = self.options.dir_action.recurse_options().is_some();\n        let only_files = self.options.filter.flags.contains(&OnlyFiles);\n        if recursing && only_files {\n            files = files\n                .into_iter()\n                .filter(|f| !f.is_directory())\n                .collect::<Vec<_>>();\n        }\n        let theme = &self.theme;\n        let View {\n            ref mode,\n            ref file_style,\n            ..\n        } = self.options.view;\n\n        match (mode, self.console_width) {\n            (Mode::Grid(opts), Some(console_width)) => {\n                let filter = &self.options.filter;\n                let r = grid::Render {\n                    files,\n                    theme,\n                    file_style,\n                    opts,\n                    console_width,\n                    filter,\n                };\n                r.render(&mut self.writer)\n            }\n\n            (Mode::Grid(opts), None) => {\n                let filter = &self.options.filter;\n                let r = grid::Render {\n                    files,\n                    theme,\n                    file_style,\n                    opts,\n                    console_width: 80,\n                    filter,\n                };\n                r.render(&mut self.writer)\n            }\n\n            (Mode::Lines, _) => {\n                let filter = &self.options.filter;\n                let r = lines::Render {\n                    files,\n                    theme,\n                    file_style,\n                    filter,\n                };\n                r.render(&mut self.writer)\n            }\n\n            (Mode::Details(opts), _) => {\n                let filter = &self.options.filter;\n                let recurse = self.options.dir_action.recurse_options();\n\n                let git_ignoring = self.options.filter.git_ignore == GitIgnore::CheckAndIgnore;\n                let git = self.git.as_ref();\n                let git_repos = self.git_repos;\n                let r = details::Render {\n                    dir,\n                    files,\n                    theme,\n                    file_style,\n                    opts,\n                    recurse,\n                    filter,\n                    git_ignoring,\n                    git,\n                    git_repos,\n                };\n                r.render(&mut self.writer)\n            }\n\n            (Mode::GridDetails(opts), Some(console_width)) => {\n                let details = &opts.details;\n                let row_threshold = opts.row_threshold;\n\n                let filter = &self.options.filter;\n                let git_ignoring = self.options.filter.git_ignore == GitIgnore::CheckAndIgnore;\n                let git = self.git.as_ref();\n                let git_repos = self.git_repos;\n\n                let r = grid_details::Render {\n                    dir,\n                    files,\n                    theme,\n                    file_style,\n                    details,\n                    filter,\n                    row_threshold,\n                    git_ignoring,\n                    git,\n                    console_width,\n                    git_repos,\n                };\n                r.render(&mut self.writer)\n            }\n\n            (Mode::GridDetails(opts), None) => {\n                let opts = &opts.to_details_options();\n                let filter = &self.options.filter;\n                let recurse = self.options.dir_action.recurse_options();\n                let git_ignoring = self.options.filter.git_ignore == GitIgnore::CheckAndIgnore;\n                let git = self.git.as_ref();\n                let git_repos = self.git_repos;\n\n                let r = details::Render {\n                    dir,\n                    files,\n                    theme,\n                    file_style,\n                    opts,\n                    recurse,\n                    filter,\n                    git_ignoring,\n                    git,\n                    git_repos,\n                };\n                r.render(&mut self.writer)\n            }\n        }\n    }\n}\n\nmod exits {\n\n    /// Exit code for when exa runs OK.\n    pub const SUCCESS: i32 = 0;\n\n    /// Exit code for when there was at least one I/O error during execution.\n    pub const RUNTIME_ERROR: i32 = 1;\n\n    /// Exit code for when the command-line options are invalid.\n    pub const OPTIONS_ERROR: i32 = 3;\n\n    /// Exit code for missing file permissions\n    pub const PERMISSION_DENIED: i32 = 13;\n}\n"
  },
  {
    "path": "src/options/config.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse crate::theme::ThemeFileType as FileType;\nuse crate::theme::{\n    FileKinds, FileNameStyle, Git, GitRepo, IconStyle, Links, Permissions, SELinuxContext,\n    SecurityContext, Size, UiStyles, Users,\n};\nuse nu_ansi_term::{Color, Style};\nuse serde::{Deserialize, Deserializer, Serialize};\nuse serde_norway;\nuse std::collections::HashMap;\nuse std::path::PathBuf;\n\n#[derive(Debug, Eq, PartialEq)]\npub struct ThemeConfig {\n    // This is rather bare for now, will be expanded with config file\n    location: PathBuf,\n}\n\nimpl Default for ThemeConfig {\n    fn default() -> Self {\n        ThemeConfig {\n            location: dirs::config_dir()\n                .unwrap_or_default()\n                .join(\"eza\")\n                .join(\"theme.yml\"),\n        }\n    }\n}\n\ntrait FromOverride<T>: Sized {\n    fn from(value: T, default: Self) -> Self;\n}\n\nimpl<S, T> FromOverride<Option<S>> for Option<T>\nwhere\n    T: FromOverride<S> + Default,\n{\n    fn from(value: Option<S>, default: Option<T>) -> Option<T> {\n        match (value, default) {\n            (Some(value), Some(default)) => Some(FromOverride::from(value, default)),\n            (Some(value), None) => Some(FromOverride::from(value, T::default())),\n            (None, Some(default)) => Some(default),\n            (None, None) => None,\n        }\n    }\n}\n\n#[rustfmt::skip]\nfn color_from_str(s: &str) -> Option<Color> {\n    use Color::{Black, Blue, Cyan, DarkGray, Default, Fixed, Green, LightBlue, LightCyan, LightGray, LightGreen, LightMagenta, LightPurple, LightRed, LightYellow, Magenta, Purple, Red, Rgb, White, Yellow};\n    match s {\n        // nothing\n        \"\" | \"none\"    | \"None\"         => None,\n\n        // hardcoded colors\n        \"default\"      | \"Default\"      => Some(Default),\n        \"black\"        | \"Black\"        => Some(Black),\n        \"darkgray\"     | \"DarkGray\"     => Some(DarkGray),\n        \"red\"          | \"Red\"          => Some(Red),\n        \"lightred\"     | \"LightRed\"     => Some(LightRed),\n        \"green\"        | \"Green\"        => Some(Green),\n        \"lightgreen\"   | \"LightGreen\"   => Some(LightGreen),\n        \"yellow\"       | \"Yellow\"       => Some(Yellow),\n        \"lightyellow\"  | \"LightYellow\"  => Some(LightYellow),\n        \"blue\"         | \"Blue\"         => Some(Blue),\n        \"lightblue\"    | \"LightBlue\"    => Some(LightBlue),\n        \"purple\"       | \"Purple\"       => Some(Purple),\n        \"lightpurple\"  | \"LightPurple\"  => Some(LightPurple),\n        \"magenta\"      | \"Magenta\"      => Some(Magenta),\n        \"lightmagenta\" | \"LightMagenta\" => Some(LightMagenta),\n        \"cyan\"         | \"Cyan\"         => Some(Cyan),\n        \"lightcyan\"    | \"LightCyan\"    => Some(LightCyan),\n        \"white\"        | \"White\"        => Some(White),\n        \"lightgray\"    | \"LightGray\"    => Some(LightGray),\n\n        // some other string\n        s => match s.chars().collect::<Vec<_>>()[..] {\n            // #rrggbb hex color\n            ['#', r1, r2, g1, g2, b1, b2] => {\n                let Ok(r) = u8::from_str_radix(&format!(\"{r1}{r2}\"), 16)\n                    else { return None };\n                let Ok(g) = u8::from_str_radix(&format!(\"{g1}{g2}\"), 16)\n                    else { return None };\n                let Ok(b) = u8::from_str_radix(&format!(\"{b1}{b2}\"), 16)\n                    else { return None };\n                Some(Rgb(r, g, b))\n            },\n            // #rgb shorthand hex color\n            ['#', r, g, b] => {\n                let Ok(r) = u8::from_str_radix(&format!(\"{r}{r}\"), 16)\n                    else { return None };\n                let Ok(g) = u8::from_str_radix(&format!(\"{g}{g}\"), 16)\n                    else { return None };\n                let Ok(b) = u8::from_str_radix(&format!(\"{b}{b}\"), 16)\n                    else { return None };\n                Some(Rgb(r, g, b))\n            },\n            // 0-255 color code (1-3 digits)\n            [c1] => {\n                let Ok(c) = str::parse::<u8>(&format!(\"{c1}\"))\n                    else { return None };\n                Some(Fixed(c))\n            },\n            [c1, c2] => {\n                let Ok(c) = str::parse::<u8>(&format!(\"{c1}{c2}\"))\n                    else { return None };\n                Some(Fixed(c))\n            },\n            [c1, c2, c3] => {\n                let Ok(c) = str::parse::<u8>(&format!(\"{c1}{c2}{c3}\"))\n                    else { return None };\n                Some(Fixed(c))\n            },\n            // unknown format\n            _ => None,\n        }\n    }\n}\n\n#[rustfmt::skip]\nfn deserialize_color<'de, D>(deserializer: D) -> Result<Option<Color>, D::Error>\nwhere D: Deserializer<'de> {\n    Ok(color_from_str(&String::deserialize(deserializer)?))\n}\n\n#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, Default)]\npub struct StyleOverride {\n    /// The style's foreground color, if it has one.\n    #[serde(alias = \"fg\", deserialize_with = \"deserialize_color\", default)]\n    pub foreground: Option<Color>,\n\n    /// The style's background color, if it has one.\n    #[serde(alias = \"bg\", deserialize_with = \"deserialize_color\", default)]\n    pub background: Option<Color>,\n\n    /// Whether this style is bold.\n    #[serde(alias = \"bold\")]\n    pub is_bold: Option<bool>,\n\n    /// Whether this style is dimmed.\n    #[serde(alias = \"dimmed\")]\n    pub is_dimmed: Option<bool>,\n\n    /// Whether this style is italic.\n    #[serde(alias = \"italic\")]\n    pub is_italic: Option<bool>,\n\n    /// Whether this style is underlined.\n    #[serde(alias = \"underline\")]\n    pub is_underline: Option<bool>,\n\n    /// Whether this style is blinking.\n    #[serde(alias = \"blink\")]\n    pub is_blink: Option<bool>,\n\n    /// Whether this style has reverse colors.\n    #[serde(alias = \"reverse\")]\n    pub is_reverse: Option<bool>,\n\n    /// Whether this style is hidden.\n    #[serde(alias = \"hidden\")]\n    pub is_hidden: Option<bool>,\n\n    /// Whether this style is struckthrough.\n    #[serde(alias = \"strikethrough\")]\n    pub is_strikethrough: Option<bool>,\n\n    /// Wether this style is always displayed starting with a reset code to clear any remaining style artifacts\n    #[serde(alias = \"prefix_reset\")]\n    pub prefix_with_reset: Option<bool>,\n}\n\nimpl FromOverride<StyleOverride> for Style {\n    fn from(value: StyleOverride, default: Self) -> Self {\n        let mut style = default;\n        if value.foreground.is_some() {\n            style.foreground = value.foreground;\n        }\n        if value.background.is_some() {\n            style.background = value.background;\n        }\n        if let Some(bold) = value.is_bold {\n            style.is_bold = bold;\n        }\n        if let Some(dimmed) = value.is_dimmed {\n            style.is_dimmed = dimmed;\n        }\n        if let Some(italic) = value.is_italic {\n            style.is_italic = italic;\n        }\n        if let Some(underline) = value.is_underline {\n            style.is_underline = underline;\n        }\n        if let Some(blink) = value.is_blink {\n            style.is_blink = blink;\n        }\n        if let Some(reverse) = value.is_reverse {\n            style.is_reverse = reverse;\n        }\n        if let Some(hidden) = value.is_hidden {\n            style.is_hidden = hidden;\n        }\n        if let Some(strikethrough) = value.is_strikethrough {\n            style.is_strikethrough = strikethrough;\n        }\n        if let Some(reset) = value.prefix_with_reset {\n            style.prefix_with_reset = reset;\n        }\n        style\n    }\n}\n\n#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]\npub struct IconStyleOverride {\n    pub glyph: Option<char>,\n    pub style: Option<StyleOverride>,\n}\n\nimpl FromOverride<char> for char {\n    fn from(value: char, _default: char) -> char {\n        value\n    }\n}\n\nimpl FromOverride<IconStyleOverride> for IconStyle {\n    fn from(value: IconStyleOverride, default: Self) -> Self {\n        IconStyle {\n            glyph: FromOverride::from(value.glyph, default.glyph),\n            style: FromOverride::from(value.style, default.style),\n        }\n    }\n}\n\n#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]\npub struct FileNameStyleOverride {\n    pub icon: Option<IconStyleOverride>,\n    pub filename: Option<StyleOverride>,\n}\n\nimpl FromOverride<FileNameStyleOverride> for FileNameStyle {\n    fn from(value: FileNameStyleOverride, default: Self) -> Self {\n        FileNameStyle {\n            icon: FromOverride::from(value.icon, default.icon),\n            filename: FromOverride::from(value.filename, default.filename),\n        }\n    }\n}\n\nimpl<R, S, T> FromOverride<HashMap<R, S>> for HashMap<R, T>\nwhere\n    T: FromOverride<S>,\n    R: Clone + Eq + std::hash::Hash,\n    T: Clone + Eq + Default,\n{\n    fn from(value: HashMap<R, S>, default: HashMap<R, T>) -> HashMap<R, T> {\n        let mut result = default.clone();\n        for (r, s) in value {\n            let t = match default.get(&r) {\n                Some(t) => t.clone(),\n                None => T::default(),\n            };\n            result.insert(r, FromOverride::from(s, t));\n        }\n        result\n    }\n}\n\n#[rustfmt::skip]\n#[derive(Clone, Eq, Copy, Debug, PartialEq, Serialize, Deserialize)]\npub struct FileKindsOverride {\n    pub normal: Option<StyleOverride>,        // fi\n    pub directory: Option<StyleOverride>,     // di\n    pub symlink: Option<StyleOverride>,       // ln\n    pub pipe: Option<StyleOverride>,          // pi\n    pub block_device: Option<StyleOverride>,  // bd\n    pub char_device: Option<StyleOverride>,   // cd\n    pub socket: Option<StyleOverride>,        // so\n    pub special: Option<StyleOverride>,       // sp\n    pub executable: Option<StyleOverride>,    // ex\n    pub mount_point: Option<StyleOverride>,   // mp\n}\n\nimpl FromOverride<FileKindsOverride> for FileKinds {\n    fn from(value: FileKindsOverride, default: Self) -> Self {\n        FileKinds {\n            normal: FromOverride::from(value.normal, default.normal),\n            directory: FromOverride::from(value.directory, default.directory),\n            symlink: FromOverride::from(value.symlink, default.symlink),\n            pipe: FromOverride::from(value.pipe, default.pipe),\n            block_device: FromOverride::from(value.block_device, default.block_device),\n            char_device: FromOverride::from(value.char_device, default.char_device),\n            socket: FromOverride::from(value.socket, default.socket),\n            special: FromOverride::from(value.special, default.special),\n            executable: FromOverride::from(value.executable, default.executable),\n            mount_point: FromOverride::from(value.mount_point, default.mount_point),\n        }\n    }\n}\n\n#[rustfmt::skip]\n#[derive(Clone, Copy,Eq, Debug, Default, PartialEq, Serialize, Deserialize)]\npub struct PermissionsOverride {\n    pub user_read:         Option<StyleOverride>,  // ur\n    pub user_write:         Option<StyleOverride>,  // uw\n    pub user_execute_file:  Option<StyleOverride>,  // ux\n    pub user_execute_other: Option<StyleOverride>,  // ue\n\n    pub group_read:    Option<StyleOverride>,       // gr\n    pub group_write:   Option<StyleOverride>,       // gw\n    pub group_execute: Option<StyleOverride>,       // gx\n\n    pub other_read:    Option<StyleOverride>,       // tr\n    pub other_write:   Option<StyleOverride>,       // tw\n    pub other_execute: Option<StyleOverride>,       // tx\n\n    pub special_user_file: Option<StyleOverride>,   // su\n    pub special_other:     Option<StyleOverride>,   // sf\n\n    pub attribute: Option<StyleOverride>,           // xa\n}\n\nimpl FromOverride<PermissionsOverride> for Permissions {\n    fn from(value: PermissionsOverride, default: Self) -> Self {\n        Permissions {\n            user_read: FromOverride::from(value.user_read, default.user_read),\n            user_write: FromOverride::from(value.user_write, default.user_write),\n            user_execute_file: FromOverride::from(\n                value.user_execute_file,\n                default.user_execute_file,\n            ),\n            user_execute_other: FromOverride::from(\n                value.user_execute_other,\n                default.user_execute_other,\n            ),\n            group_read: FromOverride::from(value.group_read, default.group_read),\n            group_write: FromOverride::from(value.group_write, default.group_write),\n            group_execute: FromOverride::from(value.group_execute, default.group_execute),\n            other_read: FromOverride::from(value.other_read, default.other_read),\n            other_write: FromOverride::from(value.other_write, default.other_write),\n            other_execute: FromOverride::from(value.other_execute, default.other_execute),\n            special_user_file: FromOverride::from(\n                value.special_user_file,\n                default.special_user_file,\n            ),\n            special_other: FromOverride::from(value.special_other, default.special_other),\n            attribute: FromOverride::from(value.attribute, default.attribute),\n        }\n    }\n}\n\n#[rustfmt::skip]\n#[derive(Clone, Copy, Eq, Debug, Default, PartialEq, Serialize, Deserialize)]\npub struct SizeOverride {\n    pub major: Option<StyleOverride>,        // df\n    pub minor: Option<StyleOverride>,        // ds\n\n    pub number_byte: Option<StyleOverride>,  // sn nb\n    pub number_kilo: Option<StyleOverride>,  // sn nk\n    pub number_mega: Option<StyleOverride>,  // sn nm\n    pub number_giga: Option<StyleOverride>,  // sn ng\n    pub number_huge: Option<StyleOverride>,  // sn nt\n\n    pub unit_byte: Option<StyleOverride>,    // sb ub\n    pub unit_kilo: Option<StyleOverride>,    // sb uk\n    pub unit_mega: Option<StyleOverride>,    // sb um\n    pub unit_giga: Option<StyleOverride>,    // sb ug\n    pub unit_huge: Option<StyleOverride>,    // sb ut\n}\n\nimpl FromOverride<SizeOverride> for Size {\n    fn from(value: SizeOverride, default: Self) -> Self {\n        Size {\n            major: FromOverride::from(value.major, default.major),\n            minor: FromOverride::from(value.minor, default.minor),\n            number_byte: FromOverride::from(value.number_byte, default.number_byte),\n            number_kilo: FromOverride::from(value.number_kilo, default.number_kilo),\n            number_mega: FromOverride::from(value.number_mega, default.number_mega),\n            number_giga: FromOverride::from(value.number_giga, default.number_giga),\n            number_huge: FromOverride::from(value.number_huge, default.number_huge),\n            unit_byte: FromOverride::from(value.unit_byte, default.unit_byte),\n            unit_kilo: FromOverride::from(value.unit_kilo, default.unit_kilo),\n            unit_mega: FromOverride::from(value.unit_mega, default.unit_mega),\n            unit_giga: FromOverride::from(value.unit_giga, default.unit_giga),\n            unit_huge: FromOverride::from(value.unit_huge, default.unit_huge),\n        }\n    }\n}\n\n#[rustfmt::skip]\n#[derive(Clone, Copy, Debug,Eq, Default, PartialEq, Serialize, Deserialize)]\npub struct UsersOverride {\n    pub user_you: Option<StyleOverride>,           // uu\n    pub user_root: Option<StyleOverride>,          // uR\n    pub user_other: Option<StyleOverride>,         // un\n    pub group_yours: Option<StyleOverride>,        // gu\n    pub group_other: Option<StyleOverride>,        // gn\n    pub group_root: Option<StyleOverride>,         // gR\n}\n\nimpl FromOverride<UsersOverride> for Users {\n    fn from(value: UsersOverride, default: Self) -> Self {\n        Users {\n            user_you: FromOverride::from(value.user_you, default.user_you),\n            user_root: FromOverride::from(value.user_root, default.user_root),\n            user_other: FromOverride::from(value.user_other, default.user_other),\n            group_yours: FromOverride::from(value.group_yours, default.group_yours),\n            group_other: FromOverride::from(value.group_other, default.group_other),\n            group_root: FromOverride::from(value.group_root, default.group_root),\n        }\n    }\n}\n\n#[rustfmt::skip]\n#[derive(Clone, Copy, Debug, Eq, Default, PartialEq, Serialize, Deserialize)]\npub struct LinksOverride {\n    pub normal: Option<StyleOverride>,           // lc\n    pub multi_link_file: Option<StyleOverride>,  // lm\n}\n\nimpl FromOverride<LinksOverride> for Links {\n    fn from(value: LinksOverride, default: Self) -> Self {\n        Links {\n            normal: FromOverride::from(value.normal, default.normal),\n            multi_link_file: FromOverride::from(value.multi_link_file, default.multi_link_file),\n        }\n    }\n}\n\n#[rustfmt::skip]\n#[derive(Clone, Copy, Debug,Eq, PartialEq, Serialize, Deserialize)]\npub struct GitOverride {\n    pub new: Option<StyleOverride>,         // ga\n    pub modified: Option<StyleOverride>,    // gm\n    pub deleted: Option<StyleOverride>,     // gd\n    pub renamed: Option<StyleOverride>,     // gv\n    pub typechange: Option<StyleOverride>,  // gt\n    pub ignored: Option<StyleOverride>,     // gi\n    pub conflicted: Option<StyleOverride>,  // gc\n}\n\nimpl FromOverride<GitOverride> for Git {\n    fn from(value: GitOverride, default: Self) -> Self {\n        Git {\n            new: FromOverride::from(value.new, default.new),\n            modified: FromOverride::from(value.modified, default.modified),\n            deleted: FromOverride::from(value.deleted, default.deleted),\n            renamed: FromOverride::from(value.renamed, default.renamed),\n            typechange: FromOverride::from(value.typechange, default.typechange),\n            ignored: FromOverride::from(value.ignored, default.ignored),\n            conflicted: FromOverride::from(value.conflicted, default.conflicted),\n        }\n    }\n}\n\n#[rustfmt::skip]\n#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]\npub struct GitRepoOverride {\n    pub branch_main: Option<StyleOverride>,  //Gm\n    pub branch_other: Option<StyleOverride>, //Go\n    pub git_clean: Option<StyleOverride>,    //Gc\n    pub git_dirty: Option<StyleOverride>,    //Gd\n}\n\nimpl FromOverride<GitRepoOverride> for GitRepo {\n    fn from(value: GitRepoOverride, default: Self) -> Self {\n        GitRepo {\n            branch_main: FromOverride::from(value.branch_main, default.branch_main),\n            branch_other: FromOverride::from(value.branch_other, default.branch_other),\n            git_clean: FromOverride::from(value.git_clean, default.git_clean),\n            git_dirty: FromOverride::from(value.git_dirty, default.git_dirty),\n        }\n    }\n}\n\n#[derive(Clone, Copy, Debug, Eq, Default, PartialEq, Serialize, Deserialize)]\npub struct SELinuxContextOverride {\n    pub colon: Option<StyleOverride>,\n    pub user: Option<StyleOverride>,  // Su\n    pub role: Option<StyleOverride>,  // Sr\n    pub typ: Option<StyleOverride>,   // St\n    pub range: Option<StyleOverride>, // Sl\n}\n\nimpl FromOverride<SELinuxContextOverride> for SELinuxContext {\n    fn from(value: SELinuxContextOverride, default: Self) -> Self {\n        SELinuxContext {\n            colon: FromOverride::from(value.colon, default.colon),\n            user: FromOverride::from(value.user, default.user),\n            role: FromOverride::from(value.role, default.role),\n            typ: FromOverride::from(value.typ, default.typ),\n            range: FromOverride::from(value.range, default.range),\n        }\n    }\n}\n\n#[rustfmt::skip]\n#[derive(Clone, Eq, Copy, Debug, PartialEq, Serialize, Deserialize)]\npub struct SecurityContextOverride {\n    pub none:    Option<StyleOverride>, // Sn\n    pub selinux: Option<SELinuxContextOverride>,\n}\n\nimpl FromOverride<SecurityContextOverride> for SecurityContext {\n    fn from(value: SecurityContextOverride, default: Self) -> Self {\n        SecurityContext {\n            none: FromOverride::from(value.none, default.none),\n            selinux: FromOverride::from(value.selinux, default.selinux),\n        }\n    }\n}\n\n#[rustfmt::skip]\n#[derive(Clone, Copy, Debug, Eq, Default, PartialEq, Serialize, Deserialize)]\npub struct FileTypeOverride {\n    pub image: Option<StyleOverride>,       // im - image file\n    pub video: Option<StyleOverride>,       // vi - video file\n    pub music: Option<StyleOverride>,       // mu - lossy music\n    pub lossless: Option<StyleOverride>,    // lo - lossless music\n    pub crypto: Option<StyleOverride>,      // cr - related to cryptography\n    pub document: Option<StyleOverride>,    // do - document file\n    pub compressed: Option<StyleOverride>,  // co - compressed file\n    pub temp: Option<StyleOverride>,        // tm - temporary file\n    pub compiled: Option<StyleOverride>,    // cm - compilation artifact\n    pub build: Option<StyleOverride>,       // bu - file that is used to build a project\n    pub source: Option<StyleOverride>,      // sc - source code\n}\n\nimpl FromOverride<FileTypeOverride> for FileType {\n    fn from(value: FileTypeOverride, default: Self) -> Self {\n        FileType {\n            image: FromOverride::from(value.image, default.image),\n            video: FromOverride::from(value.video, default.video),\n            music: FromOverride::from(value.music, default.music),\n            lossless: FromOverride::from(value.lossless, default.lossless),\n            crypto: FromOverride::from(value.crypto, default.crypto),\n            document: FromOverride::from(value.document, default.document),\n            compressed: FromOverride::from(value.compressed, default.compressed),\n            temp: FromOverride::from(value.temp, default.temp),\n            compiled: FromOverride::from(value.compiled, default.compiled),\n            build: FromOverride::from(value.build, default.build),\n            source: FromOverride::from(value.source, default.source),\n        }\n    }\n}\n\n#[rustfmt::skip]\n#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]\npub struct UiStylesOverride {\n    pub colourful: Option<bool>,\n\n    pub filekinds:        Option<FileKindsOverride>,\n    pub perms:            Option<PermissionsOverride>,\n    pub size:             Option<SizeOverride>,\n    pub users:            Option<UsersOverride>,\n    pub links:            Option<LinksOverride>,\n    pub git:              Option<GitOverride>,\n    pub git_repo:         Option<GitRepoOverride>,\n    pub security_context: Option<SecurityContextOverride>,\n    pub file_type:        Option<FileTypeOverride>,\n\n    pub punctuation:  Option<StyleOverride>,          // xx\n    pub date:         Option<StyleOverride>,          // da\n    pub inode:        Option<StyleOverride>,          // in\n    pub blocks:       Option<StyleOverride>,          // bl\n    pub header:       Option<StyleOverride>,          // hd\n    pub octal:        Option<StyleOverride>,          // oc\n    pub flags:        Option<StyleOverride>,          // ff\n\n    pub symlink_path:         Option<StyleOverride>,  // lp\n    pub control_char:         Option<StyleOverride>,  // cc\n    pub broken_symlink:       Option<StyleOverride>,  // or\n    pub broken_path_overlay:  Option<StyleOverride>,  // bO\n\n    pub filenames: Option<HashMap<String, FileNameStyleOverride>>,\n    pub extensions: Option<HashMap<String, FileNameStyleOverride>>,\n}\n\nimpl FromOverride<UiStylesOverride> for UiStyles {\n    fn from(value: UiStylesOverride, default: Self) -> Self {\n        UiStyles {\n            colourful: value.colourful,\n\n            filekinds: FromOverride::from(value.filekinds, default.filekinds),\n            perms: FromOverride::from(value.perms, default.perms),\n            size: FromOverride::from(value.size, default.size),\n            users: FromOverride::from(value.users, default.users),\n            links: FromOverride::from(value.links, default.links),\n            git: FromOverride::from(value.git, default.git),\n            git_repo: FromOverride::from(value.git_repo, default.git_repo),\n            security_context: FromOverride::from(value.security_context, default.security_context),\n            file_type: FromOverride::from(value.file_type, default.file_type),\n\n            punctuation: FromOverride::from(value.punctuation, default.punctuation),\n            date: FromOverride::from(value.date, default.date),\n            inode: FromOverride::from(value.inode, default.inode),\n            blocks: FromOverride::from(value.blocks, default.blocks),\n            header: FromOverride::from(value.header, default.header),\n            octal: FromOverride::from(value.octal, default.octal),\n            flags: FromOverride::from(value.flags, default.flags),\n\n            symlink_path: FromOverride::from(value.symlink_path, default.symlink_path),\n            control_char: FromOverride::from(value.control_char, default.control_char),\n            broken_symlink: FromOverride::from(value.broken_symlink, default.broken_symlink),\n            broken_path_overlay: FromOverride::from(\n                value.broken_path_overlay,\n                default.broken_path_overlay,\n            ),\n\n            filenames: FromOverride::from(value.filenames, default.filenames),\n            extensions: FromOverride::from(value.extensions, default.extensions),\n        }\n    }\n}\nimpl ThemeConfig {\n    #[must_use]\n    pub fn from_path(path: PathBuf) -> Self {\n        ThemeConfig { location: path }\n    }\n    #[must_use]\n    pub fn to_theme(&self) -> Option<UiStyles> {\n        let ui_styles_override: Option<UiStylesOverride> = {\n            let file = std::fs::File::open(&self.location).ok()?;\n            serde_norway::from_reader(&file).ok()\n        };\n        FromOverride::from(ui_styles_override, Some(UiStyles::default()))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn parse_none_color_from_string() {\n        for case in &[\"\", \"none\", \"None\"] {\n            assert_eq!(color_from_str(case), None);\n        }\n    }\n\n    #[test]\n    fn parse_default_color_from_string() {\n        for case in &[\"default\", \"Default\"] {\n            assert_eq!(color_from_str(case), Some(Color::Default));\n        }\n    }\n\n    #[test]\n    fn parse_fixed_color_from_string() {\n        for case in &[\"black\", \"Black\"] {\n            assert_eq!(color_from_str(case), Some(Color::Black));\n        }\n    }\n\n    #[test]\n    fn parse_long_hex_color_from_string() {\n        for case in &[\"#ff00ff\", \"#FF00FF\"] {\n            assert_eq!(color_from_str(case), Some(Color::Rgb(255, 0, 255)));\n        }\n    }\n\n    #[test]\n    fn parse_short_hex_color_from_string() {\n        for case in &[\"#f0f\", \"#F0F\"] {\n            assert_eq!(color_from_str(case), Some(Color::Rgb(255, 0, 255)));\n        }\n    }\n\n    #[test]\n    fn parse_color_code_from_string() {\n        for (s, c) in &[(\"118\", 118), (\"10\", 10), (\"01\", 1), (\"1\", 1), (\"001\", 1)] {\n            assert_eq!(color_from_str(s), Some(Color::Fixed(*c)));\n        }\n    }\n}\n"
  },
  {
    "path": "src/options/dir_action.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! Parsing the options for `DirAction`.\n\nuse crate::options::OptionsError;\n\nuse crate::fs::dir_action::{DirAction, RecurseOptions};\n\nuse clap::ArgMatches;\n\nimpl DirAction {\n    /// Determine which action to perform when trying to list a directory.\n    /// There are three possible actions, and they overlap somewhat: the\n    /// `--tree` flag is another form of recursion, so those two are allowed\n    /// to both be present, but the `--treat-dirs-as-files` flag is used\n    /// separately.\n    pub fn deduce(\n        matches: &ArgMatches,\n        can_tree: bool,\n        strict: bool,\n    ) -> Result<Self, OptionsError> {\n        let recurse = matches.get_flag(\"recurse\");\n        let as_file = matches.get_flag(\"treat-dirs-as-files\");\n        let tree = matches.get_flag(\"tree\");\n\n        if strict {\n            // Early check for --level when it wouldn’t do anything\n            if !recurse && !tree && matches.get_one::<usize>(\"level\").is_some() {\n                return Err(OptionsError::Useless2(\"level\", \"recurse\", \"tree\"));\n            } else if recurse && as_file {\n                return Err(OptionsError::Conflict(\"recurse\", \"treat-dirs-as-files\"));\n            } else if tree && as_file {\n                return Err(OptionsError::Conflict(\"tree\", \"treat-dirs-as-files\"));\n            }\n        }\n\n        if tree && can_tree {\n            // Tree is only appropriate in details mode, so this has to\n            // examine the View, which should have already been deduced by now\n            Ok(Self::Recurse(RecurseOptions::deduce(matches, true)))\n        } else if recurse {\n            Ok(Self::Recurse(RecurseOptions::deduce(matches, false)))\n        } else if as_file {\n            Ok(Self::AsFile)\n        } else {\n            Ok(Self::List)\n        }\n    }\n}\n\nimpl RecurseOptions {\n    /// Determine which files should be recursed into, based on the `--level`\n    /// flag’s value, and whether the `--tree` flag was passed, which was\n    /// determined earlier. The maximum level should be a number, and this\n    /// will fail with an `Err` if it isn’t.\n    pub fn deduce(matches: &ArgMatches, tree: bool) -> Self {\n        Self {\n            tree,\n            max_depth: matches.get_one(\"level\").copied(),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::options::parser::test::{mock_cli, mock_cli_try};\n\n    #[test]\n    fn deduce_dir_action_list() {\n        assert_eq!(\n            DirAction::deduce(&mock_cli(vec![\"\"]), false, false),\n            Ok(DirAction::List)\n        );\n    }\n\n    #[test]\n    fn deduce_recurse_options_level() {\n        assert_eq!(\n            RecurseOptions::deduce(&mock_cli(vec![\"--level\", \"3\"]), false),\n            RecurseOptions {\n                tree: false,\n                max_depth: Some(3),\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_recurse_options_no_level() {\n        assert_eq!(\n            DirAction::deduce(&mock_cli(vec![\"--recurse\"]), true, true),\n            Ok(DirAction::Recurse(RecurseOptions {\n                tree: false,\n                max_depth: None,\n            }))\n        );\n    }\n\n    #[test]\n    fn deduce_dir_action_as_file() {\n        assert_eq!(\n            DirAction::deduce(&mock_cli(vec![\"--treat-dirs-as-files\"]), false, false),\n            Ok(DirAction::AsFile)\n        );\n    }\n\n    #[test]\n    fn deduce_dir_action_recurse() {\n        assert_eq!(\n            DirAction::deduce(&mock_cli(vec![\"--recurse\"]), false, false),\n            Ok(DirAction::Recurse(RecurseOptions {\n                tree: false,\n                max_depth: None,\n            }))\n        );\n    }\n\n    #[test]\n    fn deduce_dir_action_tree() {\n        assert_eq!(\n            DirAction::deduce(&mock_cli(vec![\"--tree\"]), true, false),\n            Ok(DirAction::Recurse(RecurseOptions {\n                tree: true,\n                max_depth: None,\n            }))\n        );\n    }\n\n    #[test]\n    fn deduce_dir_action_tree_level() {\n        assert_eq!(\n            DirAction::deduce(&mock_cli(vec![\"--tree\", \"--level\", \"3\"]), true, false),\n            Ok(DirAction::Recurse(RecurseOptions {\n                tree: true,\n                max_depth: Some(3),\n            }))\n        );\n    }\n\n    #[test]\n    fn deduce_dir_action_tree_level_conflict() {\n        assert_eq!(\n            DirAction::deduce(&mock_cli(vec![\"--level\", \"3\"]), false, true),\n            Err(OptionsError::Useless2(\"level\", \"recurse\", \"tree\"))\n        );\n    }\n\n    #[test]\n    fn deduce_dir_action_recurse_as_file_conflict() {\n        assert!(mock_cli_try(vec![\"--recurse\", \"--treat-dirs-as-files\"]).is_err());\n    }\n\n    #[test]\n    fn deduce_dir_action_tree_as_file_conflict() {\n        assert!(mock_cli_try(vec![\"--tree\", \"--treat-dirs-as-files\"]).is_err());\n    }\n}\n"
  },
  {
    "path": "src/options/error.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse std::ffi::OsString;\nuse std::fmt;\nuse std::num::ParseIntError;\n\n/// Something wrong with the combination of options the user has picked.\n#[derive(PartialEq, Eq, Debug)]\npub enum OptionsError {\n    /// The user supplied an illegal choice to an Argument.\n    BadArgument(&'static str, OsString),\n\n    /// The user supplied a set of options that are unsupported\n    Unsupported(String),\n\n    /// An option was given twice or more in strict mode.\n    Duplicate(&'static str, &'static str),\n\n    /// Two options were given that conflict with one another.\n    Conflict(&'static str, &'static str),\n\n    /// An option was given that does nothing when another one either is or\n    /// isn’t present.\n    Useless(&'static str, bool, &'static str),\n\n    /// An option was given that does nothing when either of two other options\n    /// are not present.\n    Useless2(&'static str, &'static str, &'static str),\n\n    /// A very specific edge case where --tree can’t be used with --all twice.\n    TreeAllAll,\n\n    /// A numeric option was given that failed to be parsed as a number.\n    FailedParse(String, NumberSource, ParseIntError),\n\n    /// A glob ignore was given that failed to be parsed as a pattern.\n    FailedGlobPattern(String),\n}\n\n/// The source of a string that failed to be parsed as a number.\n#[derive(PartialEq, Eq, Debug)]\npub enum NumberSource {\n    /// It came... from a command-line argument!\n    Arg(&'static str),\n\n    /// It came... from the environment!\n    Env(&'static str),\n}\n\nimpl From<glob::PatternError> for OptionsError {\n    fn from(error: glob::PatternError) -> Self {\n        Self::FailedGlobPattern(error.to_string())\n    }\n}\n\nimpl fmt::Display for NumberSource {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::Arg(arg) => write!(f, \"option {arg}\"),\n            Self::Env(env) => write!(f, \"environment variable {env}\"),\n        }\n    }\n}\n\nimpl fmt::Display for OptionsError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        #[rustfmt::skip]\n        return match self {\n            Self::BadArgument(arg, _) => write!(f, \"Bad argument for {arg}\"),\n            Self::Unsupported(e)             => write!(f, \"{e}\"),\n            Self::Conflict(a, b)             => write!(f, \"Option {a} conflicts with option {b}\"),\n            Self::Duplicate(a, b) if a == b  => write!(f, \"Flag {a} was given twice\"),\n            Self::Duplicate(a, b)            => write!(f, \"Flag {a} conflicts with flag {b}\"),\n            Self::Useless(a, false, b)       => write!(f, \"Option {a} is useless without option {b}\"),\n            Self::Useless(a, true, b)        => write!(f, \"Option {a} is useless given option {b}\"),\n            Self::Useless2(a, b1, b2)        => write!(f, \"Option {a} is useless without options {b1} or {b2}\"),\n            Self::TreeAllAll                 => write!(f, \"Option --tree is useless given --all --all\"),\n            Self::FailedParse(s, n, e)       => write!(f, \"Value {s:?} not valid for {n}: {e}\"),\n            Self::FailedGlobPattern(e)       => write!(f, \"Failed to parse glob pattern: {e}\"),\n        };\n    }\n}\n"
  },
  {
    "path": "src/options/file_name.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse crate::options::parser::ShowWhen;\nuse crate::options::vars::{self, Vars};\nuse crate::options::{NumberSource, OptionsError};\n\nuse crate::output::file_name::{Classify, EmbedHyperlinks, Options, QuoteStyle, ShowIcons};\n\nuse clap::ArgMatches;\n\nimpl Options {\n    pub fn deduce<V: Vars>(\n        matches: &ArgMatches,\n        vars: &V,\n        is_a_tty: bool,\n    ) -> Result<Self, OptionsError> {\n        let classify = Classify::deduce(matches);\n        let show_icons = ShowIcons::deduce(matches, vars)?;\n\n        let quote_style = QuoteStyle::deduce(matches);\n        let embed_hyperlinks = EmbedHyperlinks::deduce(matches);\n\n        let absolute = *matches.get_one(\"absolute\").unwrap();\n\n        Ok(Self {\n            classify,\n            show_icons,\n            quote_style,\n            embed_hyperlinks,\n            absolute,\n            is_a_tty,\n        })\n    }\n}\n\nimpl Classify {\n    fn deduce(matches: &ArgMatches) -> Self {\n        match matches.get_one(\"classify\") {\n            Some(ShowWhen::Auto) => Self::AutomaticAddFileIndicators,\n            Some(ShowWhen::Always) => Self::AddFileIndicators,\n            None | Some(ShowWhen::Never) => Self::JustFilenames,\n        }\n    }\n}\n\nimpl ShowIcons {\n    pub fn deduce<V: Vars>(matches: &ArgMatches, vars: &V) -> Result<Self, OptionsError> {\n        let force_icons = vars.get(vars::EZA_ICONS_AUTO).is_some();\n        let mode_opt = &matches.get_one(\"icons\");\n        if !force_icons && mode_opt.is_none() {\n            return Ok(Self::Never);\n        }\n\n        match mode_opt {\n            Some(ShowWhen::Never) => Ok(Self::Never),\n            Some(ShowWhen::Always) => Ok(Self::Always(Self::get_width(vars)?)),\n            Some(ShowWhen::Auto) | None => Ok(Self::Automatic(Self::get_width(vars)?)),\n        }\n    }\n\n    fn get_width<V: Vars>(vars: &V) -> Result<u32, OptionsError> {\n        if let Some(columns) = vars\n            .get_with_fallback(vars::EXA_ICON_SPACING, vars::EZA_ICON_SPACING)\n            .map(|s| s.to_string_lossy().to_string())\n        {\n            match columns.parse() {\n                Ok(width) => Ok(width),\n                Err(e) => {\n                    let source = NumberSource::Env(\n                        vars.source(vars::EXA_ICON_SPACING, vars::EZA_ICON_SPACING)\n                            .unwrap_or(\"1\"),\n                    );\n                    Err(OptionsError::FailedParse(columns.clone(), source, e))\n                }\n            }\n        } else {\n            Ok(1)\n        }\n    }\n}\n\nimpl QuoteStyle {\n    pub fn deduce(matches: &ArgMatches) -> Self {\n        if matches.get_flag(\"no-quotes\") {\n            Self::NoQuotes\n        } else {\n            Self::QuoteSpaces\n        }\n    }\n}\n\nimpl EmbedHyperlinks {\n    fn deduce(matches: &ArgMatches) -> Self {\n        if matches.get_flag(\"hyperlink\") {\n            Self::On\n        } else {\n            Self::Off\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::ffi::OsString;\n    use std::num::ParseIntError;\n\n    use super::*;\n    use crate::options::parser::ShowWhen;\n    use crate::options::parser::test::mock_cli;\n    use crate::options::vars::test::MockVars;\n    use crate::output::file_name::Absolute;\n\n    use clap::ValueEnum;\n\n    #[test]\n    fn deduce_classify_file_indicators() {\n        assert_eq!(\n            Classify::deduce(&mock_cli(vec![\"--classify\"])),\n            Classify::AutomaticAddFileIndicators\n        );\n    }\n\n    #[test]\n    fn deduce_classify_just_filenames() {\n        assert_eq!(\n            Classify::deduce(&mock_cli(vec![\"\"])),\n            Classify::JustFilenames\n        );\n    }\n\n    #[test]\n    fn deduce_quote_style_no_quotes() {\n        assert_eq!(\n            QuoteStyle::deduce(&mock_cli(vec![\"--no-quotes\"])),\n            QuoteStyle::NoQuotes\n        );\n    }\n\n    #[test]\n    fn deduce_quote_style_quote_spaces() {\n        assert_eq!(\n            QuoteStyle::deduce(&mock_cli(vec![\"\"])),\n            QuoteStyle::QuoteSpaces\n        );\n    }\n\n    #[test]\n    fn deduce_embed_hyperlinks_on() {\n        assert_eq!(\n            EmbedHyperlinks::deduce(&mock_cli(vec![\"--hyperlink\"])),\n            EmbedHyperlinks::On\n        );\n    }\n\n    #[test]\n    fn deduce_embed_hyperlinks_off() {\n        assert_eq!(\n            EmbedHyperlinks::deduce(&mock_cli(vec![\"\"])),\n            EmbedHyperlinks::Off\n        );\n    }\n\n    #[test]\n    fn deduce_show_icons_never_no_arg() {\n        assert_eq!(\n            ShowIcons::deduce(&mock_cli(vec![\"\"]), &MockVars::default()),\n            Ok(ShowIcons::Never)\n        );\n    }\n\n    #[test]\n    fn deduce_show_icons_never_no_arg_env() {\n        let mut vars = MockVars::default();\n        vars.set(vars::EZA_ICONS_AUTO, &OsString::from(\"1\"));\n        assert_eq!(\n            ShowIcons::deduce(&mock_cli(vec![\"\"]), &vars),\n            Ok(ShowIcons::Automatic(1))\n        );\n    }\n\n    #[test]\n    fn deduce_show_icon_always() {\n        assert_eq!(\n            ShowIcons::deduce(&mock_cli(vec![\"--icons\", \"always\"]), &MockVars::default()),\n            Ok(ShowIcons::Always(1)),\n        );\n    }\n\n    #[test]\n    fn deduce_show_icons_never() {\n        assert_eq!(\n            ShowIcons::deduce(&mock_cli(vec![\"--icons\", \"never\"]), &MockVars::default()),\n            Ok(ShowIcons::Never)\n        );\n    }\n\n    #[test]\n    fn deduce_show_icons_auto() {\n        assert_eq!(\n            ShowIcons::deduce(&mock_cli(vec![\"--icons\", \"auto\"]), &MockVars::default()),\n            Ok(ShowIcons::Automatic(1))\n        );\n    }\n\n    #[test]\n    fn deduce_show_icons_error() {\n        assert_eq!(\n            ShowWhen::from_str(\"foo\", false)\n                .map_err(|err| OptionsError::BadArgument(\"icons\", err.into())),\n            Err(OptionsError::BadArgument(\"icons\", OsString::from(\"foo\")))\n        );\n    }\n\n    #[test]\n    fn deduce_show_icons_width() {\n        let mut vars = MockVars::default();\n        vars.set(vars::EZA_ICON_SPACING, &OsString::from(\"3\"));\n        assert_eq!(\n            ShowIcons::deduce(&mock_cli(vec![\"--icons\"]), &vars),\n            Ok(ShowIcons::Automatic(3))\n        );\n    }\n\n    #[test]\n    fn deduce_show_icons_width_error() {\n        let mut vars = MockVars::default();\n        vars.set(vars::EZA_ICON_SPACING, &OsString::from(\"foo\"));\n\n        let e: Result<i64, ParseIntError> = vars\n            .get(vars::EZA_ICON_SPACING)\n            .unwrap()\n            .to_string_lossy()\n            .parse();\n\n        assert_eq!(\n            ShowIcons::deduce(&mock_cli(vec![\"--icons\", \"auto\"]), &vars),\n            Err(OptionsError::FailedParse(\n                String::from(\"foo\"),\n                NumberSource::Env(vars::EXA_ICON_SPACING),\n                e.unwrap_err()\n            ))\n        );\n    }\n\n    #[test]\n    fn deduce_options() {\n        assert_eq!(\n            Options::deduce(&mock_cli(vec![\"\"]), &MockVars::default(), true),\n            Ok(Options {\n                classify: Classify::JustFilenames,\n                show_icons: ShowIcons::Never,\n                quote_style: QuoteStyle::QuoteSpaces,\n                embed_hyperlinks: EmbedHyperlinks::Off,\n                absolute: Absolute::Off,\n                is_a_tty: true,\n            })\n        );\n    }\n}\n"
  },
  {
    "path": "src/options/filter.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! Parsing the options for `FileFilter`.\n\nuse clap::ArgMatches;\n\nuse crate::fs::DotFilter;\nuse crate::fs::filter::{\n    FileFilter, FileFilterFlags, GitIgnore, IgnorePatterns, SortCase, SortField,\n};\n\nuse crate::options::OptionsError;\n\nimpl FileFilter {\n    /// Determines which of all the file filter options to use.\n    pub fn deduce(matches: &ArgMatches, strict: bool) -> Result<Self, OptionsError> {\n        use FileFilterFlags as FFF;\n        let mut filter_flags: Vec<FileFilterFlags> = vec![];\n\n        for (flag, filter_flag) in &[\n            (\"reverse\", FFF::Reverse),\n            (\"only-dirs\", FFF::OnlyDirs),\n            (\"only-files\", FFF::OnlyFiles),\n            (\"no-symlinks\", FFF::NoSymlinks),\n            (\"show-symlinks\", FFF::ShowSymlinks),\n            (\"dirs-last\", FFF::ListDirsLast),\n            (\"dirs-first\", FFF::ListDirsFirst),\n        ] {\n            if matches.get_flag(flag) {\n                filter_flags.push(filter_flag.clone());\n            }\n        }\n\n        Ok(Self {\n            no_symlinks: matches.get_flag(\"no-symlinks\"),\n            show_symlinks: matches.get_flag(\"show-symlinks\"),\n            flags: filter_flags,\n            sort_field: *matches.get_one(\"sort\").unwrap(),\n            dot_filter: DotFilter::deduce(matches, strict)?,\n            ignore_patterns: IgnorePatterns::deduce(matches)?,\n            git_ignore: GitIgnore::deduce(matches),\n        })\n    }\n}\n\n// I’ve gone back and forth between whether to sort case-sensitively or\n// insensitively by default. The default string sort in most programming\n// languages takes each character’s ASCII value into account, sorting\n// “Documents” before “apps”, but there’s usually an option to ignore\n// characters’ case, putting “apps” before “Documents”.\n//\n// The argument for following case is that it’s easy to forget whether an item\n// begins with an uppercase or lowercase letter and end up having to scan both\n// the uppercase and lowercase sub-lists to find the item you want. If you\n// happen to pick the sublist it’s not in, it looks like it’s missing, which\n// is worse than if you just take longer to find it.\n// (https://ux.stackexchange.com/a/79266)\n//\n// The argument for ignoring case is that it makes exa sort files differently\n// from shells. A user would expect a directory’s files to be in the same\n// order if they used “exa ~/directory” or “exa ~/directory/*”, but exa sorts\n// them in the first case, and the shell in the second case, so they wouldn’t\n// be exactly the same if exa does something non-conventional.\n//\n// However, exa already sorts files differently: it uses natural sorting from\n// the natord crate, sorting the string “2” before “10” because the number’s\n// smaller, because that’s usually what the user expects to happen. Users will\n// name their files with numbers expecting them to be treated like numbers,\n// rather than lists of numeric characters.\n//\n// In the same way, users will name their files with letters expecting the\n// order of the letters to matter, rather than each letter’s character’s ASCII\n// value. So exa breaks from tradition and ignores case while sorting:\n// “apps” first, then “Documents”.\n//\n// You can get the old behaviour back by sorting with `--sort=Name`.\nimpl Default for SortField {\n    fn default() -> Self {\n        Self::Name(SortCase::AaBbCc)\n    }\n}\n\nimpl DotFilter {\n    /// Determines the dot filter based on how many `--all` options were\n    /// given: one will show dotfiles, but two will show `.` and `..` too.\n    /// --almost-all is equivalent to --all, included for compatibility with\n    /// `ls -A`.\n    ///\n    /// It also checks for the `--tree` option, because of a special case\n    /// where `--tree --all --all` won’t work: listing the parent directory\n    /// in tree mode would loop onto itself!\n    ///\n    /// `--almost-all` binds stronger than multiple `--all` as we currently do not take the order\n    /// of arguments into account and it is the safer option (does not clash with `--tree`)\n    pub fn deduce(matches: &ArgMatches, strict: bool) -> Result<Self, OptionsError> {\n        let all_count = matches.get_count(\"all\");\n        let has_almost_all = matches.get_flag(\"almost-all\");\n\n        match (all_count, has_almost_all) {\n            (0, false) => Ok(Self::JustFiles),\n\n            // either a single --all or at least one --almost-all is given\n            (1, _) | (0, true) => Ok(Self::Dotfiles),\n            // more than one --all\n            (c, _) => {\n                if matches.get_flag(\"tree\") {\n                    Err(OptionsError::TreeAllAll)\n                } else if strict && c > 2 {\n                    Err(OptionsError::Conflict(\"all\", \"all\"))\n                } else {\n                    Ok(Self::DotfilesAndDots)\n                }\n            }\n        }\n    }\n}\n\nimpl IgnorePatterns {\n    /// Determines the set of glob patterns to use based on the\n    /// `--ignore-glob` argument’s value. This is a list of strings\n    /// separated by pipe (`|`) characters, given in any order.\n    pub fn deduce(matches: &ArgMatches) -> Result<Self, OptionsError> {\n        // If there are no inputs, we return a set of patterns that doesn’t\n        // match anything, rather than, say, `None`.\n        let Some(inputs) = matches.get_one::<String>(\"ignore-glob\") else {\n            return Ok(Self::empty());\n        };\n\n        // Awkwardly, though, a glob pattern can be invalid, and we need to\n        // deal with invalid patterns somehow.\n        let (patterns, mut errors) = Self::parse_from_iter(inputs.split('|'));\n\n        // It can actually return more than one glob error,\n        // but we only use one. (TODO)\n        match errors.pop() {\n            Some(e) => Err(e.into()),\n            None => Ok(patterns),\n        }\n    }\n}\n\nimpl GitIgnore {\n    pub fn deduce(matches: &ArgMatches) -> Self {\n        if matches.get_flag(\"git-ignore\") {\n            Self::CheckAndIgnore\n        } else {\n            Self::Off\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::ffi::OsString;\n\n    use super::*;\n    use crate::options::parser::test::{mock_cli, mock_cli_try};\n\n    #[test]\n    fn deduce_git_ignore_off() {\n        assert_eq!(GitIgnore::deduce(&mock_cli(vec![\"\"])), GitIgnore::Off);\n    }\n\n    #[test]\n    fn deduce_git_ignore_on() {\n        assert_eq!(\n            GitIgnore::deduce(&mock_cli(vec![\"--git-ignore\"])),\n            GitIgnore::CheckAndIgnore\n        );\n    }\n\n    #[test]\n    fn deduce_ignore_patterns_empty() {\n        assert_eq!(\n            IgnorePatterns::deduce(&mock_cli(vec![\"\"])),\n            Ok(IgnorePatterns::empty())\n        );\n    }\n\n    #[test]\n    fn deduce_ignore_patterns_one() {\n        let pattern = OsString::from(\"*.o\");\n        let (res, _) = IgnorePatterns::parse_from_iter(pattern.to_string_lossy().split('|'));\n\n        assert_eq!(\n            IgnorePatterns::deduce(&mock_cli(vec![\"--ignore-glob\", \"*.o\"])),\n            Ok(res)\n        );\n    }\n\n    #[test]\n    fn deduce_ignore_patterns_error() {\n        let pattern = OsString::from(\"[\");\n        let (_, mut e) = IgnorePatterns::parse_from_iter(pattern.to_string_lossy().split('|'));\n        assert_eq!(\n            IgnorePatterns::deduce(&mock_cli(vec![\"--ignore-glob\", \"[\"])),\n            Err(e.pop().unwrap().into())\n        );\n    }\n\n    #[test]\n    fn deduce_dot_filter_just_files() {\n        assert_eq!(\n            DotFilter::deduce(&mock_cli(vec![\"\"]), false),\n            Ok(DotFilter::JustFiles)\n        );\n    }\n\n    #[test]\n    fn deduce_dot_filter_dotfiles() {\n        assert_eq!(\n            DotFilter::deduce(&mock_cli(vec![\"--all\"]), false),\n            Ok(DotFilter::Dotfiles)\n        );\n    }\n\n    #[test]\n    fn deduce_dot_filter_dotfiles_and_dots() {\n        assert_eq!(\n            DotFilter::deduce(&mock_cli(vec![\"--all\", \"--all\"]), false),\n            Ok(DotFilter::DotfilesAndDots)\n        );\n    }\n\n    #[test]\n    fn deduce_dot_filter_tree_all_all() {\n        assert_eq!(\n            DotFilter::deduce(&mock_cli(vec![\"--all\", \"--all\", \"--tree\"]), false),\n            Err(OptionsError::TreeAllAll)\n        );\n    }\n\n    #[test]\n    fn deduce_dot_filter_all_all() {\n        assert_eq!(\n            DotFilter::deduce(&mock_cli(vec![\"--all\", \"--all\", \"--all\"]), true),\n            Err(OptionsError::Conflict(\"all\", \"all\"))\n        );\n    }\n\n    #[test]\n    fn deduce_dot_filter_almost_all() {\n        assert_eq!(\n            DotFilter::deduce(&mock_cli(vec![\"--almost-all\"]), false),\n            Ok(DotFilter::Dotfiles)\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_default() {\n        assert_eq!(\n            mock_cli(vec![\"\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::default())\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_name() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \"name\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::Name(SortCase::AaBbCc))\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_name_case() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \"Name\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::Name(SortCase::ABCabc))\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_name_mix_hidden() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \".name\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::NameMixHidden(SortCase::AaBbCc))\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_name_mix_hidden_case() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \".Name\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::NameMixHidden(SortCase::ABCabc))\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_size() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \"size\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::Size)\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_extension() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \"ext\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::Extension(SortCase::AaBbCc))\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_extension_case() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \"Ext\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::Extension(SortCase::ABCabc))\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_date() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \"date\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::ModifiedDate)\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_time() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \"time\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::ModifiedDate)\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_age() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \"age\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::ModifiedAge)\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_old() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \"old\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::ModifiedAge)\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_ch() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \"ch\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::ChangedDate)\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_acc() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \"acc\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::AccessedDate)\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_cr() {\n        assert_eq!(\n            mock_cli(vec![\"--sort\", \"cr\"]).get_one::<SortField>(\"sort\"),\n            Some(&SortField::CreatedDate)\n        );\n    }\n\n    #[test]\n    fn deduce_sort_field_err() {\n        assert!(mock_cli_try(vec![\"--sort\", \"foo\"]).is_err());\n    }\n\n    #[test]\n    fn deduce_file_filter_default() {\n        assert_eq!(\n            FileFilter::deduce(&mock_cli(vec![\"\"]), false),\n            Ok(FileFilter {\n                flags: vec![],\n                sort_field: SortField::default(),\n                dot_filter: DotFilter::JustFiles,\n                ignore_patterns: IgnorePatterns::empty(),\n                git_ignore: GitIgnore::Off,\n                no_symlinks: false,\n                show_symlinks: false,\n            })\n        );\n    }\n\n    #[test]\n    fn deduce_file_filter_reverse() {\n        assert_eq!(\n            FileFilter::deduce(&mock_cli(vec![\"--reverse\"]), false),\n            Ok(FileFilter {\n                flags: vec![FileFilterFlags::Reverse],\n                sort_field: SortField::default(),\n                dot_filter: DotFilter::JustFiles,\n                ignore_patterns: IgnorePatterns::empty(),\n                git_ignore: GitIgnore::Off,\n                no_symlinks: false,\n                show_symlinks: false,\n            })\n        );\n    }\n\n    #[test]\n    fn deduce_file_filter_only_dirs() {\n        assert_eq!(\n            FileFilter::deduce(&mock_cli(vec![\"--only-dirs\"]), false),\n            Ok(FileFilter {\n                flags: vec![FileFilterFlags::OnlyDirs],\n                sort_field: SortField::default(),\n                dot_filter: DotFilter::JustFiles,\n                ignore_patterns: IgnorePatterns::empty(),\n                git_ignore: GitIgnore::Off,\n                no_symlinks: false,\n                show_symlinks: false,\n            })\n        );\n    }\n\n    #[test]\n    fn deduce_file_filter_only_files() {\n        assert_eq!(\n            FileFilter::deduce(&mock_cli(vec![\"--only-files\"]), false),\n            Ok(FileFilter {\n                flags: vec![FileFilterFlags::OnlyFiles],\n                sort_field: SortField::default(),\n                dot_filter: DotFilter::JustFiles,\n                ignore_patterns: IgnorePatterns::empty(),\n                git_ignore: GitIgnore::Off,\n                no_symlinks: false,\n                show_symlinks: false,\n            })\n        );\n    }\n}\n"
  },
  {
    "path": "src/options/mod.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! Parsing command-line strings into exa options.\n//!\n//! This module imports exa’s configuration types, such as `View` (the details\n//! of displaying multiple files) and `DirAction` (what to do when encountering\n//! a directory), and implements `deduce` methods on them so they can be\n//! configured using command-line options.\n//!\n//!\n//! ## Useless and overridden options\n//!\n//! Let’s say exa was invoked with just one argument: `exa --inode`. The\n//! `--inode` option is used in the details view, where it adds the inode\n//! column to the output. But because the details view is *only* activated with\n//! the `--long` argument, adding `--inode` without it would not have any\n//! effect.\n//!\n//! For a long time, exa’s philosophy was that the user should be warned\n//! whenever they could be mistaken like this. If you tell exa to display the\n//! inode, and it *doesn’t* display the inode, isn’t that more annoying than\n//! having it throw an error back at you?\n//!\n//! However, this doesn’t take into account *configuration*. Say a user wants\n//! to configure exa so that it lists inodes in the details view, but otherwise\n//! functions normally. A common way to do this for command-line programs is to\n//! define a shell alias that specifies the details they want to use every\n//! time. For the inode column, the alias would be:\n//!\n//! `alias exa=\"exa --inode\"`\n//!\n//! Using this alias means that although the inode column will be shown in the\n//! details view, you’re now *only* allowed to use the details view, as any\n//! other view type will result in an error. Oops!\n//!\n//! Another example is when an option is specified twice, such as `exa\n//! --sort=Name --sort=size`. Did the user change their mind about sorting, and\n//! accidentally specify the option twice?\n//!\n//! Again, exa rejected this case, throwing an error back to the user instead\n//! of trying to guess how they want their output sorted. And again, this\n//! doesn’t take into account aliases being used to set defaults. A user who\n//! wants their files to be sorted case-insensitively may configure their shell\n//! with the following:\n//!\n//! `alias exa=\"exa --sort=Name\"`\n//!\n//! Just like the earlier example, the user now can’t use any other sort order,\n//! because exa refuses to guess which one they meant. It’s *more* annoying to\n//! have to go back and edit the command than if there were no error.\n//!\n//! Fortunately, there’s a heuristic for telling which options came from an\n//! alias and which came from the actual command-line: aliased options are\n//! nearer the beginning of the options array, and command-line options are\n//! nearer the end. This means that after the options have been parsed, exa\n//! needs to traverse them *backwards* to find the last-most-specified one.\n//!\n//! For example, invoking exa with `exa --sort=size` when that alias is present\n//! would result in a full command-line of:\n//!\n//! `exa --sort=Name --sort=size`\n//!\n//! `--sort=size` should override `--sort=Name` because it’s closer to the end\n//! of the arguments array. In fact, because there’s no way to tell where the\n//! arguments came from — it’s just a heuristic — this will still work even\n//! if no aliases are being used!\n//!\n//! Finally, this isn’t just useful when options could override each other.\n//! Creating an alias `exal=\"exa --long --inode --header\"` then invoking `exal\n//! --grid --long` shouldn’t complain about `--long` being given twice when\n//! it’s clear what the user wants.\n\nuse clap::ArgMatches;\n\nuse crate::fs::dir_action::DirAction;\nuse crate::fs::filter::{FileFilter, GitIgnore};\nuse crate::options::stdin::FilesInput;\nuse crate::output::{Mode, View, details, grid_details};\nuse crate::theme::Options as ThemeOptions;\n\nmod dir_action;\nmod error;\nmod file_name;\nmod filter;\n#[rustfmt::skip] // this module becomes unreadable with rustfmt\nmod theme;\nmod view;\n\npub use self::error::{NumberSource, OptionsError};\n\npub mod parser;\n\npub mod vars;\npub use self::vars::Vars;\npub mod config;\npub mod stdin;\n/// These **options** represent a parsed, error-checked versions of the\n/// user’s command-line options.\n#[derive(Debug)]\npub struct Options {\n    /// The action to perform when encountering a directory rather than a\n    /// regular file.\n    pub dir_action: DirAction,\n\n    /// How to sort and filter files before outputting them.\n    pub filter: FileFilter,\n\n    /// The user’s preference of view to use (lines, grid, details, or\n    /// grid-details) along with the options on how to render file names.\n    /// If the view requires the terminal to have a width, and there is no\n    /// width, then the view will be downgraded.\n    pub view: View,\n\n    /// The options to make up the styles of the UI and file names.\n    pub theme: ThemeOptions,\n\n    /// Whether to read file names from stdin instead of the command-line\n    pub stdin: FilesInput,\n}\n\nimpl Options {\n    /// Whether the View specified in this set of options includes a Git\n    /// status column. It’s only worth trying to discover a repository if the\n    /// results will end up being displayed.\n    #[must_use]\n    pub fn should_scan_for_git(&self) -> bool {\n        if self.filter.git_ignore == GitIgnore::CheckAndIgnore {\n            return true;\n        }\n\n        match self.view.mode {\n            Mode::Details(details::Options {\n                table: Some(ref table),\n                ..\n            })\n            | Mode::GridDetails(grid_details::Options {\n                details:\n                    details::Options {\n                        table: Some(ref table),\n                        ..\n                    },\n                ..\n            }) => table.columns.git,\n            _ => false,\n        }\n    }\n\n    /// Determines the complete set of options based on the given command-line\n    /// arguments, after they’ve been parsed.\n    pub fn deduce<V: Vars>(matches: &ArgMatches, vars: &V) -> Result<Self, OptionsError> {\n        if cfg!(not(feature = \"git\")) && (matches.get_flag(\"git\") || matches.get_flag(\"git-ignore\"))\n        {\n            return Err(OptionsError::Unsupported(String::from(\n                \"Options --git and --git-ignore can't be used because `git` feature was disabled in this build of exa\",\n            )));\n        }\n        let strict = vars\n            .get_with_fallback(vars::EXA_STRICT, vars::EZA_STRICT)\n            .is_some();\n\n        let view = View::deduce(matches, vars, strict)?;\n        let dir_action = DirAction::deduce(matches, matches!(view.mode, Mode::Details(_)), strict)?;\n        let filter = FileFilter::deduce(matches, strict)?;\n        let theme = ThemeOptions::deduce(matches, vars);\n        let stdin = FilesInput::deduce(matches, vars);\n\n        Ok(Self {\n            dir_action,\n            filter,\n            view,\n            theme,\n            stdin,\n        })\n    }\n}\n"
  },
  {
    "path": "src/options/parser.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse std::ffi::OsString;\n\nuse clap::{Error, ValueEnum, arg, builder::PossibleValue, value_parser};\n\nuse crate::{\n    fs::filter::{SortCase, SortField},\n    output::{file_name::Absolute, time::TimeFormat},\n};\n\nconst SORT_FIELDS_HELP: &str = \"[default: name] [possible values:\n  name, Name, .name, .Name, ext, ext, created,\n  date, age, accessed, changed,\n  size, inode, type, none]\";\n\nconst TIME_FIELDS_HELP: &str = \"[possible values:\n  mod|modified, acc|accessed, ch|changed, cr|created]\";\n\nconst FORMAT_STYLE_FIELDS_HELP: &str = \"[possible values:\n  default, iso, long-iso, full-iso, relative, \\\"+<CUSTOM_FORMAT>\\\"]\";\n\npub fn get_command() -> clap::Command {\n    clap::Command::new(clap::crate_name!())\n        .author(clap::crate_authors!())\n        .about(clap::crate_description!())\n        .version(include_str!(concat!(env!(\"OUT_DIR\"), \"/version_string.txt\")))\n        .disable_help_flag(true)\n        .disable_version_flag(true)\n        .args_override_self(true)\n\n        .arg(arg!([FILE]...).value_parser(clap::value_parser!(OsString)).hide_short_help(true))\n\n        .next_help_heading(\"META OPTIONS\")\n        .arg(arg!(--stdin \"read file names from stdin\"))\n        .arg(arg!(-'?' --help \"Print help\").action(clap::ArgAction::HelpShort))\n        .arg(arg!(-v --version \"Print help\").action(clap::ArgAction::Version))\n\n        .next_help_heading(\"LAYOUT OPTIONS\")\n        .arg(arg!(-'1' --oneline \"display one entry per line\"))\n        .arg(arg!(-l --long \"display extended file metadata as a table\"))\n        .arg(arg!(-G --grid \"display entries as a grid (default)\"))\n        .arg(arg!(-x --across \"sort the grid across, rather than downwards\"))\n        .arg(arg!(-R --recurse \"recurse into directories\"))\n        .arg(arg!(-T --tree \"recurse into directories as a tree\"))\n        .arg(arg!(-L --level <DEPTH> \"limit the depth of recursion\")\n            .value_parser(value_parser!(usize)))\n        .arg(arg!(--\"follow-symlinks\" \"drill down into symbolic links that point to directories\"))\n        .arg(arg!(-w --width <COLS> \"set screen width in columns\")\n            .value_parser(value_parser!(usize)))\n\n        .next_help_heading(\"DISPLAY OPTIONS\")\n        .arg(arg!(-F --classify <WHEN> \"display type indicator by file names\")\n            .num_args(0..=1)\n            .value_parser(value_parser!(ShowWhen))\n            .default_missing_value(\"auto\"))\n        .arg(arg!(-X --dereference  \"dereference symbolic links when displaying information\"))\n        .arg(arg!(--absolute \"display entries with their absolute path\")\n            .num_args(0..=1)\n            .action(clap::ArgAction::Set)\n            .value_parser(value_parser!(Absolute))\n            .default_missing_value(\"on\")\n            .default_value(\"off\")\n            .hide_default_value(true))\n        .arg(arg!(--color <WHEN> \"When to use colours.\")\n            .alias(\"colour\")\n            .num_args(0..=1)\n            .value_parser(value_parser!(ShowWhen))\n            .default_missing_value(\"auto\")\n            .default_value(\"auto\"))\n        .arg(arg!(--\"color-scale\" <FIELDS> \"highlight value of FIELDS distinctly\")\n            .num_args(0..)\n            .value_parser(value_parser!(ColorScaleArgs))\n            .default_missing_value(\"all\")\n            .value_delimiter(','))\n        .arg(arg!(--\"color-scale-mode\" <MODE> \"mode for --color-scale\")\n            .num_args(1)\n            .value_parser(value_parser!(ColorScaleModeArgs))\n            .default_value(\"gradient\"))\n        .arg(arg!(--icons <WHEN> \"when to display icons\")\n            .num_args(0..=1)\n            .value_parser(value_parser!(ShowWhen))\n            .default_missing_value(\"auto\"))\n        .arg(arg!(--hyperlink \"display entries as hyperlinks\"))\n        .arg(arg!(--\"no-quotes\" \"don't quote file names with spaces\"))\n\n        .next_help_heading(\"FILTERING OPTIONS\")\n        .arg(arg!(-a --all... \"show hidden files. Use this twice to also show the '.' and '..' directories\"))\n        .arg(arg!(-A --\"almost-all\" \"equivalent to --all; included for compatibility with `ls -A`\"))\n        .arg(arg!(-d --\"treat-dirs-as-files\" \"treat directories as files; don't list their contents\")\n            .alias(\"list-dirs\") // TODO: compat alias to remove (above flag published in v0.23.4 / 2025-10-03)\n            .conflicts_with_all([\"recurse\", \"tree\"]))\n        .arg(arg!(-D --\"only-dirs\" \"list only directories\"))\n        .arg(arg!(-f --\"only-files\" \"list only files\"))\n        .arg(arg!(--\"show-symlinks\" \"explicitly show symbolic links (with --only-dirs and --only-files)\"))\n        .arg(arg!(--\"no-symlinks\" \"do not show symbolic links\"))\n        .arg(arg!(-I --\"ignore-glob\" <GLOBS> \"glob patterns (pipe-separated) of files to ignore\"))\n        .arg(arg!(--\"git-ignore\" \"ignore files mentioned in '.gitignore'\"))\n\n        .next_help_heading(\"SORTING OPTIONS\")\n        .arg(arg!(--\"group-directories-first\" \"list directories before other files\").id(\"dirs-first\"))\n        .arg(arg!(--\"group-directories-last\" \"list directories after other files\").id(\"dirs-last\"))\n        .arg(arg!(-s --sort <FIELD>)\n            .help(format!(\"which field to sort by {SORT_FIELDS_HELP}\"))\n            .value_parser(value_parser!(SortField))\n            .default_value(\"name\")\n            .hide_default_value(true)\n            .hide_possible_values(true))\n        .arg(arg!(-r --reverse \"reverse the sort order\"))\n\n        .next_help_heading(\"LONG VIEW OPTIONS\")\n        .arg(arg!(-h --header \"add a header row to each column\"))\n        .arg(arg!(-i --inode \"list each file's inode number\"))\n        .arg(arg!(-o --\"octal-permissions\" \"list each file's permission in octal format\"))\n        .arg(arg!(-H --links \"list each file's number of hard links\"))\n        .arg(arg!(-b --binary \"show file sizes with binary prefixes\"))\n        .arg(arg!(-B --bytes \"show file sizes in bytes, without any prefixes\"))\n        .arg(arg!(--\"total-size\" \"show the size of a directory as the one of its content (unix only)\"))\n        .arg(arg!(-S --blocksize \"list size of allocated file system blocks\"))\n        .arg(arg!(-g --group \"list each file's group\"))\n        .arg(arg!(--\"smart-group\" \"only show group if it has a different name from owner\"))\n        .arg(arg!(-n --numeric \"show user and group as their numeric IDs\"))\n        .arg(arg!(-t --time <FIELD>).help(format!(\"which timestamp field to show {TIME_FIELDS_HELP}\"))\n            .value_parser(value_parser!(TimeArgs))\n            .conflicts_with_all([\"modified\", \"accessed\", \"changed\", \"created\"])\n            .hide_possible_values(true))\n        .arg(arg!(-m --modified \"show the modified timestamp field (replace default field, combinable)\"))\n        .arg(arg!(-u --accessed \"show the accessed timestamp field (replace default field, combinable)\"))\n        .arg(arg!(--changed \"show the changed timestamp field (replace default field, combinable)\"))\n        .arg(arg!(-U --created \"show the created timestamp field (replace default field, combinable)\"))\n        .arg(arg!(--\"time-style\" <STYLE>)\n            .help(format!(\"how to format timestamps {FORMAT_STYLE_FIELDS_HELP}\"))\n            .value_parser(TimeFormatParser)\n            .hide_possible_values(false))\n        .arg(arg!(-O --flags \"list file flags (Mac, BSD, and Windows only)\").id(\"file-flags\"))\n        .arg(arg!(-Z --context \"list each file's security context\").id(\"security-context\"))\n        .arg(arg!(--git \"list each file's Git status, if tracked or ignored\"))\n        .arg(arg!(--\"git-repos\" \"list root of git-tree status\"))\n        .arg(arg!(--\"git-repos-no-status\" \"list each git-repos branch name (much faster)\"))\n        .arg(arg!(-M --mounts \"show mount details (Linux and macOS only)\"))\n        .arg(arg!(-'@' --extended \"list each file's extended attributes and sizes\"))\n        .arg(arg!(--\"no-permissions\" \"suppress the permissions field\"))\n        .arg(arg!(--\"no-filesize\" \"suppress the filesize field\"))\n        .arg(arg!(--\"no-user\" \"suppress the user field\"))\n        .arg(arg!(--\"no-time\" \"suppress the time field\"))\n        .arg(arg!(--\"no-git\" \"suppress Git fields (overrides --git, --git-repos, --git-repos-no-status)\"))\n}\n\n#[derive(Clone, Debug, PartialEq, Eq)]\npub enum ShowWhen {\n    // icons, colors, quotes, headers ? eventually\n    Always,\n    Auto,\n    Never,\n}\n\nimpl ValueEnum for ShowWhen {\n    fn value_variants<'a>() -> &'a [Self] {\n        &[Self::Always, Self::Auto, Self::Never]\n    }\n\n    fn to_possible_value(&self) -> Option<clap::builder::PossibleValue> {\n        Some(\n            match self {\n                Self::Always => \"always\",\n                Self::Auto => \"auto\",\n                Self::Never => \"never\",\n            }\n            .into(),\n        )\n    }\n\n    fn from_str(s: &str, _ignore_case: bool) -> Result<Self, String> {\n        match s.to_lowercase().as_str() {\n            \"\" | \"auto\" | \"automatic\" => Ok(Self::Auto),\n            \"always\" => Ok(Self::Always),\n            \"never\" => Ok(Self::Never),\n            e => Err(String::from(e)),\n        }\n    }\n}\n\n#[derive(Clone, Debug, ValueEnum, PartialEq, Eq)]\npub enum ColorScaleArgs {\n    All,\n    Age,\n    Size,\n}\n\n#[derive(Clone, Debug, ValueEnum, PartialEq, Eq)]\npub enum ColorScaleModeArgs {\n    Fixed,\n    Gradient,\n}\n\nimpl ValueEnum for SortField {\n    fn value_variants<'a>() -> &'a [Self] {\n        &[\n            Self::Name(SortCase::AaBbCc),\n            Self::Name(SortCase::ABCabc),\n            Self::NameMixHidden(SortCase::AaBbCc),\n            Self::NameMixHidden(SortCase::ABCabc),\n            Self::Size,\n            Self::Extension(SortCase::AaBbCc),\n            Self::Extension(SortCase::ABCabc),\n            Self::ModifiedDate,\n            Self::ModifiedAge,\n            Self::ChangedDate,\n            Self::AccessedDate,\n            Self::CreatedDate,\n            #[cfg(unix)]\n            Self::FileInode,\n            Self::FileType,\n            Self::Unsorted,\n        ]\n    }\n\n    fn to_possible_value(&self) -> Option<PossibleValue> {\n        Some(match self {\n            Self::Name(SortCase::AaBbCc) => PossibleValue::new(\"name\").alias(\"filename\"),\n            Self::Name(SortCase::ABCabc) => PossibleValue::new(\"Name\").alias(\"Filename\"),\n            Self::NameMixHidden(SortCase::AaBbCc) => PossibleValue::new(\".name\").alias(\".filename\"),\n            Self::NameMixHidden(SortCase::ABCabc) => PossibleValue::new(\".Name\").alias(\".Filename\"),\n            Self::Size => PossibleValue::new(\"size\"),\n            Self::Extension(SortCase::AaBbCc) => PossibleValue::new(\"ext\").alias(\"extension\"),\n            Self::Extension(SortCase::ABCabc) => PossibleValue::new(\"Ext\").alias(\"Extension\"),\n            // “new” sorts oldest at the top and newest at the bottom; “old” sorts newest at the\n            // top and oldest at the bottom. I think this is the right way round to do this:\n            // “size” puts the smallest at  the top and the largest at the bottom, doesn’t it?\n            Self::ModifiedDate => {\n                PossibleValue::new(\"date\").aliases(vec![\"time\", \"mod\", \"modified\", \"new\", \"newest\"])\n            }\n            // Similarly, “age” means that files with the least age (the newest files) get sorted\n            //  at the top, and files with the most age (the oldest) at the bottom.\n            Self::ModifiedAge => PossibleValue::new(\"age\").aliases(vec![\"old\", \"oldest\"]),\n            Self::ChangedDate => PossibleValue::new(\"changed\").alias(\"ch\"),\n            Self::AccessedDate => PossibleValue::new(\"accessed\").alias(\"acc\"),\n            Self::CreatedDate => PossibleValue::new(\"created\").alias(\"cr\"),\n            #[cfg(unix)]\n            Self::FileInode => PossibleValue::new(\"inode\"),\n            Self::FileType => PossibleValue::new(\"type\"),\n            Self::Unsorted => PossibleValue::new(\"none\"),\n        })\n    }\n}\n\n#[derive(Clone, Debug, PartialEq, Eq)]\npub enum TimeArgs {\n    Modified,\n    Changed,\n    Accessed,\n    Created,\n}\n\nimpl ValueEnum for TimeArgs {\n    fn value_variants<'a>() -> &'a [Self] {\n        &[Self::Modified, Self::Changed, Self::Accessed, Self::Created]\n    }\n\n    fn to_possible_value(&self) -> Option<clap::builder::PossibleValue> {\n        Some(match self {\n            Self::Modified => PossibleValue::new(\"modified\").alias(\"mod\"),\n            Self::Changed => PossibleValue::new(\"changed\").alias(\"ch\"),\n            Self::Accessed => PossibleValue::new(\"accessed\").alias(\"acc\"),\n            Self::Created => PossibleValue::new(\"created\").alias(\"cr\"),\n        })\n    }\n}\n\n#[allow(unused)]\n#[derive(Debug, Clone)]\npub struct TimeFormatParser;\n\nimpl clap::builder::ValueParserFactory for TimeFormat {\n    type Parser = TimeFormatParser;\n    fn value_parser() -> Self::Parser {\n        TimeFormatParser\n    }\n}\n\nimpl clap::builder::TypedValueParser for TimeFormatParser {\n    type Value = TimeFormat;\n\n    fn parse_ref(\n        &self,\n        cmd: &clap::Command,\n        _arg: Option<&clap::Arg>,\n        value: &std::ffi::OsStr,\n    ) -> Result<Self::Value, Error> {\n        match TimeFormat::try_from_str(value.to_str().unwrap()) {\n            Err(s) => Err(Error::raw(clap::error::ErrorKind::InvalidValue, s).with_cmd(cmd)),\n            Ok(v) => Ok(v),\n        }\n    }\n}\n\nimpl ValueEnum for Absolute {\n    fn value_variants<'a>() -> &'a [Self] {\n        &[Self::On, Self::Off, Self::Follow]\n    }\n\n    fn to_possible_value(&self) -> Option<clap::builder::PossibleValue> {\n        Some(match self {\n            Self::On => PossibleValue::new(\"on\").alias(\"yes\"),\n            Self::Off => PossibleValue::new(\"off\").alias(\"no\"),\n            Self::Follow => PossibleValue::new(\"follow\"),\n        })\n    }\n}\n\n#[cfg(test)]\npub mod test {\n    use super::*;\n\n    pub fn mock_cli<I, T>(itr: I) -> clap::ArgMatches\n    where\n        I: IntoIterator<Item = T>,\n        T: Into<OsString> + Clone,\n    {\n        get_command().no_binary_name(true).get_matches_from(itr)\n    }\n\n    pub fn mock_cli_try<I, T>(itr: I) -> Result<clap::ArgMatches, clap::error::Error>\n    where\n        I: IntoIterator<Item = T>,\n        T: Into<OsString> + Clone,\n    {\n        get_command().no_binary_name(true).try_get_matches_from(itr)\n    }\n\n    #[test]\n    fn deduce_files() {\n        let cli = mock_cli(vec![\"file1\", \"file2\"]);\n        assert_eq!(\n            cli.get_many(\"FILE\")\n                .unwrap()\n                .map(OsString::as_os_str)\n                .collect::<Vec<_>>(),\n            [\"file1\", \"file2\"]\n        );\n    }\n}\n"
  },
  {
    "path": "src/options/stdin.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse clap::ArgMatches;\n\nuse crate::options::Vars;\nuse crate::options::vars::EZA_STDIN_SEPARATOR;\nuse std::ffi::OsString;\nuse std::io;\nuse std::io::IsTerminal;\n\n#[derive(Debug, PartialEq)]\npub enum FilesInput {\n    Stdin(OsString),\n    Args,\n}\n\nimpl FilesInput {\n    pub fn deduce<V: Vars>(matches: &ArgMatches, vars: &V) -> Self {\n        if matches.get_flag(\"stdin\") || !io::stdin().is_terminal() {\n            let separator = vars\n                .get(EZA_STDIN_SEPARATOR)\n                .unwrap_or(OsString::from(\"\\n\"));\n            FilesInput::Stdin(separator)\n        } else {\n            FilesInput::Args\n        }\n    }\n}\n"
  },
  {
    "path": "src/options/theme.rs",
    "content": "use clap::ArgMatches;\n\n// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse crate::options::parser::ShowWhen;\nuse crate::options::{vars, Vars};\nuse crate::output::color_scale::ColorScaleOptions;\nuse crate::theme::{Definitions, Options, UseColours};\nuse std::path::PathBuf;\n\nuse super::config::ThemeConfig;\n\nimpl Options {\n    pub fn deduce<V: Vars>(matches: &ArgMatches, vars: &V) -> Self {\n        let use_colours = UseColours::deduce(matches, vars);\n        let colour_scale = ColorScaleOptions::deduce(matches, vars);\n        let theme_config = ThemeConfig::deduce(vars);\n\n        let definitions = if use_colours == UseColours::Never {\n            Definitions::default()\n        } else {\n            Definitions::deduce(vars)\n        };\n\n        Self {\n            use_colours,\n            colour_scale,\n            definitions,\n            theme_config,\n        }\n    }\n}\n\nimpl ThemeConfig {\n    fn deduce<V: Vars>(vars: &V) -> Option<Self> {\n        if let Some(path) = vars.get(\"EZA_CONFIG_DIR\") {\n            let path = PathBuf::from(path);\n            let theme = path.join(\"theme.yml\");\n            if theme.exists() {\n                return Some(ThemeConfig::from_path(theme));\n            }\n            let theme = path.join(\"theme.yaml\");\n            if theme.exists() {\n                return Some(ThemeConfig::from_path(theme));\n            }\n            None\n        } else {\n            let path = dirs::config_dir().unwrap_or_default();\n            let path = path.join(\"eza\");\n            let theme = path.join(\"theme.yml\");\n            if theme.exists() {\n                return Some(ThemeConfig::default());\n            }\n            let theme = path.join(\"theme.yaml\");\n            if theme.exists() {\n                return Some(ThemeConfig::from_path(theme));\n            }\n            None\n        }\n    }\n}\n\nimpl UseColours {\n    fn deduce<V: Vars>(matches: &ArgMatches, vars: &V) -> Self {\n        let default_value = match vars.get(vars::NO_COLOR) {\n            Some(_) => Self::Never,\n            None => Self::Automatic,\n        };\n\n        match matches.get_one(\"color\").unwrap() {\n            ShowWhen::Auto => default_value,\n            ShowWhen::Always => Self::Always,\n            ShowWhen::Never => Self::Never,\n        }\n    }\n}\n\nimpl Definitions {\n    fn deduce<V: Vars>(vars: &V) -> Self {\n        let ls = vars\n            .get(vars::LS_COLORS)\n            .map(|e| e.to_string_lossy().to_string());\n        let exa = vars\n            .get_with_fallback(vars::EZA_COLORS, vars::EXA_COLORS)\n            .map(|e| e.to_string_lossy().to_string());\n        Self { ls, exa }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::options::{parser::test::mock_cli, vars::test::MockVars};\n    use std::ffi::OsString;\n\n    #[test]\n    fn deduce_definitions() {\n        let vars = MockVars {\n            ..MockVars::default()\n        };\n\n        assert_eq!(\n            Definitions::deduce(&vars),\n            Definitions {\n                ls: None,\n                exa: None,\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_definitions_colors() {\n        let mut vars = MockVars {\n            ..MockVars::default()\n        };\n\n        vars.set(vars::LS_COLORS, &OsString::from(\"uR=1;34\"));\n\n        assert_eq!(\n            Definitions::deduce(&vars),\n            Definitions {\n                ls: Some(\"uR=1;34\".to_string()),\n                exa: Some(\"uR=1;34\".to_string()),\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_use_colors_no_color_env() {\n        let vars = MockVars {\n            no_colors: OsString::from(\"1\"),\n            ..MockVars::default()\n        };\n\n        assert_eq!(\n            UseColours::deduce(&mock_cli(vec![\"\"]), &vars),\n            UseColours::Never\n        );\n    }\n\n    #[test]\n    fn deduce_use_colors_no_color_arg() {\n        let vars = MockVars {\n            ..MockVars::default()\n        };\n\n        assert_eq!(\n            UseColours::deduce(&mock_cli(vec![\"--color\", \"never\"]), &vars),\n            UseColours::Never\n        );\n    }\n\n    #[test]\n    fn deduce_use_colors_always() {\n        let vars = MockVars {\n            ..MockVars::default()\n        };\n\n        assert_eq!(\n            UseColours::deduce(&mock_cli(vec![\"--color\", \"always\"]), &vars),\n            UseColours::Always\n        );\n    }\n\n    #[test]\n    fn deduce_use_colors_auto() {\n        let vars = MockVars {\n            ..MockVars::default()\n        };\n\n        assert_eq!(\n            UseColours::deduce(&mock_cli(vec![\"--color\", \"auto\"]), &vars),\n            UseColours::Automatic\n        );\n    }\n}\n"
  },
  {
    "path": "src/options/vars.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse std::ffi::OsString;\n\n// General variables\n\n/// Environment variable used to colour files, both by their filesystem type\n/// (symlink, socket, directory) and their file name or extension (image,\n/// video, archive);\npub static LS_COLORS: &str = \"LS_COLORS\";\n\n/// Environment variable used to override the width of the terminal, in\n/// characters.\npub static COLUMNS: &str = \"COLUMNS\";\n\n/// Environment variable used to datetime format.\npub static TIME_STYLE: &str = \"TIME_STYLE\";\n\n/// Environment variable used to disable colors.\n/// See: <https://no-color.org/>\npub static NO_COLOR: &str = \"NO_COLOR\";\n\n// exa-specific variables\n\n/// Environment variable used to colour exa’s interface when colours are\n/// enabled. This includes all the colours that `LS_COLORS` would recognise,\n/// overriding them if necessary. It can also contain exa-specific codes.\npub static EXA_COLORS: &str = \"EXA_COLORS\";\npub static EZA_COLORS: &str = \"EZA_COLORS\";\n\n/// Environment variable used to switch on strict argument checking, such as\n/// complaining if an argument was specified twice, or if two conflict.\n/// This is meant to be so you don’t accidentally introduce the wrong\n/// behaviour in a script, rather than for general command-line use.\n/// Any non-empty value will turn strict mode on.\npub static EXA_STRICT: &str = \"EXA_STRICT\";\npub static EZA_STRICT: &str = \"EZA_STRICT\";\n\n/// Environment variable used to make exa print out debugging information as\n/// it runs. Any non-empty value will turn debug mode on.\npub static EXA_DEBUG: &str = \"EXA_DEBUG\";\npub static EZA_DEBUG: &str = \"EZA_DEBUG\";\n\n/// Environment variable used to limit the grid-details view\n/// (`--grid --long`) so it’s only activated if there’s at least the given\n/// number of rows of output.\npub static EXA_GRID_ROWS: &str = \"EXA_GRID_ROWS\";\npub static EZA_GRID_ROWS: &str = \"EZA_GRID_ROWS\";\n\n/// Environment variable used to specify how many spaces to print between an\n/// icon and its file name. Different terminals display icons differently,\n/// with 1 space bringing them too close together or 2 spaces putting them too\n/// far apart, so this may be necessary depending on how they are shown.\npub static EXA_ICON_SPACING: &str = \"EXA_ICON_SPACING\";\npub static EZA_ICON_SPACING: &str = \"EZA_ICON_SPACING\";\n\npub static EXA_OVERRIDE_GIT: &str = \"EXA_OVERRIDE_GIT\";\npub static EZA_OVERRIDE_GIT: &str = \"EZA_OVERRIDE_GIT\";\n\n/// Enviroment variable used to set the minimum luminance in `color_scale`. It's value\n/// can be between -100 and 100\npub static EXA_MIN_LUMINANCE: &str = \"EXA_MIN_LUMINANCE\";\npub static EZA_MIN_LUMINANCE: &str = \"EZA_MIN_LUMINANCE\";\n\n/// Environment variable used to automate the same behavior as `--icons=auto` if set.\n/// Any explicit use of `--icons=WHEN` overrides this behavior.\npub static EZA_ICONS_AUTO: &str = \"EZA_ICONS_AUTO\";\n\npub static EZA_STDIN_SEPARATOR: &str = \"EZA_STDIN_SEPARATOR\";\n\n/// Environment variable used to choose how windows attributes are displayed.\n/// Short will display a single character for each set attribute, long will\n/// display a comma separated list of descriptions.\npub static EZA_WINDOWS_ATTRIBUTES: &str = \"EZA_WINDOWS_ATTRIBUTES\";\n\n/// Mockable wrapper for `std::env::var_os`.\npub trait Vars {\n    fn get(&self, name: &'static str) -> Option<OsString>;\n\n    /// Get the variable `name` and if not set get the variable `fallback`.\n    fn get_with_fallback(&self, name: &'static str, fallback: &'static str) -> Option<OsString> {\n        self.get(name).or_else(|| self.get(fallback))\n    }\n\n    /// Get the source of the value.  If the variable `name` is set return\n    /// `Some(name)` else if the variable `fallback` is set return\n    /// `Some(fallback)` else `None`.\n    fn source(&self, name: &'static str, fallback: &'static str) -> Option<&'static str> {\n        match self.get(name) {\n            Some(_) if !name.is_empty() => Some(name),\n            _ => self.get(fallback).and(Some(fallback)),\n        }\n    }\n}\n\n#[cfg(test)]\npub mod test {\n    use super::*;\n\n    // Test impl that just returns the value it has.\n    impl Vars for Option<OsString> {\n        fn get(&self, _name: &'static str) -> Option<OsString> {\n            self.clone()\n        }\n    }\n\n    #[derive(Default)]\n    pub struct MockVars {\n        pub columns: OsString,\n        pub colors: OsString,\n        pub no_colors: OsString,\n        pub strict: OsString,\n        pub debug: OsString,\n        pub grid_rows: OsString,\n        pub icon_spacing: OsString,\n        pub luminance: OsString,\n        pub icons: OsString,\n        pub time: OsString,\n    }\n\n    impl Vars for MockVars {\n        fn get(&self, name: &'static str) -> Option<OsString> {\n            match name {\n                \"EXA_STRICT\" | \"EZA_STRICT\" if !self.strict.is_empty() => Some(self.strict.clone()),\n                \"EZA_COLORS\" | \"LS_COLORS\" | \"EXA_COLORS\" if !self.colors.is_empty() => {\n                    Some(self.colors.clone())\n                }\n                \"EXA_DEBUG\" | \"EZA_DEBUG\" if !self.debug.is_empty() => Some(self.debug.clone()),\n                \"EXA_GRID_ROWS\" | \"EZA_GRID_ROWS\" if !self.grid_rows.is_empty() => {\n                    Some(self.grid_rows.clone())\n                }\n                \"EXA_ICON_SPACING\" | \"EZA_ICON_SPACING\" if !self.icon_spacing.is_empty() => {\n                    Some(self.icon_spacing.clone())\n                }\n                \"EXA_MIN_LUMINANCE\" | \"EZA_MIN_LUMINANCE\" if !self.luminance.is_empty() => {\n                    Some(self.luminance.clone())\n                }\n                \"EZA_ICONS_AUTO\" if !self.icons.is_empty() => Some(self.icons.clone()),\n                \"COLUMNS\" if !self.columns.is_empty() => Some(self.columns.clone()),\n                \"NO_COLOR\" if !self.no_colors.is_empty() => Some(self.no_colors.clone()),\n                \"TIME_STYLE\" if !self.time.is_empty() => Some(self.time.clone()),\n                _ => None,\n            }\n        }\n    }\n\n    impl MockVars {\n        pub fn set(&mut self, var: &'static str, value: &OsString) {\n            match var {\n                \"EXA_STRICT\" | \"EZA_STRICT\" => self.strict = value.clone(),\n                \"EZA_COLORS\" | \"LS_COLORS\" | \"EXA_COLORS\" => self.colors = value.clone(),\n                \"EXA_DEBUG\" | \"EZA_DEBUG\" => self.debug = value.clone(),\n                \"EXA_GRID_ROWS\" | \"EZA_GRID_ROWS\" => self.grid_rows = value.clone(),\n                \"EXA_ICON_SPACING\" | \"EZA_ICON_SPACING\" => self.icon_spacing = value.clone(),\n                \"EXA_MIN_LUMINANCE\" | \"EZA_MIN_LUMINANCE\" => self.luminance = value.clone(),\n                \"EZA_ICONS_AUTO\" => self.icons = value.clone(),\n                \"COLUMNS\" => self.columns = value.clone(),\n                \"NO_COLOR\" => self.no_colors = value.clone(),\n                \"TIME_STYLE\" => self.time = value.clone(),\n                _ => (),\n            };\n        }\n    }\n\n    #[test]\n    fn set_test() {\n        let mut vars = MockVars {\n            ..MockVars::default()\n        };\n\n        vars.set(TIME_STYLE, &OsString::from(\"iso\"));\n        assert_eq!(vars.get(TIME_STYLE), Some(OsString::from(\"iso\")));\n    }\n}\n"
  },
  {
    "path": "src/options/view.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse clap::{ArgMatches, ValueEnum};\n\nuse crate::output::TerminalWidth::Automatic;\n\nuse crate::fs::feature::xattr;\nuse crate::options::parser::ColorScaleModeArgs;\nuse crate::options::{NumberSource, OptionsError, Vars, vars};\nuse crate::output::TerminalWidth::Set;\nuse crate::output::color_scale::{ColorScaleMode, ColorScaleOptions};\nuse crate::output::file_name::Options as FileStyle;\nuse crate::output::grid_details::{self, RowThreshold};\nuse crate::output::table::{\n    Columns, FlagsFormat, GroupFormat, Options as TableOptions, SizeFormat, TimeTypes, UserFormat,\n};\nuse crate::output::time::TimeFormat;\nuse crate::output::{Mode, TerminalWidth, View, details, grid};\n\nuse super::parser::{ColorScaleArgs, TimeArgs};\n\nimpl View {\n    pub fn deduce<V: Vars>(\n        matches: &ArgMatches,\n        vars: &V,\n        strict: bool,\n    ) -> Result<Self, OptionsError> {\n        let width = TerminalWidth::deduce(matches, vars)?;\n        let is_tty = width.actual_terminal_width().is_some();\n        let mode = Mode::deduce(matches, vars, is_tty, strict)?;\n        let deref_links = matches.get_flag(\"dereference\");\n        let follow_links = matches.get_flag(\"follow-symlinks\");\n        let total_size = matches.get_flag(\"total-size\");\n        let file_style = FileStyle::deduce(matches, vars, is_tty)?;\n        Ok(Self {\n            mode,\n            width,\n            file_style,\n            deref_links,\n            follow_links,\n            total_size,\n        })\n    }\n}\n\nimpl Mode {\n    /// Determine which viewing mode to use based on the user’s options.\n    ///\n    /// As with the other options, arguments are scanned right-to-left and the\n    /// first flag found is matched, so `exa --oneline --long` will pick a\n    /// details view, and `exa --long --oneline` will pick the lines view.\n    ///\n    /// This is complicated a little by the fact that `--grid` and `--tree`\n    /// can also combine with `--long`, so care has to be taken to use the\n    pub fn deduce<V: Vars>(\n        matches: &ArgMatches,\n        vars: &V,\n        is_tty: bool,\n        strict: bool,\n    ) -> Result<Self, OptionsError> {\n        let long = matches.get_flag(\"long\");\n        let oneline = matches.get_flag(\"oneline\");\n        let grid = matches.get_flag(\"grid\");\n        let tree = matches.get_flag(\"tree\");\n\n        if !long && strict {\n            Self::strict_check_long_flags(matches)?;\n        }\n\n        if !(long || oneline || grid || tree) {\n            if is_tty {\n                let grid = grid::Options::deduce(matches);\n                return Ok(Self::Grid(grid));\n            }\n            return Ok(Self::Lines);\n        }\n\n        if long {\n            let details = details::Options::deduce_long(matches, vars, strict)?;\n\n            if grid {\n                let row_threshold = RowThreshold::deduce(vars)?;\n                let grid_details = grid_details::Options {\n                    details,\n                    row_threshold,\n                };\n                return Ok(Self::GridDetails(grid_details));\n            }\n\n            // the --tree case is handled by the DirAction parser later\n            return Ok(Self::Details(details));\n        }\n\n        if tree {\n            let details = details::Options::deduce_tree(matches, vars);\n            return Ok(Self::Details(details));\n        }\n\n        if oneline {\n            return Ok(Self::Lines);\n        }\n\n        let grid = grid::Options::deduce(matches);\n        Ok(Self::Grid(grid))\n    }\n\n    // TODO: handle that with Clap\n    fn strict_check_long_flags(matches: &ArgMatches) -> Result<(), OptionsError> {\n        // If --long hasn’t been passed, then check if we need to warn the\n        // user about flags that won’t have any effect.\n        for flag in &[\n            \"binary\",\n            \"bytes\",\n            \"inode\",\n            \"links\",\n            \"header\",\n            \"blocksize\",\n            \"time\",\n            \"group\",\n            \"numeric\",\n            \"mounts\",\n        ] {\n            if matches.contains_id(flag) {\n                return Err(OptionsError::Useless(flag, false, \"long\"));\n            }\n        }\n\n        if matches.get_flag(\"git\") && !matches.get_flag(\"no-git\") {\n            return Err(OptionsError::Useless(\"git\", false, \"long\"));\n        } else if matches.contains_id(\"level\")\n            && !matches.get_flag(\"recurse\")\n            && !matches.get_flag(\"tree\")\n        {\n            return Err(OptionsError::Useless2(\"level\", \"recurse\", \"tree\"));\n        }\n\n        Ok(())\n    }\n}\n\nimpl grid::Options {\n    fn deduce(matches: &ArgMatches) -> Self {\n        grid::Options {\n            across: matches.get_flag(\"across\"),\n        }\n    }\n}\n\nimpl details::Options {\n    fn deduce_tree<V: Vars>(matches: &ArgMatches, vars: &V) -> Self {\n        details::Options {\n            table: None,\n            header: false,\n            xattr: xattr::ENABLED && matches.get_flag(\"extended\"),\n            secattr: xattr::ENABLED && matches.get_flag(\"security-context\"),\n            mounts: matches.get_flag(\"mounts\"),\n            color_scale: ColorScaleOptions::deduce(matches, vars),\n            follow_links: matches.get_flag(\"follow-symlinks\"),\n        }\n    }\n\n    fn deduce_long<V: Vars>(\n        matches: &ArgMatches,\n        vars: &V,\n        strict: bool,\n    ) -> Result<Self, OptionsError> {\n        if strict {\n            if matches.get_flag(\"across\") && !matches.get_flag(\"grid\") {\n                return Err(OptionsError::Useless(\"across\", true, \"long\"));\n            } else if matches.get_flag(\"oneline\") {\n                return Err(OptionsError::Useless(\"one-line\", true, \"long\"));\n            }\n        }\n\n        Ok(details::Options {\n            table: Some(TableOptions::deduce(matches, vars)?),\n            header: matches.get_flag(\"header\"),\n            xattr: xattr::ENABLED && matches.get_flag(\"extended\"),\n            secattr: xattr::ENABLED && matches.get_flag(\"security-context\"),\n            mounts: matches.get_flag(\"mounts\"),\n            color_scale: ColorScaleOptions::deduce(matches, vars),\n            follow_links: matches.get_flag(\"follow-symlinks\"),\n        })\n    }\n}\n\nimpl TerminalWidth {\n    fn deduce<V: Vars>(matches: &ArgMatches, vars: &V) -> Result<Self, OptionsError> {\n        if let Some(&width) = matches.get_one(\"width\") {\n            if width >= 1 {\n                Ok(Set(width))\n            } else {\n                Ok(Automatic)\n            }\n        } else if let Some(columns) = vars.get(vars::COLUMNS).and_then(|s| s.into_string().ok()) {\n            match columns.parse() {\n                Ok(width) => Ok(Set(width)),\n                Err(e) => {\n                    let source = NumberSource::Env(vars::COLUMNS);\n                    Err(OptionsError::FailedParse(columns, source, e))\n                }\n            }\n        } else {\n            Ok(Automatic)\n        }\n    }\n}\n\nimpl RowThreshold {\n    fn deduce<V: Vars>(vars: &V) -> Result<Self, OptionsError> {\n        if let Some(columns) = vars\n            .get_with_fallback(vars::EZA_GRID_ROWS, vars::EXA_GRID_ROWS)\n            .and_then(|s| s.into_string().ok())\n        {\n            match columns.parse() {\n                Ok(rows) => Ok(Self::MinimumRows(rows)),\n                Err(e) => {\n                    let source = NumberSource::Env(\n                        vars.source(vars::EZA_GRID_ROWS, vars::EXA_GRID_ROWS)\n                            .unwrap(),\n                    );\n                    Err(OptionsError::FailedParse(columns, source, e))\n                }\n            }\n        } else {\n            Ok(Self::AlwaysGrid)\n        }\n    }\n}\n\nimpl TableOptions {\n    fn deduce<V: Vars>(matches: &ArgMatches, vars: &V) -> Result<Self, OptionsError> {\n        let time_format = TimeFormat::deduce(matches, vars);\n        let flags_format = FlagsFormat::deduce(vars);\n        let size_format = SizeFormat::deduce(matches);\n        let user_format = UserFormat::deduce(matches);\n        let group_format = GroupFormat::deduce(matches);\n        let columns = Columns::deduce(matches, vars)?;\n        Ok(Self {\n            size_format,\n            time_format,\n            user_format,\n            group_format,\n            flags_format,\n            columns,\n        })\n    }\n}\n\nimpl Columns {\n    fn deduce<V: Vars>(matches: &ArgMatches, vars: &V) -> Result<Self, OptionsError> {\n        let time_types = TimeTypes::deduce(matches)?;\n\n        let no_git_env = vars\n            .get_with_fallback(vars::EXA_OVERRIDE_GIT, vars::EZA_OVERRIDE_GIT)\n            .is_some();\n\n        let git = matches.get_flag(\"git\") && !matches.get_flag(\"no-git\") && !no_git_env;\n        let subdir_git_repos =\n            matches.get_flag(\"git-repos\") && !matches.get_flag(\"no-git\") && !no_git_env;\n        let subdir_git_repos_no_stat = !subdir_git_repos\n            && matches.get_flag(\"git-repos-no-status\")\n            && !matches.get_flag(\"no-git\")\n            && !no_git_env;\n\n        let file_flags = matches.get_flag(\"file-flags\");\n        let blocksize = matches.get_flag(\"blocksize\");\n        let group = matches.get_flag(\"group\");\n        let inode = matches.get_flag(\"inode\");\n        let links = matches.get_flag(\"links\");\n        let octal = matches.get_flag(\"octal-permissions\");\n        let security_context = xattr::ENABLED && matches.get_flag(\"security-context\");\n\n        let permissions = !matches.get_flag(\"no-permissions\");\n        let filesize = !matches.get_flag(\"no-filesize\");\n        let user = !matches.get_flag(\"no-user\");\n\n        Ok(Self {\n            time_types,\n            inode,\n            links,\n            blocksize,\n            group,\n            git,\n            subdir_git_repos,\n            subdir_git_repos_no_stat,\n            octal,\n            security_context,\n            file_flags,\n            permissions,\n            filesize,\n            user,\n        })\n    }\n}\n\nimpl SizeFormat {\n    /// Determine which file size to use in the file size column based on\n    /// the user’s options.\n    ///\n    /// The default mode is to use the decimal prefixes, as they are the\n    /// most commonly-understood, and don’t involve trying to parse large\n    /// strings of digits in your head. Changing the format to anything else\n    /// involves the `--binary` or `--bytes` flags, and these conflict with\n    /// each other.\n    fn deduce(matches: &ArgMatches) -> Self {\n        use SizeFormat::*;\n        if matches.get_flag(\"binary\") {\n            BinaryBytes\n        } else if matches.get_flag(\"bytes\") {\n            JustBytes\n        } else {\n            DecimalBytes\n        }\n    }\n}\n\nconst FORMAT_STYLE_FIELDS: [&str; 6] = [\n    \"default\",\n    \"iso\",\n    \"long-iso\",\n    \"full-iso\",\n    \"relative\",\n    \"+<CUSTOM_FORMAT>\",\n];\n\nimpl TimeFormat {\n    /// Determine how time should be formatted in timestamp columns.\n    pub fn try_from_str(value: &str) -> Result<Self, String> {\n        use nu_ansi_term::Color::*;\n\n        let error_header = format!(\n            \"invalid value '{}' for '{}'\\n  [possible values: {}]\\n\\n\",\n            Yellow.paint(value),\n            White.paint(\"--time-style <STYLE>\"),\n            FORMAT_STYLE_FIELDS\n                .map(|s| Green.paint(s).to_string())\n                .join(\", \")\n        );\n        let error_footer = format!(\n            \"\\n\\nFor more information, try '{}'.\\n\",\n            White.paint(\"--help\"),\n        );\n\n        let fmt = match value {\n            \"default\" => return Ok(TimeFormat::DefaultFormat),\n            \"iso\" => return Ok(TimeFormat::ISOFormat),\n            \"long-iso\" => return Ok(TimeFormat::LongISO),\n            \"full-iso\" => return Ok(TimeFormat::FullISO),\n            \"relative\" => return Ok(TimeFormat::Relative),\n            s if !s.starts_with('+') => {\n                let error_middle = format!(\n                    \"{}{}\",\n                    \"Please start the format with a plus sign (+) to indicate a custom format.\\n\",\n                    \"For example: \\\"+%Y-%m-%d %H:%M:%S\\\"\",\n                );\n                return Err(format!(\"{error_header}{error_middle}{error_footer}\"));\n            }\n            s => s,\n        };\n\n        let mut lines = fmt.strip_prefix('+').unwrap().lines();\n\n        // line 1 is None when there is nothing after `+`\n        // line 1 is empty when `+` is followed immediately by `\\n`\n        let non_recent = match lines.next() {\n            None | Some(\"\") => {\n                let error_middle = format!(\n                    \"{}{}\",\n                    \"Custom timestamp format is empty, \",\n                    \"please supply a chrono format string after the +.\"\n                );\n                return Err(format!(\"{error_header}{error_middle}{error_footer}\"));\n            }\n            Some(non_recent) => non_recent,\n        };\n\n        // line 2 is None when there is not a single `\\n`, or nothing after the first `\\n`\n        // line 2 is empty when there are at least 2 `\\n`, and nothing between the 1st and 2nd `\\n`\n        let recent = match lines.next() {\n            Some(\"\") => {\n                let error_middle = format!(\n                    \"{}{}\",\n                    \"Custom timestamp format for recent files is empty, \",\n                    \"please supply a chrono format string at the second line.\"\n                );\n                return Err(format!(\"{error_header}{error_middle}{error_footer}\"));\n            }\n            recent => recent.map(std::string::ToString::to_string),\n        };\n\n        Ok(TimeFormat::Custom {\n            non_recent: String::from(non_recent),\n            recent,\n        })\n    }\n}\n\nimpl TimeFormat {\n    /// Determine how time should be formatted in timestamp columns.\n    fn deduce<V: Vars>(matches: &ArgMatches, vars: &V) -> Self {\n        if let Some(arg) = matches.get_one::<TimeFormat>(\"time-style\") {\n            arg.clone()\n        } else {\n            match vars.get(vars::TIME_STYLE) {\n                Some(t) if !t.is_empty() => TimeFormat::try_from_str(t.to_str().unwrap_or(\"\"))\n                    .unwrap_or(TimeFormat::DefaultFormat),\n                _ => Self::DefaultFormat,\n            }\n        }\n    }\n}\n\nimpl UserFormat {\n    fn deduce(matches: &ArgMatches) -> Self {\n        if matches.get_flag(\"numeric\") {\n            Self::Numeric\n        } else {\n            Self::Name\n        }\n    }\n}\n\nimpl GroupFormat {\n    fn deduce(matches: &ArgMatches) -> Self {\n        if matches.get_flag(\"smart-group\") {\n            Self::Smart\n        } else {\n            Self::Regular\n        }\n    }\n}\n\nimpl TimeTypes {\n    /// Determine which of a file’s time fields should be displayed for it\n    /// based on the user’s options.\n    ///\n    /// There are two separate ways to pick which fields to show: with a\n    /// flag (such as `--modified`) or with a parameter (such as\n    /// `--time=modified`). An error is signaled if both ways are used.\n    ///\n    /// It’s valid to show more than one column by passing in more than one\n    /// option, but passing *no* options means that the user just wants to\n    /// see the default set.\n    fn deduce(matches: &ArgMatches) -> Result<Self, OptionsError> {\n        let possible_word = matches.get_one::<TimeArgs>(\"time\");\n        let modified = matches.get_flag(\"modified\");\n        let changed = matches.get_flag(\"changed\");\n        let accessed = matches.get_flag(\"accessed\");\n        let created = matches.get_flag(\"created\");\n\n        let no_time = matches.get_flag(\"no-time\");\n\n        #[rustfmt::skip]\n        let time_types = if no_time {\n            Self {\n                modified: false,\n                changed: false,\n                accessed: false,\n                created: false,\n            }\n        } else if let Some(word) = possible_word {\n            if modified {\n                return Err(OptionsError::Useless(\"modified\", true, \"time\"));\n            } else if changed {\n                return Err(OptionsError::Useless(\"changed\", true, \"time\"));\n            } else if accessed {\n                return Err(OptionsError::Useless(\"accessed\", true, \"time\"));\n            } else if created {\n                return Err(OptionsError::Useless(\"created\", true, \"time\"));\n            } else if *word == TimeArgs::Modified  {\n                Self { modified: true,  changed: false, accessed: false, created: false }\n            } else if *word == TimeArgs::Changed {\n                Self { modified: false, changed: true,  accessed: false, created: false }\n            } else if *word == TimeArgs::Accessed {\n                Self { modified: false, changed: false, accessed: true,  created: false }\n            } else if *word == TimeArgs::Created {\n                Self { modified: false, changed: false, accessed: false, created: true  }\n            } else {\n                return Err(OptionsError::BadArgument(\"time\", word.to_possible_value().unwrap().get_name().into()));\n            }\n        } else if modified || changed || accessed || created {\n            Self {\n                modified,\n                changed,\n                accessed,\n                created,\n            }\n        } else {\n            Self::default()\n        };\n\n        Ok(time_types)\n    }\n}\n\nimpl ColorScaleOptions {\n    pub fn deduce<V: Vars>(matches: &ArgMatches, vars: &V) -> Self {\n        let min_luminance =\n            match vars.get_with_fallback(vars::EZA_MIN_LUMINANCE, vars::EXA_MIN_LUMINANCE) {\n                Some(var) => match var.to_string_lossy().parse() {\n                    Ok(luminance) if (-100..=100).contains(&luminance) => luminance,\n                    _ => 40,\n                },\n                None => 40,\n            };\n\n        let mode = match matches.get_one(\"color-scale-mode\").unwrap() {\n            ColorScaleModeArgs::Fixed => ColorScaleMode::Fixed,\n            ColorScaleModeArgs::Gradient => ColorScaleMode::Gradient,\n        };\n\n        let mut options = ColorScaleOptions {\n            mode,\n            min_luminance,\n            size: false,\n            age: false,\n        };\n\n        let Some(words) = matches.get_many(\"color-scale\") else {\n            return options;\n        };\n\n        for word in words {\n            match word {\n                ColorScaleArgs::All => {\n                    options.size = true;\n                    options.age = true;\n                }\n                ColorScaleArgs::Age => {\n                    options.age = true;\n                }\n                ColorScaleArgs::Size => {\n                    options.size = true;\n                }\n            }\n        }\n\n        options\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::options::parser::test::mock_cli;\n    use crate::options::vars::test::MockVars;\n    use std::ffi::OsString;\n    use std::num::ParseIntError;\n\n    use super::*;\n\n    #[test]\n    fn deduce_time_types_no_time() {\n        assert_eq!(\n            TimeTypes::deduce(&mock_cli(vec![\"--no-time\"])),\n            Ok(TimeTypes {\n                modified: false,\n                ..TimeTypes::default()\n            })\n        );\n    }\n\n    #[test]\n    fn deduce_time_types_default() {\n        assert_eq!(\n            TimeTypes::deduce(&mock_cli(vec![\"\"])),\n            Ok(TimeTypes::default())\n        );\n    }\n\n    #[test]\n    fn deduce_time_types_modified_word() {\n        assert_eq!(\n            TimeTypes::deduce(&mock_cli(vec![\"--time\", \"modified\"])),\n            Ok(TimeTypes {\n                modified: true,\n                ..TimeTypes::default()\n            })\n        );\n    }\n\n    #[test]\n    fn deduce_time_types_accessed_word() {\n        assert_eq!(\n            TimeTypes::deduce(&mock_cli(vec![\"--time\", \"accessed\"])),\n            Ok(TimeTypes {\n                accessed: true,\n                modified: false,\n                ..TimeTypes::default()\n            })\n        );\n    }\n\n    #[test]\n    fn deduce_time_types_changed_word() {\n        assert_eq!(\n            TimeTypes::deduce(&&mock_cli(vec![\"--time\", \"changed\"])),\n            Ok(TimeTypes {\n                modified: false,\n                changed: true,\n                ..TimeTypes::default()\n            })\n        );\n    }\n\n    #[test]\n    fn deduce_time_types_created_word() {\n        assert_eq!(\n            TimeTypes::deduce(&mock_cli(vec![\"--time\", \"created\"])),\n            Ok(TimeTypes {\n                modified: false,\n                created: true,\n                ..TimeTypes::default()\n            })\n        );\n    }\n\n    #[test]\n    fn deduce_time_types_modified() {\n        assert_eq!(\n            TimeTypes::deduce(&mock_cli(vec![\"--modified\"])),\n            Ok(TimeTypes {\n                modified: true,\n                ..TimeTypes::default()\n            })\n        );\n    }\n\n    #[test]\n    fn deduce_time_types_accessed() {\n        assert_eq!(\n            TimeTypes::deduce(&mock_cli(vec![\"--accessed\"])),\n            Ok(TimeTypes {\n                accessed: true,\n                modified: false,\n                ..TimeTypes::default()\n            })\n        );\n    }\n\n    #[test]\n    fn deduce_time_types_changed() {\n        assert_eq!(\n            TimeTypes::deduce(&mock_cli(vec![\"--changed\"])),\n            Ok(TimeTypes {\n                modified: false,\n                changed: true,\n                ..TimeTypes::default()\n            })\n        );\n    }\n\n    #[test]\n    fn deduce_time_types_created() {\n        assert_eq!(\n            TimeTypes::deduce(&mock_cli(vec![\"--created\"])),\n            Ok(TimeTypes {\n                modified: false,\n                created: true,\n                ..TimeTypes::default()\n            })\n        );\n    }\n\n    #[test]\n    fn deduce_group_format_on() {\n        assert_eq!(\n            GroupFormat::deduce(&mock_cli(vec![\"--smart-group\"])),\n            GroupFormat::Smart\n        );\n    }\n\n    #[test]\n    fn deduce_group_format_off() {\n        assert_eq!(\n            GroupFormat::deduce(&mock_cli(vec![\"\"])),\n            GroupFormat::Regular\n        );\n    }\n\n    #[test]\n    fn deduce_user_format_on() {\n        assert_eq!(\n            UserFormat::deduce(&mock_cli(vec![\"--numeric\"])),\n            UserFormat::Numeric\n        );\n    }\n\n    #[test]\n    fn deduce_user_format_off() {\n        assert_eq!(UserFormat::deduce(&mock_cli(vec![\"\"])), UserFormat::Name);\n    }\n\n    #[test]\n    fn deduce_size_format_off() {\n        assert_eq!(\n            SizeFormat::deduce(&mock_cli(vec![\"\"])),\n            SizeFormat::DecimalBytes\n        );\n    }\n\n    #[test]\n    fn deduce_user_format_bytes() {\n        assert_eq!(\n            SizeFormat::deduce(&mock_cli(vec![\"--bytes\"])),\n            SizeFormat::JustBytes\n        );\n    }\n\n    #[test]\n    fn deduce_user_format_binary() {\n        assert_eq!(\n            SizeFormat::deduce(&mock_cli(vec![\"--binary\"])),\n            SizeFormat::BinaryBytes\n        );\n    }\n\n    #[test]\n    fn deduce_grid_options() {\n        assert_eq!(\n            grid::Options::deduce(&mock_cli(vec![\"--across\"])),\n            grid::Options { across: true }\n        );\n    }\n\n    #[test]\n    fn deduce_time_style_iso_env() {\n        let mut vars = MockVars::default();\n        vars.set(vars::TIME_STYLE, &OsString::from(\"iso\"));\n        assert_eq!(\n            TimeFormat::deduce(&mock_cli(vec![\"\"]), &vars),\n            TimeFormat::ISOFormat\n        );\n    }\n\n    #[test]\n    fn deduce_time_style_iso_arg() {\n        let vars = MockVars::default();\n        assert_eq!(\n            TimeFormat::deduce(&mock_cli(vec![\"--time-style\", \"iso\"]), &vars),\n            TimeFormat::ISOFormat\n        );\n    }\n\n    #[test]\n    fn deduce_time_style_long_iso_env() {\n        let mut vars = MockVars::default();\n        vars.set(vars::TIME_STYLE, &OsString::from(\"long-iso\"));\n        assert_eq!(\n            TimeFormat::deduce(&mock_cli(vec![\"\"]), &vars),\n            TimeFormat::LongISO\n        );\n    }\n\n    #[test]\n    fn deduce_time_style_long_iso_arg() {\n        let vars = MockVars::default();\n        assert_eq!(\n            TimeFormat::deduce(&mock_cli(vec![\"--time-style\", \"long-iso\"]), &vars),\n            TimeFormat::LongISO\n        );\n    }\n\n    #[test]\n    fn deduce_time_style_full_iso_env() {\n        let mut vars = MockVars::default();\n        vars.set(vars::TIME_STYLE, &OsString::from(\"full-iso\"));\n        assert_eq!(\n            TimeFormat::deduce(&mock_cli(vec![\"\"]), &vars),\n            TimeFormat::FullISO\n        );\n    }\n\n    #[test]\n    fn deduce_time_style_full_iso_arg() {\n        let vars = MockVars::default();\n        assert_eq!(\n            TimeFormat::deduce(&mock_cli(vec![\"--time-style\", \"full-iso\"]), &vars),\n            TimeFormat::FullISO\n        );\n    }\n\n    #[test]\n    fn deduce_time_style_relative_env() {\n        let mut vars = MockVars::default();\n        vars.set(vars::TIME_STYLE, &OsString::from(\"relative\"));\n        assert_eq!(\n            TimeFormat::deduce(&mock_cli(vec![\"\"]), &vars),\n            TimeFormat::Relative\n        );\n    }\n\n    #[test]\n    fn deduce_time_style_relative_arg() {\n        let vars = MockVars::default();\n        assert_eq!(\n            TimeFormat::deduce(&mock_cli(vec![\"--time-style\", \"relative\"]), &vars),\n            TimeFormat::Relative\n        );\n    }\n\n    #[test]\n    fn deduce_time_style_custom_env() {\n        let mut vars = MockVars::default();\n        vars.set(vars::TIME_STYLE, &OsString::from(\"+%Y-%b-%d\"));\n        assert_eq!(\n            TimeFormat::deduce(&mock_cli(vec![\"\"]), &vars),\n            TimeFormat::Custom {\n                non_recent: String::from(\"%Y-%b-%d\"),\n                recent: None\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_time_style_custom_arg() {\n        assert_eq!(\n            TimeFormat::deduce(\n                &mock_cli(vec![\"--time-style\", \"+%Y-%b-%d\"]),\n                &MockVars::default()\n            ),\n            TimeFormat::Custom {\n                non_recent: String::from(\"%Y-%b-%d\"),\n                recent: None\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_time_style_non_recent_and_recent() {\n        assert_eq!(\n            TimeFormat::deduce(\n                &mock_cli(vec![\"--time-style\", \"+%Y-%m-%d %H\\n--%m-%d %H:%M\"]),\n                &MockVars::default()\n            ),\n            TimeFormat::Custom {\n                non_recent: String::from(\"%Y-%m-%d %H\"),\n                recent: Some(String::from(\"--%m-%d %H:%M\"))\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_color_scale_size_age_luminance_40_gradient() {\n        assert_eq!(\n            ColorScaleOptions::deduce(\n                &mock_cli(vec![\"--color-scale\", \"size,age\"]),\n                &MockVars::default()\n            ),\n            ColorScaleOptions {\n                mode: ColorScaleMode::Gradient,\n                min_luminance: 40,\n                size: true,\n                age: true,\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_color_scale_size_luminance_60_gradient() {\n        let mut vars = MockVars::default();\n        vars.set(vars::EZA_MIN_LUMINANCE, &OsString::from(\"60\"));\n        assert_eq!(\n            ColorScaleOptions::deduce(&mock_cli(vec![\"--color-scale\", \"size\"]), &vars),\n            ColorScaleOptions {\n                mode: ColorScaleMode::Gradient,\n                min_luminance: 60,\n                size: true,\n                age: false,\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_color_scale_age_luminance_60_fixed() {\n        let mut vars = MockVars::default();\n        vars.set(vars::EZA_MIN_LUMINANCE, &OsString::from(\"60\"));\n        assert_eq!(\n            ColorScaleOptions::deduce(\n                &mock_cli(vec![\"--color-scale\", \"age\", \"--color-scale-mode\", \"fixed\"]),\n                &vars\n            ),\n            ColorScaleOptions {\n                mode: ColorScaleMode::Fixed,\n                min_luminance: 60,\n                size: false,\n                age: true,\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_color_scale_size_age_luminance_99_fixed() {\n        let mut vars = MockVars::default();\n        vars.set(vars::EZA_MIN_LUMINANCE, &OsString::from(\"99\"));\n        assert_eq!(\n            ColorScaleOptions::deduce(\n                &mock_cli(vec![\n                    \"--color-scale\",\n                    \"size,age\",\n                    \"--color-scale-mode\",\n                    \"fixed\"\n                ]),\n                &vars\n            ),\n            ColorScaleOptions {\n                mode: ColorScaleMode::Fixed,\n                min_luminance: 99,\n                size: true,\n                age: true,\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_mode_grid() {\n        assert_eq!(\n            Mode::deduce(\n                &mock_cli(vec![\"--grid\"]),\n                &MockVars::default(),\n                false,\n                false\n            ),\n            Ok(Mode::Grid(grid::Options { across: false }))\n        );\n    }\n\n    #[test]\n    fn deduce_mode_grid_across() {\n        assert_eq!(\n            Mode::deduce(\n                &mock_cli(vec![\"--grid\", \"--across\"]),\n                &MockVars::default(),\n                false,\n                false\n            ),\n            Ok(Mode::Grid(grid::Options { across: true }))\n        );\n    }\n    #[test]\n    fn deduce_details_options_tree() {\n        let cli = mock_cli(vec![\"--tree\"]);\n        assert_eq!(\n            details::Options::deduce_tree(&cli, &MockVars::default()),\n            details::Options {\n                table: None,\n                header: false,\n                xattr: false,\n                secattr: false,\n                mounts: false,\n                color_scale: ColorScaleOptions::deduce(&cli, &MockVars::default()),\n                follow_links: false,\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_details_options_tree_mounts() {\n        let cli = mock_cli(vec![\"--tree\", \"--mounts\"]);\n        assert_eq!(\n            details::Options::deduce_tree(&cli, &MockVars::default()),\n            details::Options {\n                table: None,\n                header: false,\n                xattr: false,\n                secattr: false,\n                mounts: true,\n                color_scale: ColorScaleOptions::deduce(&cli, &MockVars::default()),\n                follow_links: false,\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_details_options_tree_xattr() {\n        let cli = mock_cli(vec![\"--tree\", \"--extended\"]);\n        assert_eq!(\n            details::Options::deduce_tree(&cli, &MockVars::default()),\n            details::Options {\n                table: None,\n                header: false,\n                xattr: xattr::ENABLED,\n                secattr: false,\n                mounts: false,\n                color_scale: ColorScaleOptions::deduce(&cli, &MockVars::default()),\n                follow_links: false,\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_details_options_tree_secattr() {\n        let cli = mock_cli(vec![\"--tree\", \"--context\"]);\n        assert_eq!(\n            details::Options::deduce_tree(&cli, &MockVars::default()),\n            details::Options {\n                table: None,\n                header: false,\n                xattr: false,\n                secattr: xattr::ENABLED,\n                mounts: false,\n                color_scale: ColorScaleOptions::deduce(&cli, &MockVars::default()),\n                follow_links: false,\n            }\n        );\n    }\n\n    #[test]\n    fn deduce_details_long_strict_across() {\n        assert_eq!(\n            details::Options::deduce_long(\n                &mock_cli(vec![\"--long\", \"--across\"]),\n                &MockVars::default(),\n                true\n            ),\n            Err(OptionsError::Useless(\"across\", true, \"long\"))\n        );\n    }\n\n    #[test]\n    fn deduce_details_long_strict_one_line() {\n        assert_eq!(\n            details::Options::deduce_long(\n                &mock_cli(vec![\"--long\", \"--oneline\"]),\n                &MockVars::default(),\n                true\n            ),\n            Err(OptionsError::Useless(\"one-line\", true, \"long\"))\n        );\n    }\n\n    #[test]\n    fn deduce_terminal_width_automatic() {\n        assert_eq!(\n            TerminalWidth::deduce(&mock_cli(vec![\"\"]), &MockVars::default()),\n            Ok(Automatic)\n        );\n    }\n\n    #[test]\n    fn deduce_terminal_width_set_arg() {\n        assert_eq!(\n            TerminalWidth::deduce(&mock_cli(vec![\"--width\", \"80\"]), &MockVars::default()),\n            Ok(Set(80))\n        );\n    }\n\n    #[test]\n    fn deduce_terminal_width_set_env() {\n        let mut vars = MockVars::default();\n        vars.set(vars::COLUMNS, &OsString::from(\"80\"));\n        assert_eq!(\n            TerminalWidth::deduce(&mock_cli(vec![\"\"]), &vars),\n            Ok(Set(80))\n        );\n    }\n\n    #[test]\n    fn deduce_terminal_width_set_env_bad() {\n        let mut vars = MockVars::default();\n        vars.set(vars::COLUMNS, &OsString::from(\"bad\"));\n\n        let e: Result<i64, ParseIntError> =\n            vars.get(vars::COLUMNS).unwrap().to_string_lossy().parse();\n\n        assert_eq!(\n            TerminalWidth::deduce(&mock_cli(vec![\"\"]), &vars),\n            Err(OptionsError::FailedParse(\n                String::from(\"bad\"),\n                NumberSource::Env(vars::COLUMNS),\n                e.unwrap_err()\n            ))\n        );\n    }\n}\n"
  },
  {
    "path": "src/output/cell.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! The `TextCell` type for the details and lines views.\n\nuse std::iter::Sum;\nuse std::ops::{Add, Deref, DerefMut};\n\nuse nu_ansi_term::{AnsiString as ANSIString, AnsiStrings as ANSIStrings, Style};\nuse unicode_width::UnicodeWidthStr;\n\n/// An individual cell that holds text in a table, used in the details and\n/// lines views to store ANSI-terminal-formatted data before it is printed.\n///\n/// A text cell is made up of zero or more strings coupled with the\n/// pre-computed length of all the strings combined. When constructing details\n/// or grid-details tables, the length will have to be queried multiple times,\n/// so it makes sense to cache it.\n///\n/// (This used to be called `Cell`, but was renamed because there’s a Rust\n/// type by that name too.)\n#[derive(PartialEq, Debug, Clone, Default)]\npub struct TextCell {\n    /// The contents of this cell, as a vector of ANSI-styled strings.\n    pub contents: TextCellContents,\n\n    /// The Unicode “display width” of this cell.\n    pub width: DisplayWidth,\n}\n\nimpl Deref for TextCell {\n    type Target = TextCellContents;\n\n    fn deref(&self) -> &Self::Target {\n        &self.contents\n    }\n}\n\nimpl TextCell {\n    /// Creates a new text cell that holds the given text in the given style,\n    /// computing the Unicode width of the text.\n    pub fn paint(style: Style, text: String) -> Self {\n        let width = DisplayWidth::from(&*text);\n\n        Self {\n            contents: vec![style.paint(text)].into(),\n            width,\n        }\n    }\n\n    /// Creates a new text cell that holds the given text in the given style,\n    /// computing the Unicode width of the text. (This could be merged with\n    /// `paint`, but.)\n    pub fn paint_str(style: Style, text: &'static str) -> Self {\n        let width = DisplayWidth::from(text);\n\n        Self {\n            contents: vec![style.paint(text)].into(),\n            width,\n        }\n    }\n\n    /// Creates a new “blank” text cell that contains a single hyphen in the\n    /// given style, which should be the “punctuation” style from a `Colours`\n    /// value.\n    ///\n    /// This is used in place of empty table cells, as it is easier to read\n    /// tabular data when there is *something* in each cell.\n    pub fn blank(style: Style) -> Self {\n        Self {\n            contents: vec![style.paint(\"-\")].into(),\n            width: DisplayWidth::from(1),\n        }\n    }\n\n    /// Adds the given number of unstyled spaces after this cell.\n    ///\n    /// This method allocates a `String` to hold the spaces.\n    pub fn add_spaces(&mut self, count: usize) {\n        (*self.width) += count;\n\n        let spaces: String = \" \".repeat(count);\n        self.contents.0.push(Style::default().paint(spaces));\n    }\n\n    /// Adds the contents of another `ANSIString` to the end of this cell.\n    pub fn push(&mut self, string: ANSIString<'static>, extra_width: usize) {\n        self.contents.0.push(string);\n        (*self.width) += extra_width;\n    }\n\n    /// Adds all the contents of another `TextCell` to the end of this cell.\n    pub fn append(&mut self, other: Self) {\n        (*self.width) += *other.width;\n        self.contents.0.extend(other.contents.0);\n    }\n}\n\n// I’d like to eventually abstract cells so that instead of *every* cell\n// storing a vector, only variable-length cells would, and individual cells\n// would just store an array of a fixed length (which would usually be just 1\n// or 2), which wouldn’t require a heap allocation.\n//\n// For examples, look at the `render_*` methods in the `Table` object in the\n// details view:\n//\n// - `render_blocks`, `inode`, and `links` will always return a\n//   one-string-long TextCell;\n// - `render_size` will return one or two strings in a TextCell, depending on\n//   the size and whether one is present;\n// - `render_permissions` will return ten or eleven strings;\n// - `filename` and `symlink_filename` in the output module root return six or\n//   five strings.\n//\n// In none of these cases are we dealing with a *truly variable* number of\n// strings: it is only when the strings are concatenated together do we need a\n// growable, heap-allocated buffer.\n//\n// So it would be nice to abstract the `TextCell` type so instead of a `Vec`,\n// it can use anything of type `T: IntoIterator<Item=ANSIString<’static>>`.\n// This would allow us to still hold all the data, but allocate less.\n//\n// But exa still has bugs and I need to fix those first :(\n\n/// The contents of a text cell, as a vector of ANSI-styled strings.\n///\n/// It’s possible to use this type directly in the case where you want a\n/// `TextCell` but aren’t concerned with tracking its width, because it occurs\n/// in the final cell of a table or grid and there’s no point padding it. This\n/// happens when dealing with file names.\n#[derive(PartialEq, Debug, Clone, Default)]\npub struct TextCellContents(Vec<ANSIString<'static>>);\n\nimpl From<Vec<ANSIString<'static>>> for TextCellContents {\n    fn from(strings: Vec<ANSIString<'static>>) -> Self {\n        Self(strings)\n    }\n}\n\nimpl Deref for TextCellContents {\n    type Target = [ANSIString<'static>];\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\n// No DerefMut implementation here — it would be publicly accessible, and as\n// the contents only get changed in this module, the mutators in the struct\n// above can just access the value directly.\n\nimpl TextCellContents {\n    /// Produces an `ANSIStrings` value that can be used to print the styled\n    /// values of this cell as an ANSI-terminal-formatted string.\n    pub fn strings(&self) -> ANSIStrings<'_> {\n        ANSIStrings(&self.0)\n    }\n\n    /// Calculates the width that a cell with these contents would take up, by\n    /// counting the number of characters in each unformatted ANSI string.\n    pub fn width(&self) -> DisplayWidth {\n        self.0\n            .iter()\n            .map(|anstr| DisplayWidth::from(anstr.as_str()))\n            .sum()\n    }\n\n    /// Promotes these contents to a full cell containing them alongside\n    /// their calculated width.\n    pub fn promote(self) -> TextCell {\n        TextCell {\n            width: self.width(),\n            contents: self,\n        }\n    }\n}\n\n/// The Unicode “display width” of a string.\n///\n/// This is related to the number of *graphemes* of a string, rather than the\n/// number of *characters*, or *bytes*: although most characters are one\n/// column wide, a few can be two columns wide, and this is important to note\n/// when calculating widths for displaying tables in a terminal.\n///\n/// This type is used to ensure that the width, rather than the length, is\n/// used when constructing a `TextCell` — it’s too easy to write something\n/// like `file_name.len()` and assume it will work!\n///\n/// It has `From` impls that convert an input string or fixed with to values\n/// of this type, and will `Deref` to the contained `usize` value.\n#[derive(PartialEq, Eq, Debug, Clone, Copy, Default)]\npub struct DisplayWidth(usize);\n\nimpl<'a> From<&'a str> for DisplayWidth {\n    fn from(input: &'a str) -> Self {\n        Self(UnicodeWidthStr::width(input))\n    }\n}\n\nimpl From<usize> for DisplayWidth {\n    fn from(width: usize) -> Self {\n        Self(width)\n    }\n}\n\nimpl Deref for DisplayWidth {\n    type Target = usize;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\nimpl DerefMut for DisplayWidth {\n    fn deref_mut(&mut self) -> &mut Self::Target {\n        &mut self.0\n    }\n}\n\nimpl Add for DisplayWidth {\n    type Output = Self;\n\n    fn add(self, rhs: Self) -> Self::Output {\n        Self(self.0 + rhs.0)\n    }\n}\n\nimpl Add<usize> for DisplayWidth {\n    type Output = Self;\n\n    fn add(self, rhs: usize) -> Self::Output {\n        Self(self.0 + rhs)\n    }\n}\n\nimpl Sum for DisplayWidth {\n    fn sum<I>(iter: I) -> Self\n    where\n        I: Iterator<Item = Self>,\n    {\n        iter.fold(Self(0), Add::add)\n    }\n}\n\n#[cfg(test)]\nmod width_unit_test {\n    use super::DisplayWidth;\n\n    #[test]\n    fn empty_string() {\n        let cell = DisplayWidth::from(\"\");\n        assert_eq!(*cell, 0);\n    }\n\n    #[test]\n    fn test_string() {\n        let cell = DisplayWidth::from(\"Diss Playwidth\");\n        assert_eq!(*cell, 14);\n    }\n\n    #[test]\n    fn addition() {\n        let cell_one = DisplayWidth::from(\"/usr/bin/\");\n        let cell_two = DisplayWidth::from(\"drinking\");\n        assert_eq!(*(cell_one + cell_two), 17);\n    }\n\n    #[test]\n    fn addition_usize() {\n        let cell = DisplayWidth::from(\"/usr/bin/\");\n        assert_eq!(*(cell + 8), 17);\n    }\n}\n"
  },
  {
    "path": "src/output/color_scale.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse log::trace;\nuse nu_ansi_term::{Color as Colour, Style};\nuse palette::{FromColor, LinSrgb, Oklab, Srgb};\n\nuse crate::{\n    fs::{DotFilter, File, dir_action::RecurseOptions, feature::git::GitCache, fields::Size},\n    output::{table::TimeType, tree::TreeDepth},\n};\n\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub struct ColorScaleOptions {\n    pub mode: ColorScaleMode,\n    pub min_luminance: isize,\n    pub size: bool,\n    pub age: bool,\n}\n\nimpl Default for ColorScaleOptions {\n    fn default() -> Self {\n        Self {\n            mode: ColorScaleMode::Fixed,\n            min_luminance: 50,\n            size: false,\n            age: false,\n        }\n    }\n}\n\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum ColorScaleMode {\n    Fixed,\n    Gradient,\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct ColorScaleInformation {\n    pub options: ColorScaleOptions,\n\n    pub accessed: Option<Extremes>,\n    pub changed: Option<Extremes>,\n    pub created: Option<Extremes>,\n    pub modified: Option<Extremes>,\n\n    pub size: Option<Extremes>,\n}\n\nimpl ColorScaleInformation {\n    pub fn from_color_scale(\n        color_scale: ColorScaleOptions,\n        files: &[File<'_>],\n        dot_filter: DotFilter,\n        git: Option<&GitCache>,\n        git_ignoring: bool,\n        r: Option<RecurseOptions>,\n    ) -> Option<Self> {\n        if color_scale.mode == ColorScaleMode::Fixed {\n            None\n        } else {\n            let mut information = Self {\n                options: color_scale,\n                accessed: None,\n                changed: None,\n                created: None,\n                modified: None,\n                size: None,\n            };\n\n            update_information_recursively(\n                &mut information,\n                files,\n                dot_filter,\n                git,\n                git_ignoring,\n                TreeDepth::root(),\n                r,\n            );\n\n            Some(information)\n        }\n    }\n\n    #[must_use]\n    pub fn adjust_style(&self, mut style: Style, value: f32, range: Option<Extremes>) -> Style {\n        if let (Some(fg), Some(range)) = (style.foreground, range) {\n            let mut ratio = ((value - range.min) / (range.max - range.min)).clamp(0.0, 1.0);\n            if ratio.is_nan() {\n                ratio = 1.0;\n            }\n\n            style.foreground = Some(adjust_luminance(\n                fg,\n                ratio,\n                self.options.min_luminance as f32 / 100.0,\n            ));\n        }\n\n        style\n    }\n\n    pub fn apply_time_gradient(&self, style: Style, file: &File<'_>, time_type: TimeType) -> Style {\n        let range = match time_type {\n            TimeType::Modified => self.modified,\n            TimeType::Changed => self.changed,\n            TimeType::Accessed => self.accessed,\n            TimeType::Created => self.created,\n        };\n\n        if let Some(file_time) = time_type.get_corresponding_time(file) {\n            self.adjust_style(style, file_time.and_utc().timestamp_millis() as f32, range)\n        } else {\n            style\n        }\n    }\n}\n\nfn update_information_recursively(\n    information: &mut ColorScaleInformation,\n    files: &[File<'_>],\n    dot_filter: DotFilter,\n    git: Option<&GitCache>,\n    git_ignoring: bool,\n    depth: TreeDepth,\n    r: Option<RecurseOptions>,\n) {\n    for file in files {\n        if information.options.age {\n            Extremes::update(\n                file.created_time()\n                    .map(|x| x.and_utc().timestamp_millis() as f32),\n                &mut information.created,\n            );\n            Extremes::update(\n                file.modified_time()\n                    .map(|x| x.and_utc().timestamp_millis() as f32),\n                &mut information.modified,\n            );\n            Extremes::update(\n                file.accessed_time()\n                    .map(|x| x.and_utc().timestamp_millis() as f32),\n                &mut information.accessed,\n            );\n            Extremes::update(\n                file.changed_time()\n                    .map(|x| x.and_utc().timestamp_millis() as f32),\n                &mut information.changed,\n            );\n        }\n\n        if information.options.size {\n            let size = match file.size() {\n                Size::Some(size) => Some(size as f32),\n                _ => None,\n            };\n            Extremes::update(size, &mut information.size);\n        }\n\n        // We don't want to recurse into . and .., but still want to list them, therefore bypass\n        // the dot_filter.\n        if file.is_directory()\n            && r.is_some_and(|x| !x.is_too_deep(depth.0))\n            && file.name != \".\"\n            && file.name != \"..\"\n        {\n            match file.read_dir() {\n                Ok(dir) => {\n                    let files: Vec<File<'_>> = dir\n                        .files(dot_filter, git, git_ignoring, false, false)\n                        .collect();\n\n                    update_information_recursively(\n                        information,\n                        &files,\n                        dot_filter,\n                        git,\n                        git_ignoring,\n                        depth.deeper(),\n                        r,\n                    );\n                }\n                Err(e) => trace!(\"Unable to access directory {}: {}\", file.name, e),\n            }\n        }\n    }\n}\n\n#[derive(Copy, Clone, Debug)]\npub struct Extremes {\n    max: f32,\n    min: f32,\n}\n\nimpl Extremes {\n    fn update(maybe_value: Option<f32>, maybe_range: &mut Option<Extremes>) {\n        match (maybe_value, maybe_range) {\n            (Some(value), Some(range)) => {\n                if value > range.max {\n                    range.max = value;\n                } else if value < range.min {\n                    range.min = value;\n                }\n            }\n            (Some(value), rel) => {\n                let _ = rel.insert({\n                    Extremes {\n                        max: value,\n                        min: value,\n                    }\n                });\n            }\n            _ => (),\n        }\n    }\n}\n\nfn adjust_luminance(color: Colour, x: f32, min_l: f32) -> Colour {\n    let rgb_color = match color {\n        Colour::Rgb(r, g, b) => LinSrgb::new(\n            f32::from(r) / 255.0,\n            f32::from(g) / 255.0,\n            f32::from(b) / 255.0,\n        ),\n\n        Colour::Black => LinSrgb::new(0.0, 0.0, 0.0),\n\n        Colour::Green | Colour::LightGreen => LinSrgb::new(0.0, 1.0, 0.0),\n\n        Colour::Yellow | Colour::LightYellow => LinSrgb::new(1.0, 1.0, 0.0),\n\n        Colour::Blue | Colour::LightBlue => LinSrgb::new(0.0, 0.0, 1.0),\n\n        Colour::Magenta | Colour::LightMagenta => LinSrgb::new(1.0, 0.0, 1.0),\n\n        Colour::Cyan | Colour::LightCyan => LinSrgb::new(0.0, 1.0, 1.0),\n\n        Colour::White => LinSrgb::new(1.0, 1.0, 1.0),\n\n        Colour::LightGray => LinSrgb::new(0.5, 0.5, 0.5),\n\n        Colour::LightRed | Colour::Red => LinSrgb::new(1.0, 0.0, 0.0),\n\n        Colour::DarkGray => LinSrgb::new(0.25, 0.25, 0.25),\n\n        Colour::LightPurple | Colour::Purple => LinSrgb::new(0.5, 0.0, 0.5),\n\n        _ => LinSrgb::new(1.0, 1.0, 1.0),\n    };\n\n    let mut lab: Oklab = Oklab::from_color(rgb_color);\n    lab.l = (min_l + (1.0 - min_l) * (-4.0 * (1.0 - x)).exp()).clamp(0.0, 1.0);\n\n    let adjusted_rgb: Srgb<f32> = Srgb::from_color(lab);\n    Colour::Rgb(\n        (adjusted_rgb.red * 255.0).round() as u8,\n        (adjusted_rgb.green * 255.0).round() as u8,\n        (adjusted_rgb.blue * 255.0).round() as u8,\n    )\n}\n"
  },
  {
    "path": "src/output/details.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! The **Details** output view displays each file as a row in a table.\n//!\n//! It’s used in the following situations:\n//!\n//! - Most commonly, when using the `--long` command-line argument to display the\n//!   details of each file, which requires using a table view to hold all the data;\n//! - When using the `--tree` argument, which uses the same table view to display\n//!   each file on its own line, with the table providing the tree characters;\n//! - When using both the `--long` and `--grid` arguments, which constructs a\n//!   series of tables to fit all the data on the screen.\n//!\n//! You will probably recognise it from the `ls --long` command. It looks like\n//! this:\n//!\n//! ```text\n//!     .rw-r--r--  9.6k ben 29 Jun 16:16 Cargo.lock\n//!     .rw-r--r--   547 ben 23 Jun 10:54 Cargo.toml\n//!     .rw-r--r--  1.1k ben 23 Nov  2014 LICENCE\n//!     .rw-r--r--  2.5k ben 21 May 14:38 README.md\n//!     .rw-r--r--  382k ben  8 Jun 21:00 screenshot.png\n//!     drwxr-xr-x     - ben 29 Jun 14:50 src\n//!     drwxr-xr-x     - ben 28 Jun 19:53 target\n//! ```\n//!\n//! The table is constructed by creating a `Table` value, which produces a `Row`\n//! value for each file. These rows can contain a vector of `Cell`s, or they can\n//! contain depth information for the tree view, or both. These are described\n//! below.\n//!\n//!\n//! ## Constructing Detail Views\n//!\n//! When using the `--long` command-line argument, the details of each file are\n//! displayed next to its name.\n//!\n//! The table holds a vector of all the column types. For each file and column, a\n//! `Cell` value containing the ANSI-coloured text and Unicode width of each cell\n//! is generated, with the row and column determined by indexing into both arrays.\n//!\n//! The column types vector does not actually include the filename. This is\n//! because the filename is always the rightmost field, and as such, it does not\n//! need to have its width queried or be padded with spaces.\n//!\n//! To illustrate the above:\n//!\n//! ```text\n//!     ┌─────────────────────────────────────────────────────────────────────────┐\n//!     │ columns: [ Permissions,  Size,   User,  Date(Modified) ]                │\n//!     ├─────────────────────────────────────────────────────────────────────────┤\n//!     │   rows:  cells:                                            filename:    │\n//!     │   row 1: [ \".rw-r--r--\", \"9.6k\", \"ben\", \"29 Jun 16:16\" ]   Cargo.lock   │\n//!     │   row 2: [ \".rw-r--r--\",  \"547\", \"ben\", \"23 Jun 10:54\" ]   Cargo.toml   │\n//!     │   row 3: [ \"drwxr-xr-x\",    \"-\", \"ben\", \"29 Jun 14:50\" ]   src          │\n//!     │   row 4: [ \"drwxr-xr-x\",    \"-\", \"ben\", \"28 Jun 19:53\" ]   target       │\n//!     └─────────────────────────────────────────────────────────────────────────┘\n//! ```\n//!\n//! Each column in the table needs to be resized to fit its widest argument. This\n//! means that we must wait until every row has been added to the table before it\n//! can be displayed, in order to make sure that every column is wide enough.\n\nuse std::io::{self, Write};\nuse std::path::PathBuf;\nuse std::vec::IntoIter as VecIntoIter;\n\nuse nu_ansi_term::Style;\nuse rayon::iter::{IntoParallelRefIterator, ParallelIterator};\n\nuse log::{debug, trace};\n\nuse crate::fs::dir_action::RecurseOptions;\nuse crate::fs::feature::git::GitCache;\nuse crate::fs::feature::xattr::Attribute;\nuse crate::fs::fields::SecurityContextType;\nuse crate::fs::filter::FileFilter;\nuse crate::fs::{Dir, File};\nuse crate::output::cell::TextCell;\nuse crate::output::color_scale::{ColorScaleInformation, ColorScaleOptions};\nuse crate::output::file_name::Options as FileStyle;\nuse crate::output::table::{Options as TableOptions, Row as TableRow, Table};\nuse crate::output::tree::{TreeDepth, TreeParams, TreeTrunk};\nuse crate::theme::Theme;\n\n/// With the **Details** view, the output gets formatted into columns, with\n/// each `Column` object showing some piece of information about the file,\n/// such as its size, or its permissions.\n///\n/// To do this, the results have to be written to a table, instead of\n/// displaying each file immediately. Then, the width of each column can be\n/// calculated based on the individual results, and the fields are padded\n/// during output.\n///\n/// Almost all the heavy lifting is done in a Table object, which handles the\n/// columns for each row.\n#[allow(clippy::struct_excessive_bools)]\n/// This clearly isn't a state machine\n#[derive(PartialEq, Eq, Debug)]\npub struct Options {\n    /// Options specific to drawing a table.\n    ///\n    /// Directories themselves can pick which columns are *added* to this\n    /// list, such as the Git column.\n    pub table: Option<TableOptions>,\n\n    /// Whether to show a header line or not.\n    pub header: bool,\n\n    /// Whether to show each file’s extended attributes.\n    pub xattr: bool,\n\n    /// Whether to show each file's security attribute.\n    pub secattr: bool,\n\n    /// Whether to show a directory's mounted filesystem details\n    pub mounts: bool,\n\n    pub color_scale: ColorScaleOptions,\n\n    /// Whether to drill down into symbolic links that point to directories\n    pub follow_links: bool,\n}\n\npub struct Render<'a> {\n    pub dir: Option<&'a Dir>,\n    pub files: Vec<File<'a>>,\n    pub theme: &'a Theme,\n    pub file_style: &'a FileStyle,\n    pub opts: &'a Options,\n\n    /// Whether to recurse through directories with a tree view, and if so,\n    /// which options to use. This field is only relevant here if the `tree`\n    /// field of the `RecurseOptions` is `true`.\n    pub recurse: Option<RecurseOptions>,\n\n    /// How to sort and filter the files after getting their details.\n    pub filter: &'a FileFilter,\n\n    /// Whether we are skipping Git-ignored files.\n    pub git_ignoring: bool,\n\n    pub git: Option<&'a GitCache>,\n\n    pub git_repos: bool,\n}\n\n#[rustfmt::skip]\nstruct Egg<'a> {\n    table_row: Option<TableRow>,\n    xattrs:    &'a [Attribute],\n    errors:    Vec<(io::Error, Option<PathBuf>)>,\n    dir:       Option<Dir>,\n    file:      &'a File<'a>,\n}\n\nimpl<'a> AsRef<File<'a>> for Egg<'a> {\n    fn as_ref(&self) -> &File<'a> {\n        self.file\n    }\n}\n\nimpl<'a> Render<'a> {\n    pub fn render<W: Write>(mut self, w: &mut W) -> io::Result<()> {\n        let mut rows = Vec::new();\n\n        let color_scale_info = ColorScaleInformation::from_color_scale(\n            self.opts.color_scale,\n            &self.files,\n            self.filter.dot_filter,\n            self.git,\n            self.git_ignoring,\n            self.recurse,\n        );\n\n        if let Some(ref table) = self.opts.table {\n            match (self.git, self.dir) {\n                (Some(g), Some(d)) => {\n                    if !g.has_anything_for(&d.path) {\n                        self.git = None;\n                    }\n                }\n                (Some(g), None) => {\n                    if !self.files.iter().any(|f| g.has_anything_for(&f.path)) {\n                        self.git = None;\n                    }\n                }\n                (None, _) => { /* Keep Git how it is */ }\n            }\n\n            let mut table = Table::new(table, self.git, self.theme, self.git_repos);\n\n            if self.opts.header {\n                let header = table.header_row();\n                table.add_widths(&header);\n                rows.push(self.render_header(header));\n            }\n\n            // This is weird, but I can’t find a way around it:\n            // https://internals.rust-lang.org/t/should-option-mut-t-implement-copy/3715/6\n            let mut table = Some(table);\n            self.add_files_to_table(\n                &mut table,\n                &mut rows,\n                &self.files,\n                TreeDepth::root(),\n                color_scale_info,\n            );\n\n            for row in self.iterate_with_table(table.unwrap(), rows) {\n                writeln!(w, \"{}\", row.strings())?;\n            }\n        } else {\n            self.add_files_to_table(\n                &mut None,\n                &mut rows,\n                &self.files,\n                TreeDepth::root(),\n                color_scale_info,\n            );\n\n            for row in self.iterate(rows) {\n                writeln!(w, \"{}\", row.strings())?;\n            }\n        }\n\n        Ok(())\n    }\n\n    /// Whether to show the extended attribute hint\n    pub fn show_xattr_hint(&self, file: &File<'_>) -> bool {\n        // Do not show the hint '@' if the only extended attribute is the security\n        // attribute and the security attribute column is active.\n        let xattr_count = file.extended_attributes().len();\n        let selinux_ctx_shown = self.opts.secattr\n            && match file.security_context().context {\n                SecurityContextType::SELinux(_) => true,\n                SecurityContextType::None => false,\n            };\n        xattr_count > 1 || (xattr_count == 1 && !selinux_ctx_shown)\n    }\n\n    /// Adds files to the table, possibly recursively. This is easily\n    /// parallelisable, and uses a pool of threads.\n    fn add_files_to_table<'dir>(\n        &self,\n        table: &mut Option<Table<'a>>,\n        rows: &mut Vec<Row>,\n        src: &[File<'dir>],\n        depth: TreeDepth,\n        color_scale_info: Option<ColorScaleInformation>,\n    ) {\n        use crate::fs::feature::xattr;\n\n        let mut file_eggs: Vec<_> = src\n            .par_iter()\n            .map(|file| {\n                let mut errors = Vec::new();\n\n                // There are three “levels” of extended attribute support:\n                //\n                // 1. If we’re compiling without that feature, then\n                //    exa pretends all files have no attributes.\n                // 2. If the feature is enabled and the --extended flag\n                //    has been specified, then display an @ in the\n                //    permissions column for files with attributes, the\n                //    names of all attributes and their values, and any\n                //    errors encountered when getting them.\n                // 3. If the --extended flag *hasn’t* been specified, then\n                //    display the @, but don’t display anything else.\n                //\n                // For a while, exa took a stricter approach to (3):\n                // if an error occurred while checking a file’s xattrs to\n                // see if it should display the @, exa would display that\n                // error even though the attributes weren’t actually being\n                // shown! This was confusing, as users were being shown\n                // errors for something they didn’t explicitly ask for,\n                // and just cluttered up the output. So now errors aren’t\n                // printed unless the user passes --extended to signify\n                // that they want to see them.\n\n                let xattrs: &[Attribute] = if xattr::ENABLED && self.opts.xattr {\n                    file.extended_attributes()\n                } else {\n                    &[]\n                };\n\n                let table_row = table\n                    .as_ref()\n                    .map(|t| t.row_for_file(file, self.show_xattr_hint(file), color_scale_info));\n\n                let mut dir = None;\n                let follow_links = self.opts.follow_links;\n                if let Some(r) = self.recurse\n                    && (if follow_links {\n                        file.points_to_directory()\n                    } else {\n                        file.is_directory()\n                    })\n                    && r.tree\n                    && !r.is_too_deep(depth.0)\n                {\n                    trace!(\"matching on read_dir\");\n                    match file.read_dir() {\n                        Ok(d) => {\n                            dir = Some(d);\n                        }\n                        Err(e) => {\n                            errors.push((e, None));\n                        }\n                    }\n                }\n\n                Egg {\n                    table_row,\n                    xattrs,\n                    errors,\n                    dir,\n                    file,\n                }\n            })\n            .collect();\n\n        // this is safe because all entries have been initialized above\n        self.filter.sort_files(&mut file_eggs);\n\n        for (tree_params, egg) in depth.iterate_over(file_eggs.into_iter()) {\n            let mut files = Vec::new();\n            let errors = egg.errors;\n\n            if let (Some(ref mut t), Some(row)) = (table.as_mut(), egg.table_row.as_ref()) {\n                t.add_widths(row);\n            }\n\n            let file_name = self\n                .file_style\n                .for_file(egg.file, self.theme)\n                .with_link_paths()\n                .with_mount_details(self.opts.mounts)\n                .paint()\n                .promote();\n\n            debug!(\"file_name {file_name:?}\");\n\n            let row = Row {\n                tree: tree_params,\n                cells: egg.table_row,\n                name: file_name,\n            };\n\n            rows.push(row);\n\n            if let Some(ref dir) = egg.dir {\n                for file_to_add in dir.files(\n                    self.filter.dot_filter,\n                    self.git,\n                    self.git_ignoring,\n                    egg.file.deref_links,\n                    egg.file.is_recursive_size(),\n                ) {\n                    files.push(file_to_add);\n                }\n\n                self.filter\n                    .filter_child_files(self.recurse.is_some(), &mut files);\n\n                if !files.is_empty() {\n                    for xattr in egg.xattrs {\n                        rows.push(self.render_xattr(xattr, TreeParams::new(depth.deeper(), false)));\n                    }\n\n                    for (error, path) in errors {\n                        rows.push(self.render_error(\n                            &error,\n                            TreeParams::new(depth.deeper(), false),\n                            path,\n                        ));\n                    }\n\n                    self.add_files_to_table(table, rows, &files, depth.deeper(), color_scale_info);\n                    continue;\n                }\n            }\n\n            let count = egg.xattrs.len();\n            for (index, xattr) in egg.xattrs.iter().enumerate() {\n                let params =\n                    TreeParams::new(depth.deeper(), errors.is_empty() && index == count - 1);\n                let r = self.render_xattr(xattr, params);\n                rows.push(r);\n            }\n\n            let count = errors.len();\n            for (index, (error, path)) in errors.into_iter().enumerate() {\n                let params = TreeParams::new(depth.deeper(), index == count - 1);\n                let r = self.render_error(&error, params, path);\n                rows.push(r);\n            }\n        }\n    }\n\n    #[must_use]\n    pub fn render_header(&self, header: TableRow) -> Row {\n        Row {\n            tree: TreeParams::new(TreeDepth::root(), false),\n            cells: Some(header),\n            name: TextCell::paint_str(self.theme.ui.header.unwrap_or_default(), \"Name\"),\n        }\n    }\n\n    fn render_error(&self, error: &io::Error, tree: TreeParams, path: Option<PathBuf>) -> Row {\n        use crate::output::file_name::Colours;\n\n        let error_message = if let Some(path) = path {\n            format!(\"<{}: {}>\", path.display(), error)\n        } else {\n            format!(\"<{error}>\")\n        };\n\n        // TODO: broken_symlink() doesn’t quite seem like the right name for\n        // the style that’s being used here. Maybe split it in two?\n        let name = TextCell::paint(self.theme.broken_symlink(), error_message);\n        Row {\n            cells: None,\n            name,\n            tree,\n        }\n    }\n\n    fn render_xattr(&self, xattr: &Attribute, tree: TreeParams) -> Row {\n        let name = TextCell::paint(\n            self.theme.ui.perms.unwrap_or_default().attribute(),\n            format!(\"{xattr}\"),\n        );\n        Row {\n            cells: None,\n            name,\n            tree,\n        }\n    }\n\n    #[must_use]\n    pub fn iterate_with_table(&'a self, table: Table<'a>, rows: Vec<Row>) -> TableIter<'a> {\n        TableIter {\n            tree_trunk: TreeTrunk::default(),\n            total_width: table.widths().total(),\n            table,\n            inner: rows.into_iter(),\n            tree_style: self.theme.ui.punctuation.unwrap_or_default(),\n        }\n    }\n\n    #[must_use]\n    pub fn iterate(&'a self, rows: Vec<Row>) -> Iter {\n        Iter {\n            tree_trunk: TreeTrunk::default(),\n            inner: rows.into_iter(),\n            tree_style: self.theme.ui.punctuation.unwrap_or_default(),\n        }\n    }\n}\n\npub struct Row {\n    /// Vector of cells to display.\n    ///\n    /// Most of the rows will be used to display files’ metadata, so this will\n    /// almost always be `Some`, containing a vector of cells. It will only be\n    /// `None` for a row displaying an attribute or error, neither of which\n    /// have cells.\n    pub cells: Option<TableRow>,\n\n    /// This file’s name, in coloured output. The name is treated separately\n    /// from the other cells, as it never requires padding.\n    pub name: TextCell,\n\n    /// Information used to determine which symbols to display in a tree.\n    pub tree: TreeParams,\n}\n\n#[rustfmt::skip]\npub struct TableIter<'a> {\n    inner: VecIntoIter<Row>,\n    table: Table<'a>,\n\n    total_width: usize,\n    tree_style:  Style,\n    tree_trunk:  TreeTrunk,\n}\n\nimpl Iterator for TableIter<'_> {\n    type Item = TextCell;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.inner.next().map(|row| {\n            let mut cell = if let Some(cells) = row.cells {\n                self.table.render(cells)\n            } else {\n                let mut cell = TextCell::default();\n                cell.add_spaces(self.total_width);\n                cell\n            };\n\n            for tree_part in self.tree_trunk.new_row(row.tree) {\n                cell.push(self.tree_style.paint(tree_part.ascii_art()), 4);\n            }\n\n            cell.append(row.name);\n            cell\n        })\n    }\n}\n\npub struct Iter {\n    tree_trunk: TreeTrunk,\n    tree_style: Style,\n    inner: VecIntoIter<Row>,\n}\n\nimpl Iterator for Iter {\n    type Item = TextCell;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.inner.next().map(|row| {\n            let mut cell = TextCell::default();\n\n            for tree_part in self.tree_trunk.new_row(row.tree) {\n                cell.push(self.tree_style.paint(tree_part.ascii_art()), 4);\n            }\n\n            cell.append(row.name);\n            cell\n        })\n    }\n}\n"
  },
  {
    "path": "src/output/escape.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse super::file_name::QuoteStyle;\nuse nu_ansi_term::{AnsiString as ANSIString, Style};\nuse percent_encoding::{AsciiSet, CONTROLS, utf8_percent_encode};\n\npub fn escape(\n    string: String,\n    bits: &mut Vec<ANSIString<'_>>,\n    good: Style,\n    bad: Style,\n    quote_style: QuoteStyle,\n) {\n    let bits_starting_length = bits.len();\n    let needs_quotes = string.contains(' ') || string.contains('\\'');\n    let quote_bit = good.paint(if string.contains('\\'') { \"\\\"\" } else { \"\\'\" });\n\n    if string\n        .chars()\n        .all(|c| c >= 0x20 as char && c != 0x7f as char)\n    {\n        bits.push(good.paint(string));\n    } else {\n        for c in string.chars() {\n            // The `escape_default` method on `char` is *almost* what we want here, but\n            // it still escapes non-ASCII UTF-8 characters, which are still printable.\n\n            // TODO: This allocates way too much,\n            // hence the `all` check above.\n            if c >= 0x20 as char && c != 0x7f as char {\n                bits.push(good.paint(c.to_string()));\n            } else {\n                bits.push(bad.paint(c.escape_default().to_string()));\n            }\n        }\n    }\n\n    if quote_style != QuoteStyle::NoQuotes && needs_quotes {\n        bits.insert(bits_starting_length, quote_bit.clone());\n        bits.push(quote_bit);\n    }\n}\n\nconst HYPERLINK_ESCAPE_CHARS: &AsciiSet = &CONTROLS.add(b' ');\nconst HYPERLINK_OPENING_START: &str = \"\\x1B]8;;\";\nconst HYPERLINK_OPENING_END: &str = \"\\x1B\\x5C\";\n// Combination of both above tags\npub const HYPERLINK_CLOSING: &str = \"\\x1B]8;;\\x1B\\x5C\";\n\npub fn get_hyperlink_start_tag(abs_path: &str) -> String {\n    let abs_path = utf8_percent_encode(abs_path, HYPERLINK_ESCAPE_CHARS).to_string();\n\n    // On Windows, `std::fs::canonicalize` adds the Win32 File prefix, which we need to remove\n    #[cfg(target_os = \"windows\")]\n    let abs_path = abs_path.strip_prefix(\"\\\\\\\\?\\\\\").unwrap_or(&abs_path);\n\n    format!(\"{HYPERLINK_OPENING_START}file://{abs_path}{HYPERLINK_OPENING_END}\")\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    #[test]\n    fn hyperlink_start_tag_escape_spaces() {\n        assert_eq!(\n            get_hyperlink_start_tag(\"/folder name/file name\").to_string(),\n            format!(\n                \"{HYPERLINK_OPENING_START}file:///folder%20name/file%20name{HYPERLINK_OPENING_END}\"\n            ),\n        );\n    }\n}\n"
  },
  {
    "path": "src/output/file_name.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse std::fmt::Debug;\nuse std::path::Path;\n\nuse nu_ansi_term::{AnsiString as ANSIString, Style};\nuse path_clean;\nuse unicode_width::UnicodeWidthStr;\n\nuse crate::fs::{File, FileTarget};\nuse crate::output::cell::TextCellContents;\nuse crate::output::escape;\nuse crate::output::icons::{icon_for_file, iconify_style};\nuse crate::output::render::FiletypeColours;\nuse crate::theme::FileNameStyle;\n\n/// Basically a file name factory.\n#[derive(Debug, Copy, Clone, PartialEq)]\npub struct Options {\n    /// Whether to append file class characters to file names.\n    pub classify: Classify,\n\n    /// Whether to prepend icon characters before file names.\n    pub show_icons: ShowIcons,\n\n    /// How to display file names with spaces (with or without quotes).\n    pub quote_style: QuoteStyle,\n\n    /// Whether to make file names hyperlinks.\n    pub embed_hyperlinks: EmbedHyperlinks,\n\n    /// Whether to display files with their absolute path.\n    pub absolute: Absolute,\n\n    /// Whether we are in a console or redirecting the output\n    pub is_a_tty: bool,\n}\n\nimpl Options {\n    /// Create a new `FileName` that prints the given file’s name, painting it\n    /// with the remaining arguments.\n    pub fn for_file<'a, 'dir, C>(\n        self,\n        file: &'a File<'dir>,\n        colours: &'a C,\n    ) -> FileName<'a, 'dir, C> {\n        FileName {\n            file,\n            colours,\n            link_style: LinkStyle::JustFilenames,\n            options: self,\n            target: if file.is_link() {\n                Some(file.link_target())\n            } else {\n                None\n            },\n            mount_style: MountStyle::JustDirectoryNames,\n        }\n    }\n}\n\n/// When displaying a file name, there needs to be some way to handle broken\n/// links, depending on how long the resulting Cell can be.\n#[derive(PartialEq, Debug, Copy, Clone)]\nenum LinkStyle {\n    /// Just display the file names, but colour them differently if they’re\n    /// a broken link or can’t be followed.\n    JustFilenames,\n\n    /// Display all files in their usual style, but follow each link with an\n    /// arrow pointing to their path, colouring the path differently if it’s\n    /// a broken link, and doing nothing if it can’t be followed.\n    FullLinkPaths,\n}\n\n/// Whether to append file class characters to the file names.\n#[derive(PartialEq, Eq, Debug, Default, Copy, Clone)]\npub enum Classify {\n    /// Just display the file names, without any characters.\n    #[default]\n    JustFilenames,\n\n    /// Always add a character after the file name depending on what class of\n    /// file it is.\n    AddFileIndicators,\n\n    // Like previous, but only when output is going to a terminal, not otherwise.\n    AutomaticAddFileIndicators,\n}\n\n/// When displaying a directory name, there needs to be some way to handle\n/// mount details, depending on how long the resulting Cell can be.\n#[derive(PartialEq, Debug, Copy, Clone)]\nenum MountStyle {\n    /// Just display the directory names.\n    JustDirectoryNames,\n\n    /// Display mount points as directories and include information about\n    /// the filesystem that's mounted there.\n    MountInfo,\n}\n\n/// Whether and how to show icons.\n#[derive(PartialEq, Debug, Copy, Clone)]\npub enum ShowIcons {\n    /// Display icons next to file names, with the given number of spaces between\n    /// the icon and the file name, even when output isn’t going to a terminal.\n    Always(u32),\n\n    /// Same as Always, but only when output is going to a terminal, not otherwise.\n    Automatic(u32),\n\n    /// Never display them, even when output is going to a terminal.\n    Never,\n}\n\n/// Whether to embed hyperlinks.\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum EmbedHyperlinks {\n    Off,\n    On,\n}\n\n/// Whether to show absolute paths\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum Absolute {\n    On,\n    Follow,\n    Off,\n}\n\n/// Whether or not to wrap file names with spaces in quotes.\n#[derive(PartialEq, Debug, Copy, Clone)]\npub enum QuoteStyle {\n    /// Don't ever quote file names.\n    NoQuotes,\n\n    /// Use single quotes for file names that contain spaces and no single quotes\n    /// Use double quotes for file names that contain single quotes.\n    QuoteSpaces,\n}\n\n/// A **file name** holds all the information necessary to display the name\n/// of the given file. This is used in all of the views.\npub struct FileName<'a, 'dir, C> {\n    /// A reference to the file that we’re getting the name of.\n    file: &'a File<'dir>,\n\n    /// The colours used to paint the file name and its surrounding text.\n    colours: &'a C,\n\n    /// The file that this file points to if it’s a link.\n    target: Option<FileTarget<'dir>>, // todo: remove?\n\n    /// How to handle displaying links.\n    link_style: LinkStyle,\n\n    pub options: Options,\n\n    /// How to handle displaying a mounted filesystem.\n    mount_style: MountStyle,\n}\n\nimpl<C> FileName<'_, '_, C> {\n    /// Sets the flag on this file name to display link targets with an\n    /// arrow followed by their path.\n    #[must_use]\n    pub fn with_link_paths(mut self) -> Self {\n        if !self.file.deref_links {\n            self.link_style = LinkStyle::FullLinkPaths;\n        }\n        self\n    }\n\n    /// Sets the flag on this file name to display mounted filesystem\n    ///details.\n    #[must_use]\n    pub fn with_mount_details(mut self, enable: bool) -> Self {\n        self.mount_style = if enable {\n            MountStyle::MountInfo\n        } else {\n            MountStyle::JustDirectoryNames\n        };\n        self\n    }\n}\n\nimpl<C: Colours> FileName<'_, '_, C> {\n    /// Paints the name of the file using the colours, resulting in a vector\n    /// of coloured cells that can be printed to the terminal.\n    ///\n    /// This method returns some `TextCellContents`, rather than a `TextCell`,\n    /// because for the last cell in a table, it doesn’t need to have its\n    /// width calculated.\n    #[must_use]\n    pub fn paint(&self) -> TextCellContents {\n        let mut bits = Vec::new();\n        let (icon_override, filename_style_override) = match self.colours.style_override(self.file)\n        {\n            Some(FileNameStyle { icon, filename }) => (icon, filename),\n            None => (None, None),\n        };\n\n        let spaces_count_opt = match self.options.show_icons {\n            ShowIcons::Always(spaces_count) => Some(spaces_count),\n            ShowIcons::Automatic(spaces_count) if self.options.is_a_tty => Some(spaces_count),\n            _ => None,\n        };\n\n        let should_add_classify_char = match self.options.classify {\n            Classify::AddFileIndicators => true,\n            Classify::AutomaticAddFileIndicators if self.options.is_a_tty => true,\n            _ => false,\n        };\n\n        if let Some(spaces_count) = spaces_count_opt {\n            let (style, icon) = match icon_override {\n                Some(icon_override) => (\n                    if let Some(style_override) = icon_override.style {\n                        style_override\n                    } else {\n                        iconify_style(self.style())\n                    },\n                    icon_override\n                        .glyph\n                        .unwrap_or_else(|| icon_for_file(self.file))\n                        .to_string(),\n                ),\n                None => (\n                    iconify_style(self.style()),\n                    icon_for_file(self.file).to_string(),\n                ),\n            };\n\n            bits.push(style.paint(icon));\n            bits.push(style.paint(\" \".repeat(spaces_count as usize)));\n        }\n\n        if self.file.parent_dir.is_none()\n            && self.options.absolute == Absolute::Off\n            && let Some(parent) = self.file.path.parent()\n        {\n            self.add_parent_bits(&mut bits, parent);\n        }\n\n        if !self.file.name.is_empty() {\n            // The “missing file” colour seems like it should be used here,\n            // but it’s not! In a grid view, where there’s no space to display\n            // link targets, the filename has to have a different style to\n            // indicate this fact. But when showing targets, we can just\n            // colour the path instead (see below), and leave the broken\n            // link’s filename as the link colour.\n            for bit in self.escaped_file_name(filename_style_override) {\n                bits.push(bit);\n            }\n        }\n\n        if let (LinkStyle::FullLinkPaths, Some(target)) = (self.link_style, self.target.as_ref()) {\n            match target {\n                FileTarget::Ok(target) => {\n                    bits.push(Style::default().paint(\" \"));\n                    bits.push(self.colours.normal_arrow().paint(\"->\"));\n                    bits.push(Style::default().paint(\" \"));\n\n                    if let Some(parent) = target.path.parent() {\n                        self.add_parent_bits(&mut bits, parent);\n                    }\n\n                    if !target.name.is_empty() {\n                        let target_options = Options {\n                            classify: Classify::JustFilenames,\n                            quote_style: QuoteStyle::QuoteSpaces,\n                            show_icons: ShowIcons::Never,\n                            embed_hyperlinks: EmbedHyperlinks::Off,\n                            is_a_tty: self.options.is_a_tty,\n                            absolute: Absolute::Off,\n                        };\n\n                        let target_name = FileName {\n                            file: target,\n                            colours: self.colours,\n                            target: None,\n                            link_style: LinkStyle::FullLinkPaths,\n                            options: target_options,\n                            mount_style: MountStyle::JustDirectoryNames,\n                        };\n\n                        for bit in target_name.escaped_file_name(filename_style_override) {\n                            bits.push(bit);\n                        }\n\n                        if should_add_classify_char && let Some(class) = self.classify_char(target)\n                        {\n                            bits.push(Style::default().paint(class));\n                        }\n                    }\n                }\n\n                FileTarget::Broken(broken_path) => {\n                    bits.push(Style::default().paint(\" \"));\n                    bits.push(self.colours.broken_symlink().paint(\"->\"));\n                    bits.push(Style::default().paint(\" \"));\n\n                    escape(\n                        broken_path.display().to_string(),\n                        &mut bits,\n                        self.colours.broken_filename(),\n                        self.colours.broken_control_char(),\n                        self.options.quote_style,\n                    );\n                }\n\n                FileTarget::Err(_) => {\n                    // Do nothing — the error gets displayed on the next line\n                }\n            }\n        } else if should_add_classify_char && let Some(class) = self.classify_char(self.file) {\n            bits.push(Style::default().paint(class));\n        }\n\n        if self.mount_style == MountStyle::MountInfo\n            && let Some(mount_details) = self.file.mount_point_info()\n        {\n            // This is a filesystem mounted on the directory, output its details\n            bits.push(Style::default().paint(\" [\"));\n            bits.push(Style::default().paint(mount_details.source.clone()));\n            bits.push(Style::default().paint(\" (\"));\n            bits.push(Style::default().paint(mount_details.fstype.clone()));\n            bits.push(Style::default().paint(\")]\"));\n        }\n\n        bits.into()\n    }\n\n    /// Adds the bits of the parent path to the given bits vector.\n    /// The path gets its characters escaped based on the colours.\n    fn add_parent_bits(&self, bits: &mut Vec<ANSIString<'_>>, parent: &Path) {\n        let coconut = parent.components().count();\n\n        if coconut == 1 && parent.has_root() {\n            bits.push(\n                self.colours\n                    .symlink_path()\n                    .paint(std::path::MAIN_SEPARATOR.to_string()),\n            );\n        } else if coconut >= 1 {\n            escape(\n                parent.to_string_lossy().to_string(),\n                bits,\n                self.colours.symlink_path(),\n                self.colours.control_char(),\n                self.options.quote_style,\n            );\n            bits.push(\n                self.colours\n                    .symlink_path()\n                    .paint(std::path::MAIN_SEPARATOR.to_string()),\n            );\n        }\n    }\n\n    /// The character to be displayed after a file when classifying is on, if\n    /// the file’s type has one associated with it.\n    #[cfg(unix)]\n    pub(crate) fn classify_char(&self, file: &File<'_>) -> Option<&'static str> {\n        if file.is_executable_file() {\n            Some(\"*\")\n        } else if file.is_directory() {\n            Some(\"/\")\n        } else if file.is_pipe() {\n            Some(\"|\")\n        } else if file.is_link() {\n            Some(\"@\")\n        } else if file.is_socket() {\n            Some(\"=\")\n        } else {\n            None\n        }\n    }\n\n    #[cfg(windows)]\n    pub(crate) fn classify_char(&self, file: &File<'_>) -> Option<&'static str> {\n        if file.is_directory() {\n            Some(\"/\")\n        } else if file.is_link() {\n            Some(\"@\")\n        } else {\n            None\n        }\n    }\n\n    /// Returns at least one ANSI-highlighted string representing this file’s\n    /// name using the given set of colours.\n    ///\n    /// If --hyperlink flag is provided, it will escape the filename accordingly.\n    ///\n    /// Ordinarily, this will be just one string: the file’s complete name,\n    /// coloured according to its file type. If the name contains control\n    /// characters such as newlines or escapes, though, we can’t just print them\n    /// to the screen directly, because then there’ll be newlines in weird places.\n    ///\n    /// So in that situation, those characters will be escaped and highlighted in\n    /// a different colour.\n    fn escaped_file_name<'unused>(\n        &self,\n        style_override: Option<Style>,\n    ) -> Vec<ANSIString<'unused>> {\n        let file_style = style_override.unwrap_or(self.style());\n        let mut bits = Vec::new();\n\n        let mut display_hyperlink = false;\n        if self.options.embed_hyperlinks == EmbedHyperlinks::On\n            && let Some(abs_path) = self\n                .file\n                .absolute_path()\n                .and_then(|p| p.as_os_str().to_str())\n        {\n            bits.push(ANSIString::from(escape::get_hyperlink_start_tag(abs_path)));\n\n            display_hyperlink = true;\n        }\n\n        escape(\n            self.display_name(),\n            &mut bits,\n            file_style,\n            self.colours.control_char(),\n            self.options.quote_style,\n        );\n\n        if display_hyperlink {\n            bits.push(ANSIString::from(escape::HYPERLINK_CLOSING));\n        }\n\n        bits\n    }\n\n    /// Returns the string that should be displayed as the file's name.\n    fn display_name(&self) -> String {\n        match self.options.absolute {\n            Absolute::On => std::env::current_dir().ok().and_then(|p| {\n                path_clean::clean(p.join(&self.file.path))\n                    .to_str()\n                    .map(std::borrow::ToOwned::to_owned)\n            }),\n            Absolute::Follow => self\n                .file\n                .absolute_path()\n                .and_then(|p| p.to_str())\n                .map(std::borrow::ToOwned::to_owned),\n            Absolute::Off => None,\n        }\n        .unwrap_or(self.file.name.clone())\n    }\n\n    /// Figures out which colour to paint the filename part of the output,\n    /// depending on which “type” of file it appears to be — either from the\n    /// class on the filesystem or from its name. (Or the broken link colour,\n    /// if there’s nowhere else for that fact to be shown.)\n    #[must_use]\n    pub fn style(&self) -> Style {\n        if let LinkStyle::JustFilenames = self.link_style\n            && let Some(ref target) = self.target\n            && target.is_broken()\n        {\n            return self.colours.broken_symlink();\n        }\n\n        #[rustfmt::skip]\n        return match self.file {\n            f if f.is_mount_point()      => self.colours.mount_point(),\n            f if f.is_directory()        => self.colours.directory(),\n            #[cfg(unix)]\n            f if f.is_executable_file()  => self.colours.executable_file(),\n            f if f.is_link()             => self.colours.symlink(),\n            #[cfg(unix)]\n            f if f.is_pipe()             => self.colours.pipe(),\n            #[cfg(unix)]\n            f if f.is_block_device()     => self.colours.block_device(),\n            #[cfg(unix)]\n            f if f.is_char_device()      => self.colours.char_device(),\n            #[cfg(unix)]\n            f if f.is_socket()           => self.colours.socket(),\n            f if ! f.is_file()           => self.colours.special(),\n            _                            => self.colours.colour_file(self.file),\n        };\n    }\n\n    /// For grid's use, to cover the case of hyperlink escape sequences\n    #[must_use]\n    pub fn bare_utf8_width(&self) -> usize {\n        UnicodeWidthStr::width(self.file.name.as_str())\n    }\n}\n\n/// The set of colours that are needed to paint a file name.\npub trait Colours: FiletypeColours {\n    /// The style to paint the path of a symlink’s target, up to but not\n    /// including the file’s name.\n    fn symlink_path(&self) -> Style;\n\n    /// The style to paint the arrow between a link and its target.\n    fn normal_arrow(&self) -> Style;\n\n    /// The style to paint the filenames of broken links in views that don’t\n    /// show link targets, and the style to paint the *arrow* between the link\n    /// and its target in views that *do* show link targets.\n    fn broken_symlink(&self) -> Style;\n\n    /// The style to paint the entire filename of a broken link.\n    fn broken_filename(&self) -> Style;\n\n    /// The style to paint a non-displayable control character in a filename.\n    fn control_char(&self) -> Style;\n\n    /// The style to paint a non-displayable control character in a filename,\n    /// when the filename is being displayed as a broken link target.\n    fn broken_control_char(&self) -> Style;\n\n    /// The style to paint a file that has its executable bit set.\n    fn executable_file(&self) -> Style;\n\n    /// The style to paint a directory that has a filesystem mounted on it.\n    fn mount_point(&self) -> Style;\n\n    fn colour_file(&self, file: &File<'_>) -> Style;\n\n    fn style_override(&self, file: &File<'_>) -> Option<FileNameStyle>;\n}\n"
  },
  {
    "path": "src/output/grid.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse std::io::{self, Write};\n\nuse term_grid::{Direction, Filling, Grid, GridOptions};\n\nuse crate::fs::File;\nuse crate::fs::filter::FileFilter;\nuse crate::output::file_name::Options as FileStyle;\nuse crate::theme::Theme;\n\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub struct Options {\n    pub across: bool,\n}\n\nimpl Options {\n    #[must_use]\n    pub fn direction(self) -> Direction {\n        if self.across {\n            Direction::LeftToRight\n        } else {\n            Direction::TopToBottom\n        }\n    }\n}\n\npub struct Render<'a> {\n    pub files: Vec<File<'a>>,\n    pub theme: &'a Theme,\n    pub file_style: &'a FileStyle,\n    pub opts: &'a Options,\n    pub console_width: usize,\n    pub filter: &'a FileFilter,\n}\n\nimpl Render<'_> {\n    pub fn render<W: Write>(mut self, w: &mut W) -> io::Result<()> {\n        self.filter.sort_files(&mut self.files);\n\n        let cells = self\n            .files\n            .iter()\n            .map(|file| {\n                self.file_style\n                    .for_file(file, self.theme)\n                    .paint()\n                    .strings()\n                    .to_string()\n            })\n            .collect();\n\n        let grid = Grid::new(\n            cells,\n            GridOptions {\n                filling: Filling::Spaces(2),\n                direction: self.opts.direction(),\n                width: self.console_width,\n            },\n        );\n\n        write!(w, \"{grid}\")\n    }\n}\n"
  },
  {
    "path": "src/output/grid_details.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! The grid-details view lists several details views side-by-side.\n\nuse std::io::{self, Write};\n\nuse ansi_width;\nuse grid::{Direction, Filling, Grid, GridOptions};\nuse term_grid as grid;\n\nuse crate::fs::feature::git::GitCache;\nuse crate::fs::filter::FileFilter;\nuse crate::fs::{Dir, File};\nuse crate::output::cell::TextCell;\nuse crate::output::color_scale::ColorScaleInformation;\nuse crate::output::details::{Options as DetailsOptions, Render as DetailsRender};\nuse crate::output::file_name::Options as FileStyle;\nuse crate::output::table::{Options as TableOptions, Table};\nuse crate::theme::Theme;\n\n#[derive(PartialEq, Eq, Debug)]\npub struct Options {\n    pub details: DetailsOptions,\n    pub row_threshold: RowThreshold,\n}\n\nimpl Options {\n    #[must_use]\n    pub fn to_details_options(&self) -> &DetailsOptions {\n        &self.details\n    }\n}\n\n/// The grid-details view can be configured to revert to just a details view\n/// (with one column) if it wouldn’t produce enough rows of output.\n///\n/// Doing this makes the resulting output look a bit better: when listing a\n/// small directory of four files in four columns, the files just look spaced\n/// out and it’s harder to see what’s going on. So it can be enabled just for\n/// larger directory listings.\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum RowThreshold {\n    /// Only use grid-details view if it would result in at least this many\n    /// rows of output.\n    MinimumRows(usize),\n\n    /// Use the grid-details view no matter what.\n    AlwaysGrid,\n}\n\npub struct Render<'a> {\n    /// The directory that’s being rendered here.\n    /// We need this to know which columns to put in the output.\n    pub dir: Option<&'a Dir>,\n\n    /// The files that have been read from the directory. They should all\n    /// hold a reference to it.\n    pub files: Vec<File<'a>>,\n\n    /// How to colour various pieces of text.\n    pub theme: &'a Theme,\n\n    /// How to format filenames.\n    pub file_style: &'a FileStyle,\n\n    /// The details part of the grid-details view.\n    pub details: &'a DetailsOptions,\n\n    /// How to filter files after listing a directory. The files in this\n    /// render will already have been filtered and sorted, but any directories\n    /// that we recurse into will have to have this applied.\n    pub filter: &'a FileFilter,\n\n    /// The minimum number of rows that there need to be before grid-details\n    /// mode is activated.\n    #[allow(dead_code)]\n    pub row_threshold: RowThreshold,\n\n    /// Whether we are skipping Git-ignored files.\n    pub git_ignoring: bool,\n\n    pub git: Option<&'a GitCache>,\n\n    pub console_width: usize,\n\n    pub git_repos: bool,\n}\n\nimpl<'a> Render<'a> {\n    /// Create a temporary Details render that gets used for the columns of\n    /// the grid-details render that’s being generated.\n    ///\n    /// This includes an empty files vector because the files get added to\n    /// the table in *this* file, not in details: we only want to insert every\n    /// *n* files into each column’s table, not all of them.\n    fn details_for_column(&self) -> DetailsRender<'a> {\n        #[rustfmt::skip]\n        return DetailsRender {\n            dir:           self.dir,\n            files:         Vec::new(),\n            theme:         self.theme,\n            file_style:    self.file_style,\n            opts:          self.details,\n            recurse:       None,\n            filter:        self.filter,\n            git_ignoring:  self.git_ignoring,\n            git:           self.git,\n            git_repos:     self.git_repos,\n        };\n    }\n\n    // This doesn’t take an IgnoreCache even though the details one does\n    // because grid-details has no tree view.\n\n    pub fn render<W: Write>(mut self, w: &mut W) -> io::Result<()> {\n        let options = self\n            .details\n            .table\n            .as_ref()\n            .expect(\"Details table options not given!\");\n\n        let drender = self.details_for_column();\n\n        let color_scale_info = ColorScaleInformation::from_color_scale(\n            self.details.color_scale,\n            &self.files,\n            self.filter.dot_filter,\n            self.git,\n            self.git_ignoring,\n            None,\n        );\n\n        let mut table = self.make_table(options);\n\n        // It is important to collect all these rows _before_ turning them into\n        // cells, because the width calculations need to consider all rows\n        // before each row is turned into a string.\n        let rows: Vec<_> = self\n            .files\n            .iter()\n            .map(|file| {\n                let row = table.row_for_file(file, drender.show_xattr_hint(file), color_scale_info);\n                table.add_widths(&row);\n                row\n            })\n            .collect();\n\n        let cells = rows\n            .into_iter()\n            .zip(&self.files)\n            .map(|(row, file)| {\n                let filename = self\n                    .file_style\n                    .for_file(file, self.theme)\n                    .paint()\n                    .strings()\n                    .to_string();\n                let details = table.render(row).strings().to_string();\n\n                // This bit fixes a strange corner case. If there is a header,\n                // then \"Name\" will be added to the header row. That means that\n                // the filename column, should be at least 4 characters wide.\n                // Therefore we pad the filenames with some spaces. We have to\n                // use ansi_width here, because the filename might contain some\n                // styling.\n                let padding = \" \".repeat(if self.details.header {\n                    4usize.saturating_sub(ansi_width::ansi_width(&filename))\n                } else {\n                    0\n                });\n\n                format!(\"{details} {filename}{padding}\")\n            })\n            .collect();\n\n        let grid = Grid::new(\n            cells,\n            GridOptions {\n                filling: Filling::Spaces(4),\n                direction: Direction::TopToBottom,\n                width: self.console_width,\n            },\n        );\n\n        // If a minimum grid rows threshold has been set\n        // via the `EZA_GRID_ROWS` environment variable\n        // and the grid is going to get rendered with fewer rows,\n        // then render a details list view instead.\n        if let RowThreshold::MinimumRows(minimum_rows) = self.row_threshold\n            && grid.row_count() < minimum_rows\n        {\n            let Self {\n                dir,\n                files,\n                theme,\n                file_style,\n                details: opts,\n                filter,\n                git_ignoring,\n                git,\n                git_repos,\n                ..\n            } = self;\n\n            let r = DetailsRender {\n                dir,\n                files,\n                theme,\n                file_style,\n                opts,\n                recurse: None,\n                filter,\n                git_ignoring,\n                git,\n                git_repos,\n            };\n            return r.render(w);\n        }\n\n        if self.details.header {\n            let row = table.header_row();\n            let name = TextCell::paint_str(self.theme.ui.header.unwrap_or_default(), \"Name\")\n                .strings()\n                .to_string();\n            let s = table.render(row).strings().to_string();\n            let combined_header = format!(\"{s} {name}\");\n            let header_width = ansi_width::ansi_width(&combined_header);\n            for column_width in grid.column_widths() {\n                let padding = \" \".repeat((column_width + 4).saturating_sub(header_width));\n                write!(w, \"{combined_header}{padding}\")?;\n            }\n            writeln!(w)?;\n        }\n\n        write!(w, \"{grid}\")?;\n\n        Ok(())\n    }\n\n    fn make_table(&mut self, options: &'a TableOptions) -> Table<'a> {\n        match (self.git, self.dir) {\n            (Some(g), Some(d)) => {\n                if !g.has_anything_for(&d.path) {\n                    self.git = None;\n                }\n            }\n            (Some(g), None) => {\n                if !self.files.iter().any(|f| g.has_anything_for(&f.path)) {\n                    self.git = None;\n                }\n            }\n            (None, _) => { /* Keep Git how it is */ }\n        }\n\n        let mut table = Table::new(options, self.git, self.theme, self.git_repos);\n\n        // The header row will be printed separately, but it should be\n        // considered for the width calculations.\n        if self.details.header {\n            let row = table.header_row();\n            table.add_widths(&row);\n        }\n\n        table\n    }\n}\n"
  },
  {
    "path": "src/output/icons.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse nu_ansi_term::Style;\nuse phf::{Map, phf_map};\n\nuse crate::fs::File;\n\n#[non_exhaustive]\nstruct Icons;\n\n#[rustfmt::skip]\nimpl Icons {\n    const AUDIO: char           = '\\u{f001}';  // \n    const BINARY: char          = '\\u{eae8}';  // \n    const BOOK: char            = '\\u{e28b}';  // \n    const CALENDAR: char        = '\\u{eab0}';  // \n    const CACHE: char           = '\\u{f49b}';  // \n    const CAD: char             = '\\u{f0eeb}'; // 󰻫\n    const CLOCK: char           = '\\u{f43a}';  // \n    const COMPRESSED: char      = '\\u{f410}';  // \n    const CONFIG: char          = '\\u{f107b}'; // 󱁻\n    const CSS3: char            = '\\u{e749}';  // \n    const DATABASE: char        = '\\u{f1c0}';  // \n    const DIFF: char            = '\\u{f440}';  // \n    const DISK_IMAGE: char      = '\\u{e271}';  // \n    const DOCKER: char          = '\\u{e650}';  // \n    const DOCUMENT: char        = '\\u{f1c2}';  // \n    const DOWNLOAD: char        = '\\u{f01da}'; // 󰇚\n    const EDA_SCH: char         = '\\u{f0b45}'; // 󰭅\n    const EDA_PCB: char         = '\\u{eabe}';  // \n    const EMACS: char           = '\\u{e632}';  // \n    const ESLINT: char          = '\\u{e655}';  // \n    const FILE: char            = '\\u{f15b}';  // \n    const FILE_3D: char         = '\\u{f01a7}'; // 󰆧\n    const FOLDER: char          = '\\u{e5ff}';  // \n    const FOLDER_BUILD: char    = '\\u{f19fc}'; // 󱧼\n    const FOLDER_CONFIG: char   = '\\u{e5fc}';  // \n    const FOLDER_EXERCISM: char = '\\u{ebe5}';  // \n    const FOLDER_GIT: char      = '\\u{e5fb}';  // \n    const FOLDER_GITHUB: char   = '\\u{e5fd}';  // \n    const FOLDER_HIDDEN: char   = '\\u{f179e}'; // 󱞞\n    const FOLDER_KEY: char      = '\\u{f08ac}'; // 󰢬\n    const FOLDER_NPM: char      = '\\u{e5fa}';  // \n    const FOLDER_OCAML: char    = '\\u{e67a}';  // \n    const FOLDER_OPEN: char     = '\\u{f115}';  // \n    const FILE_UNKNOW: char     = '\\u{f086f}'; // 󰡯\n    const FONT: char            = '\\u{f031}';  // \n    const FREECAD: char         = '\\u{f336}';  // \n    const GIMP: char            = '\\u{f338}';  // \n    const GIST_SECRET: char     = '\\u{eafa}';  // \n    const GIT: char             = '\\u{f02a2}'; // 󰊢\n    const GODOT: char           = '\\u{e65f}';  // \n    const GRADLE: char          = '\\u{e660}';  // \n    const GRAPH: char           = '\\u{f1049}'; // 󱁉\n    const GRAPHQL: char         = '\\u{e662}';  // \n    const GRUNT: char           = '\\u{e611}';  // \n    const GTK: char             = '\\u{f362}';  // \n    const GULP: char            = '\\u{e610}';  // \n    const HTML5: char           = '\\u{f13b}';  // \n    const IMAGE: char           = '\\u{f1c5}';  // \n    const INFO: char            = '\\u{f129}';  // \n    const INTELLIJ: char        = '\\u{e7b5}';  // \n    const JSON: char            = '\\u{e60b}';  // \n    const KEY: char             = '\\u{eb11}';  // \n    const KDENLIVE: char        = '\\u{f33c}';  // \n    const KEYPASS: char         = '\\u{f23e}';  // \n    const KICAD: char           = '\\u{f34c}';  // \n    const KRITA: char           = '\\u{f33d}';  // \n    const LANG_ARDUINO: char    = '\\u{f34b}';  // \n    const LANG_ASSEMBLY: char   = '\\u{e637}';  // \n    const LANG_C: char          = '\\u{e61e}';  // \n    const LANG_CPP: char        = '\\u{e61d}';  // \n    const LANG_CSHARP: char     = '\\u{f031b}'; // 󰌛\n    const LANG_D: char          = '\\u{e7af}';  // \n    const LANG_ELIXIR: char     = '\\u{e62d}';  // \n    const LANG_FENNEL: char     = '\\u{e6af}';  // \n    const LANG_FORTRAN: char    = '\\u{f121a}'; // 󱈚\n    const LANG_FSHARP: char     = '\\u{e7a7}';  // \n    const LANG_GLEAM: char      = '\\u{f09a5}'; // 󰦥\n    const LANG_GO: char         = '\\u{e65e}';  // \n    const LANG_GROOVY: char     = '\\u{e775}';  // \n    const LANG_HASKELL: char    = '\\u{e777}';  // \n    const LANG_HDL: char        = '\\u{f035b}'; // 󰍛\n    const LANG_HOLYC: char      = '\\u{f00a2}'; // 󰂢\n    const LANG_JAVA: char       = '\\u{e256}';  // \n    const LANG_JAVASCRIPT: char = '\\u{e74e}';  // \n    const LANG_KOTLIN: char     = '\\u{e634}';  // \n    const LANG_LUA: char        = '\\u{e620}';  // \n    const LANG_NIM: char        = '\\u{e677}';  // \n    const LANG_OCAML: char      = '\\u{e67a}';  // \n    const LANG_PERL: char       = '\\u{e67e}';  // \n    const LANG_PHP: char        = '\\u{e73d}';  // \n    const LANG_PYTHON: char     = '\\u{e606}';  // \n    const LANG_R: char          = '\\u{e68a}';  // \n    const LANG_RUBY: char       = '\\u{e739}';  // \n    const LANG_RUBYRAILS: char  = '\\u{e73b}';  // \n    const LANG_RUST: char       = '\\u{e68b}';  // \n    const LANG_SASS: char       = '\\u{e603}';  // \n    const LANG_SCHEME: char     = '\\u{e6b1}';  // \n    const LANG_STYLUS: char     = '\\u{e600}';  // \n    const LANG_TEX: char        = '\\u{e69b}';  // \n    const LANG_TYPESCRIPT: char = '\\u{e628}';  // \n    const LANG_V: char          = '\\u{e6ac}';  // \n    const LIBRARY: char         = '\\u{eb9c}';  // \n    const LICENSE: char         = '\\u{f02d}';  // \n    const LOCK: char            = '\\u{f023}';  // \n    const LOG: char             = '\\u{f18d}';  // \n    const MAKE: char            = '\\u{e673}';  // \n    const MARKDOWN: char        = '\\u{f48a}';  // \n    const MUSTACHE: char        = '\\u{e60f}';  // \n    const NEWS: char            = '\\u{f1ea}';  // \n    const NODEJS: char          = '\\u{e718}';  // \n    const NOTEBOOK: char          = '\\u{e678}';  // \n    const NPM: char             = '\\u{e71e}';  // \n    const OS_ANDROID: char      = '\\u{e70e}';  // \n    const OS_APPLE: char        = '\\u{f179}';  // \n    const OS_LINUX: char        = '\\u{f17c}';  // \n    const OS_WINDOWS: char      = '\\u{f17a}';  // \n    const OS_WINDOWS_CMD: char  = '\\u{ebc4}';  // \n    const PLAYLIST: char        = '\\u{f0cb9}'; // 󰲹\n    const POWERSHELL: char      = '\\u{ebc7}';  // \n    const PRIVATE_KEY: char     = '\\u{f0306}'; // 󰌆\n    const PUBLIC_KEY: char      = '\\u{f0dd6}'; // 󰷖\n    const QT: char              = '\\u{f375}';  // \n    const RAZOR: char           = '\\u{f1fa}';  // \n    const REACT: char           = '\\u{e7ba}';  // \n    const README: char          = '\\u{f00ba}'; // 󰂺\n    const SHEET: char           = '\\u{f1c3}';  // \n    const SHELL: char           = '\\u{f1183}'; // 󱆃\n    const SHELL_CMD: char       = '\\u{f489}';  // \n    const SHIELD_CHECK: char    = '\\u{f0565}'; // 󰕥\n    const SHIELD_KEY: char      = '\\u{f0bc4}'; // 󰯄\n    const SHIELD_LOCK: char     = '\\u{f099d}'; // 󰦝\n    const SIGNED_FILE: char     = '\\u{f19c3}'; // 󱧃\n    const SLIDE: char           = '\\u{f1c4}';  // \n    const SQLITE: char          = '\\u{e7c4}';  // \n    const SUBLIME: char         = '\\u{e7aa}';  // \n    const SUBTITLE: char        = '\\u{f0a16}'; // 󰨖\n    const TCL: char             = '\\u{f06d3}'; // 󰛓\n    const TERRAFORM: char       = '\\u{f1062}'; // 󱁢\n    const TEXT: char            = '\\u{f15c}';  // \n    const TODO: char            = '\\u{f0ae}';  // \n    const TYPST: char           = '\\u{f37f}';  // \n    const TMUX: char            = '\\u{ebc8}';  // \n    const TOML: char            = '\\u{e6b2}';  // \n    const TRANSLATION: char     = '\\u{f05ca}'; // 󰗊\n    const UNITY: char           = '\\u{e721}';  // \n    const VECTOR: char          = '\\u{f0559}'; // 󰕙\n    const VIDEO: char           = '\\u{f03d}';  // \n    const VIM: char             = '\\u{e7c5}';  // \n    const WRENCH: char          = '\\u{f0ad}';  // \n    const XML: char             = '\\u{f05c0}'; // 󰗀\n    const XORG:char             = '\\u{f369}';  // \n    const YAML: char            = '\\u{e8eb}';  // \n    const YARN: char            = '\\u{e6a7}';  // \n}\n\n/// Mapping from full filenames to directory icon. This mapping should contain\n/// all the directories that have a custom icon.\nconst DIRECTORY_ICONS: Map<&'static str, char> = phf_map! {\n    \".config\"             => Icons::FOLDER_CONFIG,  // \n    \".exercism\"           => Icons::FOLDER_EXERCISM,// \n    \".git\"                => Icons::FOLDER_GIT,     // \n    \".github\"             => Icons::FOLDER_GITHUB,  // \n    \".npm\"                => Icons::FOLDER_NPM,     // \n    \".opam\"               => Icons::FOLDER_OCAML,   // \n    \".ssh\"                => Icons::FOLDER_KEY,     // 󰢬\n    \".Trash\"              => '\\u{f1f8}',            // \n    \"build\"               => Icons::FOLDER_BUILD,   // 󱧼\n    \"config\"              => Icons::FOLDER_CONFIG,  // \n    \"Contacts\"            => '\\u{f024c}',           // 󰉌\n    \"cron.d\"              => Icons::FOLDER_CONFIG,  // \n    \"cron.daily\"          => Icons::FOLDER_CONFIG,  // \n    \"cron.hourly\"         => Icons::FOLDER_CONFIG,  // \n    \"cron.minutely\"       => Icons::FOLDER_CONFIG,  // \n    \"cron.monthly\"        => Icons::FOLDER_CONFIG,  // \n    \"cron.weekly\"         => Icons::FOLDER_CONFIG,  // \n    \"Desktop\"             => '\\u{f108}',            // \n    \"Documents\"           => '\\u{f0c82}',           // 󰲂\n    \"Downloads\"           => '\\u{f024d}',           // 󰉍\n    \"etc\"                 => Icons::FOLDER_CONFIG,  // \n    \"Favorites\"           => '\\u{f069d}',           // 󰚝\n    \"hidden\"              => Icons::FOLDER_HIDDEN,  // 󱞞\n    \"home\"                => '\\u{f10b5}',           // 󱂵\n    \"include\"             => Icons::FOLDER_CONFIG,  // \n    \"Mail\"                => '\\u{f01f0}',           // 󰇰\n    \"Movies\"              => '\\u{f0fce}',           // 󰿎\n    \"Music\"               => '\\u{f1359}',           // 󱍙\n    \"node_modules\"        => Icons::FOLDER_NPM,     // \n    \"npm_cache\"           => Icons::FOLDER_NPM,     // \n    \"pacman.d\"            => Icons::FOLDER_CONFIG,  // \n    \"pam.d\"               => Icons::FOLDER_KEY,     // 󰢬\n    \"Pictures\"            => '\\u{f024f}',           // 󰉏\n    \"src\"                 => '\\u{f08de}',           // 󰣞\n    \"ssh\"                 => Icons::FOLDER_KEY,     // 󰢬\n    \"sudoers.d\"           => Icons::FOLDER_KEY,     // 󰢬\n    \"Videos\"              => '\\u{f03d}',            // \n    \"xbps.d\"              => Icons::FOLDER_CONFIG,  // \n    \"xorg.conf.d\"         => Icons::FOLDER_CONFIG,  // \n    \"cabal\"               => Icons::LANG_HASKELL,   // \n};\n\n/// Mapping from full filenames to file icon. This mapping should also contain\n/// all the \"dot\" files that have a custom icon.\nconst FILENAME_ICONS: Map<&'static str, char> = phf_map! {\n    \".aliases\"            => Icons::SHELL,          // 󱆃\n    \".atom\"               => '\\u{e764}',            // \n    \".bashrc\"             => Icons::SHELL,          // 󱆃\n    \".bash_aliases\"       => Icons::SHELL,          // 󱆃\n    \".bash_history\"       => Icons::SHELL,          // 󱆃\n    \".bash_logout\"        => Icons::SHELL,          // 󱆃\n    \".bash_profile\"       => Icons::SHELL,          // 󱆃\n    \".CFUserTextEncoding\" => Icons::OS_APPLE,       // \n    \".clang-format\"       => Icons::CONFIG,         // 󱁻\n    \".clang-tidy\"         => Icons::CONFIG,         // 󱁻\n    \".codespellrc\"        => '\\u{f04c6}',           // 󰓆\n    \".condarc\"            => '\\u{e715}',            // \n    \".cshrc\"              => Icons::SHELL,          // 󱆃\n    \".DS_Store\"           => Icons::OS_APPLE,       // \n    \".editorconfig\"       => '\\u{e652}',            // \n    \".emacs\"              => Icons::EMACS,          // \n    \".envrc\"              => '\\u{f462}',            // \n    \".eslintignore\"       => Icons::ESLINT,         // \n    \".eslintrc.cjs\"       => Icons::ESLINT,         // \n    \".eslintrc.js\"        => Icons::ESLINT,         // \n    \".eslintrc.json\"      => Icons::ESLINT,         // \n    \".eslintrc.yaml\"      => Icons::ESLINT,         // \n    \".eslintrc.yml\"       => Icons::ESLINT,         // \n    \".gcloudignore\"       => '\\u{f11f6}',           // 󱇶\n    \".fennelrc\"           => Icons::LANG_FENNEL,    // \n    \".gitattributes\"      => Icons::GIT,            // 󰊢\n    \".git-blame-ignore-revs\" => Icons::GIT,         // 󰊢\n    \".gitconfig\"          => Icons::GIT,            // 󰊢\n    \".gitignore\"          => Icons::GIT,            // 󰊢\n    \".gitignore_global\"   => Icons::GIT,            // 󰊢\n    \".gitlab-ci.yml\"      => '\\u{f296}',            // \n    \".gitmodules\"         => Icons::GIT,            // 󰊢\n    \".gtkrc-2.0\"          => Icons::GTK,            // \n    \".gvimrc\"             => Icons::VIM,            // \n    \".htaccess\"           => Icons::CONFIG,         // 󱁻\n    \".htpasswd\"           => Icons::CONFIG,         // 󱁻\n    \".idea\"               => Icons::INTELLIJ,       // \n    \".ideavimrc\"          => Icons::VIM,            // \n    \".inputrc\"            => Icons::CONFIG,         // 󱁻\n    \".kshrc\"              => Icons::SHELL,          // 󱆃\n    \".login\"              => Icons::SHELL,          // 󱆃\n    \".logout\"             => Icons::SHELL,          // 󱆃\n    \".luacheckrc\"         => Icons::CONFIG,         // 󱁻\n    \".luaurc\"             => Icons::CONFIG,         // 󱁻\n    \".nanorc\"             => '\\u{e838}',            // \n    \".nuxtrc\"             => '\\u{f1106}',           // 󱄆\n    \".ocamlinit\"          => Icons::LANG_OCAML,     // \n    \".mailmap\"            => Icons::GIT,            // 󰊢\n    \".node_repl_history\"  => Icons::NODEJS,         // \n    \".npmignore\"          => Icons::NPM,            // \n    \".npmrc\"              => Icons::NPM,            // \n    \".pre-commit-config.yaml\" => '\\u{f06e2}',       // 󰛢\n    \".prettierignore\"     => '\\u{e6b4}',            // \n    \".prettierrc\"         => '\\u{e6b4}',            // \n    \".prettierrc.json\"    => '\\u{e6b4}',            // \n    \".prettierrc.json5\"   => '\\u{e6b4}',            // \n    \".prettierrc.toml\"    => '\\u{e6b4}',            // \n    \".prettierrc.yaml\"    => '\\u{e6b4}',            // \n    \".prettierrc.yml\"     => '\\u{e6b4}',            // \n    \".parentlock\"         => Icons::LOCK,           // \n    \".profile\"            => Icons::SHELL,          // 󱆃\n    \".pylintrc\"           => Icons::CONFIG,         // 󱁻\n    \".python_history\"     => Icons::LANG_PYTHON,    // \n    \".rustfmt.toml\"       => Icons::LANG_RUST,      // \n    \".rvm\"                => Icons::LANG_RUBY,      // \n    \".rvmrc\"              => Icons::LANG_RUBY,      // \n    \".SRCINFO\"            => '\\u{f303}',            // \n    \".stowrc\"             => '\\u{eef1}',            // \n    \".tcshrc\"             => Icons::SHELL,          // 󱆃\n    \".viminfo\"            => Icons::VIM,            // \n    \".vimrc\"              => Icons::VIM,            // \n    \".Xauthority\"         => Icons::XORG,           // \n    \".xinitrc\"            => Icons::XORG,           // \n    \".Xresources\"         => Icons::XORG,           // \n    \".xsession\"           => Icons::XORG,           // \n    \".yarnrc\"             => Icons::YARN,           // \n    \".zlogin\"             => Icons::SHELL,          // 󱆃\n    \".zlogout\"            => Icons::SHELL,          // 󱆃\n    \".zprofile\"           => Icons::SHELL,          // 󱆃\n    \".zshenv\"             => Icons::SHELL,          // 󱆃\n    \".zshrc\"              => Icons::SHELL,          // 󱆃\n    \".zsh_history\"        => Icons::SHELL,          // 󱆃\n    \".zsh_sessions\"       => Icons::SHELL,          // 󱆃\n    \"._DS_Store\"          => Icons::OS_APPLE,       // \n    \"_gvimrc\"             => Icons::VIM,            // \n    \"_vimrc\"              => Icons::VIM,            // \n    \"a.out\"               => Icons::SHELL_CMD,      // \n    \"authorized_keys\"     => '\\u{f08c0}',           // 󰣀\n    \"AUTHORS\"             => '\\u{edca}',            // \n    \"AUTHORS.txt\"         => '\\u{edca}',            // \n    \"bashrc\"              => Icons::SHELL,          // 󱆃\n    \"Brewfile\"            => '\\u{f1116}',           // 󱄖\n    \"Brewfile.lock.json\"  => '\\u{f1116}',           // 󱄖\n    \"bspwmrc\"             => '\\u{f355}',            // \n    \"build.gradle.kts\"    => Icons::GRADLE,         // \n    \"build.zig.zon\"       => '\\u{e6a9}',            // \n    \"bun.lockb\"           => '\\u{e76f}',            // \n    \"cantorrc\"            => '\\u{f373}',            // \n    \"Cargo.lock\"          => Icons::LANG_RUST,      // \n    \"Cargo.toml\"          => Icons::LANG_RUST,      // \n    \"CMakeLists.txt\"      => '\\u{e794}',            // \n    \"CHANGELOG\"           => Icons::NEWS,           // \n    \"CHANGELOG.md\"        => Icons::NEWS,           // \n    \"CHANGES\"             => Icons::NEWS,           // \n    \"CHANGES.md\"          => Icons::NEWS,           // \n    \"CODE_OF_CONDUCT\"     => '\\u{f4ae}',            // \n    \"CODE_OF_CONDUCT.md\"  => '\\u{f4ae}',            // \n    \"composer.json\"       => Icons::LANG_PHP,       // \n    \"composer.lock\"       => Icons::LANG_PHP,       // \n    \"config\"              => Icons::CONFIG,         // 󱁻\n    \"config.ru\"           => Icons::LANG_RUBY,      // \n    \"config.status\"       => Icons::CONFIG,         // 󱁻\n    \"configure\"           => Icons::WRENCH,         // \n    \"configure.ac\"        => Icons::CONFIG,         // 󱁻\n    \"configure.in\"        => Icons::CONFIG,         // 󱁻\n    \"constraints.txt\"     => Icons::LANG_PYTHON,    // \n    \"COPYING\"             => Icons::LICENSE,        // \n    \"COPYRIGHT\"           => Icons::LICENSE,        // \n    \"crontab\"             => Icons::CONFIG,         // 󱁻\n    \"crypttab\"            => Icons::CONFIG,         // 󱁻\n    \"csh.cshrc\"           => Icons::SHELL,          // 󱆃\n    \"csh.login\"           => Icons::SHELL,          // 󱆃\n    \"csh.logout\"          => Icons::SHELL,          // 󱆃\n    \"docker-compose.yml\"  => Icons::DOCKER,         // \n    \"Dockerfile\"          => Icons::DOCKER,         // \n    \"compose.yaml\"        => Icons::DOCKER,         // \n    \"compose.yml\"         => Icons::DOCKER,         // \n    \"docker-compose.yaml\" => Icons::DOCKER,         // \n    \"dropbox\"             => '\\u{e707}',            // \n    \"dune\"                => Icons::LANG_OCAML,     // \n    \"dune-project\"        => Icons::WRENCH,         // \n    \"Earthfile\"           => '\\u{f0ac}',            // \n    \"COMMIT_EDITMSG\"      => Icons::GIT,            // \n    \"environment\"         => Icons::CONFIG,         // 󱁻\n    \"favicon.ico\"         => '\\u{e623}',            // \n    \"flake.lock\"          => '\\u{f313}',            // \n    \"fennelrc\"            => Icons::LANG_FENNEL,    // \n    \"fonts.conf\"          => Icons::FONT,           // \n    \"fp-info-cache\"       => Icons::KICAD,          // \n    \"fp-lib-table\"        => Icons::KICAD,          // \n    \"FreeCAD.conf\"        => Icons::FREECAD,        // \n    \"Gemfile\"             => Icons::LANG_RUBY,      // \n    \"Gemfile.lock\"        => Icons::LANG_RUBY,      // \n    \"GNUmakefile\"         => Icons::MAKE,           // \n    \"go.mod\"              => Icons::LANG_GO,        // \n    \"go.sum\"              => Icons::LANG_GO,        // \n    \"go.work\"             => Icons::LANG_GO,        // \n    \"gradle\"              => Icons::GRADLE,         // \n    \"gradle.properties\"   => Icons::GRADLE,         // \n    \"gradlew\"             => Icons::GRADLE,         // \n    \"gradlew.bat\"         => Icons::GRADLE,         // \n    \"group\"               => Icons::LOCK,           // \n    \"gruntfile.coffee\"    => Icons::GRUNT,          // \n    \"gruntfile.js\"        => Icons::GRUNT,          // \n    \"gruntfile.ls\"        => Icons::GRUNT,          // \n    \"gshadow\"             => Icons::LOCK,           // \n    \"gtkrc\"               => Icons::GTK,            // \n    \"gulpfile.coffee\"     => Icons::GULP,           // \n    \"gulpfile.js\"         => Icons::GULP,           // \n    \"gulpfile.ls\"         => Icons::GULP,           // \n    \"heroku.yml\"          => '\\u{e77b}',            // \n    \"hostname\"            => Icons::CONFIG,         // 󱁻\n    \"hypridle.conf\"       => '\\u{f359}',            // \n    \"hyprland.conf\"       => '\\u{f359}',            // \n    \"hyprlock.conf\"       => '\\u{f359}',            // \n    \"hyprpaper.conf\"      => '\\u{f359}',            // \n    \"i3blocks.conf\"       => '\\u{f35a}',            // \n    \"i3status.conf\"       => '\\u{f35a}',            // \n    \"id_dsa\"              => Icons::PRIVATE_KEY,    // 󰌆\n    \"id_ecdsa\"            => Icons::PRIVATE_KEY,    // 󰌆\n    \"id_ecdsa_sk\"         => Icons::PRIVATE_KEY,    // 󰌆\n    \"id_ed25519\"          => Icons::PRIVATE_KEY,    // 󰌆\n    \"id_ed25519_sk\"       => Icons::PRIVATE_KEY,    // 󰌆\n    \"id_rsa\"              => Icons::PRIVATE_KEY,    // 󰌆\n    \"index.theme\"         => '\\u{ee72}',            // \n    \"inputrc\"             => Icons::CONFIG,         // 󱁻\n    \"Jenkinsfile\"         => '\\u{e66e}',            // \n    \"jsconfig.json\"       => Icons::LANG_JAVASCRIPT,// \n    \"Justfile\"            => Icons::WRENCH,         // \n    \"justfile\"            => Icons::WRENCH,         // \n    \"kalgebrarc\"          => '\\u{f373}',            // \n    \"kdeglobals\"          => '\\u{f373}',            // \n    \"kdenlive-layoutsrc\"  => Icons::KDENLIVE,       // \n    \"kdenliverc\"          => Icons::KDENLIVE,       // \n    \"known_hosts\"         => '\\u{f08c0}',           // 󰣀\n    \"kritadisplayrc\"      => Icons::KRITA,          // \n    \"kritarc\"             => Icons::KRITA,          // \n    \"LICENCE\"             => Icons::LICENSE,        // \n    \"LICENCE.md\"          => Icons::LICENSE,        // \n    \"LICENCE.txt\"         => Icons::LICENSE,        // \n    \"LICENSE\"             => Icons::LICENSE,        // \n    \"LICENSE-APACHE\"      => Icons::LICENSE,        // \n    \"LICENSE-MIT\"         => Icons::LICENSE,        // \n    \"LICENSE.md\"          => Icons::LICENSE,        // \n    \"LICENSE.txt\"         => Icons::LICENSE,        // \n    \"localized\"           => Icons::OS_APPLE,       // \n    \"localtime\"           => Icons::CLOCK,          // \n    \"lock\"                => Icons::LOCK,           // \n    \"LOCK\"                => Icons::LOCK,           // \n    \"log\"                 => Icons::LOG,            // \n    \"LOG\"                 => Icons::LOG,            // \n    \"lxde-rc.xml\"         => '\\u{f363}',            // \n    \"lxqt.conf\"           => '\\u{f364}',            // \n    \"Makefile\"            => Icons::MAKE,           // \n    \"makefile\"            => Icons::MAKE,           // \n    \"Makefile.ac\"         => Icons::MAKE,           // \n    \"Makefile.am\"         => Icons::MAKE,           // \n    \"Makefile.in\"         => Icons::MAKE,           // \n    \"MANIFEST\"            => Icons::LANG_PYTHON,    // \n    \"MANIFEST.in\"         => Icons::LANG_PYTHON,    // \n    \"mix.lock\"            => Icons::LANG_ELIXIR,    // \n    \"mpv.conf\"            => '\\u{f36e}',            // \n    \"NEWS\"                => Icons::NEWS,           // \n    \"NEWS.md\"             => Icons::NEWS,           // \n    \"npm-shrinkwrap.json\" => Icons::NPM,            // \n    \"npmrc\"               => Icons::NPM,            // \n    \"package-lock.json\"   => Icons::NPM,            // \n    \"package.json\"        => Icons::NPM,            // \n    \"passwd\"              => Icons::LOCK,           // \n    \"php.ini\"             => Icons::LANG_PHP,       // \n    \"PKGBUILD\"            => '\\u{f303}',            // \n    \"platformio.ini\"      => '\\u{e682}',            // \n    \"pom.xml\"             => '\\u{e674}',            // \n    \"Procfile\"            => '\\u{e77b}',            // \n    \"profile\"             => Icons::SHELL,          // 󱆃\n    \"PrusaSlicer.ini\"     => '\\u{f351}',            // \n    \"PrusaSlicerGcodeViewer.ini\" => '\\u{f351}',     // \n    \"pyvenv.cfg\"          => Icons::LANG_PYTHON,    // \n    \"pyproject.toml\"      => Icons::LANG_PYTHON,    // \n    \"qt5ct.conf\"          => Icons::QT,             // \n    \"qt6ct.conf\"          => Icons::QT,             // \n    \"QtProject.conf\"      => Icons::QT,             // \n    \"Rakefile\"            => Icons::LANG_RUBY,      // \n    \"README\"              => Icons::README,         // 󰂺\n    \"README.md\"           => Icons::README,         // 󰂺\n    \"release.toml\"        => Icons::LANG_RUST,      // \n    \"renovate.json\"       => '\\u{f027c}',           // 󰉼\n    \"requirements.txt\"    => Icons::LANG_PYTHON,    // \n    \"robots.txt\"          => '\\u{f06a9}',           // 󰚩\n    \"rubydoc\"             => Icons::LANG_RUBYRAILS, // \n    \"rvmrc\"               => Icons::LANG_RUBY,      // \n    \"SECURITY\"            => '\\u{f0483}',           // 󰒃\n    \"SECURITY.md\"         => '\\u{f0483}',           // 󰒃\n    \"settings.gradle.kts\" => Icons::GRADLE,         // \n    \"shadow\"              => Icons::LOCK,           // \n    \"shells\"              => Icons::CONFIG,         // 󱁻\n    \"sudoers\"             => Icons::LOCK,           // \n    \"sxhkdrc\"             => Icons::CONFIG,         // \n    \"sym-lib-table\"       => Icons::KICAD,          // \n    \"timezone\"            => Icons::CLOCK,          // \n    \"tmux.conf\"           => Icons::TMUX,           // \n    \"tmux.conf.local\"     => Icons::TMUX,           // \n    \"TODO\"                => Icons::TODO,           // \n    \"TODO.md\"             => Icons::TODO,           // \n    \"tsconfig.json\"       => Icons::LANG_TYPESCRIPT,// \n    \"Vagrantfile\"         => '\\u{2371}',            // ⍱\n    \"vlcrc\"               => '\\u{f057c}',           // 󰕼\n    \"webpack.config.js\"   => '\\u{f072b}',           // 󰜫\n    \"xorg.conf\"           => Icons::XORG,           // \n    \"xsettingsd.conf\"     => Icons::XORG,           // \n    \"weston.ini\"          => '\\u{f367}',            // \n    \"xmobarrc\"            => Icons::XORG,           // \n    \"xmobarrc.hs\"         => Icons::XORG,           // \n    \"xmonad.hs\"           => Icons::XORG,           // \n    \"yarn.lock\"           => Icons::YARN,           // \n    \"zlogin\"              => Icons::SHELL,          // 󱆃\n    \"zlogout\"             => Icons::SHELL,          // 󱆃\n    \"zprofile\"            => Icons::SHELL,          // 󱆃\n    \"zshenv\"              => Icons::SHELL,          // 󱆃\n    \"zshrc\"               => Icons::SHELL,          // 󱆃\n};\n\n/// Mapping from lowercase file extension to icons.  If an image, video, or audio extension is add\n/// also update the extension filetype map.\nconst EXTENSION_ICONS: Map<&'static str, char> = phf_map! {\n    \"123dx\"          => Icons::CAD,              // 󰻫\n    \"3dm\"            => Icons::CAD,              // 󰻫\n    \"3g2\"            => Icons::VIDEO,            // \n    \"3gp\"            => Icons::VIDEO,            // \n    \"3gp2\"           => Icons::VIDEO,            // \n    \"3gpp\"           => Icons::VIDEO,            // \n    \"3gpp2\"          => Icons::VIDEO,            // \n    \"3mf\"            => Icons::FILE_3D,          // 󰆧\n    \"7z\"             => Icons::COMPRESSED,       // \n    \"a\"              => Icons::OS_LINUX,         // \n    \"aac\"            => Icons::AUDIO,            // \n    \"acf\"            => '\\u{f1b6}',              // \n    \"age\"            => Icons::SHIELD_LOCK,      // 󰦝\n    \"ai\"             => '\\u{e7b4}',              // \n    \"aif\"            => Icons::AUDIO,            // \n    \"aifc\"           => Icons::AUDIO,            // \n    \"aiff\"           => Icons::AUDIO,            // \n    \"alac\"           => Icons::AUDIO,            // \n    \"android\"        => Icons::OS_ANDROID,       // \n    \"ape\"            => Icons::AUDIO,            // \n    \"apk\"            => Icons::OS_ANDROID,       // \n    \"app\"            => Icons::BINARY,           // \n    \"applescript\"    => Icons::OS_APPLE,         // \n    \"apple\"          => Icons::OS_APPLE,         // \n    \"ar\"             => Icons::COMPRESSED,       // \n    \"arj\"            => Icons::COMPRESSED,       // \n    \"arw\"            => Icons::IMAGE,            // \n    \"asc\"            => Icons::SHIELD_LOCK,      // 󰦝\n    \"asm\"            => Icons::LANG_ASSEMBLY,    // \n    \"asp\"            => '\\u{f121}',              // \n    \"ass\"            => Icons::SUBTITLE,         // 󰨖\n    \"avi\"            => Icons::VIDEO,            // \n    \"avif\"           => Icons::IMAGE,            // \n    \"avro\"           => Icons::JSON,             // \n    \"awk\"            => Icons::SHELL_CMD,        // \n    \"bash\"           => Icons::SHELL_CMD,        // \n    \"bat\"            => Icons::OS_WINDOWS_CMD,   // \n    \"bats\"           => Icons::SHELL_CMD,        // \n    \"bdf\"            => Icons::FONT,             // \n    \"bib\"            => Icons::LANG_TEX,         // \n    \"bin\"            => Icons::BINARY,           // \n    \"blend\"          => '\\u{f00ab}',             // 󰂫\n    \"bmp\"            => Icons::IMAGE,            // \n    \"br\"             => Icons::COMPRESSED,       // \n    \"brd\"            => Icons::EDA_PCB,          // \n    \"brep\"           => Icons::CAD,              // 󰻫\n    \"bst\"            => Icons::LANG_TEX,         // \n    \"bundle\"         => Icons::OS_APPLE,         // \n    \"bz\"             => Icons::COMPRESSED,       // \n    \"bz2\"            => Icons::COMPRESSED,       // \n    \"bz3\"            => Icons::COMPRESSED,       // \n    \"c\"              => Icons::LANG_C,           // \n    \"c++\"            => Icons::LANG_CPP,         // \n    \"cab\"            => Icons::OS_WINDOWS,       // \n    \"cache\"          => Icons::CACHE,            // \n    \"cast\"           => Icons::VIDEO,            // \n    \"catpart\"        => Icons::CAD,              // 󰻫\n    \"catproduct\"     => Icons::CAD,              // 󰻫\n    \"cbr\"            => Icons::IMAGE,            // \n    \"cbz\"            => Icons::IMAGE,            // \n    \"cc\"             => Icons::LANG_CPP,         // \n    \"cert\"           => Icons::GIST_SECRET,      // \n    \"cfg\"            => Icons::CONFIG,           // 󱁻\n    \"cjs\"            => Icons::LANG_JAVASCRIPT,  // \n    \"class\"          => Icons::LANG_JAVA,        // \n    \"clj\"            => '\\u{e768}',              // \n    \"cljc\"           => '\\u{e768}',              // \n    \"cljs\"           => '\\u{e76a}',              // \n    \"cls\"            => Icons::LANG_TEX,         // \n    \"cmake\"          => '\\u{e794}',              // \n    \"cmd\"            => Icons::OS_WINDOWS,       // \n    \"coffee\"         => '\\u{f0f4}',              // \n    \"com\"            => '\\u{e629}',              // \n    \"conda\"          => '\\u{e715}',              // \n    \"conf\"           => Icons::CONFIG,           // 󱁻\n    \"config\"         => Icons::CONFIG,           // 󱁻\n    \"cow\"            => '\\u{f019a}',             // 󰆚\n    \"cp\"             => Icons::LANG_CPP,         // \n    \"cpio\"           => Icons::COMPRESSED,       // \n    \"cpp\"            => Icons::LANG_CPP,         // \n    \"cr\"             => '\\u{e62f}',              // \n    \"cr2\"            => Icons::IMAGE,            // \n    \"crdownload\"     => Icons::DOWNLOAD,         // 󰇚\n    \"crt\"            => Icons::GIST_SECRET,      // \n    \"cs\"             => Icons::LANG_CSHARP,      // 󰌛\n    \"csh\"            => Icons::SHELL_CMD,        // \n    \"cshtml\"         => Icons::RAZOR,            // \n    \"csproj\"         => Icons::LANG_CSHARP,      // 󰌛\n    \"css\"            => Icons::CSS3,             // \n    \"csv\"            => '\\u{eefc}',              // \n    \"csx\"            => Icons::LANG_CSHARP,      // 󰌛\n    \"cts\"            => Icons::LANG_TYPESCRIPT,  // \n    \"cu\"             => '\\u{e64b}',              // \n    \"cue\"            => Icons::PLAYLIST,         // 󰲹\n    \"cxx\"            => Icons::LANG_CPP,         // \n    \"d\"              => Icons::LANG_D,           // \n    \"dart\"           => '\\u{e798}',              // \n    \"db\"             => Icons::DATABASE,         // \n    \"db3\"            => Icons::SQLITE,           // \n    \"dconf\"          => Icons::DATABASE,         // \n    \"deb\"            => '\\u{e77d}',              // \n    \"desktop\"        => '\\u{ebd1}',              // \n    \"di\"             => Icons::LANG_D,           // \n    \"diff\"           => Icons::DIFF,             // \n    \"djv\"            => Icons::DOCUMENT,         // \n    \"djvu\"           => Icons::DOCUMENT,         // \n    \"dll\"            => Icons::LIBRARY,          // \n    \"dmg\"            => Icons::DISK_IMAGE,       // \n    \"doc\"            => Icons::DOCUMENT,         // \n    \"docm\"           => Icons::DOCUMENT,         // \n    \"docx\"           => Icons::DOCUMENT,         // \n    \"dot\"            => Icons::GRAPH,            // 󱁉\n    \"download\"       => Icons::DOWNLOAD,         // 󰇚\n    \"dockerfile\"     => Icons::DOCKER,           // \n    \"dockerignore\"   => Icons::DOCKER,           // \n    \"drawio\"         => '\\u{ebba}',              // \n    \"dump\"           => Icons::DATABASE,         // \n    \"dvi\"            => Icons::IMAGE,            // \n    \"dwg\"            => Icons::CAD,              // 󰻫\n    \"dxf\"            => Icons::CAD,              // 󰻫\n    \"dylib\"          => Icons::OS_APPLE,         // \n    \"ebook\"          => Icons::BOOK,             // \n    \"ebuild\"         => '\\u{f30d}',              // \n    \"edn\"            => '\\u{e76a}',              // \n    \"editorconfig\"   => '\\u{e652}',              // \n    \"eex\"            => Icons::LANG_ELIXIR,      // \n    \"ejs\"            => '\\u{e618}',              // \n    \"el\"             => Icons::EMACS,            // \n    \"elc\"            => Icons::EMACS,            // \n    \"elf\"            => Icons::BINARY,           // \n    \"elm\"            => '\\u{e62c}',              // \n    \"eml\"            => '\\u{f003}',              // \n    \"env\"            => '\\u{f462}',              // \n    \"eot\"            => Icons::FONT,             // \n    \"eps\"            => Icons::VECTOR,           // 󰕙\n    \"epub\"           => Icons::BOOK,             // \n    \"erb\"            => Icons::LANG_RUBYRAILS,   // \n    \"erl\"            => '\\u{e7b1}',              // \n    \"ex\"             => Icons::LANG_ELIXIR,      // \n    \"exe\"            => Icons::OS_WINDOWS_CMD,   // \n    \"exs\"            => Icons::LANG_ELIXIR,      // \n    \"f\"              => Icons::LANG_FORTRAN,     // 󱈚\n    \"f#\"             => Icons::LANG_FSHARP,      // \n    \"f3d\"            => Icons::CAD,              // 󰻫\n    \"f3z\"            => Icons::CAD,              // 󰻫\n    \"f90\"            => Icons::LANG_FORTRAN,     // 󱈚\n    \"fbx\"            => Icons::FILE_3D,          // 󰆧\n    \"fdmdownload\"    => Icons::DOWNLOAD,         // 󰇚\n    \"fcbak\"          => Icons::FREECAD,          // \n    \"fcmacro\"        => Icons::FREECAD,          // \n    \"fcmat\"          => Icons::FREECAD,          // \n    \"fcparam\"        => Icons::FREECAD,          // \n    \"fcscript\"       => Icons::FREECAD,          // \n    \"fcstd\"          => Icons::FREECAD,          // \n    \"fcstd1\"         => Icons::FREECAD,          // \n    \"fctb\"           => Icons::FREECAD,          // \n    \"fctl\"           => Icons::FREECAD,          // \n    \"fish\"           => Icons::SHELL_CMD,        // \n    \"flac\"           => Icons::AUDIO,            // \n    \"flc\"            => Icons::FONT,             // \n    \"flf\"            => Icons::FONT,             // \n    \"flv\"            => Icons::VIDEO,            // \n    \"fnl\"            => Icons::LANG_FENNEL,      // \n    \"fnt\"            => Icons::FONT,             // \n    \"fodg\"           => '\\u{f379}',              // \n    \"fodp\"           => '\\u{f37a}',              // \n    \"fods\"           => '\\u{f378}',              // \n    \"fodt\"           => '\\u{f37c}',              // \n    \"fon\"            => Icons::FONT,             // \n    \"font\"           => Icons::FONT,             // \n    \"for\"            => Icons::LANG_FORTRAN,     // 󱈚\n    \"fs\"             => Icons::LANG_FSHARP,      // \n    \"fsi\"            => Icons::LANG_FSHARP,      // \n    \"fsproj\"         => Icons::LANG_FSHARP,      // \n    \"fsscript\"       => Icons::LANG_FSHARP,      // \n    \"fsx\"            => Icons::LANG_FSHARP,      // \n    \"gba\"            => '\\u{f1393}',             // 󱎓\n    \"gbl\"            => Icons::EDA_PCB,          // \n    \"gbo\"            => Icons::EDA_PCB,          // \n    \"gbp\"            => Icons::EDA_PCB,          // \n    \"gbr\"            => Icons::EDA_PCB,          // \n    \"gbs\"            => Icons::EDA_PCB,          // \n    \"gcode\"          => '\\u{f0af4}',             // 󰫴\n    \"gd\"             => Icons::GODOT,            // \n    \"gdoc\"           => Icons::DOCUMENT,         // \n    \"gem\"            => Icons::LANG_RUBY,        // \n    \"gemfile\"        => Icons::LANG_RUBY,        // \n    \"gemspec\"        => Icons::LANG_RUBY,        // \n    \"gform\"          => '\\u{f298}',              // \n    \"gif\"            => Icons::IMAGE,            // \n    \"git\"            => Icons::GIT,              // 󰊢\n    \"gleam\"          => Icons::LANG_GLEAM,       // 󰦥\n    \"gm1\"            => Icons::EDA_PCB,          // \n    \"gml\"            => Icons::EDA_PCB,          // \n    \"go\"             => Icons::LANG_GO,          // \n    \"godot\"          => Icons::GODOT,            // \n    \"gpg\"            => Icons::SHIELD_LOCK,      // 󰦝\n    \"gql\"            => Icons::GRAPHQL,          // \n    \"gradle\"         => Icons::GRADLE,           // \n    \"graphql\"        => Icons::GRAPHQL,          // \n    \"gresource\"      => Icons::GTK,              // \n    \"groovy\"         => Icons::LANG_GROOVY,      // \n    \"gsheet\"         => Icons::SHEET,            // \n    \"gslides\"        => Icons::SLIDE,            // \n    \"gtl\"            => Icons::EDA_PCB,          // \n    \"gto\"            => Icons::EDA_PCB,          // \n    \"gtp\"            => Icons::EDA_PCB,          // \n    \"gts\"            => Icons::EDA_PCB,          // \n    \"guardfile\"      => Icons::LANG_RUBY,        // \n    \"gv\"             => Icons::GRAPH,            // 󱁉\n    \"gvy\"            => Icons::LANG_GROOVY,      // \n    \"gz\"             => Icons::COMPRESSED,       // \n    \"h\"              => Icons::LANG_C,           // \n    \"h++\"            => Icons::LANG_CPP,         // \n    \"h264\"           => Icons::VIDEO,            // \n    \"haml\"           => '\\u{e664}',              // \n    \"hbs\"            => Icons::MUSTACHE,         // \n    \"hc\"             => Icons::LANG_HOLYC,       // 󰂢\n    \"heic\"           => Icons::IMAGE,            // \n    \"heics\"          => Icons::VIDEO,            // \n    \"heif\"           => Icons::IMAGE,            // \n    \"hex\"            => '\\u{f12a7}',             // 󱊧\n    \"hh\"             => Icons::LANG_CPP,         // \n    \"hi\"             => Icons::BINARY,           // \n    \"hpp\"            => Icons::LANG_CPP,         // \n    \"hrl\"            => '\\u{e7b1}',              // \n    \"hs\"             => Icons::LANG_HASKELL,     // \n    \"htm\"            => Icons::HTML5,            // \n    \"html\"           => Icons::HTML5,            // \n    \"hxx\"            => Icons::LANG_CPP,         // \n    \"iam\"            => Icons::CAD,              // 󰻫\n    \"ical\"           => Icons::CALENDAR,         // \n    \"icalendar\"      => Icons::CALENDAR,         // \n    \"ico\"            => Icons::IMAGE,            // \n    \"ics\"            => Icons::CALENDAR,         // \n    \"ifb\"            => Icons::CALENDAR,         // \n    \"ifc\"            => Icons::CAD,              // 󰻫\n    \"ige\"            => Icons::CAD,              // 󰻫\n    \"iges\"           => Icons::CAD,              // 󰻫\n    \"igs\"            => Icons::CAD,              // 󰻫\n    \"image\"          => Icons::DISK_IMAGE,       // \n    \"img\"            => Icons::DISK_IMAGE,       // \n    \"iml\"            => Icons::INTELLIJ,         // \n    \"info\"           => Icons::INFO,             // \n    \"ini\"            => Icons::CONFIG,           // 󱁻\n    \"inl\"            => Icons::LANG_C,           // \n    \"ipynb\"          => Icons::NOTEBOOK,              // \n    \"ino\"            => Icons::LANG_ARDUINO,     // \n    \"ipt\"            => Icons::CAD,              // 󰻫\n    \"iso\"            => Icons::DISK_IMAGE,       // \n    \"j2c\"            => Icons::IMAGE,            // \n    \"j2k\"            => Icons::IMAGE,            // \n    \"jad\"            => Icons::LANG_JAVA,        // \n    \"jar\"            => Icons::LANG_JAVA,        // \n    \"java\"           => Icons::LANG_JAVA,        // \n    \"jwmrc\"          => '\\u{f35b}',              // \n    \"jfi\"            => Icons::IMAGE,            // \n    \"jfif\"           => Icons::IMAGE,            // \n    \"jif\"            => Icons::IMAGE,            // \n    \"jl\"             => '\\u{e624}',              // \n    \"jmd\"            => Icons::MARKDOWN,         // \n    \"jp2\"            => Icons::IMAGE,            // \n    \"jpe\"            => Icons::IMAGE,            // \n    \"jpeg\"           => Icons::IMAGE,            // \n    \"jpf\"            => Icons::IMAGE,            // \n    \"jpg\"            => Icons::IMAGE,            // \n    \"jpx\"            => Icons::IMAGE,            // \n    \"js\"             => Icons::LANG_JAVASCRIPT,  // \n    \"json\"           => Icons::JSON,             // \n    \"json5\"          => Icons::JSON,             // \n    \"jsonc\"          => Icons::JSON,             // \n    \"jsx\"            => Icons::REACT,            // \n    \"jxl\"            => Icons::IMAGE,            // \n    \"kbx\"            => Icons::SHIELD_KEY,       // 󰯄\n    \"kdb\"            => Icons::KEYPASS,          // \n    \"kdbx\"           => Icons::KEYPASS,          // \n    \"kdenlive\"       => Icons::KDENLIVE,         // \n    \"kdenlivetitle\"  => Icons::KDENLIVE,         // \n    \"key\"            => Icons::KEY,              // \n    \"kicad_dru\"      => Icons::KICAD,            // \n    \"kicad_mod\"      => Icons::KICAD,            // \n    \"kicad_pcb\"      => Icons::KICAD,            // \n    \"kicad_prl\"      => Icons::KICAD,            // \n    \"kicad_pro\"      => Icons::KICAD,            // \n    \"kicad_sch\"      => Icons::KICAD,            // \n    \"kicad_sym\"      => Icons::KICAD,            // \n    \"kicad_wks\"      => Icons::KICAD,            // \n    \"ko\"             => Icons::OS_LINUX,         // \n    \"kpp\"            => Icons::KRITA,            // \n    \"kra\"            => Icons::KRITA,            // \n    \"krz\"            => Icons::KRITA,            // \n    \"ksh\"            => Icons::SHELL_CMD,        // \n    \"kt\"             => Icons::LANG_KOTLIN,      // \n    \"kts\"            => Icons::LANG_KOTLIN,      // \n    \"latex\"          => Icons::LANG_TEX,         // \n    \"lbr\"            => Icons::LIBRARY,          // \n    \"lck\"            => Icons::LOCK,             // \n    \"ldb\"            => Icons::DATABASE,         // \n    \"leex\"           => Icons::LANG_ELIXIR,      // \n    \"less\"           => '\\u{e758}',              // \n    \"lff\"            => Icons::FONT,             // \n    \"lhs\"            => Icons::LANG_HASKELL,     // \n    \"lib\"            => Icons::LIBRARY,          // \n    \"license\"        => Icons::LICENSE,          // \n    \"lisp\"           => '\\u{f0172}',             // 󰅲\n    \"localized\"      => Icons::OS_APPLE,         // \n    \"lock\"           => Icons::LOCK,             // \n    \"log\"            => Icons::LOG,              // \n    \"lpp\"            => Icons::EDA_PCB,          // \n    \"lrc\"            => Icons::SUBTITLE,         // 󰨖\n    \"ltx\"            => Icons::LANG_TEX,         // \n    \"lua\"            => Icons::LANG_LUA,         // \n    \"luac\"           => Icons::LANG_LUA,         // \n    \"luau\"           => Icons::LANG_LUA,         // \n    \"lz\"             => Icons::COMPRESSED,       // \n    \"lz4\"            => Icons::COMPRESSED,       // \n    \"lzh\"            => Icons::COMPRESSED,       // \n    \"lzma\"           => Icons::COMPRESSED,       // \n    \"lzo\"            => Icons::COMPRESSED,       // \n    \"m\"              => Icons::LANG_C,           // \n    \"m2ts\"           => Icons::VIDEO,            // \n    \"m2v\"            => Icons::VIDEO,            // \n    \"m3u\"            => Icons::PLAYLIST,         // 󰲹\n    \"m3u8\"           => Icons::PLAYLIST,         // 󰲹\n    \"m4a\"            => Icons::AUDIO,            // \n    \"m4v\"            => Icons::VIDEO,            // \n    \"magnet\"         => '\\u{f076}',              // \n    \"markdown\"       => Icons::MARKDOWN,         // \n    \"md\"             => Icons::MARKDOWN,         // \n    \"md5\"            => Icons::SHIELD_CHECK,     // 󰕥\n    \"mdb\"            => Icons::DATABASE,         // \n    \"mdx\"            => Icons::MARKDOWN,         // \n    \"mid\"            => '\\u{f08f2}',             // 󰣲\n    \"mjs\"            => Icons::LANG_JAVASCRIPT,  // \n    \"mk\"             => Icons::MAKE,             // \n    \"mka\"            => Icons::AUDIO,            // \n    \"mkd\"            => Icons::MARKDOWN,         // \n    \"mkv\"            => Icons::VIDEO,            // \n    \"ml\"             => Icons::LANG_OCAML,       // \n    \"mli\"            => Icons::LANG_OCAML,       // \n    \"mll\"            => Icons::LANG_OCAML,       // \n    \"mly\"            => Icons::LANG_OCAML,       // \n    \"mm\"             => Icons::LANG_CPP,         // \n    \"mo\"             => Icons::TRANSLATION,      // 󰗊\n    \"mobi\"           => Icons::BOOK,             // \n    \"mov\"            => Icons::VIDEO,            // \n    \"mp2\"            => Icons::AUDIO,            // \n    \"mp3\"            => Icons::AUDIO,            // \n    \"mp4\"            => Icons::VIDEO,            // \n    \"mpeg\"           => Icons::VIDEO,            // \n    \"mpg\"            => Icons::VIDEO,            // \n    \"msf\"            => '\\u{f370}',              // \n    \"msi\"            => Icons::OS_WINDOWS,       // \n    \"mts\"            => Icons::LANG_TYPESCRIPT,  // \n    \"mustache\"       => Icons::MUSTACHE,         // \n    \"nef\"            => Icons::IMAGE,            // \n    \"nfo\"            => Icons::INFO,             // \n    \"nim\"            => Icons::LANG_NIM,         // \n    \"nimble\"         => Icons::LANG_NIM,         // \n    \"nims\"           => Icons::LANG_NIM,         // \n    \"ninja\"          => '\\u{f0774}',             // 󰝴\n    \"nix\"            => '\\u{f313}',              // \n    \"node\"           => Icons::NODEJS,           // \n    \"norg\"           => '\\u{e847}',              // \n    \"nsp\"            => '\\u{F07E1}',             // 󰟡\n    \"nu\"             => Icons::SHELL_CMD,        // \n    \"o\"              => Icons::BINARY,           // \n    \"obj\"            => Icons::FILE_3D,          // 󰆧\n    \"odb\"            => Icons::DATABASE,         // \n    \"odf\"            => '\\u{f37b}',              // \n    \"odg\"            => '\\u{f379}',              // \n    \"odp\"            => '\\u{f37a}',              // \n    \"ods\"            => '\\u{f378}',              // \n    \"odt\"            => '\\u{f37c}',              // \n    \"ogg\"            => Icons::AUDIO,            // \n    \"ogm\"            => Icons::VIDEO,            // \n    \"ogv\"            => Icons::VIDEO,            // \n    \"opam\"           => '\\u{f0627}',             // 󰘧\n    \"opml\"           => Icons::XML,              // 󰗀\n    \"opus\"           => Icons::AUDIO,            // \n    \"orf\"            => Icons::IMAGE,            // \n    \"org\"            => '\\u{e633}',              // \n    \"otf\"            => Icons::FONT,             // \n    \"out\"            => '\\u{eb2c}',              // \n    \"p12\"            => Icons::KEY,              // \n    \"par\"            => Icons::COMPRESSED,       // \n    \"part\"           => Icons::DOWNLOAD,         // 󰇚\n    \"patch\"          => Icons::DIFF,             // \n    \"pbm\"            => Icons::IMAGE,            // \n    \"pcbdoc\"         => Icons::EDA_PCB,          // \n    \"pcm\"            => Icons::AUDIO,            // \n    \"pdf\"            => '\\u{f1c1}',              // \n    \"pem\"            => Icons::KEY,              // \n    \"pfx\"            => Icons::KEY,              // \n    \"pgm\"            => Icons::IMAGE,            // \n    \"phar\"           => Icons::LANG_PHP,         // \n    \"php\"            => Icons::LANG_PHP,         // \n    \"pkg\"            => '\\u{eb29}',              // \n    \"pl\"             => Icons::LANG_PERL,        // \n    \"plist\"          => Icons::OS_APPLE,         // \n    \"pls\"            => Icons::PLAYLIST,         // 󰲹\n    \"plx\"            => Icons::LANG_PERL,        // \n    \"ply\"            => Icons::FILE_3D,          // 󰆧\n    \"pm\"             => Icons::LANG_PERL,        // \n    \"png\"            => Icons::IMAGE,            // \n    \"pnm\"            => Icons::IMAGE,            // \n    \"po\"             => Icons::TRANSLATION,      // 󰗊\n    \"pod\"            => Icons::LANG_PERL,        // \n    \"pot\"            => Icons::TRANSLATION,      // 󰗊\n    \"pp\"             => '\\u{e631}',              // \n    \"ppm\"            => Icons::IMAGE,            // \n    \"pps\"            => Icons::SLIDE,            // \n    \"ppsx\"           => Icons::SLIDE,            // \n    \"ppt\"            => Icons::SLIDE,            // \n    \"pptx\"           => Icons::SLIDE,            // \n    \"prjpcb\"         => Icons::EDA_PCB,          // \n    \"procfile\"       => Icons::LANG_RUBY,        // \n    \"properties\"     => Icons::JSON,             // \n    \"prql\"           => Icons::DATABASE,         // \n    \"ps\"             => Icons::VECTOR,           // 󰕙\n    \"ps1\"            => Icons::POWERSHELL,       // \n    \"psb\"            => '\\u{e7b8}',              // \n    \"psd\"            => '\\u{e7b8}',              // \n    \"psd1\"           => Icons::POWERSHELL,       // \n    \"psf\"            => Icons::FONT,             // \n    \"psm\"            => Icons::CAD,              // 󰻫\n    \"psm1\"           => Icons::POWERSHELL,       // \n    \"pub\"            => Icons::PUBLIC_KEY,       // 󰷖\n    \"purs\"           => '\\u{e630}',              // \n    \"pxd\"            => Icons::LANG_PYTHON,      // \n    \"pxm\"            => Icons::IMAGE,            // \n    \"py\"             => Icons::LANG_PYTHON,      // \n    \"pyc\"            => Icons::LANG_PYTHON,      // \n    \"pyd\"            => Icons::LANG_PYTHON,      // \n    \"pyi\"            => Icons::LANG_PYTHON,      // \n    \"pyo\"            => Icons::LANG_PYTHON,      // \n    \"pyw\"            => Icons::LANG_PYTHON,      // \n    \"pyx\"            => Icons::LANG_PYTHON,      // \n    \"qcow\"           => Icons::DISK_IMAGE,       // \n    \"qcow2\"          => Icons::DISK_IMAGE,       // \n    \"qm\"             => Icons::TRANSLATION,      // 󰗊\n    \"qml\"            => Icons::QT,               // \n    \"qrc\"            => Icons::QT,               // \n    \"qss\"            => Icons::QT,               // \n    \"r\"              => Icons::LANG_R,           // \n    \"rake\"           => Icons::LANG_RUBY,        // \n    \"rakefile\"       => Icons::LANG_RUBY,        // \n    \"rar\"            => Icons::COMPRESSED,       // \n    \"raw\"            => Icons::IMAGE,            // \n    \"razor\"          => Icons::RAZOR,            // \n    \"rb\"             => Icons::LANG_RUBY,        // \n    \"rdata\"          => Icons::LANG_R,           // \n    \"rdb\"            => '\\u{e76d}',              // \n    \"rdoc\"           => Icons::MARKDOWN,         // \n    \"rds\"            => Icons::LANG_R,           // \n    \"readme\"         => Icons::README,           // 󰂺\n    \"rkt\"            => Icons::LANG_SCHEME,      // \n    \"rlib\"           => Icons::LANG_RUST,        // \n    \"rmd\"            => Icons::MARKDOWN,         // \n    \"rmeta\"          => Icons::LANG_RUST,        // \n    \"rpm\"            => '\\u{e7bb}',              // \n    \"rs\"             => Icons::LANG_RUST,        // \n    \"rspec\"          => Icons::LANG_RUBY,        // \n    \"rspec_parallel\" => Icons::LANG_RUBY,        // \n    \"rspec_status\"   => Icons::LANG_RUBY,        // \n    \"rss\"            => '\\u{f09e}',              // \n    \"rst\"            => Icons::TEXT,             // \n    \"rtf\"            => Icons::TEXT,             // \n    \"ru\"             => Icons::LANG_RUBY,        // \n    \"rubydoc\"        => Icons::LANG_RUBYRAILS,   // \n    \"s\"              => Icons::LANG_ASSEMBLY,    // \n    \"s3db\"           => Icons::SQLITE,           // \n    \"sal\"            => '\\u{f147b}',             // 󱑻\n    \"sass\"           => Icons::LANG_SASS,        // \n    \"sbt\"            => Icons::SUBTITLE,         // 󰨖\n    \"scad\"           => '\\u{f34e}',              // \n    \"scala\"          => '\\u{e737}',              // \n    \"scm\"            => Icons::LANG_SCHEME,      // \n    \"sch\"            => Icons::EDA_SCH,          // 󰭅\n    \"schdoc\"         => Icons::EDA_SCH,          // 󰭅\n    \"scss\"           => Icons::LANG_SASS,        // \n    \"service\"        => '\\u{eba2}',              // \n    \"sf2\"            => '\\u{f0f70}',             // 󰽰\n    \"sfz\"            => '\\u{f0f70}',             // 󰽰\n    \"sh\"             => Icons::SHELL_CMD,        // \n    \"sha1\"           => Icons::SHIELD_CHECK,     // 󰕥\n    \"sha224\"         => Icons::SHIELD_CHECK,     // 󰕥\n    \"sha256\"         => Icons::SHIELD_CHECK,     // 󰕥\n    \"sha384\"         => Icons::SHIELD_CHECK,     // 󰕥\n    \"sha512\"         => Icons::SHIELD_CHECK,     // 󰕥\n    \"shell\"          => Icons::SHELL_CMD,        // \n    \"shtml\"          => Icons::HTML5,            // \n    \"sig\"            => Icons::SIGNED_FILE,      // 󱧃\n    \"signature\"      => Icons::SIGNED_FILE,      // 󱧃\n    \"sld\"            => Icons::LANG_SCHEME,      // \n    \"skp\"            => Icons::CAD,              // 󰻫\n    \"sl3\"            => Icons::SQLITE,           // \n    \"sldasm\"         => Icons::CAD,              // 󰻫\n    \"sldprt\"         => Icons::CAD,              // 󰻫\n    \"slim\"           => Icons::LANG_RUBYRAILS,   // \n    \"sln\"            => '\\u{e70c}',              // \n    \"slvs\"           => Icons::CAD,              // 󰻫\n    \"so\"             => Icons::OS_LINUX,         // \n    \"sql\"            => Icons::DATABASE,         // \n    \"sqlite\"         => Icons::SQLITE,           // \n    \"sqlite3\"        => Icons::SQLITE,           // \n    \"sr\"             => '\\u{f147b}',             // 󱑻\n    \"srt\"            => Icons::SUBTITLE,         // 󰨖\n    \"ss\"             => Icons::LANG_SCHEME,      // \n    \"ssa\"            => Icons::SUBTITLE,         // 󰨖\n    \"stl\"            => Icons::FILE_3D,          // 󰆧\n    \"ste\"            => Icons::CAD,              // 󰻫\n    \"step\"           => Icons::CAD,              // 󰻫\n    \"stp\"            => Icons::CAD,              // 󰻫\n    \"sty\"            => Icons::LANG_TEX,         // \n    \"styl\"           => Icons::LANG_STYLUS,      // \n    \"stylus\"         => Icons::LANG_STYLUS,      // \n    \"sub\"            => Icons::SUBTITLE,         // 󰨖\n    \"sublime-build\"  => Icons::SUBLIME,          // \n    \"sublime-keymap\" => Icons::SUBLIME,          // \n    \"sublime-menu\"   => Icons::SUBLIME,          // \n    \"sublime-options\"=> Icons::SUBLIME,          // \n    \"sublime-package\"=> Icons::SUBLIME,          // \n    \"sublime-project\"=> Icons::SUBLIME,          // \n    \"sublime-session\"=> Icons::SUBLIME,          // \n    \"sublime-settings\"=>Icons::SUBLIME,          // \n    \"sublime-snippet\"=> Icons::SUBLIME,          // \n    \"sublime-theme\"  => Icons::SUBLIME,          // \n    \"suo\"            => '\\u{e70c}',              // \n    \"svelte\"         => '\\u{e697}',              // \n    \"sv\"             => Icons::LANG_HDL,         // 󰍛\n    \"svg\"            => Icons::VECTOR,           // 󰕙\n    \"svh\"            => Icons::LANG_HDL,         // 󰍛\n    \"swf\"            => Icons::AUDIO,            // \n    \"swift\"          => '\\u{e755}',              // \n    \"t\"              => Icons::LANG_PERL,        // \n    \"tbc\"            => Icons::TCL,              // 󰛓\n    \"tar\"            => Icons::COMPRESSED,       // \n    \"taz\"            => Icons::COMPRESSED,       // \n    \"tbz\"            => Icons::COMPRESSED,       // \n    \"tbz2\"           => Icons::COMPRESSED,       // \n    \"tc\"             => Icons::DISK_IMAGE,       // \n    \"tcl\"            => Icons::TCL,              // 󰛓\n    \"tex\"            => Icons::LANG_TEX,         // \n    \"tf\"             => Icons::TERRAFORM,        // 󱁢\n    \"tfstate\"        => Icons::TERRAFORM,        // 󱁢\n    \"tfvars\"         => Icons::TERRAFORM,        // 󱁢\n    \"tgz\"            => Icons::COMPRESSED,       // \n    \"tif\"            => Icons::IMAGE,            // \n    \"tiff\"           => Icons::IMAGE,            // \n    \"tlz\"            => Icons::COMPRESSED,       // \n    \"tml\"            => Icons::CONFIG,           // \n    \"tmux\"           => Icons::TMUX,             // \n    \"toml\"           => Icons::TOML,             // \n    \"torrent\"        => '\\u{e275}',              // \n    \"tres\"           => Icons::GODOT,            // \n    \"ts\"             => Icons::LANG_TYPESCRIPT,  // \n    \"tscn\"           => Icons::GODOT,            // \n    \"tsv\"            => Icons::SHEET,            // \n    \"tsx\"            => Icons::REACT,            // \n    \"ttc\"            => Icons::FONT,             // \n    \"ttf\"            => Icons::FONT,             // \n    \"twig\"           => '\\u{e61c}',              // \n    \"txt\"            => Icons::TEXT,             // \n    \"typ\"            => Icons::TYPST,            // \n    \"txz\"            => Icons::COMPRESSED,       // \n    \"tz\"             => Icons::COMPRESSED,       // \n    \"tzo\"            => Icons::COMPRESSED,       // \n    \"ui\"             => '\\u{f2d0}',              // \n    \"unity\"          => Icons::UNITY,            // \n    \"unity3d\"        => Icons::UNITY,            // \n    \"v\"              => Icons::LANG_V,           // \n    \"vala\"           => '\\u{e8d1}',              // \n    \"vdi\"            => Icons::DISK_IMAGE,       // \n    \"vhd\"            => Icons::DISK_IMAGE,       // \n    \"vhs\"            => '\\u{F0A1B}',             // 󰨛\n    \"vi\"             => '\\u{e81e}',              // \n    \"vhdl\"           => Icons::LANG_HDL,         // 󰍛\n    \"video\"          => Icons::VIDEO,            // \n    \"vim\"            => Icons::VIM,              // \n    \"vmdk\"           => Icons::DISK_IMAGE,       // \n    \"vob\"            => Icons::VIDEO,            // \n    \"vsix\"           => '\\u{f0a1e}',             // 󰨞\n    \"vue\"            => '\\u{f0844}',             // 󰡄\n    \"war\"            => Icons::LANG_JAVA,        // \n    \"wav\"            => Icons::AUDIO,            // \n    \"webm\"           => Icons::VIDEO,            // \n    \"webmanifest\"    => Icons::JSON,             // \n    \"webp\"           => Icons::IMAGE,            // \n    \"whl\"            => Icons::LANG_PYTHON,      // \n    \"windows\"        => Icons::OS_WINDOWS,       // \n    \"wma\"            => Icons::AUDIO,            // \n    \"wmv\"            => Icons::VIDEO,            // \n    \"woff\"           => Icons::FONT,             // \n    \"woff2\"          => Icons::FONT,             // \n    \"wrl\"            => Icons::FILE_3D,          // 󰆧\n    \"wrz\"            => Icons::FILE_3D,          // 󰆧\n    \"wv\"             => Icons::AUDIO,            // \n    \"xaml\"           => '\\u{f0673}',             // 󰙳\n    \"xcf\"            => Icons::GIMP,             // \n    \"xci\"            => '\\u{F07E1}',             // 󰟡\n    \"xcplayground\"   => '\\u{e755}',              // \n    \"xhtml\"          => Icons::HTML5,            // \n    \"xlr\"            => Icons::SHEET,            // \n    \"xls\"            => Icons::SHEET,            // \n    \"xlsm\"           => Icons::SHEET,            // \n    \"xlsx\"           => Icons::SHEET,            // \n    \"xml\"            => Icons::XML,              // 󰗀\n    \"xpi\"            => '\\u{eae6}',              // \n    \"xpm\"            => Icons::IMAGE,            // \n    \"xul\"            => Icons::XML,              // 󰗀\n    \"xz\"             => Icons::COMPRESSED,       // \n    \"x_b\"            => Icons::CAD,              // 󰻫\n    \"x_t\"            => Icons::CAD,              // 󰻫\n    \"yaml\"           => Icons::YAML,             // \n    \"yml\"            => Icons::YAML,             // \n    \"z\"              => Icons::COMPRESSED,       // \n    \"zig\"            => '\\u{e6a9}',              // \n    \"zip\"            => Icons::COMPRESSED,       // \n    \"zsh\"            => Icons::SHELL_CMD,        // \n    \"zsh-theme\"      => Icons::SHELL,            // 󱆃\n    \"zst\"            => Icons::COMPRESSED,       // \n    \"z64\"            => '\\u{f1393}',             // 󱎓\n};\n\n/// Converts the style used to paint a file name into the style that should be\n/// used to paint an icon.\n///\n/// - The background colour should be preferred to the foreground colour, as\n///   if one is set, it’s the more “obvious” colour choice.\n/// - If neither is set, just use the default style.\n/// - Attributes such as bold or underline should not be used to paint the\n///   icon, as they can make it look weird.\npub fn iconify_style(style: Style) -> Style {\n    style\n        .background\n        .or(style.foreground)\n        .map(Style::from)\n        .unwrap_or_default()\n}\n\n/// Lookup the icon for a file based on the file's name, if the entry is a\n/// directory, or by the lowercase file extension.\npub fn icon_for_file(file: &File<'_>) -> char {\n    if file.points_to_directory() {\n        *DIRECTORY_ICONS.get(file.name.as_str()).unwrap_or_else(|| {\n            if file.is_empty_dir() {\n                &Icons::FOLDER_OPEN // \n            } else {\n                &Icons::FOLDER // \n            }\n        })\n    } else if let Some(icon) = FILENAME_ICONS.get(file.name.as_str()) {\n        *icon\n    } else if let Some(ext) = file.ext.as_ref() {\n        *EXTENSION_ICONS.get(ext.as_str()).unwrap_or(&Icons::FILE) // \n    } else {\n        Icons::FILE_UNKNOW // 󰡯\n    }\n}\n"
  },
  {
    "path": "src/output/lines.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse std::io::{self, Write};\n\nuse nu_ansi_term::AnsiStrings as ANSIStrings;\n\nuse crate::fs::File;\nuse crate::fs::filter::FileFilter;\nuse crate::output::cell::TextCellContents;\nuse crate::output::file_name::Options as FileStyle;\nuse crate::theme::Theme;\n\n/// The lines view literally just displays each file, line-by-line.\npub struct Render<'a> {\n    pub files: Vec<File<'a>>,\n    pub theme: &'a Theme,\n    pub file_style: &'a FileStyle,\n    pub filter: &'a FileFilter,\n}\n\nimpl<'a> Render<'a> {\n    pub fn render<W: Write>(mut self, w: &mut W) -> io::Result<()> {\n        self.filter.sort_files(&mut self.files);\n        for file in &self.files {\n            let name_cell = self.render_file(file);\n            writeln!(w, \"{}\", ANSIStrings(&name_cell))?;\n        }\n\n        Ok(())\n    }\n\n    fn render_file<'f>(&self, file: &'f File<'a>) -> TextCellContents {\n        self.file_style\n            .for_file(file, self.theme)\n            .with_link_paths()\n            .with_mount_details(false)\n            .paint()\n    }\n}\n"
  },
  {
    "path": "src/output/mod.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n#[cfg(target_os = \"windows\")]\npub use self::cell::TextCell;\npub use self::escape::escape;\n\npub mod color_scale;\npub mod details;\npub mod file_name;\npub mod grid;\npub mod grid_details;\npub mod icons;\npub mod lines;\npub mod render;\npub mod table;\npub mod time;\n\nmod cell;\nmod escape;\nmod tree;\n\n/// The **view** contains all information about how to format output.\n#[derive(Debug)]\npub struct View {\n    pub mode: Mode,\n    pub width: TerminalWidth,\n    pub file_style: file_name::Options,\n    pub deref_links: bool,\n    pub follow_links: bool,\n    pub total_size: bool,\n}\n\n/// The **mode** is the “type” of output.\n#[derive(PartialEq, Eq, Debug)]\n#[allow(clippy::large_enum_variant)]\npub enum Mode {\n    Grid(grid::Options),\n    Details(details::Options),\n    GridDetails(grid_details::Options),\n    Lines,\n}\n\n/// The width of the terminal requested by the user.\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum TerminalWidth {\n    /// The user requested this specific number of columns.\n    Set(usize),\n\n    /// Look up the terminal size at runtime.\n    Automatic,\n}\n\nimpl TerminalWidth {\n    #[must_use]\n    pub fn actual_terminal_width(self) -> Option<usize> {\n        // All of stdin, stdout, and stderr could not be connected to a\n        // terminal, but we’re only interested in stdout because it’s\n        // where the output goes.\n\n        #[cfg(unix)]\n        let stdout_term_width =\n            { terminal_size::terminal_size_of(std::io::stdout()).map(|(w, _h)| w.0 as _) };\n        #[cfg(windows)]\n        let stdout_term_width = {\n            use std::os::windows::io::BorrowedHandle;\n            use windows_sys::Win32::System::Console::{GetStdHandle, STD_OUTPUT_HANDLE};\n            terminal_size::terminal_size_of(unsafe {\n                BorrowedHandle::borrow_raw(GetStdHandle(STD_OUTPUT_HANDLE))\n            })\n            .map(|(w, _h)| w.0 as _)\n        };\n\n        #[rustfmt::skip]\n        return match self {\n            Self::Set(width)  => Some(width),\n            Self::Automatic   => stdout_term_width,\n        };\n    }\n}\n"
  },
  {
    "path": "src/output/render/blocks.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse locale::Numeric as NumericLocale;\nuse nu_ansi_term::Style;\nuse unit_prefix::Prefix;\n\nuse crate::fs::fields as f;\nuse crate::output::cell::{DisplayWidth, TextCell};\nuse crate::output::table::SizeFormat;\n\nimpl f::Blocksize {\n    pub fn render<C: Colours>(\n        self,\n        colours: &C,\n        size_format: SizeFormat,\n        numerics: &NumericLocale,\n    ) -> TextCell {\n        use unit_prefix::NumberPrefix;\n\n        let size = match self {\n            Self::Some(s) => s,\n            Self::None => return TextCell::blank(colours.no_blocksize()),\n        };\n\n        let result = match size_format {\n            SizeFormat::DecimalBytes => NumberPrefix::decimal(size as f64),\n            SizeFormat::BinaryBytes => NumberPrefix::binary(size as f64),\n            SizeFormat::JustBytes => {\n                // Use the binary prefix to select a style.\n                let prefix = match NumberPrefix::binary(size as f64) {\n                    NumberPrefix::Standalone(_) => None,\n                    NumberPrefix::Prefixed(p, _) => Some(p),\n                };\n\n                // But format the number directly using the locale.\n                let string = numerics.format_int(size);\n\n                return TextCell::paint(colours.blocksize(prefix), string);\n            }\n        };\n\n        let (prefix, n) = match result {\n            NumberPrefix::Standalone(b) => {\n                return TextCell::paint(colours.blocksize(None), numerics.format_int(b));\n            }\n            NumberPrefix::Prefixed(p, n) => (p, n),\n        };\n\n        let symbol = prefix.symbol();\n        let number = if n < 10_f64 {\n            numerics.format_float(n, 1)\n        } else {\n            numerics.format_int(n.round() as isize)\n        };\n\n        TextCell {\n            // symbol is guaranteed to be ASCII since unit prefixes are hardcoded.\n            width: DisplayWidth::from(&*number) + symbol.len(),\n            contents: vec![\n                colours.blocksize(Some(prefix)).paint(number),\n                colours.unit(Some(prefix)).paint(symbol),\n            ]\n            .into(),\n        }\n    }\n}\n\n#[rustfmt::skip]\npub trait Colours {\n    fn blocksize(&self, prefix: Option<Prefix>) -> Style;\n    fn unit(&self, prefix: Option<Prefix>)      -> Style;\n    fn no_blocksize(&self)                      -> Style;\n}\n\n#[cfg(test)]\npub mod test {\n    use nu_ansi_term::Color::*;\n    use nu_ansi_term::Style;\n\n    use super::Colours;\n    use crate::fs::fields as f;\n    use crate::output::cell::{DisplayWidth, TextCell};\n    use crate::output::table::SizeFormat;\n\n    use locale::Numeric as NumericLocale;\n    use unit_prefix::Prefix;\n\n    struct TestColours;\n\n    #[rustfmt::skip]\n    impl Colours for TestColours {\n        fn blocksize(&self, _prefix: Option<Prefix>) -> Style { Fixed(66).normal() }\n        fn unit(&self, _prefix: Option<Prefix>)      -> Style { Fixed(77).bold() }\n        fn no_blocksize(&self)                       -> Style { Black.italic() }\n    }\n\n    #[test]\n    fn directory() {\n        let directory = f::Blocksize::None;\n        let expected = TextCell::blank(Black.italic());\n        assert_eq!(\n            expected,\n            directory.render(\n                &TestColours,\n                SizeFormat::JustBytes,\n                &NumericLocale::english()\n            )\n        );\n    }\n\n    #[test]\n    fn file_decimal() {\n        let directory = f::Blocksize::Some(2_100_000);\n        let expected = TextCell {\n            width: DisplayWidth::from(4),\n            contents: vec![Fixed(66).paint(\"2.1\"), Fixed(77).bold().paint(\"M\")].into(),\n        };\n\n        assert_eq!(\n            expected,\n            directory.render(\n                &TestColours,\n                SizeFormat::DecimalBytes,\n                &NumericLocale::english()\n            )\n        );\n    }\n\n    #[test]\n    fn file_binary() {\n        let directory = f::Blocksize::Some(1_048_576);\n        let expected = TextCell {\n            width: DisplayWidth::from(5),\n            contents: vec![Fixed(66).paint(\"1.0\"), Fixed(77).bold().paint(\"Mi\")].into(),\n        };\n\n        assert_eq!(\n            expected,\n            directory.render(\n                &TestColours,\n                SizeFormat::BinaryBytes,\n                &NumericLocale::english()\n            )\n        );\n    }\n\n    #[test]\n    fn file_bytes() {\n        let directory = f::Blocksize::Some(1_048_576);\n        let expected = TextCell {\n            width: DisplayWidth::from(9),\n            contents: vec![Fixed(66).paint(\"1,048,576\")].into(),\n        };\n\n        assert_eq!(\n            expected,\n            directory.render(\n                &TestColours,\n                SizeFormat::JustBytes,\n                &NumericLocale::english()\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "src/output/render/filetype.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse nu_ansi_term::{AnsiString as ANSIString, Style};\n\nuse crate::fs::fields as f;\n\nimpl f::Type {\n    pub fn render<C: Colours>(self, colours: &C) -> ANSIString<'static> {\n        #[rustfmt::skip]\n        return match self {\n            Self::File         => colours.normal().paint(\".\"),\n            Self::Directory    => colours.directory().paint(\"d\"),\n            Self::Pipe         => colours.pipe().paint(\"|\"),\n            Self::Link         => colours.symlink().paint(\"l\"),\n            Self::BlockDevice  => colours.block_device().paint(\"b\"),\n            Self::CharDevice   => colours.char_device().paint(\"c\"),\n            Self::Socket       => colours.socket().paint(\"s\"),\n            Self::Special      => colours.special().paint(\"?\"),\n        };\n    }\n}\n\npub trait Colours {\n    fn normal(&self) -> Style;\n    fn directory(&self) -> Style;\n    fn pipe(&self) -> Style;\n    fn symlink(&self) -> Style;\n    fn block_device(&self) -> Style;\n    fn char_device(&self) -> Style;\n    fn socket(&self) -> Style;\n    fn special(&self) -> Style;\n}\n"
  },
  {
    "path": "src/output/render/flags.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse nu_ansi_term::Style;\n\nuse crate::fs::fields as f;\nuse crate::output::cell::TextCell;\nuse crate::output::table::FlagsFormat;\n\nimpl f::Flags {\n    #[must_use]\n    pub fn render(self, style: Style, _format: FlagsFormat) -> TextCell {\n        TextCell::paint(style, \"-\".to_string())\n    }\n}\n"
  },
  {
    "path": "src/output/render/flags_bsd.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse nu_ansi_term::Style;\nuse std::ffi::CStr;\n\n#[cfg(target_os = \"netbsd\")]\nuse std::ffi::CString;\n\nuse crate::fs::fields as f;\nuse crate::output::cell::TextCell;\nuse crate::output::table::FlagsFormat;\n\n#[cfg(not(target_os = \"netbsd\"))]\nunsafe extern \"C\" {\n    fn fflagstostr(flags: libc::c_ulong) -> *const libc::c_char;\n}\n\n#[cfg(target_os = \"netbsd\")]\nunsafe extern \"C\" {\n    fn flags_to_string(flags: libc::c_ulong, def: *const libc::c_char) -> *const libc::c_char;\n}\n\n/// Wrapper around the C library call fflagstostr or the netbsd equivalent\n/// If returned string is NULL or empty a \"-\" is returned\nfn wrapper_flags_to_string(flags: f::flag_t) -> String {\n    #[cfg(target_os = \"netbsd\")]\n    let empty_string = CString::new(\"\").expect(\"This string is always valid\");\n\n    // SAFETY: Calling external \"C\" function\n    #[cfg(not(target_os = \"netbsd\"))]\n    let flags_c_str = unsafe { fflagstostr(libc::c_ulong::from(flags)) };\n\n    // SAFETY: Calling external \"C\" function\n    #[cfg(target_os = \"netbsd\")]\n    let flags_c_str = unsafe { flags_to_string(libc::c_ulong::from(flags), empty_string.as_ptr()) };\n\n    if flags_c_str.is_null() {\n        \"-\".to_string()\n    } else {\n        let flags_str = unsafe { CStr::from_ptr(flags_c_str) };\n        let flags = flags_str\n            .to_str()\n            .map_or(\"-\", |s| if s.is_empty() { \"-\" } else { s })\n            .to_string();\n\n        // SAFETY: Calling external \"C\" function to free memory allocated by fflagstostr\n        unsafe {\n            libc::free(flags_c_str.cast_mut().cast());\n        }\n\n        flags\n    }\n}\n\nimpl f::Flags {\n    pub fn render(self, style: Style, _format: FlagsFormat) -> TextCell {\n        TextCell::paint(style, wrapper_flags_to_string(self.0))\n    }\n}\n"
  },
  {
    "path": "src/output/render/flags_windows.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse crate::fs::fields as f;\nuse crate::output::TextCell;\nuse crate::output::table::FlagsFormat;\nuse nu_ansi_term::Style;\n\n// See https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants\nconst FILE_ATTRIBUTE_READONLY: u32 = 0x0000_0001; // R\nconst FILE_ATTRIBUTE_HIDDEN: u32 = 0x0000_0002; // H\nconst FILE_ATTRIBUTE_SYSTEM: u32 = 0x0000_0004; // S\nconst FILE_ATTRIBUTE_ARCHIVE: u32 = 0x0000_0020; // A\nconst FILE_ATTRIBUTE_TEMPORARY: u32 = 0x0000_0100; // T\nconst FILE_ATTRIBUTE_COMPRESSED: u32 = 0x0000_0800; // C\nconst FILE_ATTRIBUTE_OFFLINE: u32 = 0x0000_1000; // O\nconst FILE_ATTRIBUTE_NOT_CONTENT_INDEXED: u32 = 0x0000_2000; // I\nconst FILE_ATTRIBUTE_ENCRYPTED: u32 = 0x0000_4000; // E\nconst FILE_ATTRIBUTE_NO_SCRUB_DATA: u32 = 0x0002_0000; // X\nconst FILE_ATTRIBUTE_PINNED: u32 = 0x0008_0000; // P\nconst FILE_ATTRIBUTE_UNPINNED: u32 = 0x0010_0000; // U\nconst FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS: u32 = 0x0040_0000; // M\n\nstruct Attribute {\n    flag: u32,\n    name: &'static str,\n    abbr: char,\n}\n\nconst ATTRIBUTES: [Attribute; 13] = [\n    Attribute {\n        flag: FILE_ATTRIBUTE_READONLY,\n        name: \"readonly\",\n        abbr: 'R',\n    },\n    Attribute {\n        flag: FILE_ATTRIBUTE_HIDDEN,\n        name: \"hidden\",\n        abbr: 'H',\n    },\n    Attribute {\n        flag: FILE_ATTRIBUTE_SYSTEM,\n        name: \"system\",\n        abbr: 'S',\n    },\n    Attribute {\n        flag: FILE_ATTRIBUTE_ARCHIVE,\n        name: \"archive\",\n        abbr: 'A',\n    },\n    Attribute {\n        flag: FILE_ATTRIBUTE_TEMPORARY,\n        name: \"temporary\",\n        abbr: 'T',\n    },\n    Attribute {\n        flag: FILE_ATTRIBUTE_COMPRESSED,\n        name: \"compressed\",\n        abbr: 'C',\n    },\n    Attribute {\n        flag: FILE_ATTRIBUTE_OFFLINE,\n        name: \"offline\",\n        abbr: 'O',\n    },\n    Attribute {\n        flag: FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,\n        name: \"not indexed\",\n        abbr: 'I',\n    },\n    Attribute {\n        flag: FILE_ATTRIBUTE_ENCRYPTED,\n        name: \"encrypted\",\n        abbr: 'E',\n    },\n    Attribute {\n        flag: FILE_ATTRIBUTE_NO_SCRUB_DATA,\n        name: \"no scrub\",\n        abbr: 'X',\n    },\n    Attribute {\n        flag: FILE_ATTRIBUTE_UNPINNED,\n        name: \"unpinned\",\n        abbr: 'U',\n    },\n    Attribute {\n        flag: FILE_ATTRIBUTE_PINNED,\n        name: \"pinned\",\n        abbr: 'P',\n    },\n    Attribute {\n        flag: FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS,\n        name: \"recall on data access\",\n        abbr: 'M',\n    },\n];\n\nfn flags_to_bsd_string(flags: f::flag_t) -> String {\n    let mut result = Vec::new();\n\n    for attribute in &ATTRIBUTES {\n        if attribute.flag & flags != 0 {\n            result.push(attribute.name);\n        }\n    }\n\n    if result.is_empty() {\n        \"-\".to_string()\n    } else {\n        result.join(\"-\")\n    }\n}\n\nfn flags_to_windows_string(flags: f::flag_t) -> String {\n    let mut result = String::new();\n\n    for attribute in &ATTRIBUTES {\n        if attribute.flag & flags != 0 {\n            result.push(attribute.abbr);\n        }\n    }\n\n    if result.is_empty() {\n        result.push('-');\n    }\n\n    result\n}\n\nimpl f::Flags {\n    pub fn render(self, style: Style, format: FlagsFormat) -> TextCell {\n        TextCell::paint(\n            style,\n            if format == FlagsFormat::Short {\n                flags_to_windows_string(self.0)\n            } else {\n                flags_to_bsd_string(self.0)\n            },\n        )\n    }\n}\n"
  },
  {
    "path": "src/output/render/git.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse nu_ansi_term::{AnsiString as ANSIString, Style};\n\nuse crate::fs::fields as f;\nuse crate::output::cell::{DisplayWidth, TextCell};\n\nimpl f::Git {\n    pub fn render(self, colours: &dyn Colours) -> TextCell {\n        TextCell {\n            width: DisplayWidth::from(2),\n            contents: vec![self.staged.render(colours), self.unstaged.render(colours)].into(),\n        }\n    }\n}\n\nimpl f::GitStatus {\n    fn render(self, colours: &dyn Colours) -> ANSIString<'static> {\n        #[rustfmt::skip]\n        return match self {\n            Self::NotModified  => colours.not_modified().paint(\"-\"),\n            Self::New          => colours.new().paint(\"N\"),\n            Self::Modified     => colours.modified().paint(\"M\"),\n            Self::Deleted      => colours.deleted().paint(\"D\"),\n            Self::Renamed      => colours.renamed().paint(\"R\"),\n            Self::TypeChange   => colours.type_change().paint(\"T\"),\n            Self::Ignored      => colours.ignored().paint(\"I\"),\n            Self::Conflicted   => colours.conflicted().paint(\"U\"),\n        };\n    }\n}\n\npub trait Colours {\n    fn not_modified(&self) -> Style;\n    // FIXME: this amount of allows needed to keep clippy happy should be enough\n    // of an argument that new needs to be renamed.\n    #[allow(clippy::new_ret_no_self, clippy::wrong_self_convention)]\n    fn new(&self) -> Style;\n    fn modified(&self) -> Style;\n    fn deleted(&self) -> Style;\n    fn renamed(&self) -> Style;\n    fn type_change(&self) -> Style;\n    fn ignored(&self) -> Style;\n    fn conflicted(&self) -> Style;\n}\n\nimpl f::SubdirGitRepo {\n    pub fn render(self, colours: &dyn RepoColours) -> TextCell {\n        let branch_name = match self.branch {\n            Some(name) => match name.as_ref() {\n                \"main\" | \"master\" => colours.branch_main().paint(name),\n                _ => colours.branch_other().paint(name),\n            },\n            None => colours.no_repo().paint(\"-\"),\n        };\n\n        if let Some(status) = self.status {\n            TextCell {\n                width: DisplayWidth::from(2) + DisplayWidth::from(branch_name.as_str()),\n                contents: vec![\n                    status.render(colours),\n                    Style::default().paint(\" \"),\n                    branch_name,\n                ]\n                .into(),\n            }\n        } else {\n            TextCell {\n                width: DisplayWidth::from(branch_name.as_str()),\n                contents: vec![branch_name].into(),\n            }\n        }\n    }\n}\n\nimpl f::SubdirGitRepoStatus {\n    pub fn render(self, colours: &dyn RepoColours) -> ANSIString<'static> {\n        match self {\n            Self::NoRepo => colours.no_repo().paint(\"-\"),\n            Self::GitClean => colours.git_clean().paint(\"|\"),\n            Self::GitDirty => colours.git_dirty().paint(\"+\"),\n        }\n    }\n}\n\npub trait RepoColours {\n    fn branch_main(&self) -> Style;\n    fn branch_other(&self) -> Style;\n    fn no_repo(&self) -> Style;\n    fn git_clean(&self) -> Style;\n    fn git_dirty(&self) -> Style;\n}\n\n#[cfg(test)]\npub mod test {\n    use super::Colours;\n    use crate::fs::fields as f;\n    use crate::output::cell::{DisplayWidth, TextCell};\n\n    use nu_ansi_term::Color::*;\n    use nu_ansi_term::Style;\n\n    struct TestColours;\n\n    impl Colours for TestColours {\n        fn not_modified(&self) -> Style {\n            Fixed(90).normal()\n        }\n        fn new(&self) -> Style {\n            Fixed(91).normal()\n        }\n        fn modified(&self) -> Style {\n            Fixed(92).normal()\n        }\n        fn deleted(&self) -> Style {\n            Fixed(93).normal()\n        }\n        fn renamed(&self) -> Style {\n            Fixed(94).normal()\n        }\n        fn type_change(&self) -> Style {\n            Fixed(95).normal()\n        }\n        fn ignored(&self) -> Style {\n            Fixed(96).normal()\n        }\n        fn conflicted(&self) -> Style {\n            Fixed(97).normal()\n        }\n    }\n\n    #[test]\n    fn git_blank() {\n        let stati = f::Git {\n            staged: f::GitStatus::NotModified,\n            unstaged: f::GitStatus::NotModified,\n        };\n\n        let expected = TextCell {\n            width: DisplayWidth::from(2),\n            contents: vec![Fixed(90).paint(\"-\"), Fixed(90).paint(\"-\")].into(),\n        };\n\n        assert_eq!(expected, stati.render(&TestColours));\n    }\n\n    #[test]\n    fn git_new_changed() {\n        let stati = f::Git {\n            staged: f::GitStatus::New,\n            unstaged: f::GitStatus::Modified,\n        };\n\n        let expected = TextCell {\n            width: DisplayWidth::from(2),\n            contents: vec![Fixed(91).paint(\"N\"), Fixed(92).paint(\"M\")].into(),\n        };\n\n        assert_eq!(expected, stati.render(&TestColours));\n    }\n}\n"
  },
  {
    "path": "src/output/render/groups.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse nu_ansi_term::Style;\nuse uzers::{Groups, Users};\n\nuse crate::fs::fields as f;\nuse crate::fs::fields::User;\nuse crate::output::cell::TextCell;\nuse crate::output::table::{GroupFormat, UserFormat};\n\npub trait Render {\n    fn render<C: Colours, U: Users + Groups>(\n        self,\n        colours: &C,\n        users: &U,\n        user_format: UserFormat,\n        group_format: GroupFormat,\n        file_user: Option<User>,\n    ) -> TextCell;\n}\n\nimpl Render for Option<f::Group> {\n    fn render<C: Colours, U: Users + Groups>(\n        self,\n        colours: &C,\n        users: &U,\n        user_format: UserFormat,\n        group_format: GroupFormat,\n        file_user: Option<User>,\n    ) -> TextCell {\n        use uzers::os::unix::GroupExt;\n\n        let mut style = colours.not_yours();\n\n        let group = match self {\n            Some(g) => match users.get_group_by_gid(g.0) {\n                Some(g) => (*g).clone(),\n                None => return TextCell::paint(style, g.0.to_string()),\n            },\n            None => return TextCell::blank(colours.no_group()),\n        };\n\n        let current_uid = users.get_current_uid();\n        if let Some(current_user) = users.get_user_by_uid(current_uid)\n            && (current_user.primary_group_id() == group.gid()\n                || group.members().iter().any(|u| u == current_user.name()))\n        {\n            style = colours.yours();\n        }\n\n        if group.gid() == 0 && style != colours.yours() {\n            style = colours.root_group();\n        }\n\n        let mut group_name = match user_format {\n            UserFormat::Name => group.name().to_string_lossy().into(),\n            UserFormat::Numeric => group.gid().to_string(),\n        };\n\n        if let GroupFormat::Smart = group_format\n            && let Some(file_uid) = file_user\n            && let Some(file_user) = users.get_user_by_uid(file_uid.0)\n            && file_user.name().to_string_lossy() == group.name().to_string_lossy()\n        {\n            group_name = \":\".to_string();\n        }\n\n        TextCell::paint(style, group_name)\n    }\n}\n\npub trait Colours {\n    fn yours(&self) -> Style;\n    fn not_yours(&self) -> Style;\n    fn no_group(&self) -> Style;\n    fn root_group(&self) -> Style;\n}\n\n#[cfg(test)]\n#[allow(unused_results)]\npub mod test {\n    use super::{Colours, Render};\n    use crate::fs::fields as f;\n    use crate::output::cell::TextCell;\n    use crate::output::table::{GroupFormat, UserFormat};\n\n    use nu_ansi_term::Color::*;\n    use nu_ansi_term::Style;\n    use uzers::mock::MockUsers;\n    use uzers::os::unix::GroupExt;\n    use uzers::{Group, User};\n\n    struct TestColours;\n\n    #[rustfmt::skip]\n    impl Colours for TestColours {\n        fn yours(&self)     -> Style { Fixed(80).normal() }\n        fn not_yours(&self) -> Style { Fixed(81).normal() }\n        fn no_group(&self)   -> Style { Black.italic() }\n        fn root_group(&self) -> Style { Fixed(82).normal() }\n    }\n\n    #[test]\n    fn named() {\n        let mut users = MockUsers::with_current_uid(1000);\n        users.add_group(Group::new(100, \"folk\"));\n\n        let group = Some(f::Group(100));\n        let file_user = Some(f::User(1000));\n        let expected = TextCell::paint_str(TestColours.not_yours(), \"folk\");\n        assert_eq!(\n            expected,\n            group.render(\n                &TestColours,\n                &users,\n                UserFormat::Name,\n                GroupFormat::Regular,\n                file_user\n            )\n        );\n\n        let expected = TextCell::paint_str(TestColours.not_yours(), \"100\");\n        assert_eq!(\n            expected,\n            group.render(\n                &TestColours,\n                &users,\n                UserFormat::Numeric,\n                GroupFormat::Regular,\n                file_user\n            )\n        );\n    }\n\n    #[test]\n    fn unnamed() {\n        let users = MockUsers::with_current_uid(1000);\n\n        let group = Some(f::Group(100));\n        let file_user = Some(f::User(1000));\n        let expected = TextCell::paint_str(TestColours.not_yours(), \"100\");\n        assert_eq!(\n            expected,\n            group.render(\n                &TestColours,\n                &users,\n                UserFormat::Name,\n                GroupFormat::Regular,\n                file_user\n            )\n        );\n        assert_eq!(\n            expected,\n            group.render(\n                &TestColours,\n                &users,\n                UserFormat::Numeric,\n                GroupFormat::Regular,\n                file_user\n            )\n        );\n    }\n\n    #[test]\n    fn primary() {\n        let mut users = MockUsers::with_current_uid(2);\n        users.add_user(User::new(2, \"eve\", 100));\n        users.add_group(Group::new(100, \"folk\"));\n\n        let group = Some(f::Group(100));\n        let file_user = Some(f::User(2));\n        let expected = TextCell::paint_str(TestColours.yours(), \"folk\");\n        assert_eq!(\n            expected,\n            group.render(\n                &TestColours,\n                &users,\n                UserFormat::Name,\n                GroupFormat::Regular,\n                file_user\n            )\n        );\n    }\n\n    #[test]\n    fn secondary() {\n        let mut users = MockUsers::with_current_uid(2);\n        users.add_user(User::new(2, \"eve\", 666));\n\n        let test_group = Group::new(100, \"folk\").add_member(\"eve\");\n        users.add_group(test_group);\n\n        let group = Some(f::Group(100));\n        let file_user = Some(f::User(2));\n        let expected = TextCell::paint_str(TestColours.yours(), \"folk\");\n        assert_eq!(\n            expected,\n            group.render(\n                &TestColours,\n                &users,\n                UserFormat::Name,\n                GroupFormat::Regular,\n                file_user\n            )\n        );\n    }\n\n    #[test]\n    fn overflow() {\n        let group = Some(f::Group(2_147_483_648));\n        let file_user = Some(f::User(1000));\n        let expected = TextCell::paint_str(TestColours.not_yours(), \"2147483648\");\n        assert_eq!(\n            expected,\n            group.render(\n                &TestColours,\n                &MockUsers::with_current_uid(0),\n                UserFormat::Numeric,\n                GroupFormat::Regular,\n                file_user\n            )\n        );\n    }\n\n    #[test]\n    fn smart() {\n        let mut users = MockUsers::with_current_uid(1000);\n        users.add_user(User::new(1000, \"user\", 100));\n        users.add_user(User::new(1001, \"http\", 101));\n        users.add_group(Group::new(100, \"user\"));\n        users.add_group(Group::new(101, \"http\"));\n\n        let user_group = Some(f::Group(100));\n        let user_file = Some(f::User(1000));\n        let expected = TextCell::paint_str(TestColours.yours(), \":\");\n        assert_eq!(\n            expected,\n            user_group.render(\n                &TestColours,\n                &users,\n                UserFormat::Name,\n                GroupFormat::Smart,\n                user_file\n            )\n        );\n\n        let expected = TextCell::paint_str(TestColours.yours(), \":\");\n        assert_eq!(\n            expected,\n            user_group.render(\n                &TestColours,\n                &users,\n                UserFormat::Numeric,\n                GroupFormat::Smart,\n                user_file\n            )\n        );\n\n        let http_group = Some(f::Group(101));\n        let expected = TextCell::paint_str(TestColours.not_yours(), \"http\");\n        assert_eq!(\n            expected,\n            http_group.render(\n                &TestColours,\n                &users,\n                UserFormat::Name,\n                GroupFormat::Smart,\n                user_file\n            )\n        );\n\n        let http_file = Some(f::User(1001));\n        let expected = TextCell::paint_str(TestColours.not_yours(), \":\");\n        assert_eq!(\n            expected,\n            http_group.render(\n                &TestColours,\n                &users,\n                UserFormat::Name,\n                GroupFormat::Smart,\n                http_file\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "src/output/render/inode.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse nu_ansi_term::Style;\n\nuse crate::fs::fields as f;\nuse crate::output::cell::TextCell;\n\nimpl f::Inode {\n    #[must_use]\n    pub fn render(self, style: Style) -> TextCell {\n        TextCell::paint(style, self.0.to_string())\n    }\n}\n\n#[cfg(test)]\npub mod test {\n    use crate::fs::fields as f;\n    use crate::output::cell::TextCell;\n\n    use nu_ansi_term::Color::*;\n\n    #[test]\n    fn blocklessness() {\n        let io = f::Inode(1_414_213);\n        let expected = TextCell::paint_str(Cyan.underline(), \"1414213\");\n        assert_eq!(expected, io.render(Cyan.underline()));\n    }\n}\n"
  },
  {
    "path": "src/output/render/links.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n#[cfg(unix)]\nuse locale::Numeric as NumericLocale;\nuse nu_ansi_term::Style;\n\n#[cfg(unix)]\nuse crate::fs::fields as f;\n#[cfg(unix)]\nuse crate::output::cell::TextCell;\n\n#[cfg(unix)]\nimpl f::Links {\n    pub fn render<C: Colours>(&self, colours: &C, numeric: &NumericLocale) -> TextCell {\n        let style = if self.multiple {\n            colours.multi_link_file()\n        } else {\n            colours.normal()\n        };\n\n        TextCell::paint(style, numeric.format_int(self.count))\n    }\n}\n\n#[allow(unused)]\npub trait Colours {\n    fn normal(&self) -> Style;\n    fn multi_link_file(&self) -> Style;\n}\n\n#[cfg(test)]\npub mod test {\n    use super::Colours;\n    #[cfg(unix)]\n    use crate::fs::fields as f;\n    #[cfg(unix)]\n    use crate::output::cell::{DisplayWidth, TextCell};\n\n    #[cfg(unix)]\n    use locale;\n    use nu_ansi_term::Color::*;\n    use nu_ansi_term::Style;\n\n    #[allow(dead_code)]\n    struct TestColours;\n\n    impl Colours for TestColours {\n        fn normal(&self) -> Style {\n            Blue.normal()\n        }\n        fn multi_link_file(&self) -> Style {\n            Blue.on(Red)\n        }\n    }\n\n    #[test]\n    #[cfg(unix)]\n    fn regular_file() {\n        let stati = f::Links {\n            count: 1,\n            multiple: false,\n        };\n\n        let expected = TextCell {\n            width: DisplayWidth::from(1),\n            contents: vec![Blue.paint(\"1\")].into(),\n        };\n\n        assert_eq!(\n            expected,\n            stati.render(&TestColours, &locale::Numeric::english())\n        );\n    }\n\n    #[test]\n    #[cfg(unix)]\n    fn regular_directory() {\n        let stati = f::Links {\n            count: 3005,\n            multiple: false,\n        };\n\n        let expected = TextCell {\n            width: DisplayWidth::from(5),\n            contents: vec![Blue.paint(\"3,005\")].into(),\n        };\n\n        assert_eq!(\n            expected,\n            stati.render(&TestColours, &locale::Numeric::english())\n        );\n    }\n\n    #[test]\n    #[cfg(unix)]\n    fn popular_file() {\n        let stati = f::Links {\n            count: 3005,\n            multiple: true,\n        };\n\n        let expected = TextCell {\n            width: DisplayWidth::from(5),\n            contents: vec![Blue.on(Red).paint(\"3,005\")].into(),\n        };\n\n        assert_eq!(\n            expected,\n            stati.render(&TestColours, &locale::Numeric::english())\n        );\n    }\n}\n"
  },
  {
    "path": "src/output/render/mod.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n#[cfg(unix)]\nmod blocks;\n#[cfg(unix)]\npub use self::blocks::Colours as BlocksColours;\n\nmod filetype;\npub use self::filetype::Colours as FiletypeColours;\n\nmod git;\npub use self::git::Colours as GitColours;\npub use self::git::RepoColours as GitRepoColours;\n\n#[cfg(unix)]\nmod groups;\n#[cfg(unix)]\npub use self::groups::{Colours as GroupColours, Render as GroupRender};\n\n#[cfg(unix)]\nmod inode;\n// inode uses just one colour\n\nmod links;\npub use self::links::Colours as LinksColours;\n\nmod permissions;\npub use self::permissions::{Colours as PermissionsColours, PermissionsPlusRender};\n#[cfg(unix)]\nmod permissions_unix;\n#[cfg(windows)]\nmod permissions_windows;\n\nmod size;\npub use self::size::Colours as SizeColours;\n\nmod times;\npub use self::times::Render as TimeRender;\n// times does too\n\n#[cfg(unix)]\nmod users;\n#[cfg(unix)]\npub use self::users::Colours as UserColours;\n#[cfg(unix)]\npub use self::users::Render as UserRender;\n\n#[cfg(unix)]\nmod octal;\n#[cfg(unix)]\npub use self::octal::Render as OctalPermissionsRender;\n// octal uses just one colour\n\nmod securityctx;\npub use self::securityctx::Colours as SecurityCtxColours;\n\n#[cfg(any(\n    target_os = \"macos\",\n    target_os = \"freebsd\",\n    target_os = \"netbsd\",\n    target_os = \"openbsd\",\n    target_os = \"dragonfly\"\n))]\nmod flags_bsd;\n\n#[cfg(windows)]\nmod flags_windows;\n\n#[cfg(not(any(\n    target_os = \"macos\",\n    target_os = \"freebsd\",\n    target_os = \"netbsd\",\n    target_os = \"openbsd\",\n    target_os = \"dragonfly\",\n    target_os = \"windows\"\n)))]\nmod flags;\n"
  },
  {
    "path": "src/output/render/octal.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse nu_ansi_term::Style;\n\nuse crate::fs::fields as f;\nuse crate::output::cell::TextCell;\n\npub trait Render {\n    fn render(&self, style: Style) -> TextCell;\n}\n\nimpl Render for Option<f::OctalPermissions> {\n    fn render(&self, style: Style) -> TextCell {\n        match self {\n            Some(p) => {\n                let perm = &p.permissions;\n                #[rustfmt::skip]\n                let octal_sticky = f::OctalPermissions::bits_to_octal(\n                    perm.setuid,\n                    perm.setgid,\n                    perm.sticky\n                );\n                let octal_owner = f::OctalPermissions::bits_to_octal(\n                    perm.user_read,\n                    perm.user_write,\n                    perm.user_execute,\n                );\n                let octal_group = f::OctalPermissions::bits_to_octal(\n                    perm.group_read,\n                    perm.group_write,\n                    perm.group_execute,\n                );\n                let octal_other = f::OctalPermissions::bits_to_octal(\n                    perm.other_read,\n                    perm.other_write,\n                    perm.other_execute,\n                );\n\n                TextCell::paint(\n                    style,\n                    format!(\"{octal_sticky}{octal_owner}{octal_group}{octal_other}\"),\n                )\n            }\n            None => TextCell::paint(style, \"----\".into()),\n        }\n    }\n}\n\nimpl f::OctalPermissions {\n    fn bits_to_octal(r: bool, w: bool, x: bool) -> u8 {\n        u8::from(r) * 4 + u8::from(w) * 2 + u8::from(x)\n    }\n}\n\n#[cfg(test)]\npub mod test {\n    use super::Render;\n    use crate::fs::fields as f;\n    use crate::output::cell::TextCell;\n\n    use nu_ansi_term::Color::*;\n\n    #[test]\n    fn normal_folder() {\n        let bits = f::Permissions {\n            user_read: true,\n            user_write: true,\n            user_execute: true,\n            setuid: false,\n            group_read: true,\n            group_write: false,\n            group_execute: true,\n            setgid: false,\n            other_read: true,\n            other_write: false,\n            other_execute: true,\n            sticky: false,\n        };\n\n        let octal = Some(f::OctalPermissions { permissions: bits });\n\n        let expected = TextCell::paint_str(Purple.bold(), \"0755\");\n        assert_eq!(expected, octal.render(Purple.bold()));\n    }\n\n    #[test]\n    fn normal_file() {\n        let bits = f::Permissions {\n            user_read: true,\n            user_write: true,\n            user_execute: false,\n            setuid: false,\n            group_read: true,\n            group_write: false,\n            group_execute: false,\n            setgid: false,\n            other_read: true,\n            other_write: false,\n            other_execute: false,\n            sticky: false,\n        };\n\n        let octal = Some(f::OctalPermissions { permissions: bits });\n\n        let expected = TextCell::paint_str(Purple.bold(), \"0644\");\n        assert_eq!(expected, octal.render(Purple.bold()));\n    }\n\n    #[test]\n    fn secret_file() {\n        let bits = f::Permissions {\n            user_read: true,\n            user_write: true,\n            user_execute: false,\n            setuid: false,\n            group_read: false,\n            group_write: false,\n            group_execute: false,\n            setgid: false,\n            other_read: false,\n            other_write: false,\n            other_execute: false,\n            sticky: false,\n        };\n\n        let octal = Some(f::OctalPermissions { permissions: bits });\n\n        let expected = TextCell::paint_str(Purple.bold(), \"0600\");\n        assert_eq!(expected, octal.render(Purple.bold()));\n    }\n\n    #[test]\n    fn sticky1() {\n        let bits = f::Permissions {\n            user_read: true,\n            user_write: true,\n            user_execute: true,\n            setuid: true,\n            group_read: true,\n            group_write: true,\n            group_execute: true,\n            setgid: false,\n            other_read: true,\n            other_write: true,\n            other_execute: true,\n            sticky: false,\n        };\n\n        let octal = Some(f::OctalPermissions { permissions: bits });\n\n        let expected = TextCell::paint_str(Purple.bold(), \"4777\");\n        assert_eq!(expected, octal.render(Purple.bold()));\n    }\n\n    #[test]\n    fn sticky2() {\n        let bits = f::Permissions {\n            user_read: true,\n            user_write: true,\n            user_execute: true,\n            setuid: false,\n            group_read: true,\n            group_write: true,\n            group_execute: true,\n            setgid: true,\n            other_read: true,\n            other_write: true,\n            other_execute: true,\n            sticky: false,\n        };\n\n        let octal = Some(f::OctalPermissions { permissions: bits });\n\n        let expected = TextCell::paint_str(Purple.bold(), \"2777\");\n        assert_eq!(expected, octal.render(Purple.bold()));\n    }\n\n    #[test]\n    fn sticky3() {\n        let bits = f::Permissions {\n            user_read: true,\n            user_write: true,\n            user_execute: true,\n            setuid: false,\n            group_read: true,\n            group_write: true,\n            group_execute: true,\n            setgid: false,\n            other_read: true,\n            other_write: true,\n            other_execute: true,\n            sticky: true,\n        };\n\n        let octal = Some(f::OctalPermissions { permissions: bits });\n\n        let expected = TextCell::paint_str(Purple.bold(), \"1777\");\n        assert_eq!(expected, octal.render(Purple.bold()));\n    }\n}\n"
  },
  {
    "path": "src/output/render/permissions.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n\nuse crate::output::cell::TextCell;\nuse crate::output::render::FiletypeColours;\n\nuse nu_ansi_term::Style;\n\npub trait PermissionsPlusRender {\n    fn render<C: Colours + FiletypeColours>(&self, colours: &C) -> TextCell;\n}\n\npub trait Colours {\n    fn dash(&self) -> Style;\n\n    fn user_read(&self) -> Style;\n    fn user_write(&self) -> Style;\n    fn user_execute_file(&self) -> Style;\n    fn user_execute_other(&self) -> Style;\n\n    fn group_read(&self) -> Style;\n    fn group_write(&self) -> Style;\n    fn group_execute(&self) -> Style;\n\n    fn other_read(&self) -> Style;\n    fn other_write(&self) -> Style;\n    fn other_execute(&self) -> Style;\n\n    fn special_user_file(&self) -> Style;\n    fn special_other(&self) -> Style;\n\n    fn attribute(&self) -> Style;\n}\n"
  },
  {
    "path": "src/output/render/permissions_unix.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse std::iter;\n\nuse super::{PermissionsColours as Colours, PermissionsPlusRender};\nuse crate::fs::fields as f;\nuse crate::output::cell::{DisplayWidth, TextCell};\nuse crate::output::render::FiletypeColours;\n\nuse nu_ansi_term::{AnsiString as ANSIString, Style};\n\nimpl PermissionsPlusRender for Option<f::PermissionsPlus> {\n    fn render<C: Colours + FiletypeColours>(&self, colours: &C) -> TextCell {\n        if let Some(p) = self {\n            let mut chars = vec![p.file_type.render(colours)];\n            let permissions = p.permissions;\n            chars.extend(Some(permissions).render(colours, p.file_type.is_regular_file()));\n\n            if p.xattrs {\n                chars.push(colours.attribute().paint(\"@\"));\n            }\n\n            // As these are all ASCII characters, we can guarantee that they’re\n            // all going to be one character wide, and don’t need to compute the\n            // cell’s display width.\n            TextCell {\n                width: DisplayWidth::from(chars.len()),\n                contents: chars.into(),\n            }\n        } else {\n            let chars: Vec<_> = iter::repeat_n(colours.dash().paint(\"-\"), 10).collect();\n            TextCell {\n                width: DisplayWidth::from(chars.len()),\n                contents: chars.into(),\n            }\n        }\n    }\n}\n\npub trait RenderPermissions {\n    fn render<C: Colours>(&self, colours: &C, is_regular_file: bool) -> Vec<ANSIString<'static>>;\n}\n\nimpl RenderPermissions for Option<f::Permissions> {\n    fn render<C: Colours>(&self, colours: &C, is_regular_file: bool) -> Vec<ANSIString<'static>> {\n        match self {\n            Some(p) => {\n                let bit = |bit, chr: &'static str, style: Style| {\n                    if bit {\n                        style.paint(chr)\n                    } else {\n                        colours.dash().paint(\"-\")\n                    }\n                };\n\n                vec![\n                    bit(p.user_read, \"r\", colours.user_read()),\n                    bit(p.user_write, \"w\", colours.user_write()),\n                    p.user_execute_bit(colours, is_regular_file),\n                    bit(p.group_read, \"r\", colours.group_read()),\n                    bit(p.group_write, \"w\", colours.group_write()),\n                    p.group_execute_bit(colours),\n                    bit(p.other_read, \"r\", colours.other_read()),\n                    bit(p.other_write, \"w\", colours.other_write()),\n                    p.other_execute_bit(colours),\n                ]\n            }\n            None => std::iter::repeat_n(colours.dash().paint(\"-\"), 9).collect(),\n        }\n    }\n}\n\nimpl f::Permissions {\n    fn user_execute_bit<C: Colours>(\n        &self,\n        colours: &C,\n        is_regular_file: bool,\n    ) -> ANSIString<'static> {\n        #[rustfmt::skip]\n        return match (self.user_execute, self.setuid, is_regular_file) {\n            (false, false, _)      => colours.dash().paint(\"-\"),\n            (true,  false, false)  => colours.user_execute_other().paint(\"x\"),\n            (true,  false, true)   => colours.user_execute_file().paint(\"x\"),\n            (false, true,  _)      => colours.special_other().paint(\"S\"),\n            (true,  true,  false)  => colours.special_other().paint(\"s\"),\n            (true,  true,  true)   => colours.special_user_file().paint(\"s\"),\n        };\n    }\n\n    fn group_execute_bit<C: Colours>(&self, colours: &C) -> ANSIString<'static> {\n        #[rustfmt::skip]\n        return match (self.group_execute, self.setgid) {\n            (false, false)  => colours.dash().paint(\"-\"),\n            (true,  false)  => colours.group_execute().paint(\"x\"),\n            (false, true)   => colours.special_other().paint(\"S\"),\n            (true,  true)   => colours.special_other().paint(\"s\"),\n        };\n    }\n\n    fn other_execute_bit<C: Colours>(&self, colours: &C) -> ANSIString<'static> {\n        #[rustfmt::skip]\n        return match (self.other_execute, self.sticky) {\n            (false, false)  => colours.dash().paint(\"-\"),\n            (true,  false)  => colours.other_execute().paint(\"x\"),\n            (false, true)   => colours.special_other().paint(\"T\"),\n            (true,  true)   => colours.special_other().paint(\"t\"),\n        };\n    }\n}\n\n#[cfg(test)]\n#[allow(unused_results)]\npub mod test {\n    use nu_ansi_term::Color::*;\n    use nu_ansi_term::Style;\n\n    use super::*;\n    use crate::output::cell::TextCellContents;\n\n    struct TestColours;\n\n    #[rustfmt::skip]\n    impl Colours for TestColours {\n        fn dash(&self)                -> Style { Fixed(11).normal() }\n        fn user_read(&self)           -> Style { Fixed(101).normal() }\n        fn user_write(&self)          -> Style { Fixed(102).normal() }\n        fn user_execute_file(&self)   -> Style { Fixed(103).normal() }\n        fn user_execute_other(&self)  -> Style { Fixed(113).normal() }\n        fn group_read(&self)          -> Style { Fixed(104).normal() }\n        fn group_write(&self)         -> Style { Fixed(105).normal() }\n        fn group_execute(&self)       -> Style { Fixed(106).normal() }\n        fn other_read(&self)          -> Style { Fixed(107).normal() }\n        fn other_write(&self)         -> Style { Fixed(108).normal() }\n        fn other_execute(&self)       -> Style { Fixed(109).normal() }\n        fn special_user_file(&self)   -> Style { Fixed(110).normal() }\n        fn special_other(&self)       -> Style { Fixed(111).normal() }\n        fn attribute(&self)           -> Style { Fixed(112).normal() }\n    }\n\n    #[test]\n    #[cfg(unix)]\n    fn negate() {\n        let bits = Some(f::Permissions {\n            user_read: false,\n            user_write: false,\n            user_execute: false,\n            setuid: false,\n            group_read: false,\n            group_write: false,\n            group_execute: false,\n            setgid: false,\n            other_read: false,\n            other_write: false,\n            other_execute: false,\n            sticky: false,\n        });\n\n        let expected = TextCellContents::from(vec![\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n        ]);\n\n        assert_eq!(expected, bits.render(&TestColours, false).into());\n    }\n\n    #[test]\n    #[cfg(unix)]\n    fn affirm() {\n        let bits = Some(f::Permissions {\n            user_read: true,\n            user_write: true,\n            user_execute: true,\n            setuid: false,\n            group_read: true,\n            group_write: true,\n            group_execute: true,\n            setgid: false,\n            other_read: true,\n            other_write: true,\n            other_execute: true,\n            sticky: false,\n        });\n\n        let expected = TextCellContents::from(vec![\n            Fixed(101).paint(\"r\"),\n            Fixed(102).paint(\"w\"),\n            Fixed(103).paint(\"x\"),\n            Fixed(104).paint(\"r\"),\n            Fixed(105).paint(\"w\"),\n            Fixed(106).paint(\"x\"),\n            Fixed(107).paint(\"r\"),\n            Fixed(108).paint(\"w\"),\n            Fixed(109).paint(\"x\"),\n        ]);\n\n        assert_eq!(expected, bits.render(&TestColours, true).into());\n    }\n\n    #[test]\n    fn specials() {\n        let bits = Some(f::Permissions {\n            user_read: false,\n            user_write: false,\n            user_execute: true,\n            setuid: true,\n            group_read: false,\n            group_write: false,\n            group_execute: true,\n            setgid: true,\n            other_read: false,\n            other_write: false,\n            other_execute: true,\n            sticky: true,\n        });\n\n        let expected = TextCellContents::from(vec![\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(110).paint(\"s\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(111).paint(\"s\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(111).paint(\"t\"),\n        ]);\n\n        assert_eq!(expected, bits.render(&TestColours, true).into());\n    }\n\n    #[test]\n    fn extra_specials() {\n        let bits = Some(f::Permissions {\n            user_read: false,\n            user_write: false,\n            user_execute: false,\n            setuid: true,\n            group_read: false,\n            group_write: false,\n            group_execute: false,\n            setgid: true,\n            other_read: false,\n            other_write: false,\n            other_execute: false,\n            sticky: true,\n        });\n\n        let expected = TextCellContents::from(vec![\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(111).paint(\"S\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(111).paint(\"S\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(11).paint(\"-\"),\n            Fixed(111).paint(\"T\"),\n        ]);\n\n        assert_eq!(expected, bits.render(&TestColours, true).into());\n    }\n}\n"
  },
  {
    "path": "src/output/render/permissions_windows.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse crate::fs::fields as f;\nuse crate::output::cell::{DisplayWidth, TextCell};\nuse crate::output::render::FiletypeColours;\n\nuse super::{PermissionsColours as Colours, PermissionsPlusRender};\n\nuse nu_ansi_term::{AnsiString as ANSIString, Style};\n\nimpl PermissionsPlusRender for Option<f::PermissionsPlus> {\n    fn render<C: Colours + FiletypeColours>(&self, colours: &C) -> TextCell {\n        match self {\n            Some(p) => {\n                let mut chars = vec![p.attributes.render_type(colours)];\n                chars.extend(p.attributes.render(colours));\n\n                TextCell {\n                    width: DisplayWidth::from(chars.len()),\n                    contents: chars.into(),\n                }\n            }\n            None => TextCell {\n                width: DisplayWidth::from(0),\n                contents: vec![].into(),\n            },\n        }\n    }\n}\n\nimpl f::Attributes {\n    pub fn render<C: Colours + FiletypeColours>(self, colours: &C) -> Vec<ANSIString<'static>> {\n        let bit = |bit, chr: &'static str, style: Style| {\n            if bit {\n                style.paint(chr)\n            } else {\n                colours.dash().paint(\"-\")\n            }\n        };\n\n        vec![\n            bit(self.archive, \"a\", colours.normal()),\n            bit(self.readonly, \"r\", colours.user_read()),\n            bit(self.hidden, \"h\", colours.special_user_file()),\n            bit(self.system, \"s\", colours.special_other()),\n        ]\n    }\n\n    pub fn render_type<C: Colours + FiletypeColours>(self, colours: &C) -> ANSIString<'static> {\n        if self.reparse_point {\n            return colours.pipe().paint(\"l\");\n        } else if self.directory {\n            return colours.directory().paint(\"d\");\n        }\n        colours.dash().paint(\"-\")\n    }\n}\n"
  },
  {
    "path": "src/output/render/securityctx.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse nu_ansi_term::Style;\n\nuse crate::fs::fields as f;\nuse crate::output::cell::{DisplayWidth, TextCell};\n\nimpl f::SecurityContext<'_> {\n    pub fn render<C: Colours>(&self, colours: &C) -> TextCell {\n        match &self.context {\n            f::SecurityContextType::None => TextCell::paint_str(colours.none(), \"?\"),\n            f::SecurityContextType::SELinux(context) => {\n                let mut chars = Vec::with_capacity(7);\n\n                for (i, part) in context.split(':').enumerate() {\n                    let partcolour = match i {\n                        0 => colours.selinux_user(),\n                        1 => colours.selinux_role(),\n                        2 => colours.selinux_type(),\n                        _ => colours.selinux_range(),\n                    };\n                    if i > 0 {\n                        chars.push(colours.selinux_colon().paint(\":\"));\n                    }\n                    chars.push(partcolour.paint(String::from(part)));\n                }\n\n                TextCell {\n                    contents: chars.into(),\n                    width: DisplayWidth::from(context.len()),\n                }\n            }\n        }\n    }\n}\n\n#[rustfmt::skip]\npub trait Colours {\n    fn none(&self) -> Style;\n    fn selinux_colon(&self) -> Style;\n    fn selinux_user(&self)  -> Style;\n    fn selinux_role(&self)  -> Style;\n    fn selinux_type(&self)  -> Style;\n    fn selinux_range(&self) -> Style;\n}\n"
  },
  {
    "path": "src/output/render/size.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse locale::Numeric as NumericLocale;\nuse nu_ansi_term::Style;\nuse unit_prefix::Prefix;\n\nuse crate::fs::fields as f;\nuse crate::output::cell::{DisplayWidth, TextCell};\nuse crate::output::color_scale::{ColorScaleInformation, ColorScaleMode};\nuse crate::output::table::SizeFormat;\n\nimpl f::Size {\n    pub fn render<C: Colours>(\n        self,\n        colours: &C,\n        size_format: SizeFormat,\n        numerics: &NumericLocale,\n        color_scale_info: Option<ColorScaleInformation>,\n    ) -> TextCell {\n        use unit_prefix::NumberPrefix;\n\n        let size = match self {\n            Self::Some(s) => s,\n            Self::None => return TextCell::blank(colours.no_size()),\n            Self::DeviceIDs(ref ids) => return ids.render(colours),\n        };\n\n        let is_gradient_mode =\n            color_scale_info.is_some_and(|csi| csi.options.mode == ColorScaleMode::Gradient);\n\n        #[rustfmt::skip]\n        let result = match size_format {\n            SizeFormat::DecimalBytes  => NumberPrefix::decimal(size as f64),\n            SizeFormat::BinaryBytes   => NumberPrefix::binary(size as f64),\n            SizeFormat::JustBytes     => {\n                // Use the binary prefix to select a style.\n                let prefix = match NumberPrefix::binary(size as f64) {\n                    NumberPrefix::Standalone(_) => None,\n                    NumberPrefix::Prefixed(p, _) => Some(p),\n                };\n\n                // But format the number directly using the locale.\n                let string = numerics.format_int(size);\n\n                return if is_gradient_mode {\n                    let csi = color_scale_info.unwrap();\n                    TextCell::paint(\n                        csi.adjust_style(colours.size(prefix), size as f32, csi.size),\n                        string,\n                    )\n                } else {\n                    TextCell::paint(colours.size(prefix), string)\n                }\n            }\n        };\n\n        #[rustfmt::skip]\n        let (prefix, n) = match result {\n            NumberPrefix::Standalone(b) => {\n                return if is_gradient_mode {\n                    let csi = color_scale_info.unwrap();\n                    TextCell::paint(\n                        csi.adjust_style(colours.size(None), size as f32, csi.size),\n                        numerics.format_int(b),\n                    )\n                } else {\n                    TextCell::paint(colours.size(None), numerics.format_int(b))\n                }\n            }\n            NumberPrefix::Prefixed(p, n)  => (p, n),\n        };\n\n        let symbol = prefix.symbol();\n        let number = if n < 10_f64 {\n            numerics.format_float(n, 1)\n        } else {\n            numerics.format_int(n.round() as isize)\n        };\n\n        TextCell {\n            // symbol is guaranteed to be ASCII since unit prefixes are hardcoded.\n            width: DisplayWidth::from(&*number) + symbol.len(),\n            contents: if is_gradient_mode {\n                let csi = color_scale_info.unwrap();\n                vec![\n                    csi.adjust_style(colours.size(Some(prefix)), size as f32, csi.size)\n                        .paint(number),\n                    csi.adjust_style(colours.size(Some(prefix)), size as f32, csi.size)\n                        .paint(symbol),\n                ]\n            } else {\n                vec![\n                    colours.size(Some(prefix)).paint(number),\n                    colours.unit(Some(prefix)).paint(symbol),\n                ]\n            }\n            .into(),\n        }\n    }\n}\n\nimpl f::DeviceIDs {\n    fn render<C: Colours>(self, colours: &C) -> TextCell {\n        let major = self.major.to_string();\n        let minor = self.minor.to_string();\n\n        TextCell {\n            width: DisplayWidth::from(major.len() + 1 + minor.len()),\n            contents: vec![\n                colours.major().paint(major),\n                colours.comma().paint(\",\"),\n                colours.minor().paint(minor),\n            ]\n            .into(),\n        }\n    }\n}\n\npub trait Colours {\n    fn size(&self, prefix: Option<Prefix>) -> Style;\n    fn unit(&self, prefix: Option<Prefix>) -> Style;\n    fn no_size(&self) -> Style;\n\n    fn major(&self) -> Style;\n    fn comma(&self) -> Style;\n    fn minor(&self) -> Style;\n}\n\n#[cfg(test)]\npub mod test {\n    use super::Colours;\n    use crate::fs::fields as f;\n    use crate::output::cell::{DisplayWidth, TextCell};\n    use crate::output::table::SizeFormat;\n\n    use locale::Numeric as NumericLocale;\n    use nu_ansi_term::Color::*;\n    use nu_ansi_term::Style;\n    use unit_prefix::Prefix;\n\n    struct TestColours;\n\n    #[rustfmt::skip]\n    impl Colours for TestColours {\n        fn size(&self, _prefix: Option<Prefix>) -> Style { Fixed(66).normal() }\n        fn unit(&self, _prefix: Option<Prefix>) -> Style { Fixed(77).bold() }\n        fn no_size(&self)                       -> Style { Black.italic() }\n\n        fn major(&self) -> Style { Blue.on(Red) }\n        fn comma(&self) -> Style { Green.italic() }\n        fn minor(&self) -> Style { Cyan.on(Yellow) }\n    }\n\n    #[test]\n    fn directory() {\n        let directory = f::Size::None;\n        let expected = TextCell::blank(Black.italic());\n        assert_eq!(\n            expected,\n            directory.render(\n                &TestColours,\n                SizeFormat::JustBytes,\n                &NumericLocale::english(),\n                None\n            )\n        );\n    }\n\n    #[test]\n    fn file_decimal() {\n        let directory = f::Size::Some(2_100_000);\n        let expected = TextCell {\n            width: DisplayWidth::from(4),\n            contents: vec![Fixed(66).paint(\"2.1\"), Fixed(77).bold().paint(\"M\")].into(),\n        };\n\n        assert_eq!(\n            expected,\n            directory.render(\n                &TestColours,\n                SizeFormat::DecimalBytes,\n                &NumericLocale::english(),\n                None\n            )\n        );\n    }\n\n    #[test]\n    fn file_binary() {\n        let directory = f::Size::Some(1_048_576);\n        let expected = TextCell {\n            width: DisplayWidth::from(5),\n            contents: vec![Fixed(66).paint(\"1.0\"), Fixed(77).bold().paint(\"Mi\")].into(),\n        };\n\n        assert_eq!(\n            expected,\n            directory.render(\n                &TestColours,\n                SizeFormat::BinaryBytes,\n                &NumericLocale::english(),\n                None\n            )\n        );\n    }\n\n    #[test]\n    fn file_bytes() {\n        let directory = f::Size::Some(1_048_576);\n        let expected = TextCell {\n            width: DisplayWidth::from(9),\n            contents: vec![Fixed(66).paint(\"1,048,576\")].into(),\n        };\n\n        assert_eq!(\n            expected,\n            directory.render(\n                &TestColours,\n                SizeFormat::JustBytes,\n                &NumericLocale::english(),\n                None\n            )\n        );\n    }\n\n    #[test]\n    fn device_ids() {\n        let directory = f::Size::DeviceIDs(f::DeviceIDs {\n            major: 10,\n            minor: 80,\n        });\n        let expected = TextCell {\n            width: DisplayWidth::from(5),\n            contents: vec![\n                Blue.on(Red).paint(\"10\"),\n                Green.italic().paint(\",\"),\n                Cyan.on(Yellow).paint(\"80\"),\n            ]\n            .into(),\n        };\n\n        assert_eq!(\n            expected,\n            directory.render(\n                &TestColours,\n                SizeFormat::JustBytes,\n                &NumericLocale::english(),\n                None\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "src/output/render/times.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse crate::output::cell::TextCell;\nuse crate::output::time::TimeFormat;\n\nuse chrono::prelude::*;\nuse nu_ansi_term::Style;\n\npub trait Render {\n    fn render(self, style: Style, time_offset: FixedOffset, time_format: TimeFormat) -> TextCell;\n}\n\nimpl Render for Option<NaiveDateTime> {\n    fn render(self, style: Style, time_offset: FixedOffset, time_format: TimeFormat) -> TextCell {\n        let datestamp = if let Some(time) = self {\n            time_format.format(&DateTime::<FixedOffset>::from_naive_utc_and_offset(\n                time,\n                time_offset,\n            ))\n        } else {\n            String::from(\"-\")\n        };\n\n        TextCell::paint(style, datestamp)\n    }\n}\n"
  },
  {
    "path": "src/output/render/users.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse nu_ansi_term::Style;\nuse uzers::Users;\n\nuse crate::fs::fields as f;\nuse crate::output::cell::TextCell;\nuse crate::output::table::UserFormat;\n\npub trait Render {\n    fn render<C: Colours, U: Users>(self, colours: &C, users: &U, format: UserFormat) -> TextCell;\n}\n\nimpl Render for Option<f::User> {\n    fn render<C: Colours, U: Users>(self, colours: &C, users: &U, format: UserFormat) -> TextCell {\n        #[rustfmt::skip]\n        let uid = match self {\n            Some(u) => u.0,\n            None    => return TextCell::blank(colours.no_user()),\n        };\n        #[rustfmt::skip]\n        let user_name = match (format, users.get_user_by_uid(uid)) {\n            (_, None)                      => uid.to_string(),\n            (UserFormat::Numeric, _)       => uid.to_string(),\n            (UserFormat::Name, Some(user)) => user.name().to_string_lossy().into(),\n        };\n\n        let style = if users.get_current_uid() == uid {\n            colours.you()\n        } else if uid == 0 {\n            colours.root()\n        } else {\n            colours.other()\n        };\n        TextCell::paint(style, user_name)\n    }\n}\n\npub trait Colours {\n    fn you(&self) -> Style;\n    fn other(&self) -> Style;\n    fn root(&self) -> Style;\n    fn no_user(&self) -> Style;\n}\n\n#[cfg(test)]\n#[allow(unused_results)]\npub mod test {\n    use super::{Colours, Render};\n    use crate::fs::fields as f;\n    use crate::output::cell::TextCell;\n    use crate::output::table::UserFormat;\n\n    use nu_ansi_term::Color::*;\n    use nu_ansi_term::Style;\n    use uzers::User;\n    use uzers::mock::MockUsers;\n\n    struct TestColours;\n\n    #[rustfmt::skip]\n    impl Colours for TestColours {\n        fn you(&self)          -> Style { Red.bold() }\n        fn other(&self) -> Style { Blue.underline() }\n        fn root(&self)         -> Style { Blue.underline() }\n        fn no_user(&self)      -> Style { Black.italic() }\n    }\n\n    #[test]\n    fn named() {\n        let mut users = MockUsers::with_current_uid(1000);\n        users.add_user(User::new(1000, \"enoch\", 100));\n\n        let user = Some(f::User(1000));\n        let expected = TextCell::paint_str(Red.bold(), \"enoch\");\n        #[rustfmt::skip]\n        assert_eq!(expected, user.render(&TestColours, &users, UserFormat::Name));\n\n        let expected = TextCell::paint_str(Red.bold(), \"1000\");\n        #[rustfmt::skip]\n        assert_eq!(expected, user.render(&TestColours, &users, UserFormat::Numeric));\n    }\n\n    #[test]\n    fn unnamed() {\n        let users = MockUsers::with_current_uid(1000);\n\n        let user = Some(f::User(1000));\n        let expected = TextCell::paint_str(Red.bold(), \"1000\");\n        #[rustfmt::skip]\n        assert_eq!(expected, user.render(&TestColours, &users, UserFormat::Name));\n        #[rustfmt::skip]\n        assert_eq!(expected, user.render(&TestColours, &users, UserFormat::Numeric));\n    }\n\n    #[test]\n    fn different_named() {\n        let mut users = MockUsers::with_current_uid(0);\n        users.add_user(User::new(1000, \"enoch\", 100));\n\n        let user = Some(f::User(1000));\n        let expected = TextCell::paint_str(Blue.underline(), \"enoch\");\n        assert_eq!(\n            expected,\n            user.render(&TestColours, &users, UserFormat::Name)\n        );\n    }\n\n    #[test]\n    fn different_unnamed() {\n        let user = Some(f::User(1000));\n        let expected = TextCell::paint_str(Blue.underline(), \"1000\");\n        assert_eq!(\n            expected,\n            user.render(\n                &TestColours,\n                &MockUsers::with_current_uid(0),\n                UserFormat::Numeric\n            )\n        );\n    }\n\n    #[test]\n    fn overflow() {\n        let user = Some(f::User(2_147_483_648));\n        let expected = TextCell::paint_str(Blue.underline(), \"2147483648\");\n        assert_eq!(\n            expected,\n            user.render(\n                &TestColours,\n                &MockUsers::with_current_uid(0),\n                UserFormat::Numeric\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "src/output/table.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse std::cmp::max;\nuse std::ops::Deref;\n#[cfg(unix)]\nuse std::sync::{Mutex, MutexGuard};\n\nuse chrono::prelude::*;\n\nuse log::debug;\nuse std::sync::LazyLock;\n#[cfg(unix)]\nuse uzers::UsersCache;\n\nuse crate::fs::feature::git::GitCache;\nuse crate::fs::{File, fields as f};\nuse crate::options::Vars;\nuse crate::options::vars::EZA_WINDOWS_ATTRIBUTES;\nuse crate::output::cell::TextCell;\nuse crate::output::color_scale::ColorScaleInformation;\n#[cfg(unix)]\nuse crate::output::render::{GroupRender, OctalPermissionsRender, UserRender};\nuse crate::output::render::{PermissionsPlusRender, TimeRender};\nuse crate::output::time::TimeFormat;\nuse crate::theme::Theme;\n\nuse super::color_scale::ColorScaleMode;\n\n/// Options for displaying a table.\n#[derive(PartialEq, Eq, Debug)]\npub struct Options {\n    pub size_format: SizeFormat,\n    pub time_format: TimeFormat,\n    pub user_format: UserFormat,\n    pub group_format: GroupFormat,\n    pub flags_format: FlagsFormat,\n    pub columns: Columns,\n}\n\n/// Extra columns to display in the table.\n#[allow(clippy::struct_excessive_bools)]\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub struct Columns {\n    /// At least one of these timestamps will be shown.\n    pub time_types: TimeTypes,\n\n    // The rest are just on/off\n    pub inode: bool,\n    pub links: bool,\n    pub blocksize: bool,\n    pub group: bool,\n    pub git: bool,\n    pub subdir_git_repos: bool,\n    pub subdir_git_repos_no_stat: bool,\n    pub octal: bool,\n    pub security_context: bool,\n    pub file_flags: bool,\n\n    // Defaults to true:\n    pub permissions: bool,\n    pub filesize: bool,\n    pub user: bool,\n}\n\nimpl Columns {\n    #[must_use]\n    pub fn collect(&self, actually_enable_git: bool, git_repos: bool) -> Vec<Column> {\n        let mut columns = Vec::with_capacity(4);\n\n        if self.inode {\n            #[cfg(unix)]\n            columns.push(Column::Inode);\n        }\n\n        if self.octal {\n            #[cfg(unix)]\n            columns.push(Column::Octal);\n        }\n\n        if self.permissions {\n            columns.push(Column::Permissions);\n        }\n\n        if self.links {\n            #[cfg(unix)]\n            columns.push(Column::HardLinks);\n        }\n\n        if self.filesize {\n            columns.push(Column::FileSize);\n        }\n\n        if self.blocksize {\n            #[cfg(unix)]\n            columns.push(Column::Blocksize);\n        }\n\n        if self.user {\n            #[cfg(unix)]\n            columns.push(Column::User);\n        }\n\n        if self.group {\n            #[cfg(unix)]\n            columns.push(Column::Group);\n        }\n\n        if self.file_flags {\n            columns.push(Column::FileFlags);\n        }\n\n        #[cfg(target_os = \"linux\")]\n        if self.security_context {\n            columns.push(Column::SecurityContext);\n        }\n\n        if self.time_types.modified {\n            columns.push(Column::Timestamp(TimeType::Modified));\n        }\n\n        if self.time_types.changed {\n            columns.push(Column::Timestamp(TimeType::Changed));\n        }\n\n        if self.time_types.created {\n            columns.push(Column::Timestamp(TimeType::Created));\n        }\n\n        if self.time_types.accessed {\n            columns.push(Column::Timestamp(TimeType::Accessed));\n        }\n\n        if self.git && actually_enable_git {\n            columns.push(Column::GitStatus);\n        }\n\n        if self.subdir_git_repos && git_repos {\n            columns.push(Column::SubdirGitRepo(true));\n        }\n\n        if self.subdir_git_repos_no_stat && git_repos {\n            columns.push(Column::SubdirGitRepo(false));\n        }\n\n        columns\n    }\n}\n\n/// A table contains these.\n#[derive(Debug, Copy, Clone)]\npub enum Column {\n    Permissions,\n    FileSize,\n    Timestamp(TimeType),\n    #[cfg(unix)]\n    Blocksize,\n    #[cfg(unix)]\n    User,\n    #[cfg(unix)]\n    Group,\n    #[cfg(unix)]\n    HardLinks,\n    #[cfg(unix)]\n    Inode,\n    GitStatus,\n    SubdirGitRepo(bool),\n    #[cfg(unix)]\n    Octal,\n    #[cfg(unix)]\n    SecurityContext,\n    FileFlags,\n}\n\n/// Each column can pick its own **Alignment**. Usually, numbers are\n/// right-aligned, and text is left-aligned.\n#[derive(Copy, Clone)]\npub enum Alignment {\n    Left,\n    Right,\n}\n\nimpl Column {\n    /// Get the alignment this column should use.\n    #[cfg(unix)]\n    #[must_use]\n    pub fn alignment(self) -> Alignment {\n        #[allow(clippy::wildcard_in_or_patterns)]\n        match self {\n            Self::FileSize | Self::HardLinks | Self::Inode | Self::Blocksize | Self::GitStatus => {\n                Alignment::Right\n            }\n            Self::Timestamp(_) | _ => Alignment::Left,\n        }\n    }\n\n    #[cfg(windows)]\n    pub fn alignment(self) -> Alignment {\n        match self {\n            Self::FileSize | Self::GitStatus => Alignment::Right,\n            _ => Alignment::Left,\n        }\n    }\n\n    /// Get the text that should be printed at the top, when the user elects\n    /// to have a header row printed.\n    #[must_use]\n    pub fn header(self) -> &'static str {\n        match self {\n            #[cfg(unix)]\n            Self::Permissions => \"Permissions\",\n            #[cfg(windows)]\n            Self::Permissions => \"Mode\",\n            Self::FileSize => \"Size\",\n            Self::Timestamp(t) => t.header(),\n            #[cfg(unix)]\n            Self::Blocksize => \"Blocksize\",\n            #[cfg(unix)]\n            Self::User => \"User\",\n            #[cfg(unix)]\n            Self::Group => \"Group\",\n            #[cfg(unix)]\n            Self::HardLinks => \"Links\",\n            #[cfg(unix)]\n            Self::Inode => \"inode\",\n            Self::GitStatus => \"Git\",\n            Self::SubdirGitRepo(_) => \"Git Repo\",\n            #[cfg(unix)]\n            Self::Octal => \"Octal\",\n            #[cfg(unix)]\n            Self::SecurityContext => \"Security Context\",\n            Self::FileFlags => \"Flags\",\n        }\n    }\n}\n\n/// Formatting options for file sizes.\n#[allow(clippy::enum_variant_names)]\n#[derive(PartialEq, Eq, Debug, Default, Copy, Clone)]\npub enum SizeFormat {\n    /// Format the file size using **decimal** prefixes, such as “kilo”,\n    /// “mega”, or “giga”.\n    #[default]\n    DecimalBytes,\n\n    /// Format the file size using **binary** prefixes, such as “kibi”,\n    /// “mebi”, or “gibi”.\n    BinaryBytes,\n\n    /// Do no formatting and just display the size as a number of bytes.\n    JustBytes,\n}\n\n/// Formatting options for user and group.\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum UserFormat {\n    /// The UID / GID\n    Numeric,\n    /// Show the name\n    Name,\n}\n\n/// Formatting options for group only.\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum GroupFormat {\n    /// Numeric or text value\n    Regular,\n    /// Show \":\" if user-group value is the same\n    Smart,\n}\n\n/// The types of a file’s time fields. These three fields are standard\n/// across most (all?) operating systems.\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum TimeType {\n    /// The file’s modified time (`st_mtime`).\n    Modified,\n\n    /// The file’s changed time (`st_ctime`)\n    Changed,\n\n    /// The file’s accessed time (`st_atime`).\n    Accessed,\n\n    /// The file’s creation time (`btime` or `birthtime`).\n    Created,\n}\n\nimpl TimeType {\n    /// Returns the text to use for a column’s heading in the columns output.\n    #[must_use]\n    pub fn header(self) -> &'static str {\n        match self {\n            Self::Modified => \"Date Modified\",\n            Self::Changed => \"Date Changed\",\n            Self::Accessed => \"Date Accessed\",\n            Self::Created => \"Date Created\",\n        }\n    }\n\n    /// Returns the corresponding time from [File]\n    pub fn get_corresponding_time(self, file: &File<'_>) -> Option<NaiveDateTime> {\n        match self {\n            TimeType::Modified => file.modified_time(),\n            TimeType::Changed => file.changed_time(),\n            TimeType::Accessed => file.accessed_time(),\n            TimeType::Created => file.created_time(),\n        }\n    }\n}\n\n/// How display file flags.\n#[derive(PartialEq, Eq, Debug, Default, Copy, Clone)]\npub enum FlagsFormat {\n    /// Display flags as comma seperated descriptions\n    #[default]\n    Long,\n    /// Display flags as single character abbreviations (Windows only)\n    Short,\n}\n\nimpl FlagsFormat {\n    pub(crate) fn deduce<V: Vars>(vars: &V) -> FlagsFormat {\n        vars.get(EZA_WINDOWS_ATTRIBUTES)\n            .and_then(|v| match v.to_ascii_lowercase().to_str() {\n                Some(\"short\") => Some(FlagsFormat::Short),\n                Some(\"long\") => Some(FlagsFormat::Long),\n                _ => None,\n            })\n            .unwrap_or_default()\n    }\n}\n\n/// Fields for which of a file’s time fields should be displayed in the\n/// columns output.\n///\n/// There should always be at least one of these — there’s no way to disable\n/// the time columns entirely (yet).\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\n#[rustfmt::skip]\n#[allow(clippy::struct_excessive_bools)]\npub struct TimeTypes {\n    pub modified: bool,\n    pub changed:  bool,\n    pub accessed: bool,\n    pub created:  bool,\n}\n\nimpl Default for TimeTypes {\n    /// By default, display just the ‘modified’ time. This is the most\n    /// common option, which is why it has this shorthand.\n    fn default() -> Self {\n        Self {\n            modified: true,\n            changed: false,\n            accessed: false,\n            created: false,\n        }\n    }\n}\n\n/// The **environment** struct contains any data that could change between\n/// running instances of exa, depending on the user’s computer’s configuration.\n///\n/// Any environment field should be able to be mocked up for test runs.\npub struct Environment {\n    /// The computer’s current time offset, determined from time zone.\n    time_offset: FixedOffset,\n\n    /// Localisation rules for formatting numbers.\n    numeric: locale::Numeric,\n\n    /// Mapping cache of user IDs to usernames.\n    #[cfg(unix)]\n    users: Mutex<UsersCache>,\n}\n\nimpl Environment {\n    #[cfg(unix)]\n    pub fn lock_users(&self) -> MutexGuard<'_, UsersCache> {\n        self.users.lock().unwrap()\n    }\n\n    fn load_all() -> Self {\n        let time_offset = *Local::now().offset();\n\n        let numeric =\n            locale::Numeric::load_user_locale().unwrap_or_else(|_| locale::Numeric::english());\n\n        #[cfg(unix)]\n        let users = Mutex::new(UsersCache::new());\n\n        Self {\n            time_offset,\n            numeric,\n            #[cfg(unix)]\n            users,\n        }\n    }\n}\n\nstatic ENVIRONMENT: LazyLock<Environment> = LazyLock::new(Environment::load_all);\n\npub struct Table<'a> {\n    columns: Vec<Column>,\n    theme: &'a Theme,\n    env: &'a Environment,\n    widths: TableWidths,\n    time_format: TimeFormat,\n    size_format: SizeFormat,\n    #[cfg(unix)]\n    user_format: UserFormat,\n    #[cfg(unix)]\n    group_format: GroupFormat,\n    flags_format: FlagsFormat,\n    git: Option<&'a GitCache>,\n}\n\n#[derive(Clone)]\npub struct Row {\n    cells: Vec<TextCell>,\n}\n\nimpl<'a> Table<'a> {\n    #[must_use]\n    pub fn new(\n        options: &'a Options,\n        git: Option<&'a GitCache>,\n        theme: &'a Theme,\n        git_repos: bool,\n    ) -> Table<'a> {\n        let columns = options.columns.collect(git.is_some(), git_repos);\n        let widths = TableWidths::zero(columns.len());\n        let env = &*ENVIRONMENT;\n\n        debug!(\"Creating table with columns: {columns:?}\");\n\n        Table {\n            theme,\n            widths,\n            columns,\n            git,\n            env,\n            time_format: options.time_format.clone(),\n            size_format: options.size_format,\n            #[cfg(unix)]\n            user_format: options.user_format,\n            #[cfg(unix)]\n            group_format: options.group_format,\n            flags_format: options.flags_format,\n        }\n    }\n\n    #[must_use]\n    pub fn widths(&self) -> &TableWidths {\n        &self.widths\n    }\n\n    #[must_use]\n    pub fn header_row(&self) -> Row {\n        let cells = self\n            .columns\n            .iter()\n            .map(|c| TextCell::paint_str(self.theme.ui.header.unwrap_or_default(), c.header()))\n            .collect();\n\n        Row { cells }\n    }\n\n    pub fn row_for_file(\n        &self,\n        file: &File<'_>,\n        xattrs: bool,\n        color_scale_info: Option<ColorScaleInformation>,\n    ) -> Row {\n        let cells = self\n            .columns\n            .iter()\n            .map(|c| self.display(file, *c, xattrs, color_scale_info))\n            .collect();\n\n        Row { cells }\n    }\n\n    pub fn add_widths(&mut self, row: &Row) {\n        self.widths.add_widths(row);\n    }\n\n    #[cfg(unix)]\n    fn permissions_plus(&self, file: &File<'_>, xattrs: bool) -> Option<f::PermissionsPlus> {\n        file.permissions().map(|p| f::PermissionsPlus {\n            file_type: file.type_char(),\n            permissions: p,\n            xattrs,\n        })\n    }\n\n    #[allow(clippy::unnecessary_wraps)] // Needs to match Unix function\n    #[cfg(windows)]\n    fn permissions_plus(&self, file: &File<'_>, xattrs: bool) -> Option<f::PermissionsPlus> {\n        Some(f::PermissionsPlus {\n            file_type: file.type_char(),\n            #[cfg(windows)]\n            attributes: file.attributes()?,\n            xattrs,\n        })\n    }\n\n    #[cfg(unix)]\n    fn octal_permissions(&self, file: &File<'_>) -> Option<f::OctalPermissions> {\n        file.permissions()\n            .map(|p| f::OctalPermissions { permissions: p })\n    }\n\n    fn display(\n        &self,\n        file: &File<'_>,\n        column: Column,\n        xattrs: bool,\n        color_scale_info: Option<ColorScaleInformation>,\n    ) -> TextCell {\n        match column {\n            Column::Permissions => self.permissions_plus(file, xattrs).render(self.theme),\n            Column::FileSize => file.size().render(\n                self.theme,\n                self.size_format,\n                &self.env.numeric,\n                color_scale_info,\n            ),\n            #[cfg(unix)]\n            Column::HardLinks => file.links().render(self.theme, &self.env.numeric),\n            #[cfg(unix)]\n            Column::Inode => file.inode().render(self.theme.ui.inode.unwrap_or_default()),\n            #[cfg(unix)]\n            Column::Blocksize => {\n                file.blocksize()\n                    .render(self.theme, self.size_format, &self.env.numeric)\n            }\n            #[cfg(unix)]\n            Column::User => {\n                file.user()\n                    .render(self.theme, &*self.env.lock_users(), self.user_format)\n            }\n            #[cfg(unix)]\n            Column::Group => file.group().render(\n                self.theme,\n                &*self.env.lock_users(),\n                self.user_format,\n                self.group_format,\n                file.user(),\n            ),\n            #[cfg(unix)]\n            Column::SecurityContext => file.security_context().render(self.theme),\n            Column::FileFlags => file\n                .flags()\n                .render(self.theme.ui.flags.unwrap_or_default(), self.flags_format),\n            Column::GitStatus => self.git_status(file).render(self.theme),\n            Column::SubdirGitRepo(status) => self.subdir_git_repo(file, status).render(self.theme),\n            #[cfg(unix)]\n            Column::Octal => self\n                .octal_permissions(file)\n                .render(self.theme.ui.octal.unwrap_or_default()),\n\n            Column::Timestamp(time_type) => time_type.get_corresponding_time(file).render(\n                if color_scale_info.is_some_and(|csi| csi.options.mode == ColorScaleMode::Gradient)\n                {\n                    color_scale_info.unwrap().apply_time_gradient(\n                        self.theme.ui.date.unwrap_or_default(),\n                        file,\n                        time_type,\n                    )\n                } else {\n                    self.theme.ui.date.unwrap_or_default()\n                },\n                self.env.time_offset,\n                self.time_format.clone(),\n            ),\n        }\n    }\n\n    fn git_status(&self, file: &File<'_>) -> f::Git {\n        debug!(\"Getting Git status for file {:?}\", file.path);\n\n        self.git\n            .map(|g| g.get(&file.path, file.is_directory()))\n            .unwrap_or_default()\n    }\n\n    fn subdir_git_repo(&self, file: &File<'_>, status: bool) -> f::SubdirGitRepo {\n        debug!(\"Getting subdir repo status for path {:?}\", file.path);\n\n        if file.is_directory() {\n            return f::SubdirGitRepo::from_path(&file.path, status);\n        }\n        f::SubdirGitRepo::default()\n    }\n\n    #[must_use]\n    pub fn render(&self, row: Row) -> TextCell {\n        let mut cell = TextCell::default();\n\n        let iter = row.cells.into_iter().zip(self.widths.iter()).enumerate();\n\n        for (n, (this_cell, width)) in iter {\n            let padding = width - *this_cell.width;\n\n            match self.columns[n].alignment() {\n                Alignment::Left => {\n                    cell.append(this_cell);\n                    cell.add_spaces(padding);\n                }\n                Alignment::Right => {\n                    cell.add_spaces(padding);\n                    cell.append(this_cell);\n                }\n            }\n\n            cell.add_spaces(1);\n        }\n\n        cell\n    }\n}\n\npub struct TableWidths(Vec<usize>);\n\nimpl Deref for TableWidths {\n    type Target = [usize];\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\nimpl TableWidths {\n    #[must_use]\n    pub fn zero(count: usize) -> Self {\n        Self(vec![0; count])\n    }\n\n    pub fn add_widths(&mut self, row: &Row) {\n        for (old_width, cell) in self.0.iter_mut().zip(row.cells.iter()) {\n            *old_width = max(*old_width, *cell.width);\n        }\n    }\n\n    #[must_use]\n    pub fn total(&self) -> usize {\n        self.0.len() + self.0.iter().sum::<usize>()\n    }\n}\n"
  },
  {
    "path": "src/output/time.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! Timestamp formatting.\n\nuse chrono::prelude::*;\nuse core::cmp::max;\nuse std::sync::LazyLock;\nuse std::time::Duration;\nuse unicode_width::UnicodeWidthStr;\n\n/// Every timestamp in exa needs to be rendered by a **time format**.\n/// Formatting times is tricky, because how a timestamp is rendered can\n/// depend on one or more of the following:\n///\n/// - The user’s locale, for printing the month name as “Feb”, or as “fév”,\n///   or as “2月”;\n/// - The current year, because certain formats will be less precise when\n///   dealing with dates far in the past;\n/// - The formatting style that the user asked for on the command-line.\n///\n/// Because not all formatting styles need the same data, they all have their\n/// own enum variants. It’s not worth looking the locale up if the formatter\n/// prints month names as numbers.\n///\n/// Also, eza supports *custom* styles, where the user enters a\n/// format string in an environment variable or something. Just these four.\n#[derive(PartialEq, Eq, Debug, Clone)]\npub enum TimeFormat {\n    /// The **default format** uses the user’s locale to print month names,\n    /// and specifies the timestamp down to the minute for recent times, and\n    /// day for older times.\n    DefaultFormat,\n\n    /// Use the **ISO format**, which specifies the timestamp down to the\n    /// minute for recent times, and day for older times. It uses a number\n    /// for the month so it doesn’t use the locale.\n    ISOFormat,\n\n    /// Use the **long ISO format**, which specifies the timestamp down to the\n    /// minute using only numbers, without needing the locale or year.\n    LongISO,\n\n    /// Use the **full ISO format**, which specifies the timestamp down to the\n    /// millisecond and includes its offset down to the minute. This too uses\n    /// only numbers so doesn’t require any special consideration.\n    FullISO,\n\n    /// Use a relative but fixed width representation.\n    Relative,\n\n    /// Use custom formats, optionally a different custom format can be\n    /// specified for recent times, otherwise the same custom format will be\n    /// used for both recent and non-recent times.\n    Custom {\n        non_recent: String,\n        recent: Option<String>,\n    },\n}\n\nimpl TimeFormat {\n    #[must_use]\n    pub fn format(self, time: &DateTime<FixedOffset>) -> String {\n        #[rustfmt::skip]\n        return match self {\n            Self::DefaultFormat                 => default(time),\n            Self::ISOFormat                     => iso(time),\n            Self::LongISO                       => long(time),\n            Self::FullISO                       => full(time),\n            Self::Relative                      => relative(time),\n            Self::Custom { non_recent, recent } => custom(\n                time, non_recent.as_str(), recent.as_deref()\n            ),\n        };\n    }\n}\n\nfn default(time: &DateTime<FixedOffset>) -> String {\n    let month = &*LOCALE.short_month_name(time.month0() as usize);\n    let month_width = short_month_padding(*MAX_MONTH_WIDTH, month);\n    let format = if time.year() == *CURRENT_YEAR {\n        format!(\"%_d {month:<month_width$} %H:%M\")\n    } else {\n        format!(\"%_d {month:<month_width$}  %Y\")\n    };\n    time.format(format.as_str()).to_string()\n}\n\n/// Convert between Unicode width and width in chars to use in format!.\n/// ex: in Japanese, 月 is one character, but it has the width of two.\n/// For alignment purposes, we take the real display width into account.\n/// So, `MAXIMUM_MONTH_WIDTH` (“12月”) = 4, but if we use `{:4}` in format!,\n/// it will add a space (“ 12月”) because format! counts characters.\n/// Conversely, a char can have a width of zero (like combining diacritics)\nfn short_month_padding(max_month_width: usize, month: &str) -> usize {\n    let shift = month.chars().count() as isize - UnicodeWidthStr::width(month) as isize;\n    (max_month_width as isize + shift) as usize\n}\n\nfn iso(time: &DateTime<FixedOffset>) -> String {\n    if time.year() == *CURRENT_YEAR {\n        time.format(\"%m-%d %H:%M\").to_string()\n    } else {\n        time.format(\"%Y-%m-%d\").to_string()\n    }\n}\n\nfn long(time: &DateTime<FixedOffset>) -> String {\n    time.format(\"%Y-%m-%d %H:%M\").to_string()\n}\n\n// #[allow(trivial_numeric_casts)]\nfn relative(time: &DateTime<FixedOffset>) -> String {\n    timeago::Formatter::new()\n        .ago(\"\")\n        .convert(Duration::from_secs(\n            max(0, Local::now().timestamp() - time.timestamp())\n                // this .unwrap is safe since the call above can never result in a\n                // value < 0\n                .try_into()\n                .unwrap(),\n        ))\n}\n\nfn full(time: &DateTime<FixedOffset>) -> String {\n    time.format(\"%Y-%m-%d %H:%M:%S.%f %z\").to_string()\n}\n\nfn custom(time: &DateTime<FixedOffset>, non_recent_fmt: &str, recent_fmt: Option<&str>) -> String {\n    if let Some(recent_fmt) = recent_fmt {\n        if time.year() == *CURRENT_YEAR {\n            time.format(recent_fmt).to_string()\n        } else {\n            time.format(non_recent_fmt).to_string()\n        }\n    } else {\n        time.format(non_recent_fmt).to_string()\n    }\n}\n\nstatic CURRENT_YEAR: LazyLock<i32> = LazyLock::new(|| Local::now().year());\n\nstatic LOCALE: LazyLock<locale::Time> =\n    LazyLock::new(|| locale::Time::load_user_locale().unwrap_or_else(|_| locale::Time::english()));\n\nstatic MAX_MONTH_WIDTH: LazyLock<usize> = LazyLock::new(|| {\n    // Some locales use a three-character wide month name (Jan to Dec);\n    // others vary between three to four (1月 to 12月, juil.). We check each month width\n    // to detect the longest and set the output format accordingly.\n    (0..11)\n        .map(|i| UnicodeWidthStr::width(&*LOCALE.short_month_name(i)))\n        .max()\n        .unwrap()\n});\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    #[test]\n    fn short_month_width_japanese() {\n        let max_month_width = 4;\n        let month = \"1\\u{2F49}\"; // 1月\n        let padding = short_month_padding(max_month_width, month);\n        let final_str = format!(\"{month:<padding$}\");\n        assert_eq!(max_month_width, UnicodeWidthStr::width(final_str.as_str()));\n    }\n\n    #[test]\n    fn short_month_width_hindi() {\n        let max_month_width = 4;\n        assert!(\n            [\n                \"\\u{091C}\\u{0928}\\u{0970}\",                         // जन॰\n                \"\\u{092B}\\u{093C}\\u{0930}\\u{0970}\",                 // फ़र॰\n                \"\\u{092E}\\u{093E}\\u{0930}\\u{094D}\\u{091A}\",         // मार्च\n                \"\\u{0905}\\u{092A}\\u{094D}\\u{0930}\\u{0948}\\u{0932}\", // अप्रैल\n                \"\\u{092E}\\u{0908}\",                                 // मई\n                \"\\u{091C}\\u{0942}\\u{0928}\",                         // जून\n                \"\\u{091C}\\u{0941}\\u{0932}\\u{0970}\",                 // जुल॰\n                \"\\u{0905}\\u{0917}\\u{0970}\",                         // अग॰\n                \"\\u{0938}\\u{093F}\\u{0924}\\u{0970}\",                 // सित॰\n                \"\\u{0905}\\u{0915}\\u{094D}\\u{0924}\\u{0942}\\u{0970}\", // अक्तू॰\n                \"\\u{0928}\\u{0935}\\u{0970}\",                         // नव॰\n                \"\\u{0926}\\u{093F}\\u{0938}\\u{0970}\",                 // दिस॰\n            ]\n            .iter()\n            .map(|month| format!(\n                \"{:<width$}\",\n                month,\n                width = short_month_padding(max_month_width, month)\n            ))\n            .all(|string| UnicodeWidthStr::width(string.as_str()) == max_month_width)\n        );\n    }\n}\n"
  },
  {
    "path": "src/output/tree.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\n//! Tree structures, such as `├──` or `└──`, used in a tree view.\n//!\n//! ## Constructing Tree Views\n//!\n//! When using the `--tree` argument, instead of a vector of cells, each row\n//! has a `depth` field that indicates how far deep in the tree it is: the top\n//! level has depth 0, its children have depth 1, and *their* children have\n//! depth 2, and so on.\n//!\n//! On top of this, it also has a `last` field that specifies whether this is\n//! the last row of this particular consecutive set of rows. This doesn’t\n//! affect the file’s information; it’s just used to display a different set of\n//! Unicode tree characters! The resulting table looks like this:\n//!\n//! ```text\n//!     ┌───────┬───────┬───────────────────────┐\n//!     │ Depth │ Last  │ Output                │\n//!     ├───────┼───────┼───────────────────────┤\n//!     │     0 │       │ documents             │\n//!     │     1 │ false │ ├── this_file.txt     │\n//!     │     1 │ false │ ├── that_file.txt     │\n//!     │     1 │ false │ ├── features          │\n//!     │     2 │ false │ │   ├── feature_1.rs  │\n//!     │     2 │ false │ │   ├── feature_2.rs  │\n//!     │     2 │ true  │ │   └── feature_3.rs  │\n//!     │     1 │ true  │ └── pictures          │\n//!     │     2 │ false │     ├── garden.jpg    │\n//!     │     2 │ false │     ├── flowers.jpg   │\n//!     │     2 │ false │     ├── library.png   │\n//!     │     2 │ true  │     └── space.tiff    │\n//!     └───────┴───────┴───────────────────────┘\n//! ```\n//!\n//! Creating the table like this means that each file has to be tested to see\n//! if it’s the last one in the group. This is usually done by putting all the\n//! files in a vector beforehand, getting its length, then comparing the index\n//! of each file to see if it’s the last one. (As some files may not be\n//! successfully `stat`ted, we don’t know how many files are going to exist in\n//! each directory)\n\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum TreePart {\n    /// Rightmost column, *not* the last in the directory.\n    Edge,\n\n    /// Not the rightmost column, and the directory has not finished yet.\n    Line,\n\n    /// Rightmost column, and the last in the directory.\n    Corner,\n\n    /// Not the rightmost column, and the directory *has* finished.\n    Blank,\n}\n\nimpl TreePart {\n    /// Turn this tree part into ASCII-licious box drawing characters!\n    /// (Warning: not actually ASCII)\n    pub fn ascii_art(self) -> &'static str {\n        #[rustfmt::skip]\n        return match self {\n            Self::Edge    => \"├── \",\n            Self::Line    => \"│   \",\n            Self::Corner  => \"└── \",\n            Self::Blank   => \"    \",\n        };\n    }\n}\n\n/// A **tree trunk** builds up arrays of tree parts over multiple depths.\n#[derive(Debug, Default)]\npub struct TreeTrunk {\n    /// A stack tracks which tree characters should be printed. It’s\n    /// necessary to maintain information about the previously-printed\n    /// lines, as the output will change based on any previous entries.\n    stack: Vec<TreePart>,\n\n    /// A tuple for the last ‘depth’ and ‘last’ parameters that are passed in.\n    last_params: Option<TreeParams>,\n}\n\n#[derive(Debug, Copy, Clone)]\npub struct TreeParams {\n    /// How many directories deep into the tree structure this is. Directories\n    /// on top have depth 0.\n    depth: TreeDepth,\n\n    /// Whether this is the last entry in the directory.\n    last: bool,\n}\n\n#[derive(Debug, Copy, Clone)]\npub struct TreeDepth(pub usize);\n\nimpl TreeTrunk {\n    /// Calculates the tree parts for an entry at the given depth and\n    /// last-ness. The depth is used to determine where in the stack the tree\n    /// part should be inserted, and the last-ness is used to determine which\n    /// type of tree part to insert.\n    ///\n    /// This takes a `&mut self` because the results of each file are stored\n    /// and used in future rows.\n    pub fn new_row(&mut self, params: TreeParams) -> &[TreePart] {\n        // If this isn’t our first iteration, then update the tree parts thus\n        // far to account for there being another row after it.\n        if let Some(last) = self.last_params {\n            self.stack[last.depth.0] = if last.last {\n                TreePart::Blank\n            } else {\n                TreePart::Line\n            };\n        }\n\n        // Make sure the stack has enough space, then add or modify another\n        // part into it.\n        self.stack.resize(params.depth.0 + 1, TreePart::Edge);\n        self.stack[params.depth.0] = if params.last {\n            TreePart::Corner\n        } else {\n            TreePart::Edge\n        };\n\n        self.last_params = Some(params);\n\n        // Return the tree parts as a slice of the stack.\n        //\n        // Ignore the first element here to prevent a ‘zeroth level’ from\n        // appearing before the very first directory. This level would\n        // join unrelated directories without connecting to anything:\n        //\n        //     with [0..]        with [1..]\n        //     ==========        ==========\n        //      ├── folder        folder\n        //      │   └── file       └── file\n        //      └── folder        folder\n        //          └── file       └──file\n        //\n        &self.stack[1..]\n    }\n}\n\nimpl TreeParams {\n    pub fn new(depth: TreeDepth, last: bool) -> Self {\n        Self { depth, last }\n    }\n}\n\nimpl TreeDepth {\n    pub fn root() -> Self {\n        Self(0)\n    }\n\n    pub fn deeper(self) -> Self {\n        Self(self.0 + 1)\n    }\n\n    /// Creates an iterator that, as well as yielding each value, yields a\n    /// `TreeParams` with the current depth and last flag filled in.\n    pub fn iterate_over<I, T>(self, inner: I) -> Iter<I>\n    where\n        I: ExactSizeIterator + Iterator<Item = T>,\n    {\n        Iter {\n            current_depth: self,\n            inner,\n        }\n    }\n}\n\npub struct Iter<I> {\n    current_depth: TreeDepth,\n    inner: I,\n}\n\nimpl<I, T> Iterator for Iter<I>\nwhere\n    I: ExactSizeIterator + Iterator<Item = T>,\n{\n    type Item = (TreeParams, T);\n\n    fn next(&mut self) -> Option<Self::Item> {\n        let t = self.inner.next()?;\n\n        // TODO: use exact_size_is_empty API soon\n        let params = TreeParams::new(self.current_depth, self.inner.len() == 0);\n        Some((params, t))\n    }\n}\n\n#[cfg(test)]\nmod trunk_test {\n    use super::*;\n\n    fn params(depth: usize, last: bool) -> TreeParams {\n        TreeParams::new(TreeDepth(depth), last)\n    }\n\n    #[rustfmt::skip]\n    #[test]\n    fn empty_at_first() {\n        let mut tt = TreeTrunk::default();\n        assert_eq!(tt.new_row(params(0, true)),  &[ ]);\n    }\n\n    #[rustfmt::skip]\n    #[test]\n    fn one_child() {\n        let mut tt = TreeTrunk::default();\n        assert_eq!(tt.new_row(params(0, true)),  &[ ]);\n        assert_eq!(tt.new_row(params(1, true)),  &[ TreePart::Corner ]);\n    }\n\n    #[rustfmt::skip]\n    #[test]\n    fn two_children() {\n        let mut tt = TreeTrunk::default();\n        assert_eq!(tt.new_row(params(0, true)),  &[ ]);\n        assert_eq!(tt.new_row(params(1, false)), &[ TreePart::Edge ]);\n        assert_eq!(tt.new_row(params(1, true)),  &[ TreePart::Corner ]);\n    }\n\n    #[rustfmt::skip]\n    #[test]\n    fn two_times_two_children() {\n        let mut tt = TreeTrunk::default();\n        assert_eq!(tt.new_row(params(0, false)), &[ ]);\n        assert_eq!(tt.new_row(params(1, false)), &[ TreePart::Edge ]);\n        assert_eq!(tt.new_row(params(1, true)),  &[ TreePart::Corner ]);\n\n        assert_eq!(tt.new_row(params(0, true)),  &[ ]);\n        assert_eq!(tt.new_row(params(1, false)), &[ TreePart::Edge ]);\n        assert_eq!(tt.new_row(params(1, true)),  &[ TreePart::Corner ]);\n    }\n\n    #[rustfmt::skip]\n    #[test]\n    fn two_times_two_nested_children() {\n        let mut tt = TreeTrunk::default();\n        assert_eq!(tt.new_row(params(0, true)),  &[ ]);\n\n        assert_eq!(tt.new_row(params(1, false)), &[ TreePart::Edge ]);\n        assert_eq!(tt.new_row(params(2, false)), &[ TreePart::Line, TreePart::Edge ]);\n        assert_eq!(tt.new_row(params(2, true)),  &[ TreePart::Line, TreePart::Corner ]);\n\n        assert_eq!(tt.new_row(params(1, true)),  &[ TreePart::Corner ]);\n        assert_eq!(tt.new_row(params(2, false)), &[ TreePart::Blank, TreePart::Edge ]);\n        assert_eq!(tt.new_row(params(2, true)),  &[ TreePart::Blank, TreePart::Corner ]);\n    }\n}\n\n#[cfg(test)]\nmod iter_test {\n    use super::*;\n\n    #[test]\n    fn test_iteration() {\n        let foos = &[\"first\", \"middle\", \"last\"];\n        let mut iter = TreeDepth::root().iterate_over(foos.iter());\n\n        let next = iter.next().unwrap();\n        assert_eq!(&\"first\", next.1);\n        assert!(!next.0.last);\n\n        let next = iter.next().unwrap();\n        assert_eq!(&\"middle\", next.1);\n        assert!(!next.0.last);\n\n        let next = iter.next().unwrap();\n        assert_eq!(&\"last\", next.1);\n        assert!(next.0.last);\n\n        assert!(iter.next().is_none());\n    }\n\n    #[test]\n    fn test_empty() {\n        let nothing: &[usize] = &[];\n        let mut iter = TreeDepth::root().iterate_over(nothing.iter());\n        assert!(iter.next().is_none());\n    }\n}\n"
  },
  {
    "path": "src/theme/default_theme.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse nu_ansi_term::Color::{Blue, Cyan, DarkGray, Green, Purple, Red, Yellow};\nuse nu_ansi_term::Style;\nuse std::default::Default;\n\nuse crate::output::color_scale::{ColorScaleMode, ColorScaleOptions};\nuse crate::theme::ui_styles::{\n    FileKinds, FileType, Git, GitRepo, Links, Permissions, SELinuxContext, SecurityContext, Size,\n    UiStyles, Users,\n};\nimpl UiStyles {\n    #[must_use]\n    pub fn default_theme(scale: ColorScaleOptions) -> Self {\n        Self {\n            size: Some(Size::colourful(scale)),\n            ..Self::default()\n        }\n    }\n}\n\nimpl Default for UiStyles {\n    fn default() -> Self {\n        Self {\n            colourful: Some(true),\n\n            #[rustfmt::skip]\n            filekinds: Some(FileKinds {\n            normal: Some(Style::default()),\n            directory: Some(Blue.bold()),\n            symlink: Some(Cyan.normal()),\n            pipe: Some(Yellow.normal()),\n            block_device: Some(Yellow.bold()),\n            char_device: Some(Yellow.bold()),\n            socket: Some(Red.bold()),\n            special: Some(Yellow.normal()),\n            executable: Some(Green.bold()),\n            mount_point: Some(Blue.bold().underline()),\n            }),\n\n            #[rustfmt::skip]\n            perms: Some(Permissions {\n                user_read:           Some(Yellow.bold()),\n                user_write:          Some(Red.bold()),\n                user_execute_file:   Some(Green.bold().underline()),\n                user_execute_other:  Some(Green.bold()),\n\n                group_read:          Some(Yellow.normal()),\n                group_write:         Some(Red.normal()),\n                group_execute:       Some(Green.normal()),\n\n                other_read:          Some(Yellow.normal()),\n                other_write:         Some(Red.normal()),\n                other_execute:       Some(Green.normal()),\n\n                special_user_file:   Some(Purple.normal()),\n                special_other:       Some(Purple.normal()),\n\n                attribute:           Some(Style::default()),\n            }),\n\n            size: Some(Size::colourful(ColorScaleOptions::default())),\n\n            #[rustfmt::skip]\n            users:Some(Users {\n                user_you:                       Some(Yellow.bold()),\n                user_other:                     Some(Style::default()),\n                user_root:                      Some(Style::default()),\n                group_yours:                    Some(Yellow.bold()),\n                group_other:                    Some(Style::default()),\n                group_root:                     Some(Style::default()),\n            }),\n\n            #[rustfmt::skip]\n            links: Some(Links {\n                normal:          Some(Red.bold()),\n                multi_link_file: Some(Red.on(Yellow)),\n            }),\n\n            #[rustfmt::skip]\n            git: Some(Git {\n                new:         Some(Green.normal()),\n                modified:    Some(Blue.normal()),\n                deleted:     Some(Red.normal()),\n                renamed:     Some(Yellow.normal()),\n                typechange:  Some(Purple.normal()),\n                ignored:     Some(Style::default().dimmed()),\n                conflicted:  Some(Red.normal()),\n            }),\n\n            git_repo: Some(GitRepo {\n                branch_main: Some(Green.normal()),\n                branch_other: Some(Yellow.normal()),\n                git_clean: Some(Green.normal()),\n                git_dirty: Some(Yellow.bold()),\n            }),\n\n            security_context: Some(SecurityContext {\n                none: Some(Style::default()),\n                #[rustfmt::skip]\n                selinux: Some(SELinuxContext {\n                    colon: Some(Style::default().dimmed()),\n                    user:  Some(Blue.normal()),\n                    role:  Some(Green.normal()),\n                    typ:   Some(Yellow.normal()),\n                    range: Some(Cyan.normal()),\n                }),\n            }),\n\n            #[rustfmt::skip]\n            file_type: Some(FileType {\n                image:      Some(Purple.normal()),\n                video:      Some(Purple.bold()),\n                music:      Some(Cyan.normal()),\n                lossless:   Some(Cyan.bold()),\n                crypto:     Some(Green.bold()),\n                document:   Some(Green.normal()),\n                compressed: Some(Red.normal()),\n                temp:       Some(Style::default().dimmed()),\n                compiled:   Some(Yellow.normal()),\n                build:      Some(Yellow.bold().underline()),\n                source:     Some(Yellow.bold()), // Need to discuss color\n            }),\n\n            punctuation: Some(DarkGray.bold()),\n            date: Some(Blue.normal()),\n            inode: Some(Purple.normal()),\n            blocks: Some(Cyan.normal()),\n            octal: Some(Purple.normal()),\n            flags: Some(Style::default()),\n            header: Some(Style::default().underline()),\n\n            symlink_path: Some(Cyan.normal()),\n            control_char: Some(Red.normal()),\n            broken_symlink: Some(Red.normal()),\n            broken_path_overlay: Some(Style::default().underline()),\n\n            filenames: None,\n            extensions: None,\n        }\n    }\n}\n\nimpl Size {\n    pub fn colourful(scale: ColorScaleOptions) -> Self {\n        if scale.size && scale.mode == ColorScaleMode::Fixed {\n            Self::colourful_fixed()\n        } else {\n            Self::colourful_gradient()\n        }\n    }\n\n    fn colourful_fixed() -> Self {\n        Self {\n            major: Some(Green.bold()),\n            minor: Some(Green.normal()),\n\n            number_byte: Some(Green.bold()),\n            number_kilo: Some(Green.bold()),\n            number_mega: Some(Green.bold()),\n            number_giga: Some(Green.bold()),\n            number_huge: Some(Green.bold()),\n\n            unit_byte: Some(Green.normal()),\n            unit_kilo: Some(Green.normal()),\n            unit_mega: Some(Green.normal()),\n            unit_giga: Some(Green.normal()),\n            unit_huge: Some(Green.normal()),\n        }\n    }\n\n    fn colourful_gradient() -> Self {\n        Self {\n            major: Some(Green.bold()),\n            minor: Some(Green.normal()),\n\n            number_byte: Some(Green.normal()),\n            number_kilo: Some(Green.bold()),\n            number_mega: Some(Yellow.normal()),\n            number_giga: Some(Red.normal()),\n            number_huge: Some(Purple.normal()),\n\n            unit_byte: Some(Green.normal()),\n            unit_kilo: Some(Green.bold()),\n            unit_mega: Some(Yellow.normal()),\n            unit_giga: Some(Red.normal()),\n            unit_huge: Some(Purple.normal()),\n        }\n    }\n}\n"
  },
  {
    "path": "src/theme/lsc.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse std::iter::Peekable;\nuse std::ops::FnMut;\n\nuse nu_ansi_term::Color::{\n    Black, Blue, Cyan, DarkGray, Fixed, Green, LightBlue, LightCyan, LightGray, LightGreen,\n    LightPurple, LightRed, LightYellow, Purple, Red, Rgb, White, Yellow,\n};\nuse nu_ansi_term::{Color as Colour, Style};\n\n// Parsing the LS_COLORS environment variable into a map of names to Style values.\n//\n// This is sitting around undocumented at the moment because it’s a feature\n// that should really be unnecessary! exa highlights its output by creating a\n// theme of one Style value per part of the interface that can be coloured,\n// then reading styles from that theme. The LS_COLORS variable, on the other\n// hand, can contain arbitrary characters that ls is supposed to add to the\n// output, without needing to know what they actually do. This puts exa in the\n// annoying position of having to parse the ANSI escape codes _back_ into\n// Style values before it’s able to use them. Doing this has a lot of\n// downsides: if a new terminal feature is added with its own code, exa won’t\n// be able to use this without explicit support for parsing the feature, while\n// ls would not even need to know it existed. And there are some edge cases in\n// ANSI codes, where terminals would accept codes exa is strict about it. It’s\n// just not worth doing, and there should really be a way to just use slices\n// of the LS_COLORS string without having to parse them.\n\npub struct LSColors<'var>(pub &'var str);\n\nimpl<'var> LSColors<'var> {\n    pub fn each_pair<C>(&mut self, mut callback: C)\n    where\n        C: FnMut(Pair<'var>),\n    {\n        for next in self.0.split(':') {\n            let bits = next.split('=').take(3).collect::<Vec<_>>();\n\n            if bits.len() == 2 && !bits[0].is_empty() && !bits[1].is_empty() {\n                callback(Pair {\n                    key: bits[0],\n                    value: bits[1],\n                });\n            }\n        }\n    }\n}\n\nfn parse_into_high_colour<'a, I>(iter: &mut Peekable<I>) -> Option<Colour>\nwhere\n    I: Iterator<Item = &'a str>,\n{\n    match iter.peek() {\n        Some(&\"5\") => {\n            let _ = iter.next();\n            if let Some(byte) = iter.next()\n                && let Ok(num) = byte.parse()\n            {\n                return Some(Fixed(num));\n            }\n        }\n\n        Some(&\"2\") => {\n            let _ = iter.next();\n            if let Some(hexes) = iter.next() {\n                // Some terminals support R:G:B instead of R;G;B\n                // but this clashes with splitting on ‘:’ in each_pair above.\n                /*if hexes.contains(':') {\n                    let rgb = hexes.splitn(3, ':').collect::<Vec<_>>();\n                    if rgb.len() != 3 {\n                        return None;\n                    }\n                    else if let (Ok(r), Ok(g), Ok(b)) = (rgb[0].parse(), rgb[1].parse(), rgb[2].parse()) {\n                        return Some(RGB(r, g, b));\n                    }\n                }*/\n\n                if let (Some(r), Some(g), Some(b)) = (\n                    hexes.parse().ok(),\n                    iter.next().and_then(|s| s.parse().ok()),\n                    iter.next().and_then(|s| s.parse().ok()),\n                ) {\n                    return Some(Rgb(r, g, b));\n                }\n            }\n        }\n\n        _ => {}\n    }\n\n    None\n}\n\npub struct Pair<'var> {\n    pub key: &'var str,\n    pub value: &'var str,\n}\n\nimpl Pair<'_> {\n    pub fn to_style(&self) -> Style {\n        let mut style = Style::default();\n        let mut iter = self.value.split(';').peekable();\n\n        while let Some(num) = iter.next() {\n            match num.trim_start_matches('0') {\n                // Bold and italic\n                \"1\" => style = style.bold(),\n                \"2\" => style = style.dimmed(),\n                \"3\" => style = style.italic(),\n                \"4\" => style = style.underline(),\n                \"5\" => style = style.blink(),\n                // 6 is supposedly a faster blink\n                \"7\" => style = style.reverse(),\n                \"8\" => style = style.hidden(),\n                \"9\" => style = style.strikethrough(),\n\n                // Foreground colours\n                \"30\" => style = style.fg(Black),\n                \"31\" => style = style.fg(Red),\n                \"32\" => style = style.fg(Green),\n                \"33\" => style = style.fg(Yellow),\n                \"34\" => style = style.fg(Blue),\n                \"35\" => style = style.fg(Purple),\n                \"36\" => style = style.fg(Cyan),\n                \"37\" => style = style.fg(White),\n                // Bright foreground colours\n                \"90\" => style = style.fg(DarkGray),\n                \"91\" => style = style.fg(LightRed),\n                \"92\" => style = style.fg(LightGreen),\n                \"93\" => style = style.fg(LightYellow),\n                \"94\" => style = style.fg(LightBlue),\n                \"95\" => style = style.fg(LightPurple),\n                \"96\" => style = style.fg(LightCyan),\n                \"97\" => style = style.fg(LightGray),\n                \"38\" => {\n                    if let Some(c) = parse_into_high_colour(&mut iter) {\n                        style = style.fg(c);\n                    }\n                }\n\n                // Background colours\n                \"40\" => style = style.on(Black),\n                \"41\" => style = style.on(Red),\n                \"42\" => style = style.on(Green),\n                \"43\" => style = style.on(Yellow),\n                \"44\" => style = style.on(Blue),\n                \"45\" => style = style.on(Purple),\n                \"46\" => style = style.on(Cyan),\n                \"47\" => style = style.on(White),\n                // Bright background colours\n                \"100\" => style = style.on(DarkGray),\n                \"101\" => style = style.on(LightRed),\n                \"102\" => style = style.on(LightGreen),\n                \"103\" => style = style.on(LightYellow),\n                \"104\" => style = style.on(LightBlue),\n                \"105\" => style = style.on(LightPurple),\n                \"106\" => style = style.on(LightCyan),\n                \"107\" => style = style.on(LightGray),\n                \"48\" => {\n                    if let Some(c) = parse_into_high_colour(&mut iter) {\n                        style = style.on(c);\n                    }\n                }\n                _ => { /* ignore the error and do nothing */ }\n            }\n        }\n\n        style\n    }\n}\n\n#[cfg(test)]\nmod ansi_test {\n    use super::*;\n    use nu_ansi_term::Style;\n\n    macro_rules! test {\n        ($name:ident: $input:expr => $result:expr) => {\n            #[test]\n            fn $name() {\n                assert_eq!(\n                    Pair {\n                        key: \"\",\n                        value: $input\n                    }\n                    .to_style(),\n                    $result\n                );\n            }\n        };\n    }\n\n    // Styles\n    test!(bold:  \"1\"         => Style::default().bold());\n    test!(bold2: \"01\"        => Style::default().bold());\n    test!(under: \"4\"         => Style::default().underline());\n    test!(unde2: \"04\"        => Style::default().underline());\n    test!(both:  \"1;4\"       => Style::default().bold().underline());\n    test!(both2: \"01;04\"     => Style::default().bold().underline());\n    test!(fg:    \"31\"        => Red.normal());\n    test!(bg:    \"43\"        => Style::default().on(Yellow));\n    test!(bfg:   \"31;43\"     => Red.on(Yellow));\n    test!(bfg2:  \"0031;0043\" => Red.on(Yellow));\n    test!(all:   \"43;31;1;4\" => Red.on(Yellow).bold().underline());\n    test!(again: \"1;1;1;1;1\" => Style::default().bold());\n\n    // Failure cases\n    test!(empty: \"\"          => Style::default());\n    test!(semis: \";;;;;;\"    => Style::default());\n    test!(nines: \"99999999\"  => Style::default());\n    test!(word:  \"GREEN\"     => Style::default());\n\n    // Higher colours\n    test!(hifg:  \"38;5;149\"  => Fixed(149).normal());\n    test!(hibg:  \"48;5;1\"    => Style::default().on(Fixed(1)));\n    test!(hibo:  \"48;5;1;1\"  => Style::default().on(Fixed(1)).bold());\n    test!(hiund: \"4;48;5;1\"  => Style::default().on(Fixed(1)).underline());\n\n    test!(rgb:   \"38;2;255;100;0\"     => Style::default().fg(Rgb(255, 100, 0)));\n    test!(rgbi:  \"38;2;255;100;0;3\"   => Style::default().fg(Rgb(255, 100, 0)).italic());\n    test!(rgbbg: \"48;2;255;100;0\"     => Style::default().on(Rgb(255, 100, 0)));\n    test!(rgbbi: \"48;2;255;100;0;3\"   => Style::default().on(Rgb(255, 100, 0)).italic());\n\n    test!(fgbg:  \"38;5;121;48;5;212\"  => Fixed(121).on(Fixed(212)));\n    test!(bgfg:  \"48;5;121;38;5;212\"  => Fixed(212).on(Fixed(121)));\n    test!(toohi: \"48;5;999\"           => Style::default());\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    macro_rules! test {\n        ($name:ident: $input:expr => $result:expr) => {\n            #[test]\n            fn $name() {\n                let mut lscs = Vec::new();\n                LSColors($input).each_pair(|p| lscs.push((p.key.clone(), p.to_style())));\n                assert_eq!(lscs, $result.to_vec());\n            }\n        };\n    }\n\n    // Bad parses\n    test!(empty:    \"\"       => []);\n    test!(jibber:   \"blah\"   => []);\n\n    test!(equals:     \"=\"    => []);\n    test!(starts:     \"=di\"  => []);\n    test!(ends:     \"id=\"    => []);\n\n    // Foreground colours\n    test!(green:   \"cb=32\"   => [ (\"cb\", Green.normal()) ]);\n    test!(red:     \"di=31\"   => [ (\"di\", Red.normal()) ]);\n    test!(blue:    \"la=34\"   => [ (\"la\", Blue.normal()) ]);\n\n    // Background colours\n    test!(yellow:  \"do=43\"   => [ (\"do\", Style::default().on(Yellow)) ]);\n    test!(purple:  \"re=45\"   => [ (\"re\", Style::default().on(Purple)) ]);\n    test!(cyan:    \"mi=46\"   => [ (\"mi\", Style::default().on(Cyan)) ]);\n\n    // Bold and underline\n    test!(bold:    \"fa=1\"    => [ (\"fa\", Style::default().bold()) ]);\n    test!(under:   \"so=4\"    => [ (\"so\", Style::default().underline()) ]);\n    test!(both:    \"la=1;4\"  => [ (\"la\", Style::default().bold().underline()) ]);\n\n    // More and many\n    test!(more:  \"me=43;21;55;34:yu=1;4;1\"  => [ (\"me\", Blue.on(Yellow)), (\"yu\", Style::default().bold().underline()) ]);\n    test!(many:  \"red=31:green=32:blue=34\"  => [ (\"red\", Red.normal()), (\"green\", Green.normal()), (\"blue\", Blue.normal()) ]);\n}\n"
  },
  {
    "path": "src/theme/mod.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse nu_ansi_term::Style;\n\nuse std::collections::HashMap;\n\nuse crate::fs::File;\nuse crate::info::filetype::FileType;\nuse crate::options::config::ThemeConfig;\nuse crate::output::color_scale::ColorScaleOptions;\nuse crate::output::file_name::Colours as FileNameColours;\nuse crate::output::render;\n\nmod ui_styles;\npub(crate) use self::ui_styles::FileType as ThemeFileType;\npub use self::ui_styles::UiStyles;\npub(crate) use self::ui_styles::*;\n\nmod lsc;\npub use self::lsc::LSColors;\n\nmod default_theme;\n\n#[derive(PartialEq, Eq, Debug)]\npub struct Options {\n    pub use_colours: UseColours,\n\n    pub colour_scale: ColorScaleOptions,\n\n    pub definitions: Definitions,\n\n    pub theme_config: Option<ThemeConfig>,\n}\n\n/// Under what circumstances we should display coloured, rather than plain,\n/// output to the terminal.\n///\n/// By default, we want to display the colours when stdout can display them.\n/// Turning them on when output is going to, say, a pipe, would make programs\n/// such as `grep` or `more` not work properly. So the `Automatic` mode does\n/// this check and only displays colours when they can be truly appreciated.\n#[derive(PartialEq, Eq, Debug, Copy, Clone)]\npub enum UseColours {\n    /// Display them even when output isn’t going to a terminal.\n    Always,\n\n    /// Display them when output is going to a terminal, but not otherwise.\n    Automatic,\n\n    /// Never display them, even when output is going to a terminal.\n    Never,\n}\n\n#[derive(PartialEq, Eq, Debug, Default)]\npub struct Definitions {\n    pub ls: Option<String>,\n    pub exa: Option<String>,\n}\n\npub struct Theme {\n    pub ui: UiStyles,\n    pub exts: Box<dyn FileStyle>,\n}\n\nimpl Options {\n    #[must_use]\n    pub fn to_theme(&self, isatty: bool) -> Theme {\n        if self.use_colours == UseColours::Never\n            || (self.use_colours == UseColours::Automatic && !isatty)\n        {\n            let ui = UiStyles::plain();\n            let exts = Box::new(NoFileStyle);\n            return Theme { ui, exts };\n        }\n\n        #[cfg(windows)]\n        if nu_ansi_term::enable_ansi_support().is_err() {\n            // Failed to enable ansi support, probably because legacy mode console.\n            // No need to alert the user unless they explicitly set color=always\n            if self.use_colours == UseColours::Always {\n                eprintln!(\"eza: Ignoring option color=always in legacy console.\");\n            }\n            let ui = UiStyles::plain();\n            let exts = Box::new(NoFileStyle);\n            return Theme { ui, exts };\n        }\n\n        match self.theme_config {\n            Some(ref theme) => {\n                if let Some(mut ui) = theme.to_theme() {\n                    let (exts, use_default_filetypes) = self.definitions.parse_color_vars(&mut ui);\n                    let exts: Box<dyn FileStyle> =\n                        match (exts.is_non_empty(), use_default_filetypes) {\n                            (false, false) => Box::new(NoFileStyle),\n                            (false, true) => Box::new(FileTypes),\n                            (true, false) => Box::new(exts),\n                            (true, true) => Box::new((exts, FileTypes)),\n                        };\n                    return Theme { ui, exts };\n                }\n                self.default_theme()\n            }\n            None => self.default_theme(),\n        }\n    }\n\n    fn default_theme(&self) -> Theme {\n        let mut ui = UiStyles::default_theme(self.colour_scale);\n        let (exts, use_default_filetypes) = self.definitions.parse_color_vars(&mut ui);\n        let exts: Box<dyn FileStyle> = match (exts.is_non_empty(), use_default_filetypes) {\n            (false, false) => Box::new(NoFileStyle),\n            (false, true) => Box::new(FileTypes),\n            (true, false) => Box::new(exts),\n            (true, true) => Box::new((exts, FileTypes)),\n        };\n        Theme { ui, exts }\n    }\n}\n\nimpl Definitions {\n    /// Parse the environment variables into `LS_COLORS` pairs, putting file glob\n    /// colours into the `ExtensionMappings` that gets returned, and using the\n    /// two-character UI codes to modify the mutable `Colours`.\n    ///\n    /// Also returns if the `EZA_COLORS` variable should reset the existing file\n    /// type mappings or not. The `reset` code needs to be the first one.\n    fn parse_color_vars(&self, colours: &mut UiStyles) -> (ExtensionMappings, bool) {\n        use log::warn;\n\n        let mut exts = ExtensionMappings::default();\n\n        if let Some(lsc) = &self.ls {\n            LSColors(lsc).each_pair(|pair| {\n                if !colours.set_ls(&pair) {\n                    match glob::Pattern::new(pair.key) {\n                        Ok(pat) => {\n                            exts.add(pat, pair.to_style());\n                        }\n                        Err(e) => {\n                            warn!(\"Couldn't parse glob pattern {:?}: {}\", pair.key, e);\n                        }\n                    }\n                }\n            });\n        }\n\n        let mut use_default_filetypes = true;\n\n        if let Some(exa) = &self.exa {\n            // Is this hacky? Yes.\n            if exa == \"reset\" || exa.starts_with(\"reset:\") {\n                use_default_filetypes = false;\n            }\n\n            LSColors(exa).each_pair(|pair| {\n                if !colours.set_ls(&pair) && !colours.set_exa(&pair) {\n                    match glob::Pattern::new(pair.key) {\n                        Ok(pat) => {\n                            exts.add(pat, pair.to_style());\n                        }\n                        Err(e) => {\n                            warn!(\"Couldn't parse glob pattern {:?}: {}\", pair.key, e);\n                        }\n                    }\n                }\n            });\n        }\n\n        (exts, use_default_filetypes)\n    }\n}\n\n/// Determine the style to paint the text for the filename part of the output.\npub trait FileStyle: Sync {\n    /// Return the style to paint the filename text for `file` from the given\n    /// `theme`.\n    fn get_style(&self, file: &File<'_>, theme: &Theme) -> Option<Style>;\n}\n\n#[derive(PartialEq, Debug)]\nstruct NoFileStyle;\n\nimpl FileStyle for NoFileStyle {\n    fn get_style(&self, _file: &File<'_>, _theme: &Theme) -> Option<Style> {\n        None\n    }\n}\n\n// When getting the colour of a file from a *pair* of colourisers, try the\n// first one then try the second one. This lets the user provide their own\n// file type associations, while falling back to the default set if not set\n// explicitly.\nimpl<A, B> FileStyle for (A, B)\nwhere\n    A: FileStyle,\n    B: FileStyle,\n{\n    fn get_style(&self, file: &File<'_>, theme: &Theme) -> Option<Style> {\n        self.0\n            .get_style(file, theme)\n            .or_else(|| self.1.get_style(file, theme))\n    }\n}\n\n#[derive(PartialEq, Debug, Default)]\nstruct ExtensionMappings {\n    mappings: Vec<GlobPattern>,\n}\n\n#[derive(PartialEq, Debug)]\n/// Using a hashmap here for \"simple\" patterns (plain extensions like '*.txt')\n/// improves performance drastically for complex `LS_COLORS` usage (see\n/// <https://github.com/eza-community/eza/pull/1421#issuecomment-2816666661>).\n///\n/// It doesn't change highlighting behavior, as we still walk the\n/// [`ExtensionMappings`] in reverse order, and the hashmap will only consist of\n/// disjoint sets (it doesn't matter in which order we search *.txt or *.pdf).\n///\n/// In the event that a pattern shows up twice, we will use the later one (since\n/// .insert overrides any entry that exists), which is the correct behavior.\nenum GlobPattern {\n    Complex(glob::Pattern, Style),\n    Simple(HashMap<String, Style>),\n}\n\nimpl ExtensionMappings {\n    fn is_non_empty(&self) -> bool {\n        !self.mappings.is_empty()\n    }\n\n    fn add(&mut self, pattern: glob::Pattern, style: Style) {\n        match (self.mappings.last_mut(), is_simple_pattern(pattern)) {\n            (Some(GlobPattern::Simple(h)), Ok(s)) => {\n                h.insert(s, style);\n            }\n            (_, Ok(s)) => {\n                self.mappings\n                    .push(GlobPattern::Simple(HashMap::from([(s, style)])));\n            }\n            (_, Err(p)) => {\n                self.mappings.push(GlobPattern::Complex(p, style));\n            }\n        }\n    }\n}\n\nfn is_simple_pattern(pattern: glob::Pattern) -> Result<String, glob::Pattern> {\n    match pattern.as_str().strip_prefix(\"*.\") {\n        // Maybe too pessimistic here, some of these might be valid.\n        //\n        // For example, '*.[*]' is a simple pattern with ext '*'\n        // (the [*] is treated as a literal *, not as a glob).\n        //\n        // Ideally we'd inspect pattern.tokens, but it's not public.\n        None => Err(pattern),\n        Some(ext) if ext.contains(['?', '*', '[', ']', '.']) => Err(pattern),\n        Some(ext) => Ok(ext.to_string()),\n    }\n}\n\n// Loop through backwards so that colours specified later in the list override\n// colours specified earlier, like we do with options and strict mode\n\nimpl FileStyle for ExtensionMappings {\n    fn get_style(&self, file: &File<'_>, _theme: &Theme) -> Option<Style> {\n        let maybe_ext = file.name.rsplit_once('.').map(|x| x.1);\n\n        for mapping in self.mappings.iter().rev() {\n            match mapping {\n                GlobPattern::Complex(pat, style) => {\n                    if pat.matches(&file.name) {\n                        return Some(*style);\n                    }\n                }\n                GlobPattern::Simple(map) => {\n                    if let Some(ext) = maybe_ext\n                        && let Some(style) = map.get(ext)\n                    {\n                        return Some(*style);\n                    }\n                }\n            }\n        }\n\n        None\n    }\n}\n\n#[derive(Debug)]\nstruct FileTypes;\n\nimpl FileStyle for FileTypes {\n    fn get_style(&self, file: &File<'_>, theme: &Theme) -> Option<Style> {\n        #[rustfmt::skip]\n        return match FileType::get_file_type(file) {\n            Some(FileType::Image)      => theme.ui.file_type.unwrap_or_default().image,\n            Some(FileType::Video)      => theme.ui.file_type.unwrap_or_default().video,\n            Some(FileType::Music)      => theme.ui.file_type.unwrap_or_default().music,\n            Some(FileType::Lossless)   => theme.ui.file_type.unwrap_or_default().lossless,\n            Some(FileType::Crypto)     => theme.ui.file_type.unwrap_or_default().crypto,\n            Some(FileType::Document)   => theme.ui.file_type.unwrap_or_default().document,\n            Some(FileType::Compressed) => theme.ui.file_type.unwrap_or_default().compressed,\n            Some(FileType::Temp)       => theme.ui.file_type.unwrap_or_default().temp,\n            Some(FileType::Compiled)   => theme.ui.file_type.unwrap_or_default().compiled,\n            Some(FileType::Build)      => theme.ui.file_type.unwrap_or_default().build,\n            Some(FileType::Source)     => theme.ui.file_type.unwrap_or_default().source,\n            None                       => None\n    };\n    }\n}\n\n#[cfg(unix)]\nimpl render::BlocksColours for Theme {\n    fn blocksize(&self, prefix: Option<unit_prefix::Prefix>) -> Style {\n        use unit_prefix::Prefix::{Gibi, Giga, Kibi, Kilo, Mebi, Mega};\n\n        #[rustfmt::skip]\n        let style = match prefix {\n            Some(Kilo | Kibi) => self.ui.size.unwrap_or_default().number_kilo,\n            Some(Mega | Mebi) => self.ui.size.unwrap_or_default().number_mega,\n            Some(Giga | Gibi) => self.ui.size.unwrap_or_default().number_giga,\n            Some(_)           => self.ui.size.unwrap_or_default().number_huge,\n            None              => self.ui.size.unwrap_or_default().number_byte,\n        };\n        style.unwrap_or_default()\n    }\n\n    fn unit(&self, prefix: Option<unit_prefix::Prefix>) -> Style {\n        use unit_prefix::Prefix::{Gibi, Giga, Kibi, Kilo, Mebi, Mega};\n\n        #[rustfmt::skip]\n           let style = match prefix {\n            Some(Kilo | Kibi) => self.ui.size.unwrap_or_default().unit_kilo,\n            Some(Mega | Mebi) => self.ui.size.unwrap_or_default().unit_mega,\n            Some(Giga | Gibi) => self.ui.size.unwrap_or_default().unit_giga,\n            Some(_)           => self.ui.size.unwrap_or_default().unit_huge,\n            None              => self.ui.size.unwrap_or_default().unit_byte,\n        };\n        style.unwrap_or_default()\n    }\n\n    fn no_blocksize(&self) -> Style {\n        self.ui.punctuation.unwrap_or_default()\n    }\n}\n\n#[rustfmt::skip]\nimpl render::FiletypeColours for Theme {\n    fn normal(&self)       -> Style { self.ui.filekinds.unwrap_or_default().normal() }\n    fn directory(&self)    -> Style { self.ui.filekinds.unwrap_or_default().directory() }\n    fn pipe(&self)         -> Style { self.ui.filekinds.unwrap_or_default().pipe() }\n    fn symlink(&self)      -> Style { self.ui.filekinds.unwrap_or_default().symlink() }\n    fn block_device(&self) -> Style { self.ui.filekinds.unwrap_or_default().block_device() }\n    fn char_device(&self)  -> Style { self.ui.filekinds.unwrap_or_default().char_device() }\n    fn socket(&self)       -> Style { self.ui.filekinds.unwrap_or_default().socket() }\n    fn special(&self)      -> Style { self.ui.filekinds.unwrap_or_default().special() }\n}\n\n#[rustfmt::skip]\nimpl render::GitColours for Theme {\n    fn not_modified(&self)  -> Style { self.ui.punctuation() }\n    #[allow(clippy::new_ret_no_self)]\n    fn new(&self)           -> Style { self.ui.git.unwrap_or_default().new() }\n    fn modified(&self)      -> Style { self.ui.git.unwrap_or_default().modified() }\n    fn deleted(&self)       -> Style { self.ui.git.unwrap_or_default().deleted() }\n    fn renamed(&self)       -> Style { self.ui.git.unwrap_or_default().renamed() }\n    fn type_change(&self)   -> Style { self.ui.git.unwrap_or_default().typechange() }\n    fn ignored(&self)       -> Style { self.ui.git.unwrap_or_default().ignored() }\n    fn conflicted(&self)    -> Style { self.ui.git.unwrap_or_default().conflicted() }\n}\n\n#[rustfmt::skip]\nimpl render::GitRepoColours for Theme {\n    fn branch_main(&self)  -> Style { self.ui.git_repo.unwrap_or_default().branch_main() }\n    fn branch_other(&self) -> Style { self.ui.git_repo.unwrap_or_default().branch_other() }\n    fn no_repo(&self)      -> Style { self.ui.punctuation() }\n    fn git_clean(&self)    -> Style { self.ui.git_repo.unwrap_or_default().git_clean() }\n    fn git_dirty(&self)    -> Style { self.ui.git_repo.unwrap_or_default().git_dirty() }\n}\n\n#[rustfmt::skip]\n#[cfg(unix)]\nimpl render::GroupColours for Theme {\n    fn yours(&self)      -> Style { self.ui.users.unwrap_or_default().group_yours() }\n    fn not_yours(&self)  -> Style { self.ui.users.unwrap_or_default().group_other() }\n    fn root_group(&self) -> Style { self.ui.users.unwrap_or_default().group_root() }\n    fn no_group(&self)   -> Style { self.ui.punctuation() }\n}\n\n#[rustfmt::skip]\nimpl render::LinksColours for Theme {\n    fn normal(&self)           -> Style { self.ui.links.unwrap_or_default().normal() }\n    fn multi_link_file(&self)  -> Style { self.ui.links.unwrap_or_default().multi_link_file() }\n}\n\n#[rustfmt::skip]\nimpl render::PermissionsColours for Theme {\n    fn dash(&self)               -> Style { self.ui.punctuation() }\n    fn user_read(&self)          -> Style { self.ui.perms.unwrap_or_default().user_read() }\n    fn user_write(&self)         -> Style { self.ui.perms.unwrap_or_default().user_write() }\n    fn user_execute_file(&self)  -> Style { self.ui.perms.unwrap_or_default().user_execute_file() }\n    fn user_execute_other(&self) -> Style { self.ui.perms.unwrap_or_default().user_execute_other() }\n    fn group_read(&self)         -> Style { self.ui.perms.unwrap_or_default().group_read() }\n    fn group_write(&self)        -> Style { self.ui.perms.unwrap_or_default().group_write() }\n    fn group_execute(&self)      -> Style { self.ui.perms.unwrap_or_default().group_execute() }\n    fn other_read(&self)         -> Style { self.ui.perms.unwrap_or_default().other_read() }\n    fn other_write(&self)        -> Style { self.ui.perms.unwrap_or_default().other_write() }\n    fn other_execute(&self)      -> Style { self.ui.perms.unwrap_or_default().other_execute() }\n    fn special_user_file(&self)  -> Style { self.ui.perms.unwrap_or_default().special_user_file() }\n    fn special_other(&self)      -> Style { self.ui.perms.unwrap_or_default().special_other() }\n    fn attribute(&self)          -> Style { self.ui.perms.unwrap_or_default().attribute() }\n}\n\nimpl render::SizeColours for Theme {\n    fn size(&self, prefix: Option<unit_prefix::Prefix>) -> Style {\n        use unit_prefix::Prefix::{Gibi, Giga, Kibi, Kilo, Mebi, Mega};\n\n        #[rustfmt::skip]\n        return match prefix {\n            Some(Kilo | Kibi) => self.ui.size.unwrap_or_default().number_kilo(),\n            Some(Mega | Mebi) => self.ui.size.unwrap_or_default().number_mega(),\n            Some(Giga | Gibi) => self.ui.size.unwrap_or_default().number_giga(),\n            Some(_)           => self.ui.size.unwrap_or_default().number_huge(),\n            None              => self.ui.size.unwrap_or_default().number_byte(),\n        };\n    }\n\n    fn unit(&self, prefix: Option<unit_prefix::Prefix>) -> Style {\n        use unit_prefix::Prefix::{Gibi, Giga, Kibi, Kilo, Mebi, Mega};\n\n        #[rustfmt::skip]\n        return match prefix {\n            Some(Kilo | Kibi) => self.ui.size.unwrap_or_default().unit_kilo(),\n            Some(Mega | Mebi) => self.ui.size.unwrap_or_default().unit_mega(),\n            Some(Giga | Gibi) => self.ui.size.unwrap_or_default().unit_giga(),\n            Some(_)           => self.ui.size.unwrap_or_default().unit_huge(),\n            None              => self.ui.size.unwrap_or_default().unit_byte(),\n        };\n    }\n\n    #[rustfmt::skip]\n    fn no_size(&self) -> Style { self.ui.punctuation() }\n    #[rustfmt::skip]\n    fn major(&self)   -> Style { self.ui.size.unwrap_or_default().major() }\n    #[rustfmt::skip]\n    fn comma(&self)   -> Style { self.ui.punctuation() }\n    #[rustfmt::skip]\n    fn minor(&self)   -> Style { self.ui.size.unwrap_or_default().minor() }\n}\n\n#[rustfmt::skip]\n#[cfg(unix)]\nimpl render::UserColours for Theme {\n    fn you(&self)           -> Style { self.ui.users.unwrap_or_default().user_you() }\n    fn other(&self)         -> Style { self.ui.users.unwrap_or_default().user_other() }\n    fn root(&self)          -> Style { self.ui.users.unwrap_or_default().user_root() }\n    fn no_user(&self)       -> Style { self.ui.punctuation() }\n}\n\n#[rustfmt::skip]\nimpl FileNameColours for Theme {\n    fn symlink_path(&self)        -> Style { self.ui.symlink_path() }\n    fn normal_arrow(&self)        -> Style { self.ui.punctuation() }\n    fn broken_symlink(&self)      -> Style { self.ui.broken_symlink() }\n    fn broken_filename(&self)     -> Style { apply_overlay(self.ui.broken_symlink(), self.ui.broken_path_overlay()) }\n    fn control_char(&self)        -> Style { self.ui.control_char() }\n    fn broken_control_char(&self) -> Style { apply_overlay(self.ui.control_char(),   self.ui.broken_path_overlay()) }\n    fn executable_file(&self)     -> Style { self.ui.filekinds.unwrap_or_default().executable() }\n    fn mount_point(&self)         -> Style { self.ui.filekinds.unwrap_or_default().mount_point() }\n\n    fn colour_file(&self, file: &File<'_>) -> Style {\n        self.exts\n            .get_style(file, self)\n            .unwrap_or(self.ui.filekinds.unwrap_or_default().normal())\n    }\n\n fn style_override(&self, file: &File<'_>) -> Option<FileNameStyle> {\n        if let Some(ref name_overrides) = self.ui.filenames\n            && let Some(file_override) = name_overrides.get(&file.name) {\n                return Some(*file_override);\n            }\n\n        if let Some(ref ext_overrides) = self.ui.extensions\n            && let Some(ext) = file.ext.clone()\n                && let Some(file_override) = ext_overrides.get(&ext) {\n                    return Some(*file_override);\n                }\n\n        None\n    }\n}\n\n#[rustfmt::skip]\nimpl render::SecurityCtxColours for Theme {\n    fn none(&self)          -> Style { self.ui.security_context.unwrap_or_default().none() }\n    fn selinux_colon(&self) -> Style { self.ui.security_context.unwrap_or_default().selinux().colon() }\n    fn selinux_user(&self)  -> Style { self.ui.security_context.unwrap_or_default().selinux().user() }\n    fn selinux_role(&self)  -> Style { self.ui.security_context.unwrap_or_default().selinux().role() }\n    fn selinux_type(&self)  -> Style { self.ui.security_context.unwrap_or_default().selinux().typ() }\n    fn selinux_range(&self) -> Style { self.ui.security_context.unwrap_or_default().selinux().range() }\n}\n\n/// Some of the styles are **overlays**: although they have the same attribute\n/// set as regular styles (foreground and background colours, bold, underline,\n/// etc), they’re intended to be used to *amend* existing styles.\n///\n/// For example, the target path of a broken symlink is displayed in a red,\n/// underlined style by default. Paths can contain control characters, so\n/// these control characters need to be underlined too, otherwise it looks\n/// weird. So instead of having four separate configurable styles for “link\n/// path”, “broken link path”, “control character” and “broken control\n/// character”, there are styles for “link path”, “control character”, and\n/// “broken link overlay”, the latter of which is just set to override the\n/// underline attribute on the other two.\n#[rustfmt::skip]\nfn apply_overlay(mut base: Style, overlay: Style) -> Style {\n    if let Some(fg) = overlay.foreground { base.foreground = Some(fg); }\n    if let Some(bg) = overlay.background { base.background = Some(bg); }\n\n    if overlay.is_bold          { base.is_bold          = true; }\n    if overlay.is_dimmed        { base.is_dimmed        = true; }\n    if overlay.is_italic        { base.is_italic        = true; }\n    if overlay.is_underline     { base.is_underline     = true; }\n    if overlay.is_blink         { base.is_blink         = true; }\n    if overlay.is_reverse       { base.is_reverse       = true; }\n    if overlay.is_hidden        { base.is_hidden        = true; }\n    if overlay.is_strikethrough { base.is_strikethrough = true; }\n\n    base\n}\n\n#[cfg(test)]\n#[cfg(unix)]\nmod customs_test {\n    use super::*;\n    use crate::theme::ui_styles::UiStyles;\n    use nu_ansi_term::Color::*;\n\n    impl ExtensionMappings {\n        // helper for test suite\n        fn to_vec_pat_style(&self) -> Vec<(glob::Pattern, Style)> {\n            let mut out = Vec::new();\n            for map in &self.mappings {\n                match map {\n                    GlobPattern::Complex(p, s) => {\n                        out.push((p.clone(), *s));\n                    }\n                    GlobPattern::Simple(h) => {\n                        let mut simple_pats = h\n                            .iter()\n                            .map(|(k, v)| (glob::Pattern::new(&format!(\"*.{k}\")).unwrap(), *v))\n                            .collect::<Vec<(glob::Pattern, Style)>>();\n\n                        simple_pats.sort_by_key(|x| x.0.clone());\n\n                        out.extend(simple_pats);\n                    }\n                }\n            }\n            out\n        }\n    }\n\n    macro_rules! test {\n        ($name:ident:  ls $ls:expr, exa $exa:expr  =>  colours $expected:ident -> $process_expected:expr) => {\n            #[allow(non_snake_case)]\n            #[test]\n            fn $name() {\n                let mut $expected = UiStyles::default();\n                $process_expected();\n\n                let definitions = Definitions {\n                    ls: Some($ls.into()),\n                    exa: Some($exa.into()),\n                };\n\n                let mut result = UiStyles::default();\n                let (_, _) = definitions.parse_color_vars(&mut result);\n                assert_eq!($expected, result);\n            }\n        };\n        ($name:ident:  ls $ls:expr, exa $exa:expr  =>  exts $mappings:expr) => {\n            #[test]\n            fn $name() {\n                let mappings: Vec<(glob::Pattern, Style)> = $mappings\n                    .iter()\n                    .map(|t| (glob::Pattern::new(t.0).unwrap(), t.1))\n                    .collect();\n\n                let definitions = Definitions {\n                    ls: Some($ls.into()),\n                    exa: Some($exa.into()),\n                };\n\n                let (result, _) = definitions.parse_color_vars(&mut UiStyles::default());\n                assert_eq!(mappings, result.to_vec_pat_style());\n            }\n        };\n        ($name:ident:  ls $ls:expr, exa $exa:expr  =>  colours $expected:ident -> $process_expected:expr, exts $mappings:expr) => {\n            #[test]\n            fn $name() {\n                let mut $expected = UiStyles::default();\n                $process_expected();\n\n                let mappings: Vec<(glob::Pattern, Style)> = $mappings\n                    .iter()\n                    .map(|t| (glob::Pattern::new(t.0).unwrap(), t.1))\n                    .collect();\n\n                let definitions = Definitions {\n                    ls: Some($ls.into()),\n                    exa: Some($exa.into()),\n                };\n\n                let mut result = UiStyles::default();\n                let (exts, _) = definitions.parse_color_vars(&mut result);\n\n                assert_eq!(mappings, exts.to_vec_pat_style());\n                assert_eq!($expected, result);\n            }\n        };\n    }\n\n    // LS_COLORS can affect all of these colours:\n    test!(ls_di:   ls \"di=31\", exa \"\"  =>  colours c -> { c.filekinds().directory    = Some(Red.normal());    });\n    test!(ls_ex:   ls \"ex=32\", exa \"\"  =>  colours c -> { c.filekinds().executable   = Some(Green.normal());  });\n    test!(ls_fi:   ls \"fi=33\", exa \"\"  =>  colours c -> { c.filekinds().normal       = Some(Yellow.normal()); });\n    test!(ls_pi:   ls \"pi=34\", exa \"\"  =>  colours c -> { c.filekinds().pipe         = Some(Blue.normal());   });\n    test!(ls_so:   ls \"so=35\", exa \"\"  =>  colours c -> { c.filekinds().socket       = Some(Purple.normal()); });\n    test!(ls_bd:   ls \"bd=36\", exa \"\"  =>  colours c -> { c.filekinds().block_device = Some(Cyan.normal());   });\n    test!(ls_cd:   ls \"cd=35\", exa \"\"  =>  colours c -> { c.filekinds().char_device  = Some(Purple.normal()); });\n    test!(ls_ln:   ls \"ln=34\", exa \"\"  =>  colours c -> { c.filekinds().symlink      = Some(Blue.normal());   });\n    test!(ls_or:   ls \"or=33\", exa \"\"  =>  colours c -> { c.broken_symlink         = Some(Yellow.normal()); });\n\n    // EZA_COLORS can affect all those colours too:\n    test!(exa_di:  ls \"\", exa \"di=32\"  =>  colours c -> { c.filekinds().directory    = Some(Green.normal());  });\n    test!(exa_ex:  ls \"\", exa \"ex=33\"  =>  colours c -> { c.filekinds().executable   = Some(Yellow.normal()); });\n    test!(exa_fi:  ls \"\", exa \"fi=34\"  =>  colours c -> { c.filekinds().normal       = Some(Blue.normal());   });\n    test!(exa_pi:  ls \"\", exa \"pi=35\"  =>  colours c -> { c.filekinds().pipe         = Some(Purple.normal()); });\n    test!(exa_so:  ls \"\", exa \"so=36\"  =>  colours c -> { c.filekinds().socket       = Some(Cyan.normal());   });\n    test!(exa_bd:  ls \"\", exa \"bd=35\"  =>  colours c -> { c.filekinds().block_device = Some(Purple.normal()); });\n    test!(exa_cd:  ls \"\", exa \"cd=34\"  =>  colours c -> { c.filekinds().char_device  = Some(Blue.normal());   });\n    test!(exa_ln:  ls \"\", exa \"ln=33\"  =>  colours c -> { c.filekinds().symlink      = Some(Yellow.normal()); });\n    test!(exa_or:  ls \"\", exa \"or=32\"  =>  colours c -> { c.broken_symlink         = Some(Green.normal());  });\n\n    // EZA_COLORS will even override options from LS_COLORS:\n    test!(ls_exa_di: ls \"di=31\", exa \"di=32\"  =>  colours c -> { c.filekinds().directory  = Some(Green.normal());  });\n    test!(ls_exa_ex: ls \"ex=32\", exa \"ex=33\"  =>  colours c -> { c.filekinds().executable = Some(Yellow.normal()); });\n    test!(ls_exa_fi: ls \"fi=33\", exa \"fi=34\"  =>  colours c -> { c.filekinds().normal     = Some(Blue.normal());   });\n\n    // But more importantly, EZA_COLORS has its own, special list of colours:\n    test!(exa_ur:  ls \"\", exa \"ur=38;5;100\"  =>  colours c -> { c.perms().user_read           = Some(Fixed(100).normal()); });\n    test!(exa_uw:  ls \"\", exa \"uw=38;5;101\"  =>  colours c -> { c.perms().user_write          = Some(Fixed(101).normal()); });\n    test!(exa_ux:  ls \"\", exa \"ux=38;5;102\"  =>  colours c -> { c.perms().user_execute_file   = Some(Fixed(102).normal()); });\n    test!(exa_ue:  ls \"\", exa \"ue=38;5;103\"  =>  colours c -> { c.perms().user_execute_other  = Some(Fixed(103).normal()); });\n    test!(exa_gr:  ls \"\", exa \"gr=38;5;104\"  =>  colours c -> { c.perms().group_read          = Some(Fixed(104).normal()); });\n    test!(exa_gw:  ls \"\", exa \"gw=38;5;105\"  =>  colours c -> { c.perms().group_write         = Some(Fixed(105).normal()); });\n    test!(exa_gx:  ls \"\", exa \"gx=38;5;106\"  =>  colours c -> { c.perms().group_execute       = Some(Fixed(106).normal()); });\n    test!(exa_tr:  ls \"\", exa \"tr=38;5;107\"  =>  colours c -> { c.perms().other_read          = Some(Fixed(107).normal()); });\n    test!(exa_tw:  ls \"\", exa \"tw=38;5;108\"  =>  colours c -> { c.perms().other_write         = Some(Fixed(108).normal()); });\n    test!(exa_tx:  ls \"\", exa \"tx=38;5;109\"  =>  colours c -> { c.perms().other_execute       = Some(Fixed(109).normal()); });\n    test!(exa_su:  ls \"\", exa \"su=38;5;110\"  =>  colours c -> { c.perms().special_user_file   = Some(Fixed(110).normal()); });\n    test!(exa_sf:  ls \"\", exa \"sf=38;5;111\"  =>  colours c -> { c.perms().special_other       = Some(Fixed(111).normal()); });\n    test!(exa_xa:  ls \"\", exa \"xa=38;5;112\"  =>  colours c -> { c.perms().attribute           = Some(Fixed(112).normal()); });\n\n    test!(exa_sn:  ls \"\", exa \"sn=38;5;113\" => colours c -> {\n        c.size().number_byte = Some(Fixed(113).normal());\n        c.size().number_kilo = Some(Fixed(113).normal());\n        c.size().number_mega = Some(Fixed(113).normal());\n        c.size().number_giga = Some(Fixed(113).normal());\n        c.size().number_huge = Some(Fixed(113).normal());\n    });\n    test!(exa_sb:  ls \"\", exa \"sb=38;5;114\" => colours c -> {\n        c.size().unit_byte = Some(Fixed(114).normal());\n        c.size().unit_kilo = Some(Fixed(114).normal());\n        c.size().unit_mega = Some(Fixed(114).normal());\n        c.size().unit_giga = Some(Fixed(114).normal());\n        c.size().unit_huge = Some(Fixed(114).normal());\n    });\n\n    test!(exa_nb:  ls \"\", exa \"nb=38;5;115\"  =>  colours c -> { c.size().number_byte                      = Some(Fixed(115).normal()); });\n    test!(exa_nk:  ls \"\", exa \"nk=38;5;116\"  =>  colours c -> { c.size().number_kilo                      = Some(Fixed(116).normal()); });\n    test!(exa_nm:  ls \"\", exa \"nm=38;5;117\"  =>  colours c -> { c.size().number_mega                      = Some(Fixed(117).normal()); });\n    test!(exa_ng:  ls \"\", exa \"ng=38;5;118\"  =>  colours c -> { c.size().number_giga                      = Some(Fixed(118).normal()); });\n    test!(exa_nt:  ls \"\", exa \"nt=38;5;119\"  =>  colours c -> { c.size().number_huge                      = Some(Fixed(119).normal()); });\n\n    test!(exa_ub:  ls \"\", exa \"ub=38;5;115\"  =>  colours c -> { c.size().unit_byte                        = Some(Fixed(115).normal()); });\n    test!(exa_uk:  ls \"\", exa \"uk=38;5;116\"  =>  colours c -> { c.size().unit_kilo                        = Some(Fixed(116).normal()); });\n    test!(exa_um:  ls \"\", exa \"um=38;5;117\"  =>  colours c -> { c.size().unit_mega                        = Some(Fixed(117).normal()); });\n    test!(exa_ug:  ls \"\", exa \"ug=38;5;118\"  =>  colours c -> { c.size().unit_giga                        = Some(Fixed(118).normal()); });\n    test!(exa_ut:  ls \"\", exa \"ut=38;5;119\"  =>  colours c -> { c.size().unit_huge                        = Some(Fixed(119).normal()); });\n\n    test!(exa_df:  ls \"\", exa \"df=38;5;115\"  =>  colours c -> { c.size().major                            = Some(Fixed(115).normal()); });\n    test!(exa_ds:  ls \"\", exa \"ds=38;5;116\"  =>  colours c -> { c.size().minor                            = Some(Fixed(116).normal()); });\n\n    test!(exa_uu:  ls \"\", exa \"uu=38;5;117\"  =>  colours c -> { c.users().user_you                        = Some(Fixed(117).normal()); });\n    test!(exa_un:  ls \"\", exa \"un=38;5;118\"  =>  colours c -> { c.users().user_other                      = Some(Fixed(118).normal()); });\n    test!(exa_gu:  ls \"\", exa \"gu=38;5;119\"  =>  colours c -> { c.users().group_yours                     = Some(Fixed(119).normal()); });\n    test!(exa_gn:  ls \"\", exa \"gn=38;5;120\"  =>  colours c -> { c.users().group_other                     = Some(Fixed(120).normal()); });\n\n    test!(exa_lc:  ls \"\", exa \"lc=38;5;121\"  =>  colours c -> { c.links().normal                          = Some(Fixed(121).normal()); });\n    test!(exa_lm:  ls \"\", exa \"lm=38;5;122\"  =>  colours c -> { c.links().multi_link_file                 = Some(Fixed(122).normal()); });\n\n    test!(exa_ga:  ls \"\", exa \"ga=38;5;123\"  =>  colours c -> { c.git().new                               = Some(Fixed(123).normal()); });\n    test!(exa_gm:  ls \"\", exa \"gm=38;5;124\"  =>  colours c -> { c.git().modified                          = Some(Fixed(124).normal()); });\n    test!(exa_gd:  ls \"\", exa \"gd=38;5;125\"  =>  colours c -> { c.git().deleted                           = Some(Fixed(125).normal()); });\n    test!(exa_gv:  ls \"\", exa \"gv=38;5;126\"  =>  colours c -> { c.git().renamed                           = Some(Fixed(126).normal()); });\n    test!(exa_gt:  ls \"\", exa \"gt=38;5;127\"  =>  colours c -> { c.git().typechange                        = Some(Fixed(127).normal()); });\n    test!(exa_gi:  ls \"\", exa \"gi=38;5;128\"  =>  colours c -> { c.git().ignored                           = Some(Fixed(128).normal()); });\n    test!(exa_gc:  ls \"\", exa \"gc=38;5;129\"  =>  colours c -> { c.git().conflicted                        = Some(Fixed(129).normal()); });\n\n    test!(exa_xx:  ls \"\", exa \"xx=38;5;128\"  =>  colours c -> { c.punctuation                           = Some(Fixed(128).normal()); });\n    test!(exa_da:  ls \"\", exa \"da=38;5;129\"  =>  colours c -> { c.date                                  = Some(Fixed(129).normal()); });\n    test!(exa_in:  ls \"\", exa \"in=38;5;130\"  =>  colours c -> { c.inode                                 = Some(Fixed(130).normal()); });\n    test!(exa_bl:  ls \"\", exa \"bl=38;5;131\"  =>  colours c -> { c.blocks                                = Some(Fixed(131).normal()); });\n    test!(exa_hd:  ls \"\", exa \"hd=38;5;132\"  =>  colours c -> { c.header                                = Some(Fixed(132).normal()); });\n    test!(exa_lp:  ls \"\", exa \"lp=38;5;133\"  =>  colours c -> { c.symlink_path                          = Some(Fixed(133).normal()); });\n    test!(exa_cc:  ls \"\", exa \"cc=38;5;134\"  =>  colours c -> { c.control_char                          = Some(Fixed(134).normal()); });\n    test!(exa_oc:  ls \"\", exa \"oc=38;5;135\"  =>  colours c -> { c.octal                                 = Some(Fixed(135).normal()); });\n    test!(exa_ff:  ls \"\", exa \"ff=38;5;136\"  =>  colours c -> { c.flags                                 = Some(Fixed(136).normal()); });\n    test!(exa_bo:  ls \"\", exa \"bO=4\"         =>  colours c -> { c.broken_path_overlay                   = Some(Style::default().underline()); });\n\n    test!(exa_mp:  ls \"\", exa \"mp=1;34;4\"    =>  colours c -> { c.filekinds().mount_point                 = Some(Blue.bold().underline()); });\n    test!(exa_sp:  ls \"\", exa \"sp=1;35;4\"    =>  colours c -> { c.filekinds().special                     = Some(Purple.bold().underline()); });\n\n    test!(exa_im:  ls \"\", exa \"im=38;5;128\"  =>  colours c -> { c.file_type().image                       = Some(Fixed(128).normal()); });\n    test!(exa_vi:  ls \"\", exa \"vi=38;5;129\"  =>  colours c -> { c.file_type().video                       = Some(Fixed(129).normal()); });\n    test!(exa_mu:  ls \"\", exa \"mu=38;5;130\"  =>  colours c -> { c.file_type().music                       = Some(Fixed(130).normal()); });\n    test!(exa_lo:  ls \"\", exa \"lo=38;5;131\"  =>  colours c -> { c.file_type().lossless                    = Some(Fixed(131).normal()); });\n    test!(exa_cr:  ls \"\", exa \"cr=38;5;132\"  =>  colours c -> { c.file_type().crypto                      = Some(Fixed(132).normal()); });\n    test!(exa_do:  ls \"\", exa \"do=38;5;133\"  =>  colours c -> { c.file_type().document                    = Some(Fixed(133).normal()); });\n    test!(exa_co:  ls \"\", exa \"co=38;5;134\"  =>  colours c -> { c.file_type().compressed                  = Some(Fixed(134).normal()); });\n    test!(exa_tm:  ls \"\", exa \"tm=38;5;135\"  =>  colours c -> { c.file_type().temp                        = Some(Fixed(135).normal()); });\n    test!(exa_cm:  ls \"\", exa \"cm=38;5;136\"  =>  colours c -> { c.file_type().compiled                    = Some(Fixed(136).normal()); });\n    test!(exa_ie:  ls \"\", exa \"bu=38;5;137\"  =>  colours c -> { c.file_type().build                       = Some(Fixed(137).normal()); });\n    test!(exa_bu:  ls \"\", exa \"bu=38;5;137\"  =>  colours c -> { c.file_type().build                       = Some(Fixed(137).normal()); });\n    test!(exa_sc:  ls \"\", exa \"sc=38;5;138\"  =>  colours c -> { c.file_type().source                      = Some(Fixed(138).normal()); });\n\n    test!(exa_Sn:  ls \"\", exa \"Sn=38;5;128\"  =>  colours c -> { c.security_context().none                   = Some(Fixed(128).normal()); });\n    test!(exa_Su:  ls \"\", exa \"Su=38;5;129\"  =>  colours c -> { c.security_context().selinux().user         = Some(Fixed(129).normal()); });\n    test!(exa_Sr:  ls \"\", exa \"Sr=38;5;130\"  =>  colours c -> { c.security_context().selinux().role         = Some(Fixed(130).normal()); });\n    test!(exa_St:  ls \"\", exa \"St=38;5;131\"  =>  colours c -> { c.security_context().selinux().typ          = Some(Fixed(131).normal()); });\n    test!(exa_Sl:  ls \"\", exa \"Sl=38;5;132\"  =>  colours c -> { c.security_context().selinux().range        = Some(Fixed(132).normal()); });\n\n    // All the while, LS_COLORS treats them as filenames:\n    test!(ls_uu:   ls \"uu=38;5;117\", exa \"\"  =>  exts [ (\"uu\", Fixed(117).normal()) ]);\n    test!(ls_un:   ls \"un=38;5;118\", exa \"\"  =>  exts [ (\"un\", Fixed(118).normal()) ]);\n    test!(ls_gu:   ls \"gu=38;5;119\", exa \"\"  =>  exts [ (\"gu\", Fixed(119).normal()) ]);\n    test!(ls_gn:   ls \"gn=38;5;120\", exa \"\"  =>  exts [ (\"gn\", Fixed(120).normal()) ]);\n\n    // Just like all other keys:\n    test!(ls_txt:  ls \"*.txt=31\",          exa \"\"  =>  exts [ (\"*.txt\",      Red.normal())             ]);\n    test!(ls_mp3:  ls \"*.mp3=38;5;135\",    exa \"\"  =>  exts [ (\"*.mp3\",      Fixed(135).normal())      ]);\n    test!(ls_mak:  ls \"Makefile=1;32;4\",   exa \"\"  =>  exts [ (\"Makefile\",   Green.bold().underline()) ]);\n    test!(exa_txt: ls \"\", exa \"*.zip=31\"           =>  exts [ (\"*.zip\",      Red.normal())             ]);\n    test!(exa_mp3: ls \"\", exa \"lev.*=38;5;153\"     =>  exts [ (\"lev.*\",      Fixed(153).normal())      ]);\n    test!(exa_mak: ls \"\", exa \"Cargo.toml=4;32;1\"  =>  exts [ (\"Cargo.toml\", Green.bold().underline()) ]);\n\n    // Testing whether a glob from EZA_COLORS overrides a glob from LS_COLORS\n    // can’t be tested here, because they’ll both be added to the same vec\n\n    // Values get separated by colons:\n    test!(ls_multi:     ls \"*.txt=31:*.rtf=32\", exa \"\"  => exts [ (\"*.rtf\", Green.normal()),   (\"*.txt\", Red.normal()) ]);\n    test!(exa_multi:    ls \"\", exa \"*.tmp=37:*.log=37\"  => exts [ (\"*.log\", White.normal()), (\"*.tmp\", White.normal()) ]);\n    test!(ls_exa_multi: ls \"*.txt=31\", exa \"*.rtf=32\"   => exts [ (\"*.rtf\", Green.normal()),   (\"*.txt\", Red.normal())]);\n\n    test!(ls_five: ls \"1*1=31:2*2=32:3*3=1;33:4*4=34;1:5*5=35;4\", exa \"\"  =>  exts [\n        (\"1*1\", Red.normal()), (\"2*2\", Green.normal()), (\"3*3\", Yellow.bold()), (\"4*4\", Blue.bold()), (\"5*5\", Purple.underline())\n    ]);\n\n    // Finally, colours get applied right-to-left:\n    test!(ls_overwrite:  ls \"pi=31:pi=32:pi=33\", exa \"\"  =>  colours c -> { c.filekinds().pipe = Some(Yellow.normal()); });\n    test!(exa_overwrite: ls \"\", exa \"da=36:da=35:da=34\"  =>  colours c -> { c.date = Some(Blue.normal()); });\n\n    // Parse keys and extensions\n    test!(ls_fi_ls_txt:   ls \"fi=33:*.txt=31\", exa \"\" => colours c -> { c.filekinds().normal = Some(Yellow.normal()); }, exts [ (\"*.txt\", Red.normal()) ]);\n    test!(ls_fi_exa_txt:  ls \"fi=33\", exa \"*.txt=31\"  => colours c -> { c.filekinds().normal = Some(Yellow.normal()); }, exts [ (\"*.txt\", Red.normal()) ]);\n    test!(ls_txt_exa_fi:  ls \"*.txt=31\", exa \"fi=33\"  => colours c -> { c.filekinds().normal = Some(Yellow.normal()); }, exts [ (\"*.txt\", Red.normal()) ]);\n    test!(eza_fi_exa_txt: ls \"\", exa \"fi=33:*.txt=31\" => colours c -> { c.filekinds().normal = Some(Yellow.normal()); }, exts [ (\"*.txt\", Red.normal()) ]);\n}\n"
  },
  {
    "path": "src/theme/ui_styles.rs",
    "content": "// SPDX-FileCopyrightText: 2024 Christina Sørensen\n// SPDX-License-Identifier: EUPL-1.2\n//\n// SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors\n// SPDX-FileCopyrightText: 2014 Benjamin Sago\n// SPDX-License-Identifier: MIT\nuse crate::theme::lsc::Pair;\nuse nu_ansi_term::{\n    Color::{Blue, Cyan, Green, Purple, Red, Yellow},\n    Style,\n};\nuse serde::{Deserialize, Serialize};\nuse std::collections::HashMap;\nuse std::default::Default;\n\n#[derive(Debug, Default, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]\npub struct IconStyle {\n    pub glyph: Option<char>,\n    pub style: Option<Style>,\n}\n\n#[derive(Debug, Default, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]\npub struct FileNameStyle {\n    pub icon: Option<IconStyle>,\n    pub filename: Option<Style>,\n}\n\n#[rustfmt::skip]\n#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]\npub struct UiStyles {\n    pub colourful: Option<bool>,\n\n    pub filekinds:        Option<FileKinds>,\n    pub perms:            Option<Permissions>,\n    pub size:             Option<Size>,\n    pub users:            Option<Users>,\n    pub links:            Option<Links>,\n    pub git:              Option<Git>,\n    pub git_repo:         Option<GitRepo>,\n    pub security_context: Option<SecurityContext>,\n    pub file_type:        Option<FileType>,\n\n    pub punctuation:  Option<Style>,          // xx\n    pub date:         Option<Style>,          // da\n    pub inode:        Option<Style>,          // in\n    pub blocks:       Option<Style>,          // bl\n    pub header:       Option<Style>,          // hd\n    pub octal:        Option<Style>,          // oc\n    pub flags:        Option<Style>,          // ff\n\n    pub symlink_path:         Option<Style>,  // lp\n    pub control_char:         Option<Style>,  // cc\n    pub broken_symlink:       Option<Style>,  // or\n    pub broken_path_overlay:  Option<Style>,  // bO\n\n    pub filenames: Option<HashMap<String, FileNameStyle>>,\n    pub extensions: Option<HashMap<String, FileNameStyle>>,\n}\n// Macro to generate .unwrap_or_default getters for each field to cut down boilerplate\nmacro_rules! field_accessors {\n    ($struct_name:ident, $($field_name:ident: Option<$type:ty>),*) => {\n        impl $struct_name {\n            $(\n                #[allow(clippy::wrong_self_convention, clippy::new_ret_no_self)]\n                #[must_use] pub fn $field_name(&self) -> $type {\n                    self.$field_name.unwrap_or_default()\n                }\n            )*\n        }\n    };\n}\n// Macro to generate method that returns a mut ref to each field or creates a default one if it's None\nmacro_rules! update_field_accessors {\n    ($struct_name:ident, $($field_name:ident: Option<$type:ty>),*) => {\n        impl $struct_name {\n            $(\n                pub fn $field_name(&mut self) -> &mut $type {\n                    if self.$field_name.is_none() {\n                        self.$field_name = Some(Default::default());\n                    }\n                    // It is safe to unwrap here because we just ensured it's not None\n                    self.$field_name.as_mut().unwrap()\n                }\n            )*\n        }\n    };\n}\n\nupdate_field_accessors!(\n    UiStyles,\n    colourful: Option<bool>,\n    filekinds: Option<FileKinds>,\n    perms: Option<Permissions>,\n    size: Option<Size>,\n    file_type: Option<FileType>,\n    security_context: Option<SecurityContext>,\n    users: Option<Users>,\n    links: Option<Links>,\n    git: Option<Git>,\n    git_repo: Option<GitRepo>\n);\n\nfield_accessors!(\n    UiStyles,\n    punctuation: Option<Style>,\n    date: Option<Style>,\n    inode: Option<Style>,\n    blocks: Option<Style>,\n    header: Option<Style>,\n    octal: Option<Style>,\n    flags: Option<Style>,\n    symlink_path: Option<Style>,\n    control_char: Option<Style>,\n    broken_symlink: Option<Style>,\n    broken_path_overlay: Option<Style>\n);\n\n#[rustfmt::skip]\n#[derive(Clone, Eq, Copy, Debug, PartialEq, Serialize, Deserialize)]\npub struct FileKinds {\n    pub normal: Option<Style>,        // fi\n    pub directory: Option<Style>,     // di\n    pub symlink: Option<Style>,       // ln\n    pub pipe: Option<Style>,          // pi\n    pub block_device: Option<Style>,  // bd\n    pub char_device: Option<Style>,   // cd\n    pub socket: Option<Style>,        // so\n    pub special: Option<Style>,       // sp\n    pub executable: Option<Style>,    // ex\n    pub mount_point: Option<Style>,   // mp\n}\n\nimpl Default for FileKinds {\n    fn default() -> Self {\n        Self {\n            normal: Some(Style::default()),\n            directory: Some(Blue.bold()),\n            symlink: Some(Cyan.normal()),\n            pipe: Some(Yellow.normal()),\n            block_device: Some(Yellow.bold()),\n            char_device: Some(Yellow.bold()),\n            socket: Some(Red.bold()),\n            special: Some(Yellow.normal()),\n            executable: Some(Green.bold()),\n            mount_point: Some(Blue.bold().underline()),\n        }\n    }\n}\nfield_accessors!(\n    FileKinds,\n    normal: Option<Style>,\n    directory: Option<Style>,\n    symlink: Option<Style>,\n    pipe: Option<Style>,\n    block_device: Option<Style>,\n    char_device: Option<Style>,\n    socket: Option<Style>,\n    special: Option<Style>,\n    executable: Option<Style>,\n    mount_point: Option<Style>\n);\n\n#[rustfmt::skip]\n#[derive(Clone, Copy,Eq, Debug, Default, PartialEq, Serialize, Deserialize)]\npub struct Permissions {\n    pub user_read:         Option<Style>,  // ur\n    pub user_write:         Option<Style>,  // uw\n    pub user_execute_file:  Option<Style>,  // ux\n    pub user_execute_other: Option<Style>,  // ue\n\n    pub group_read:    Option<Style>,       // gr\n    pub group_write:   Option<Style>,       // gw\n    pub group_execute: Option<Style>,       // gx\n\n    pub other_read:    Option<Style>,       // tr\n    pub other_write:   Option<Style>,       // tw\n    pub other_execute: Option<Style>,       // tx\n\n    pub special_user_file: Option<Style>,   // su\n    pub special_other:     Option<Style>,   // sf\n\n    pub attribute: Option<Style>,           // xa\n}\nfield_accessors!(\n    Permissions,\n    user_read: Option<Style>,\n    user_write: Option<Style>,\n    user_execute_file: Option<Style>,\n    user_execute_other: Option<Style>,\n    group_read: Option<Style>,\n    group_write: Option<Style>,\n    group_execute: Option<Style>,\n    other_read: Option<Style>,\n    other_write: Option<Style>,\n    other_execute: Option<Style>,\n    special_user_file: Option<Style>,\n    special_other: Option<Style>,\n    attribute: Option<Style>\n);\n\n#[rustfmt::skip]\n#[derive(Clone, Copy, Eq, Debug, Default, PartialEq, Serialize, Deserialize)]\npub struct Size {\n    pub major: Option<Style>,        // df\n    pub minor: Option<Style>,        // ds\n\n    pub number_byte: Option<Style>,  // sn nb\n    pub number_kilo: Option<Style>,  // sn nk\n    pub number_mega: Option<Style>,  // sn nm\n    pub number_giga: Option<Style>,  // sn ng\n    pub number_huge: Option<Style>,  // sn nt\n\n    pub unit_byte: Option<Style>,    // sb ub\n    pub unit_kilo: Option<Style>,    // sb uk\n    pub unit_mega: Option<Style>,    // sb um\n    pub unit_giga: Option<Style>,    // sb ug\n    pub unit_huge: Option<Style>,    // sb ut\n}\nfield_accessors!(\n    Size,\n    major: Option<Style>,\n    minor: Option<Style>,\n    number_byte: Option<Style>,\n    number_kilo: Option<Style>,\n    number_mega: Option<Style>,\n    number_giga: Option<Style>,\n    number_huge: Option<Style>,\n    unit_byte: Option<Style>,\n    unit_kilo: Option<Style>,\n    unit_mega: Option<Style>,\n    unit_giga: Option<Style>,\n    unit_huge: Option<Style>\n);\n\n#[rustfmt::skip]\n#[derive(Clone, Copy, Debug,Eq, Default, PartialEq, Serialize, Deserialize)]\npub struct Users {\n    pub user_you: Option<Style>,           // uu\n    pub user_root: Option<Style>,          // uR\n    pub user_other: Option<Style>,         // un\n    pub group_yours: Option<Style>,        // gu\n    pub group_other: Option<Style>,        // gn\n    pub group_root: Option<Style>,         // gR\n}\nfield_accessors!(\n    Users,\n    user_you: Option<Style>,\n    user_root: Option<Style>,\n    user_other: Option<Style>,\n    group_yours: Option<Style>,\n    group_other: Option<Style>,\n    group_root: Option<Style>\n);\n\n#[rustfmt::skip]\n#[allow(unused)]\n#[derive(Clone, Copy, Debug, Eq, Default, PartialEq, Serialize, Deserialize)]\npub struct Links {\n    pub normal: Option<Style>,           // lc\n    pub multi_link_file: Option<Style>,  // lm\n}\nfield_accessors!(Links, normal: Option<Style>, multi_link_file: Option<Style>);\n\n#[rustfmt::skip]\n#[derive(Clone, Copy, Debug,Eq, PartialEq, Serialize, Deserialize)]\npub struct Git {\n    pub new: Option<Style>,         // ga\n    pub modified: Option<Style>,    // gm\n    pub deleted: Option<Style>,     // gd\n    pub renamed: Option<Style>,     // gv\n    pub typechange: Option<Style>,  // gt\n    pub ignored: Option<Style>,     // gi\n    pub conflicted: Option<Style>,  // gc\n}\n\nfield_accessors!(\n    Git,\n    new: Option<Style>,\n    modified: Option<Style>,\n    deleted: Option<Style>,\n    renamed: Option<Style>,\n    typechange: Option<Style>,\n    ignored: Option<Style>,\n    conflicted: Option<Style>\n);\nimpl Default for Git {\n    fn default() -> Self {\n        Git {\n            new: Some(Green.normal()),\n            modified: Some(Blue.normal()),\n            deleted: Some(Red.normal()),\n            renamed: Some(Yellow.normal()),\n            typechange: Some(Purple.normal()),\n            ignored: Some(Style::default().dimmed()),\n            conflicted: Some(Red.normal()),\n        }\n    }\n}\n\n#[rustfmt::skip]\n#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]\npub struct GitRepo {\n    pub branch_main: Option<Style>,  //Gm\n    pub branch_other: Option<Style>, //Go\n    pub git_clean: Option<Style>,    //Gc\n    pub git_dirty: Option<Style>,    //Gd\n}\nfield_accessors!(\n    GitRepo,\n    branch_main: Option<Style>,\n    branch_other: Option<Style>,\n    git_clean: Option<Style>,\n    git_dirty: Option<Style>\n);\nimpl Default for GitRepo {\n    fn default() -> Self {\n        Self {\n            branch_main: Some(Green.normal()),\n            branch_other: Some(Yellow.normal()),\n            git_clean: Some(Green.normal()),\n            git_dirty: Some(Yellow.bold()),\n        }\n    }\n}\n\n#[derive(Clone, Copy, Debug, Eq, Default, PartialEq, Serialize, Deserialize)]\npub struct SELinuxContext {\n    pub colon: Option<Style>,\n    pub user: Option<Style>,  // Su\n    pub role: Option<Style>,  // Sr\n    pub typ: Option<Style>,   // St\n    pub range: Option<Style>, // Sl\n}\nfield_accessors!(\n    SELinuxContext,\n    colon: Option<Style>,\n    user: Option<Style>,\n    role: Option<Style>,\n    typ: Option<Style>,\n    range: Option<Style>\n);\n\n#[rustfmt::skip]\n#[derive(Clone, Eq, Copy, Debug, PartialEq, Serialize, Deserialize)]\npub struct SecurityContext {\n    pub none:    Option<Style>, // Sn\n    pub selinux: Option<SELinuxContext>,\n}\nfield_accessors!(\n    SecurityContext,\n    none: Option<Style>,\n    selinux: Option<SELinuxContext>\n);\n\nimpl Default for SecurityContext {\n    fn default() -> Self {\n        SecurityContext {\n            none: Some(Style::default()),\n            selinux: Some(SELinuxContext {\n                colon: Some(Style::default().dimmed()),\n                user: Some(Blue.normal()),\n                role: Some(Green.normal()),\n                typ: Some(Yellow.normal()),\n                range: Some(Cyan.normal()),\n            }),\n        }\n    }\n}\n\n/// Drawing styles based on the type of file (video, image, compressed, etc)\n#[rustfmt::skip]\n#[derive(Clone, Copy, Debug, Eq, Default, PartialEq, Serialize, Deserialize)]\npub struct FileType {\n    pub image: Option<Style>,       // im - image file\n    pub video: Option<Style>,       // vi - video file\n    pub music: Option<Style>,       // mu - lossy music\n    pub lossless: Option<Style>,    // lo - lossless music\n    pub crypto: Option<Style>,      // cr - related to cryptography\n    pub document: Option<Style>,    // do - document file\n    pub compressed: Option<Style>,  // co - compressed file\n    pub temp: Option<Style>,        // tm - temporary file\n    pub compiled: Option<Style>,    // cm - compilation artifact\n    pub build: Option<Style>,       // bu - file that is used to build a project\n    pub source: Option<Style>,      // sc - source code\n}\n\nimpl UiStyles {\n    #[must_use]\n    pub fn plain() -> Self {\n        Self {\n            colourful: Some(false),\n\n            #[rustfmt::skip]\n            filekinds: Some(FileKinds {\n            normal: Some(Style::default()),\n            directory: Some(Style::default()),\n            symlink: Some(Style::default()),\n            pipe: Some(Style::default()),\n            block_device: Some(Style::default()),\n            char_device: Some(Style::default()),\n            socket: Some(Style::default()),\n            special: Some(Style::default()),\n            executable: Some(Style::default()),\n            mount_point: Some(Style::default()),\n            }),\n\n            #[rustfmt::skip]\n            perms: Some(Permissions {\n                user_read:           Some(Style::default()),\n                user_write:          Some(Style::default()),\n                user_execute_file:   Some(Style::default()),\n                user_execute_other:  Some(Style::default()),\n\n                group_read:          Some(Style::default()),\n                group_write:         Some(Style::default()),\n                group_execute:       Some(Style::default()),\n\n                other_read:          Some(Style::default()),\n                other_write:         Some(Style::default()),\n                other_execute:       Some(Style::default()),\n\n                special_user_file:   Some(Style::default()),\n                special_other:       Some(Style::default()),\n\n                attribute:           Some(Style::default()),\n            }),\n\n            size: Some(Size::default()),\n\n            #[rustfmt::skip]\n            users:Some(Users {\n                user_you:                       Some(Style::default()),\n                user_other:                     Some(Style::default()),\n                user_root:                      Some(Style::default()),\n                group_yours:                    Some(Style::default()),\n                group_other:                    Some(Style::default()),\n                group_root:                     Some(Style::default()),\n            }),\n\n            #[rustfmt::skip]\n            links: Some(Links {\n                normal:          Some(Style::default()),\n                multi_link_file: Some(Style::default()),\n            }),\n\n            #[rustfmt::skip]\n            git: Some(Git {\n                new:         Some(Style::default()),\n                modified:    Some(Style::default()),\n                deleted:     Some(Style::default()),\n                renamed:     Some(Style::default()),\n                typechange:  Some(Style::default()),\n                ignored:     Some(Style::default()),\n                conflicted:  Some(Style::default()),\n            }),\n\n            git_repo: Some(GitRepo {\n                branch_main: Some(Style::default()),\n                branch_other: Some(Style::default()),\n                git_clean: Some(Style::default()),\n                git_dirty: Some(Style::default()),\n            }),\n\n            security_context: Some(SecurityContext {\n                none: Some(Style::default()),\n                #[rustfmt::skip]\n                selinux: Some(SELinuxContext {\n                    colon: Some(Style::default()),\n                    user:  Some(Style::default()),\n                    role:  Some(Style::default()),\n                    typ:   Some(Style::default()),\n                    range: Some(Style::default()),\n                }),\n            }),\n\n            #[rustfmt::skip]\n            file_type: Some(FileType {\n                image:      Some(Style::default()),\n                video:      Some(Style::default()),\n                music:      Some(Style::default()),\n                lossless:   Some(Style::default()),\n                crypto:     Some(Style::default()),\n                document:   Some(Style::default()),\n                compressed: Some(Style::default()),\n                temp:       Some(Style::default()),\n                compiled:   Some(Style::default()),\n                build:      Some(Style::default()),\n                source:     Some(Style::default()), // Need to discuss color\n            }),\n\n            punctuation: Some(Style::default()),\n            date: Some(Style::default()),\n            inode: Some(Style::default()),\n            blocks: Some(Style::default()),\n            octal: Some(Style::default()),\n            flags: Some(Style::default()),\n            header: Some(Style::default()),\n\n            symlink_path: Some(Style::default()),\n            control_char: Some(Style::default()),\n            broken_symlink: Some(Style::default()),\n            broken_path_overlay: Some(Style::default()),\n\n            filenames: None,\n            extensions: None,\n        }\n    }\n}\n\nimpl UiStyles {\n    /// Sets a value on this set of colours using one of the keys understood\n    /// by the `LS_COLORS` environment variable. Invalid keys set nothing, but\n    /// return false.\n    #[rustfmt::skip]\n    pub fn set_ls(&mut self, pair: &Pair<'_>) -> bool {\n        match pair.key {\n            \"di\" => self.filekinds().directory    = Some(pair.to_style()),  // DIR\n            \"ex\" => self.filekinds().executable   = Some(pair.to_style()),  // EXEC\n            \"fi\" => self.filekinds().normal       = Some(pair.to_style()),  // FILE\n            \"pi\" => self.filekinds().pipe         = Some(pair.to_style()),  // FIFO\n            \"so\" => self.filekinds().socket       = Some(pair.to_style()),  // SOCK\n            \"bd\" => self.filekinds().block_device = Some(pair.to_style()),  // BLK\n            \"cd\" => self.filekinds().char_device  = Some(pair.to_style()),  // CHR\n            \"ln\" => self.filekinds().symlink      = Some(pair.to_style()),  // LINK\n            \"or\" => self.broken_symlink         = Some(pair.to_style()),  // ORPHAN\n             _   => return false,\n             // Codes we don’t do anything with:\n             // MULTIHARDLINK, DOOR, SETUID, SETGID, CAPABILITY,\n             // STICKY_OTHER_WRITABLE, OTHER_WRITABLE, STICKY, MISSING\n        }\n        true\n    }\n\n    /// Sets a value on this set of colours using one of the keys understood\n    /// by the `EZA_COLORS` environment variable. Invalid keys set nothing,\n    /// but return false. This doesn’t take the `LS_COLORS` keys into account,\n    /// so `set_ls` should have been run first.\n    #[rustfmt::skip]\n    pub fn set_exa(&mut self, pair: &Pair<'_>) -> bool {\n        match pair.key {\n            \"ur\" => self.perms().user_read                = Some(pair.to_style()),\n            \"uw\" => self.perms().user_write               = Some(pair.to_style()),\n            \"ux\" => self.perms().user_execute_file        = Some(pair.to_style()),\n            \"ue\" => self.perms().user_execute_other       = Some(pair.to_style()),\n            \"gr\" => self.perms().group_read               = Some(pair.to_style()),\n            \"gw\" => self.perms().group_write              = Some(pair.to_style()),\n            \"gx\" => self.perms().group_execute            = Some(pair.to_style()),\n            \"tr\" => self.perms().other_read               = Some(pair.to_style()),\n            \"tw\" => self.perms().other_write              = Some(pair.to_style()),\n            \"tx\" => self.perms().other_execute            = Some(pair.to_style()),\n            \"su\" => self.perms().special_user_file        = Some(pair.to_style()),\n            \"sf\" => self.perms().special_other            = Some(pair.to_style()),\n            \"xa\" => self.perms().attribute                = Some(pair.to_style()),\n\n            \"sn\" => self.set_number_style(pair.to_style()),\n            \"sb\" => self.set_unit_style(pair.to_style()),\n            \"nb\" => self.size().number_byte               = Some(pair.to_style()),\n            \"nk\" => self.size().number_kilo               = Some(pair.to_style()),\n            \"nm\" => self.size().number_mega               = Some(pair.to_style()),\n            \"ng\" => self.size().number_giga               = Some(pair.to_style()),\n            \"nt\" => self.size().number_huge               = Some(pair.to_style()),\n            \"ub\" => self.size().unit_byte                 = Some(pair.to_style()),\n            \"uk\" => self.size().unit_kilo                 = Some(pair.to_style()),\n            \"um\" => self.size().unit_mega                 = Some(pair.to_style()),\n            \"ug\" => self.size().unit_giga                 = Some(pair.to_style()),\n            \"ut\" => self.size().unit_huge                 = Some(pair.to_style()),\n            \"df\" => self.size().major                     = Some(pair.to_style()),\n            \"ds\" => self.size().minor                     = Some(pair.to_style()),\n\n            \"uu\" => self.users().user_you                 = Some(pair.to_style()),\n            \"un\" => self.users().user_other               = Some(pair.to_style()),\n            \"uR\" => self.users().user_root                = Some(pair.to_style()),\n            \"gu\" => self.users().group_yours              = Some(pair.to_style()),\n            \"gn\" => self.users().group_other              = Some(pair.to_style()),\n            \"gR\" => self.users().group_root               = Some(pair.to_style()),\n\n            \"lc\" => self.links().normal                   = Some(pair.to_style()),\n            \"lm\" => self.links().multi_link_file          = Some(pair.to_style()),\n\n            \"ga\" => self.git().new                        = Some(pair.to_style()),\n            \"gm\" => self.git().modified                   = Some(pair.to_style()),\n            \"gd\" => self.git().deleted                    = Some(pair.to_style()),\n            \"gv\" => self.git().renamed                    = Some(pair.to_style()),\n            \"gt\" => self.git().typechange                 = Some(pair.to_style()),\n            \"gi\" => self.git().ignored                    = Some(pair.to_style()),\n            \"gc\" => self.git().conflicted                 = Some(pair.to_style()),\n\n            \"Gm\" => self.git_repo().branch_main           = Some(pair.to_style()),\n            \"Go\" => self.git_repo().branch_other          = Some(pair.to_style()),\n            \"Gc\" => self.git_repo().git_clean             = Some(pair.to_style()),\n            \"Gd\" => self.git_repo().git_dirty             = Some(pair.to_style()),\n            \"xx\" => self.punctuation                     = Some(pair.to_style()),\n            \"da\" => self.date                            = Some(pair.to_style()),\n            \"in\" => self.inode                           = Some(pair.to_style()),\n            \"bl\" => self.blocks                          = Some(pair.to_style()),\n            \"hd\" => self.header                          = Some(pair.to_style()),\n            \"oc\" => self.octal                           = Some(pair.to_style()),\n            \"ff\" => self.flags                           = Some(pair.to_style()),\n            \"lp\" => self.symlink_path                    = Some(pair.to_style()),\n            \"cc\" => self.control_char                    = Some(pair.to_style()),\n            \"bO\" => self.broken_path_overlay             = Some(pair.to_style()),\n\n            \"mp\" => self.filekinds().mount_point          = Some(pair.to_style()),\n            \"sp\" => self.filekinds().special              = Some(pair.to_style()),  // Catch-all for unrecognized file kind\n\n            \"im\" => self.file_type().image                = Some(pair.to_style()),\n            \"vi\" => self.file_type().video                = Some(pair.to_style()),\n            \"mu\" => self.file_type().music                = Some(pair.to_style()),\n            \"lo\" => self.file_type().lossless             = Some(pair.to_style()),\n            \"cr\" => self.file_type().crypto               = Some(pair.to_style()),\n            \"do\" => self.file_type().document             = Some(pair.to_style()),\n            \"co\" => self.file_type().compressed           = Some(pair.to_style()),\n            \"tm\" => self.file_type().temp                 = Some(pair.to_style()),\n            \"cm\" => self.file_type().compiled             = Some(pair.to_style()),\n            \"bu\" => self.file_type().build                = Some(pair.to_style()),\n            \"sc\" => self.file_type().source               = Some(pair.to_style()),\n\n            \"Sn\" => self.security_context().none          = Some(pair.to_style()),\n            \"Su\" => self.security_context().selinux().user  = Some(pair.to_style()),\n            \"Sr\" => self.security_context().selinux().role  = Some(pair.to_style()),\n            \"St\" => self.security_context().selinux().typ   = Some(pair.to_style()),\n            \"Sl\" => self.security_context().selinux().range = Some(pair.to_style()),\n\n             _   => return false,\n        }\n\n        true\n    }\n\n    pub fn set_number_style(&mut self, style: Style) {\n        self.size().number_byte = Some(style);\n        self.size().number_kilo = Some(style);\n        self.size().number_mega = Some(style);\n        self.size().number_giga = Some(style);\n        self.size().number_huge = Some(style);\n    }\n\n    pub fn set_unit_style(&mut self, style: Style) {\n        self.size().unit_byte = Some(style);\n        self.size().unit_kilo = Some(style);\n        self.size().unit_mega = Some(style);\n        self.size().unit_giga = Some(style);\n        self.size().unit_huge = Some(style);\n    }\n}\n"
  },
  {
    "path": "tests/cli_tests.rs",
    "content": "#[test]\nfn cli_all_tests() {\n    trycmd::TestCases::new().case(\"tests/cmd/*_all.toml\");\n}\n\n#[test]\n#[cfg(unix)]\nfn cli_unix_tests() {\n    trycmd::TestCases::new().case(\"tests/cmd/*_unix.toml\");\n}\n\n#[test]\n#[cfg(windows)]\nfn cli_windows_tests() {\n    trycmd::TestCases::new().case(\"tests/cmd/*_windows.toml\");\n}\n\n#[test]\n#[cfg(feature = \"nix-local\")]\nfn cli_nix_local_tests() {\n    trycmd::TestCases::new().case(\"tests/cmd/*_nix_local.toml\");\n}\n\n#[test]\n#[cfg(feature = \"powertest\")]\nfn cli_powertest_tests() {\n    trycmd::TestCases::new().case(\"tests/ptests/*.toml\");\n}\n\n#[test]\n#[cfg(feature = \"nix\")]\nfn cli_nix_generated_tests() {\n    trycmd::TestCases::new().case(\"tests/gen/*.toml\");\n}\n"
  },
  {
    "path": "tests/cmd/absolute_file_all.stderr",
    "content": ""
  },
  {
    "path": "tests/cmd/absolute_file_all.stdout",
    "content": "[CWD]/tests/itest/index.svg\n"
  },
  {
    "path": "tests/cmd/absolute_file_all.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/itest/index.svg --absolute\"\n"
  },
  {
    "path": "tests/cmd/absolute_recurse_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/cmd/absolute_recurse_unix.stdout",
    "content": "[CWD]/tests/itest/a\n[CWD]/tests/itest/b\n[CWD]/tests/itest/c\n[CWD]/tests/itest/d\n[CWD]/tests/itest/dir-symlink -> vagrant/debug\n[CWD]/tests/itest/e\n[CWD]/tests/itest/exa\n[CWD]/tests/itest/f\n[CWD]/tests/itest/g\n[CWD]/tests/itest/h\n[CWD]/tests/itest/i\n[CWD]/tests/itest/image.jpg.img.c.rs.log.png\n[CWD]/tests/itest/index.svg\n[CWD]/tests/itest/j\n[CWD]/tests/itest/k\n[CWD]/tests/itest/l\n[CWD]/tests/itest/m\n[CWD]/tests/itest/n\n[CWD]/tests/itest/o\n[CWD]/tests/itest/p\n[CWD]/tests/itest/q\n[CWD]/tests/itest/vagrant\n\ntests/itest/exa:\n[CWD]/tests/itest/exa/file.c -> djihisudjuhfius\n[CWD]/tests/itest/exa/sssssssssssssssssssssssssggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\n\ntests/itest/exa/sssssssssssssssssssssssssggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss:\n[CWD]/tests/itest/exa/sssssssssssssssssssssssssggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss/Makefile\n\ntests/itest/vagrant:\n[CWD]/tests/itest/vagrant/debug\n[CWD]/tests/itest/vagrant/dev\n[CWD]/tests/itest/vagrant/log\n\ntests/itest/vagrant/debug:\n[CWD]/tests/itest/vagrant/debug/a\n[CWD]/tests/itest/vagrant/debug/symlink -> a\n[CWD]/tests/itest/vagrant/debug/symlink-broken -> ./b\n\ntests/itest/vagrant/dev:\n[CWD]/tests/itest/vagrant/dev/main.bf\n\ntests/itest/vagrant/log:\n[CWD]/tests/itest/vagrant/log/file.png\n[CWD]/tests/itest/vagrant/log/run\n\ntests/itest/vagrant/log/run:\n[CWD]/tests/itest/vagrant/log/run/run.log.text\n[CWD]/tests/itest/vagrant/log/run/sps.log.text\n"
  },
  {
    "path": "tests/cmd/absolute_recurse_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/itest --absolute -R\"\n"
  },
  {
    "path": "tests/cmd/absolute_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/cmd/absolute_unix.stdout",
    "content": "[CWD]/tests/itest/a\n[CWD]/tests/itest/b\n[CWD]/tests/itest/c\n[CWD]/tests/itest/d\n[CWD]/tests/itest/dir-symlink -> vagrant/debug\n[CWD]/tests/itest/e\n[CWD]/tests/itest/exa\n[CWD]/tests/itest/f\n[CWD]/tests/itest/g\n[CWD]/tests/itest/h\n[CWD]/tests/itest/i\n[CWD]/tests/itest/image.jpg.img.c.rs.log.png\n[CWD]/tests/itest/index.svg\n[CWD]/tests/itest/j\n[CWD]/tests/itest/k\n[CWD]/tests/itest/l\n[CWD]/tests/itest/m\n[CWD]/tests/itest/n\n[CWD]/tests/itest/o\n[CWD]/tests/itest/p\n[CWD]/tests/itest/q\n[CWD]/tests/itest/vagrant\n"
  },
  {
    "path": "tests/cmd/absolute_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/itest --absolute\"\n"
  },
  {
    "path": "tests/cmd/basic_all.stderr",
    "content": ""
  },
  {
    "path": "tests/cmd/basic_all.stdout",
    "content": "a\nb\nc\nd\ndir-symlink -> vagrant/debug\ne\nexa\nf\ng\nh\ni\nimage.jpg.img.c.rs.log.png\nindex.svg\nj\nk\nl\nm\nn\no\np\nq\nvagrant\n"
  },
  {
    "path": "tests/cmd/basic_all.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/itest\"\n"
  },
  {
    "path": "tests/cmd/classify-hyperlink-width-50_nix_local.stderr",
    "content": ""
  },
  {
    "path": "tests/cmd/classify-hyperlink-width-50_nix_local.stdout",
    "content": "\u001b]8;;file:///build/source/tests/itest/a\u001b/a\u001b]8;;\u001b/  \u001b]8;;file:///build/source/tests/itest/exa\u001b/exa\u001b]8;;\u001b//  \u001b]8;;file:///build/source/tests/itest/image.jpg.img.c.rs.log.png\u001b/image.jpg.img.c.rs.log.png\u001b]8;;\u001b/  \u001b]8;;file:///build/source/tests/itest/m\u001b/m\u001b]8;;\u001b/  \u001b]8;;file:///build/source/tests/itest/vagrant\u001b/vagrant\u001b]8;;\u001b//\n\u001b]8;;file:///build/source/tests/itest/b\u001b/b\u001b]8;;\u001b/  \u001b]8;;file:///build/source/tests/itest/f\u001b/f\u001b]8;;\u001b/     \u001b]8;;file:///build/source/tests/itest/index.svg\u001b/index.svg\u001b]8;;\u001b/                   \u001b]8;;file:///build/source/tests/itest/n\u001b/n\u001b]8;;\u001b/  \n\u001b]8;;file:///build/source/tests/itest/c\u001b/c\u001b]8;;\u001b/  \u001b]8;;file:///build/source/tests/itest/g\u001b/g\u001b]8;;\u001b/     \u001b]8;;file:///build/source/tests/itest/j\u001b/j\u001b]8;;\u001b/                           \u001b]8;;file:///build/source/tests/itest/o\u001b/o\u001b]8;;\u001b/  \n\u001b]8;;file:///build/source/tests/itest/d\u001b/d\u001b]8;;\u001b/  \u001b]8;;file:///build/source/tests/itest/h\u001b/h\u001b]8;;\u001b/     \u001b]8;;file:///build/source/tests/itest/k\u001b/k\u001b]8;;\u001b/                           \u001b]8;;file:///build/source/tests/itest/p\u001b/p\u001b]8;;\u001b/  \n\u001b]8;;file:///build/source/tests/itest/e\u001b/e\u001b]8;;\u001b/  \u001b]8;;file:///build/source/tests/itest/i\u001b/i\u001b]8;;\u001b/     \u001b]8;;file:///build/source/tests/itest/l\u001b/l\u001b]8;;\u001b/                           \u001b]8;;file:///build/source/tests/itest/q\u001b/q\u001b]8;;\u001b/  \n"
  },
  {
    "path": "tests/cmd/follow-symlinks_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/cmd/follow-symlinks_unix.stdout",
    "content": "tests/itest\n├── a\n├── b\n├── c\n├── d\n├── dir-symlink -> vagrant/debug\n│   ├── a\n│   ├── symlink -> a\n│   └── symlink-broken -> ./b\n├── e\n├── exa\n│   ├── file.c -> djihisudjuhfius\n│   └── sssssssssssssssssssssssssggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\n│       └── Makefile\n├── f\n├── g\n├── h\n├── i\n├── image.jpg.img.c.rs.log.png\n├── index.svg\n├── j\n├── k\n├── l\n├── m\n├── n\n├── o\n├── p\n├── q\n└── vagrant\n    ├── debug\n    │   ├── a\n    │   ├── symlink -> a\n    │   └── symlink-broken -> ./b\n    ├── dev\n    │   └── main.bf\n    └── log\n        ├── file.png\n        └── run\n            ├── run.log.text\n            └── sps.log.text\n"
  },
  {
    "path": "tests/cmd/follow-symlinks_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/itest --follow-symlinks -T\"\n"
  },
  {
    "path": "tests/cmd/icons_all.stderr",
    "content": ""
  },
  {
    "path": "tests/cmd/icons_all.stdout",
    "content": "󰡯 a\n󰡯 b\n󰡯 c\n󰡯 d\n dir-symlink -> vagrant/debug\n󰡯 e\n exa\n󰡯 f\n󰡯 g\n󰡯 h\n󰡯 i\n image.jpg.img.c.rs.log.png\n󰕙 index.svg\n󰡯 j\n󰡯 k\n󰡯 l\n󰡯 m\n󰡯 n\n󰡯 o\n󰡯 p\n󰡯 q\n vagrant\n"
  },
  {
    "path": "tests/cmd/icons_all.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/itest --icons=always\"\n"
  },
  {
    "path": "tests/cmd/long_icons_always.stderr",
    "content": ""
  },
  {
    "path": "tests/cmd/long_icons_always.stdout",
    "content": ".rw-r--r--  0 nixbld  1 Jan  1970  a\n.rw-r--r--  0 nixbld  1 Jan  1970  b\n.rw-r--r--  0 nixbld  1 Jan  1970  c\n.rw-r--r--  0 nixbld  1 Jan  1970  d\n.rw-r--r--  0 nixbld  1 Jan  1970  e\ndrwxr-xr-x  - nixbld  1 Jan  1970  exa\n.rw-r--r--  0 nixbld  1 Jan  1970  f\n.rw-r--r--  0 nixbld  1 Jan  1970  g\n.rw-r--r--  0 nixbld  1 Jan  1970  h\n.rw-r--r--  0 nixbld  1 Jan  1970  i\n.rw-r--r--  0 nixbld  1 Jan  1970  image.jpg.img.c.rs.log.png\n.rw-r--r-- 19 nixbld  1 Jan  1970 󰕙 index.svg\n.rw-r--r--  0 nixbld  1 Jan  1970  j\n.rw-r--r--  0 nixbld  1 Jan  1970  k\n.rw-r--r--  0 nixbld  1 Jan  1970  l\n.rw-r--r--  0 nixbld  1 Jan  1970  m\n.rw-r--r--  0 nixbld  1 Jan  1970  n\n.rw-r--r--  0 nixbld  1 Jan  1970  o\n.rw-r--r--  0 nixbld  1 Jan  1970  p\n.rw-r--r--  0 nixbld  1 Jan  1970  q\ndrwxr-xr-x  - nixbld  1 Jan  1970  vagrant\n"
  },
  {
    "path": "tests/cmd/long_icons_always.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/itest --long --icons=always\"\n"
  },
  {
    "path": "tests/cmd/long_windows.stderr",
    "content": ""
  },
  {
    "path": "tests/cmd/long_windows.stdout",
    "content": "-a--- a\n-a--- b\n-a--- c\n-a--- d\nl---- dir-symlink -> vagrant/debug\n-a--- e\nd---- exa\n-a--- f\n-a--- g\n-a--- h\n-a--- i\n-a--- image.jpg.img.c.rs.log.png\n-a--- index.svg\n-a--- j\n-a--- k\n-a--- l\n-a--- m\n-a--- n\n-a--- o\n-a--- p\n-a--- q\nd---- vagrant\n"
  },
  {
    "path": "tests/cmd/long_windows.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/itest --long --no-user --no-time --no-filesize\"\n"
  },
  {
    "path": "tests/cmd/tree_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/cmd/tree_unix.stdout",
    "content": "tests/itest\n├── a\n├── b\n├── c\n├── d\n├── dir-symlink -> vagrant/debug\n├── e\n├── exa\n│   ├── file.c -> djihisudjuhfius\n│   └── sssssssssssssssssssssssssggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\n│       └── Makefile\n├── f\n├── g\n├── h\n├── i\n├── image.jpg.img.c.rs.log.png\n├── index.svg\n├── j\n├── k\n├── l\n├── m\n├── n\n├── o\n├── p\n├── q\n└── vagrant\n    ├── debug\n    │   ├── a\n    │   ├── symlink -> a\n    │   └── symlink-broken -> ./b\n    ├── dev\n    │   └── main.bf\n    └── log\n        ├── file.png\n        └── run\n            ├── run.log.text\n            └── sps.log.text\n"
  },
  {
    "path": "tests/cmd/tree_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/itest -T\"\n"
  },
  {
    "path": "tests/gen/inexistant_file_unix.stderr",
    "content": "\"nonexistentdir\": No such file or directory (os error 2)\n"
  },
  {
    "path": "tests/gen/inexistant_file_unix.stdout",
    "content": ""
  },
  {
    "path": "tests/gen/inexistant_file_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"nonexistentdir\"\nstatus.code = 2\n"
  },
  {
    "path": "tests/gen/long_all_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_all_nix.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/gen/long_all_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --all\"\n"
  },
  {
    "path": "tests/gen/long_binary_bytes_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_binary_bytes_unix.stdout",
    "content": "- git\n- grid\n- group\n- icons\n- perms\n- size\n- specials\n- symlinks\n- time\n"
  },
  {
    "path": "tests/gen/long_binary_bytes_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --no-user --no-time --no-permissions --binary\"\n"
  },
  {
    "path": "tests/gen/long_blocksize_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_blocksize_nix.stdout",
    "content": "drwxr-xr-x - - nixbld  1 Jan  1970 git\ndrwxr-xr-x - - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - - nixbld  1 Jan  1970 group\ndrwxr-xr-x - - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - - nixbld  1 Jan  1970 size\ndrwxr-xr-x - - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/gen/long_blocksize_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --blocksize\"\n"
  },
  {
    "path": "tests/gen/long_extended_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_extended_nix.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/gen/long_extended_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --extended\"\n"
  },
  {
    "path": "tests/gen/long_file_size_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_file_size_unix.stdout",
    "content": "- git\n- grid\n- group\n- icons\n- perms\n- size\n- specials\n- symlinks\n- time\n"
  },
  {
    "path": "tests/gen/long_file_size_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --no-user --no-time --no-permissions\"\n"
  },
  {
    "path": "tests/gen/long_git_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_git_nix.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/gen/long_git_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --git\"\n"
  },
  {
    "path": "tests/gen/long_git_repos_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_git_repos_nix.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/gen/long_git_repos_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --git-repos\"\n"
  },
  {
    "path": "tests/gen/long_git_repos_no_status_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_git_repos_no_status_nix.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/gen/long_git_repos_no_status_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --git-repos-no-status\"\n"
  },
  {
    "path": "tests/gen/long_grid_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_grid_nix.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/gen/long_grid_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --grid\"\n"
  },
  {
    "path": "tests/gen/long_header_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_header_nix.stdout",
    "content": "Permissions Size User   Date Modified Name\ndrwxr-xr-x     - nixbld  1 Jan  1970  git\ndrwxr-xr-x     - nixbld  1 Jan  1970  grid\ndrwxr-xr-x     - nixbld  1 Jan  1970  group\ndrwxr-xr-x     - nixbld  1 Jan  1970  icons\ndrwxr-xr-x     - nixbld  1 Jan  1970  perms\ndrwxr-xr-x     - nixbld  1 Jan  1970  size\ndrwxr-xr-x     - nixbld  1 Jan  1970  specials\ndrwxr-xr-x     - nixbld  1 Jan  1970  symlinks\ndrwxr-xr-x     - nixbld  1 Jan  1970  time\n"
  },
  {
    "path": "tests/gen/long_header_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --header\"\n"
  },
  {
    "path": "tests/gen/long_header_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_header_unix.stdout",
    "content": "Size Name\n   - git\n   - grid\n   - group\n   - icons\n   - perms\n   - size\n   - specials\n   - symlinks\n   - time\n"
  },
  {
    "path": "tests/gen/long_header_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --no-user --no-time --header --no-permissions\"\n"
  },
  {
    "path": "tests/gen/long_icons_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_icons_nix.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/gen/long_icons_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --icons=auto\"\n"
  },
  {
    "path": "tests/gen/long_links_recurse_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_links_recurse_unix.stdout",
    "content": "  12 git\n1002 grid\n   2 group\n   2 icons\n   2 perms\n   2 size\n   2 specials\n   3 symlinks\n   2 time\n\ntests/test_dir/git:\n3 001\n3 002\n3 003\n3 004\n3 005\n3 006\n3 007\n3 008\n3 009\n3 010\n\ntests/test_dir/git/001:\n1 file_000\n1 file_001\n1 file_002\n1 file_003\n1 file_004\n1 file_005\n1 file_006\n1 file_007\n1 file_008\n1 file_009\n\ntests/test_dir/git/002:\n1 file_000\n1 file_001\n1 file_002\n1 file_003\n1 file_004\n1 file_005\n1 file_006\n1 file_007\n1 file_008\n1 file_009\n\ntests/test_dir/git/003:\n1 file_000\n1 file_001\n1 file_002\n1 file_003\n1 file_004\n1 file_005\n1 file_006\n1 file_007\n1 file_008\n1 file_009\n\ntests/test_dir/git/004:\n1 file_000\n1 file_001\n1 file_002\n1 file_003\n1 file_004\n1 file_005\n1 file_006\n1 file_007\n1 file_008\n1 file_009\n\ntests/test_dir/git/005:\n1 file_000\n1 file_001\n1 file_002\n1 file_003\n1 file_004\n1 file_005\n1 file_006\n1 file_007\n1 file_008\n1 file_009\n\ntests/test_dir/git/006:\n1 file_000\n1 file_001\n1 file_002\n1 file_003\n1 file_004\n1 file_005\n1 file_006\n1 file_007\n1 file_008\n1 file_009\n\ntests/test_dir/git/007:\n1 file_000\n1 file_001\n1 file_002\n1 file_003\n1 file_004\n1 file_005\n1 file_006\n1 file_007\n1 file_008\n1 file_009\n\ntests/test_dir/git/008:\n1 file_000\n1 file_001\n1 file_002\n1 file_003\n1 file_004\n1 file_005\n1 file_006\n1 file_007\n1 file_008\n1 file_009\n\ntests/test_dir/git/009:\n1 file_000\n1 file_001\n1 file_002\n1 file_003\n1 file_004\n1 file_005\n1 file_006\n1 file_007\n1 file_008\n1 file_009\n\ntests/test_dir/git/010:\n1 file_000\n1 file_001\n1 file_002\n1 file_003\n1 file_004\n1 file_005\n1 file_006\n1 file_007\n1 file_008\n1 file_009\n\ntests/test_dir/grid:\n2 0001\n2 0002\n2 0003\n2 0004\n2 0005\n2 0006\n2 0007\n2 0008\n2 0009\n2 0010\n2 0011\n2 0012\n2 0013\n2 0014\n2 0015\n2 0016\n2 0017\n2 0018\n2 0019\n2 0020\n2 0021\n2 0022\n2 0023\n2 0024\n2 0025\n2 0026\n2 0027\n2 0028\n2 0029\n2 0030\n2 0031\n2 0032\n2 0033\n2 0034\n2 0035\n2 0036\n2 0037\n2 0038\n2 0039\n2 0040\n2 0041\n2 0042\n2 0043\n2 0044\n2 0045\n2 0046\n2 0047\n2 0048\n2 0049\n2 0050\n2 0051\n2 0052\n2 0053\n2 0054\n2 0055\n2 0056\n2 0057\n2 0058\n2 0059\n2 0060\n2 0061\n2 0062\n2 0063\n2 0064\n2 0065\n2 0066\n2 0067\n2 0068\n2 0069\n2 0070\n2 0071\n2 0072\n2 0073\n2 0074\n2 0075\n2 0076\n2 0077\n2 0078\n2 0079\n2 0080\n2 0081\n2 0082\n2 0083\n2 0084\n2 0085\n2 0086\n2 0087\n2 0088\n2 0089\n2 0090\n2 0091\n2 0092\n2 0093\n2 0094\n2 0095\n2 0096\n2 0097\n2 0098\n2 0099\n2 0100\n2 0101\n2 0102\n2 0103\n2 0104\n2 0105\n2 0106\n2 0107\n2 0108\n2 0109\n2 0110\n2 0111\n2 0112\n2 0113\n2 0114\n2 0115\n2 0116\n2 0117\n2 0118\n2 0119\n2 0120\n2 0121\n2 0122\n2 0123\n2 0124\n2 0125\n2 0126\n2 0127\n2 0128\n2 0129\n2 0130\n2 0131\n2 0132\n2 0133\n2 0134\n2 0135\n2 0136\n2 0137\n2 0138\n2 0139\n2 0140\n2 0141\n2 0142\n2 0143\n2 0144\n2 0145\n2 0146\n2 0147\n2 0148\n2 0149\n2 0150\n2 0151\n2 0152\n2 0153\n2 0154\n2 0155\n2 0156\n2 0157\n2 0158\n2 0159\n2 0160\n2 0161\n2 0162\n2 0163\n2 0164\n2 0165\n2 0166\n2 0167\n2 0168\n2 0169\n2 0170\n2 0171\n2 0172\n2 0173\n2 0174\n2 0175\n2 0176\n2 0177\n2 0178\n2 0179\n2 0180\n2 0181\n2 0182\n2 0183\n2 0184\n2 0185\n2 0186\n2 0187\n2 0188\n2 0189\n2 0190\n2 0191\n2 0192\n2 0193\n2 0194\n2 0195\n2 0196\n2 0197\n2 0198\n2 0199\n2 0200\n2 0201\n2 0202\n2 0203\n2 0204\n2 0205\n2 0206\n2 0207\n2 0208\n2 0209\n2 0210\n2 0211\n2 0212\n2 0213\n2 0214\n2 0215\n2 0216\n2 0217\n2 0218\n2 0219\n2 0220\n2 0221\n2 0222\n2 0223\n2 0224\n2 0225\n2 0226\n2 0227\n2 0228\n2 0229\n2 0230\n2 0231\n2 0232\n2 0233\n2 0234\n2 0235\n2 0236\n2 0237\n2 0238\n2 0239\n2 0240\n2 0241\n2 0242\n2 0243\n2 0244\n2 0245\n2 0246\n2 0247\n2 0248\n2 0249\n2 0250\n2 0251\n2 0252\n2 0253\n2 0254\n2 0255\n2 0256\n2 0257\n2 0258\n2 0259\n2 0260\n2 0261\n2 0262\n2 0263\n2 0264\n2 0265\n2 0266\n2 0267\n2 0268\n2 0269\n2 0270\n2 0271\n2 0272\n2 0273\n2 0274\n2 0275\n2 0276\n2 0277\n2 0278\n2 0279\n2 0280\n2 0281\n2 0282\n2 0283\n2 0284\n2 0285\n2 0286\n2 0287\n2 0288\n2 0289\n2 0290\n2 0291\n2 0292\n2 0293\n2 0294\n2 0295\n2 0296\n2 0297\n2 0298\n2 0299\n2 0300\n2 0301\n2 0302\n2 0303\n2 0304\n2 0305\n2 0306\n2 0307\n2 0308\n2 0309\n2 0310\n2 0311\n2 0312\n2 0313\n2 0314\n2 0315\n2 0316\n2 0317\n2 0318\n2 0319\n2 0320\n2 0321\n2 0322\n2 0323\n2 0324\n2 0325\n2 0326\n2 0327\n2 0328\n2 0329\n2 0330\n2 0331\n2 0332\n2 0333\n2 0334\n2 0335\n2 0336\n2 0337\n2 0338\n2 0339\n2 0340\n2 0341\n2 0342\n2 0343\n2 0344\n2 0345\n2 0346\n2 0347\n2 0348\n2 0349\n2 0350\n2 0351\n2 0352\n2 0353\n2 0354\n2 0355\n2 0356\n2 0357\n2 0358\n2 0359\n2 0360\n2 0361\n2 0362\n2 0363\n2 0364\n2 0365\n2 0366\n2 0367\n2 0368\n2 0369\n2 0370\n2 0371\n2 0372\n2 0373\n2 0374\n2 0375\n2 0376\n2 0377\n2 0378\n2 0379\n2 0380\n2 0381\n2 0382\n2 0383\n2 0384\n2 0385\n2 0386\n2 0387\n2 0388\n2 0389\n2 0390\n2 0391\n2 0392\n2 0393\n2 0394\n2 0395\n2 0396\n2 0397\n2 0398\n2 0399\n2 0400\n2 0401\n2 0402\n2 0403\n2 0404\n2 0405\n2 0406\n2 0407\n2 0408\n2 0409\n2 0410\n2 0411\n2 0412\n2 0413\n2 0414\n2 0415\n2 0416\n2 0417\n2 0418\n2 0419\n2 0420\n2 0421\n2 0422\n2 0423\n2 0424\n2 0425\n2 0426\n2 0427\n2 0428\n2 0429\n2 0430\n2 0431\n2 0432\n2 0433\n2 0434\n2 0435\n2 0436\n2 0437\n2 0438\n2 0439\n2 0440\n2 0441\n2 0442\n2 0443\n2 0444\n2 0445\n2 0446\n2 0447\n2 0448\n2 0449\n2 0450\n2 0451\n2 0452\n2 0453\n2 0454\n2 0455\n2 0456\n2 0457\n2 0458\n2 0459\n2 0460\n2 0461\n2 0462\n2 0463\n2 0464\n2 0465\n2 0466\n2 0467\n2 0468\n2 0469\n2 0470\n2 0471\n2 0472\n2 0473\n2 0474\n2 0475\n2 0476\n2 0477\n2 0478\n2 0479\n2 0480\n2 0481\n2 0482\n2 0483\n2 0484\n2 0485\n2 0486\n2 0487\n2 0488\n2 0489\n2 0490\n2 0491\n2 0492\n2 0493\n2 0494\n2 0495\n2 0496\n2 0497\n2 0498\n2 0499\n2 0500\n2 0501\n2 0502\n2 0503\n2 0504\n2 0505\n2 0506\n2 0507\n2 0508\n2 0509\n2 0510\n2 0511\n2 0512\n2 0513\n2 0514\n2 0515\n2 0516\n2 0517\n2 0518\n2 0519\n2 0520\n2 0521\n2 0522\n2 0523\n2 0524\n2 0525\n2 0526\n2 0527\n2 0528\n2 0529\n2 0530\n2 0531\n2 0532\n2 0533\n2 0534\n2 0535\n2 0536\n2 0537\n2 0538\n2 0539\n2 0540\n2 0541\n2 0542\n2 0543\n2 0544\n2 0545\n2 0546\n2 0547\n2 0548\n2 0549\n2 0550\n2 0551\n2 0552\n2 0553\n2 0554\n2 0555\n2 0556\n2 0557\n2 0558\n2 0559\n2 0560\n2 0561\n2 0562\n2 0563\n2 0564\n2 0565\n2 0566\n2 0567\n2 0568\n2 0569\n2 0570\n2 0571\n2 0572\n2 0573\n2 0574\n2 0575\n2 0576\n2 0577\n2 0578\n2 0579\n2 0580\n2 0581\n2 0582\n2 0583\n2 0584\n2 0585\n2 0586\n2 0587\n2 0588\n2 0589\n2 0590\n2 0591\n2 0592\n2 0593\n2 0594\n2 0595\n2 0596\n2 0597\n2 0598\n2 0599\n2 0600\n2 0601\n2 0602\n2 0603\n2 0604\n2 0605\n2 0606\n2 0607\n2 0608\n2 0609\n2 0610\n2 0611\n2 0612\n2 0613\n2 0614\n2 0615\n2 0616\n2 0617\n2 0618\n2 0619\n2 0620\n2 0621\n2 0622\n2 0623\n2 0624\n2 0625\n2 0626\n2 0627\n2 0628\n2 0629\n2 0630\n2 0631\n2 0632\n2 0633\n2 0634\n2 0635\n2 0636\n2 0637\n2 0638\n2 0639\n2 0640\n2 0641\n2 0642\n2 0643\n2 0644\n2 0645\n2 0646\n2 0647\n2 0648\n2 0649\n2 0650\n2 0651\n2 0652\n2 0653\n2 0654\n2 0655\n2 0656\n2 0657\n2 0658\n2 0659\n2 0660\n2 0661\n2 0662\n2 0663\n2 0664\n2 0665\n2 0666\n2 0667\n2 0668\n2 0669\n2 0670\n2 0671\n2 0672\n2 0673\n2 0674\n2 0675\n2 0676\n2 0677\n2 0678\n2 0679\n2 0680\n2 0681\n2 0682\n2 0683\n2 0684\n2 0685\n2 0686\n2 0687\n2 0688\n2 0689\n2 0690\n2 0691\n2 0692\n2 0693\n2 0694\n2 0695\n2 0696\n2 0697\n2 0698\n2 0699\n2 0700\n2 0701\n2 0702\n2 0703\n2 0704\n2 0705\n2 0706\n2 0707\n2 0708\n2 0709\n2 0710\n2 0711\n2 0712\n2 0713\n2 0714\n2 0715\n2 0716\n2 0717\n2 0718\n2 0719\n2 0720\n2 0721\n2 0722\n2 0723\n2 0724\n2 0725\n2 0726\n2 0727\n2 0728\n2 0729\n2 0730\n2 0731\n2 0732\n2 0733\n2 0734\n2 0735\n2 0736\n2 0737\n2 0738\n2 0739\n2 0740\n2 0741\n2 0742\n2 0743\n2 0744\n2 0745\n2 0746\n2 0747\n2 0748\n2 0749\n2 0750\n2 0751\n2 0752\n2 0753\n2 0754\n2 0755\n2 0756\n2 0757\n2 0758\n2 0759\n2 0760\n2 0761\n2 0762\n2 0763\n2 0764\n2 0765\n2 0766\n2 0767\n2 0768\n2 0769\n2 0770\n2 0771\n2 0772\n2 0773\n2 0774\n2 0775\n2 0776\n2 0777\n2 0778\n2 0779\n2 0780\n2 0781\n2 0782\n2 0783\n2 0784\n2 0785\n2 0786\n2 0787\n2 0788\n2 0789\n2 0790\n2 0791\n2 0792\n2 0793\n2 0794\n2 0795\n2 0796\n2 0797\n2 0798\n2 0799\n2 0800\n2 0801\n2 0802\n2 0803\n2 0804\n2 0805\n2 0806\n2 0807\n2 0808\n2 0809\n2 0810\n2 0811\n2 0812\n2 0813\n2 0814\n2 0815\n2 0816\n2 0817\n2 0818\n2 0819\n2 0820\n2 0821\n2 0822\n2 0823\n2 0824\n2 0825\n2 0826\n2 0827\n2 0828\n2 0829\n2 0830\n2 0831\n2 0832\n2 0833\n2 0834\n2 0835\n2 0836\n2 0837\n2 0838\n2 0839\n2 0840\n2 0841\n2 0842\n2 0843\n2 0844\n2 0845\n2 0846\n2 0847\n2 0848\n2 0849\n2 0850\n2 0851\n2 0852\n2 0853\n2 0854\n2 0855\n2 0856\n2 0857\n2 0858\n2 0859\n2 0860\n2 0861\n2 0862\n2 0863\n2 0864\n2 0865\n2 0866\n2 0867\n2 0868\n2 0869\n2 0870\n2 0871\n2 0872\n2 0873\n2 0874\n2 0875\n2 0876\n2 0877\n2 0878\n2 0879\n2 0880\n2 0881\n2 0882\n2 0883\n2 0884\n2 0885\n2 0886\n2 0887\n2 0888\n2 0889\n2 0890\n2 0891\n2 0892\n2 0893\n2 0894\n2 0895\n2 0896\n2 0897\n2 0898\n2 0899\n2 0900\n2 0901\n2 0902\n2 0903\n2 0904\n2 0905\n2 0906\n2 0907\n2 0908\n2 0909\n2 0910\n2 0911\n2 0912\n2 0913\n2 0914\n2 0915\n2 0916\n2 0917\n2 0918\n2 0919\n2 0920\n2 0921\n2 0922\n2 0923\n2 0924\n2 0925\n2 0926\n2 0927\n2 0928\n2 0929\n2 0930\n2 0931\n2 0932\n2 0933\n2 0934\n2 0935\n2 0936\n2 0937\n2 0938\n2 0939\n2 0940\n2 0941\n2 0942\n2 0943\n2 0944\n2 0945\n2 0946\n2 0947\n2 0948\n2 0949\n2 0950\n2 0951\n2 0952\n2 0953\n2 0954\n2 0955\n2 0956\n2 0957\n2 0958\n2 0959\n2 0960\n2 0961\n2 0962\n2 0963\n2 0964\n2 0965\n2 0966\n2 0967\n2 0968\n2 0969\n2 0970\n2 0971\n2 0972\n2 0973\n2 0974\n2 0975\n2 0976\n2 0977\n2 0978\n2 0979\n2 0980\n2 0981\n2 0982\n2 0983\n2 0984\n2 0985\n2 0986\n2 0987\n2 0988\n2 0989\n2 0990\n2 0991\n2 0992\n2 0993\n2 0994\n2 0995\n2 0996\n2 0997\n2 0998\n2 0999\n2 1000\n1 file_000\n1 file_001\n1 file_002\n1 file_003\n1 file_004\n1 file_005\n1 file_006\n1 file_007\n1 file_008\n1 file_009\n1 file_010\n1 file_011\n1 file_012\n1 file_013\n1 file_014\n1 file_015\n1 file_016\n1 file_017\n1 file_018\n1 file_019\n1 file_020\n1 file_021\n1 file_022\n1 file_023\n1 file_024\n1 file_025\n1 file_026\n1 file_027\n1 file_028\n1 file_029\n1 file_030\n1 file_031\n1 file_032\n1 file_033\n1 file_034\n1 file_035\n1 file_036\n1 file_037\n1 file_038\n1 file_039\n1 file_040\n1 file_041\n1 file_042\n1 file_043\n1 file_044\n1 file_045\n1 file_046\n1 file_047\n1 file_048\n1 file_049\n1 file_050\n1 file_051\n1 file_052\n1 file_053\n1 file_054\n1 file_055\n1 file_056\n1 file_057\n1 file_058\n1 file_059\n1 file_060\n1 file_061\n1 file_062\n1 file_063\n1 file_064\n1 file_065\n1 file_066\n1 file_067\n1 file_068\n1 file_069\n1 file_070\n1 file_071\n1 file_072\n1 file_073\n1 file_074\n1 file_075\n1 file_076\n1 file_077\n1 file_078\n1 file_079\n1 file_080\n1 file_081\n1 file_082\n1 file_083\n1 file_084\n1 file_085\n1 file_086\n1 file_087\n1 file_088\n1 file_089\n1 file_090\n1 file_091\n1 file_092\n1 file_093\n1 file_094\n1 file_095\n1 file_096\n1 file_097\n1 file_098\n1 file_099\n1 file_100\n1 file_101\n1 file_102\n1 file_103\n1 file_104\n1 file_105\n1 file_106\n1 file_107\n1 file_108\n1 file_109\n1 file_110\n1 file_111\n1 file_112\n1 file_113\n1 file_114\n1 file_115\n1 file_116\n1 file_117\n1 file_118\n1 file_119\n1 file_120\n1 file_121\n1 file_122\n1 file_123\n1 file_124\n1 file_125\n1 file_126\n1 file_127\n1 file_128\n1 file_129\n1 file_130\n1 file_131\n1 file_132\n1 file_133\n1 file_134\n1 file_135\n1 file_136\n1 file_137\n1 file_138\n1 file_139\n1 file_140\n1 file_141\n1 file_142\n1 file_143\n1 file_144\n1 file_145\n1 file_146\n1 file_147\n1 file_148\n1 file_149\n1 file_150\n1 file_151\n1 file_152\n1 file_153\n1 file_154\n1 file_155\n1 file_156\n1 file_157\n1 file_158\n1 file_159\n1 file_160\n1 file_161\n1 file_162\n1 file_163\n1 file_164\n1 file_165\n1 file_166\n1 file_167\n1 file_168\n1 file_169\n1 file_170\n1 file_171\n1 file_172\n1 file_173\n1 file_174\n1 file_175\n1 file_176\n1 file_177\n1 file_178\n1 file_179\n1 file_180\n1 file_181\n1 file_182\n1 file_183\n1 file_184\n1 file_185\n1 file_186\n1 file_187\n1 file_188\n1 file_189\n1 file_190\n1 file_191\n1 file_192\n1 file_193\n1 file_194\n1 file_195\n1 file_196\n1 file_197\n1 file_198\n1 file_199\n1 file_200\n1 file_201\n1 file_202\n1 file_203\n1 file_204\n1 file_205\n1 file_206\n1 file_207\n1 file_208\n1 file_209\n1 file_210\n1 file_211\n1 file_212\n1 file_213\n1 file_214\n1 file_215\n1 file_216\n1 file_217\n1 file_218\n1 file_219\n1 file_220\n1 file_221\n1 file_222\n1 file_223\n1 file_224\n1 file_225\n1 file_226\n1 file_227\n1 file_228\n1 file_229\n1 file_230\n1 file_231\n1 file_232\n1 file_233\n1 file_234\n1 file_235\n1 file_236\n1 file_237\n1 file_238\n1 file_239\n1 file_240\n1 file_241\n1 file_242\n1 file_243\n1 file_244\n1 file_245\n1 file_246\n1 file_247\n1 file_248\n1 file_249\n1 file_250\n1 file_251\n1 file_252\n1 file_253\n1 file_254\n1 file_255\n1 file_256\n1 file_257\n1 file_258\n1 file_259\n1 file_260\n1 file_261\n1 file_262\n1 file_263\n1 file_264\n1 file_265\n1 file_266\n1 file_267\n1 file_268\n1 file_269\n1 file_270\n1 file_271\n1 file_272\n1 file_273\n1 file_274\n1 file_275\n1 file_276\n1 file_277\n1 file_278\n1 file_279\n1 file_280\n1 file_281\n1 file_282\n1 file_283\n1 file_284\n1 file_285\n1 file_286\n1 file_287\n1 file_288\n1 file_289\n1 file_290\n1 file_291\n1 file_292\n1 file_293\n1 file_294\n1 file_295\n1 file_296\n1 file_297\n1 file_298\n1 file_299\n1 file_300\n1 file_301\n1 file_302\n1 file_303\n1 file_304\n1 file_305\n1 file_306\n1 file_307\n1 file_308\n1 file_309\n1 file_310\n1 file_311\n1 file_312\n1 file_313\n1 file_314\n1 file_315\n1 file_316\n1 file_317\n1 file_318\n1 file_319\n1 file_320\n1 file_321\n1 file_322\n1 file_323\n1 file_324\n1 file_325\n1 file_326\n1 file_327\n1 file_328\n1 file_329\n1 file_330\n1 file_331\n1 file_332\n1 file_333\n1 file_334\n1 file_335\n1 file_336\n1 file_337\n1 file_338\n1 file_339\n1 file_340\n1 file_341\n1 file_342\n1 file_343\n1 file_344\n1 file_345\n1 file_346\n1 file_347\n1 file_348\n1 file_349\n1 file_350\n1 file_351\n1 file_352\n1 file_353\n1 file_354\n1 file_355\n1 file_356\n1 file_357\n1 file_358\n1 file_359\n1 file_360\n1 file_361\n1 file_362\n1 file_363\n1 file_364\n1 file_365\n1 file_366\n1 file_367\n1 file_368\n1 file_369\n1 file_370\n1 file_371\n1 file_372\n1 file_373\n1 file_374\n1 file_375\n1 file_376\n1 file_377\n1 file_378\n1 file_379\n1 file_380\n1 file_381\n1 file_382\n1 file_383\n1 file_384\n1 file_385\n1 file_386\n1 file_387\n1 file_388\n1 file_389\n1 file_390\n1 file_391\n1 file_392\n1 file_393\n1 file_394\n1 file_395\n1 file_396\n1 file_397\n1 file_398\n1 file_399\n1 file_400\n1 file_401\n1 file_402\n1 file_403\n1 file_404\n1 file_405\n1 file_406\n1 file_407\n1 file_408\n1 file_409\n1 file_410\n1 file_411\n1 file_412\n1 file_413\n1 file_414\n1 file_415\n1 file_416\n1 file_417\n1 file_418\n1 file_419\n1 file_420\n1 file_421\n1 file_422\n1 file_423\n1 file_424\n1 file_425\n1 file_426\n1 file_427\n1 file_428\n1 file_429\n1 file_430\n1 file_431\n1 file_432\n1 file_433\n1 file_434\n1 file_435\n1 file_436\n1 file_437\n1 file_438\n1 file_439\n1 file_440\n1 file_441\n1 file_442\n1 file_443\n1 file_444\n1 file_445\n1 file_446\n1 file_447\n1 file_448\n1 file_449\n1 file_450\n1 file_451\n1 file_452\n1 file_453\n1 file_454\n1 file_455\n1 file_456\n1 file_457\n1 file_458\n1 file_459\n1 file_460\n1 file_461\n1 file_462\n1 file_463\n1 file_464\n1 file_465\n1 file_466\n1 file_467\n1 file_468\n1 file_469\n1 file_470\n1 file_471\n1 file_472\n1 file_473\n1 file_474\n1 file_475\n1 file_476\n1 file_477\n1 file_478\n1 file_479\n1 file_480\n1 file_481\n1 file_482\n1 file_483\n1 file_484\n1 file_485\n1 file_486\n1 file_487\n1 file_488\n1 file_489\n1 file_490\n1 file_491\n1 file_492\n1 file_493\n1 file_494\n1 file_495\n1 file_496\n1 file_497\n1 file_498\n1 file_499\n1 file_500\n1 file_501\n1 file_502\n1 file_503\n1 file_504\n1 file_505\n1 file_506\n1 file_507\n1 file_508\n1 file_509\n1 file_510\n1 file_511\n1 file_512\n1 file_513\n1 file_514\n1 file_515\n1 file_516\n1 file_517\n1 file_518\n1 file_519\n1 file_520\n1 file_521\n1 file_522\n1 file_523\n1 file_524\n1 file_525\n1 file_526\n1 file_527\n1 file_528\n1 file_529\n1 file_530\n1 file_531\n1 file_532\n1 file_533\n1 file_534\n1 file_535\n1 file_536\n1 file_537\n1 file_538\n1 file_539\n1 file_540\n1 file_541\n1 file_542\n1 file_543\n1 file_544\n1 file_545\n1 file_546\n1 file_547\n1 file_548\n1 file_549\n1 file_550\n1 file_551\n1 file_552\n1 file_553\n1 file_554\n1 file_555\n1 file_556\n1 file_557\n1 file_558\n1 file_559\n1 file_560\n1 file_561\n1 file_562\n1 file_563\n1 file_564\n1 file_565\n1 file_566\n1 file_567\n1 file_568\n1 file_569\n1 file_570\n1 file_571\n1 file_572\n1 file_573\n1 file_574\n1 file_575\n1 file_576\n1 file_577\n1 file_578\n1 file_579\n1 file_580\n1 file_581\n1 file_582\n1 file_583\n1 file_584\n1 file_585\n1 file_586\n1 file_587\n1 file_588\n1 file_589\n1 file_590\n1 file_591\n1 file_592\n1 file_593\n1 file_594\n1 file_595\n1 file_596\n1 file_597\n1 file_598\n1 file_599\n1 file_600\n1 file_601\n1 file_602\n1 file_603\n1 file_604\n1 file_605\n1 file_606\n1 file_607\n1 file_608\n1 file_609\n1 file_610\n1 file_611\n1 file_612\n1 file_613\n1 file_614\n1 file_615\n1 file_616\n1 file_617\n1 file_618\n1 file_619\n1 file_620\n1 file_621\n1 file_622\n1 file_623\n1 file_624\n1 file_625\n1 file_626\n1 file_627\n1 file_628\n1 file_629\n1 file_630\n1 file_631\n1 file_632\n1 file_633\n1 file_634\n1 file_635\n1 file_636\n1 file_637\n1 file_638\n1 file_639\n1 file_640\n1 file_641\n1 file_642\n1 file_643\n1 file_644\n1 file_645\n1 file_646\n1 file_647\n1 file_648\n1 file_649\n1 file_650\n1 file_651\n1 file_652\n1 file_653\n1 file_654\n1 file_655\n1 file_656\n1 file_657\n1 file_658\n1 file_659\n1 file_660\n1 file_661\n1 file_662\n1 file_663\n1 file_664\n1 file_665\n1 file_666\n1 file_667\n1 file_668\n1 file_669\n1 file_670\n1 file_671\n1 file_672\n1 file_673\n1 file_674\n1 file_675\n1 file_676\n1 file_677\n1 file_678\n1 file_679\n1 file_680\n1 file_681\n1 file_682\n1 file_683\n1 file_684\n1 file_685\n1 file_686\n1 file_687\n1 file_688\n1 file_689\n1 file_690\n1 file_691\n1 file_692\n1 file_693\n1 file_694\n1 file_695\n1 file_696\n1 file_697\n1 file_698\n1 file_699\n1 file_700\n1 file_701\n1 file_702\n1 file_703\n1 file_704\n1 file_705\n1 file_706\n1 file_707\n1 file_708\n1 file_709\n1 file_710\n1 file_711\n1 file_712\n1 file_713\n1 file_714\n1 file_715\n1 file_716\n1 file_717\n1 file_718\n1 file_719\n1 file_720\n1 file_721\n1 file_722\n1 file_723\n1 file_724\n1 file_725\n1 file_726\n1 file_727\n1 file_728\n1 file_729\n1 file_730\n1 file_731\n1 file_732\n1 file_733\n1 file_734\n1 file_735\n1 file_736\n1 file_737\n1 file_738\n1 file_739\n1 file_740\n1 file_741\n1 file_742\n1 file_743\n1 file_744\n1 file_745\n1 file_746\n1 file_747\n1 file_748\n1 file_749\n1 file_750\n1 file_751\n1 file_752\n1 file_753\n1 file_754\n1 file_755\n1 file_756\n1 file_757\n1 file_758\n1 file_759\n1 file_760\n1 file_761\n1 file_762\n1 file_763\n1 file_764\n1 file_765\n1 file_766\n1 file_767\n1 file_768\n1 file_769\n1 file_770\n1 file_771\n1 file_772\n1 file_773\n1 file_774\n1 file_775\n1 file_776\n1 file_777\n1 file_778\n1 file_779\n1 file_780\n1 file_781\n1 file_782\n1 file_783\n1 file_784\n1 file_785\n1 file_786\n1 file_787\n1 file_788\n1 file_789\n1 file_790\n1 file_791\n1 file_792\n1 file_793\n1 file_794\n1 file_795\n1 file_796\n1 file_797\n1 file_798\n1 file_799\n1 file_800\n1 file_801\n1 file_802\n1 file_803\n1 file_804\n1 file_805\n1 file_806\n1 file_807\n1 file_808\n1 file_809\n1 file_810\n1 file_811\n1 file_812\n1 file_813\n1 file_814\n1 file_815\n1 file_816\n1 file_817\n1 file_818\n1 file_819\n1 file_820\n1 file_821\n1 file_822\n1 file_823\n1 file_824\n1 file_825\n1 file_826\n1 file_827\n1 file_828\n1 file_829\n1 file_830\n1 file_831\n1 file_832\n1 file_833\n1 file_834\n1 file_835\n1 file_836\n1 file_837\n1 file_838\n1 file_839\n1 file_840\n1 file_841\n1 file_842\n1 file_843\n1 file_844\n1 file_845\n1 file_846\n1 file_847\n1 file_848\n1 file_849\n1 file_850\n1 file_851\n1 file_852\n1 file_853\n1 file_854\n1 file_855\n1 file_856\n1 file_857\n1 file_858\n1 file_859\n1 file_860\n1 file_861\n1 file_862\n1 file_863\n1 file_864\n1 file_865\n1 file_866\n1 file_867\n1 file_868\n1 file_869\n1 file_870\n1 file_871\n1 file_872\n1 file_873\n1 file_874\n1 file_875\n1 file_876\n1 file_877\n1 file_878\n1 file_879\n1 file_880\n1 file_881\n1 file_882\n1 file_883\n1 file_884\n1 file_885\n1 file_886\n1 file_887\n1 file_888\n1 file_889\n1 file_890\n1 file_891\n1 file_892\n1 file_893\n1 file_894\n1 file_895\n1 file_896\n1 file_897\n1 file_898\n1 file_899\n1 file_900\n1 file_901\n1 file_902\n1 file_903\n1 file_904\n1 file_905\n1 file_906\n1 file_907\n1 file_908\n1 file_909\n1 file_910\n1 file_911\n1 file_912\n1 file_913\n1 file_914\n1 file_915\n1 file_916\n1 file_917\n1 file_918\n1 file_919\n1 file_920\n1 file_921\n1 file_922\n1 file_923\n1 file_924\n1 file_925\n1 file_926\n1 file_927\n1 file_928\n1 file_929\n1 file_930\n1 file_931\n1 file_932\n1 file_933\n1 file_934\n1 file_935\n1 file_936\n1 file_937\n1 file_938\n1 file_939\n1 file_940\n1 file_941\n1 file_942\n1 file_943\n1 file_944\n1 file_945\n1 file_946\n1 file_947\n1 file_948\n1 file_949\n1 file_950\n1 file_951\n1 file_952\n1 file_953\n1 file_954\n1 file_955\n1 file_956\n1 file_957\n1 file_958\n1 file_959\n1 file_960\n1 file_961\n1 file_962\n1 file_963\n1 file_964\n1 file_965\n1 file_966\n1 file_967\n1 file_968\n1 file_969\n1 file_970\n1 file_971\n1 file_972\n1 file_973\n1 file_974\n1 file_975\n1 file_976\n1 file_977\n1 file_978\n1 file_979\n1 file_980\n1 file_981\n1 file_982\n1 file_983\n1 file_984\n1 file_985\n1 file_986\n1 file_987\n1 file_988\n1 file_989\n1 file_990\n1 file_991\n1 file_992\n1 file_993\n1 file_994\n1 file_995\n1 file_996\n1 file_997\n1 file_998\n1 file_999\n\ntests/test_dir/grid/0001:\n\ntests/test_dir/grid/0002:\n\ntests/test_dir/grid/0003:\n\ntests/test_dir/grid/0004:\n\ntests/test_dir/grid/0005:\n\ntests/test_dir/grid/0006:\n\ntests/test_dir/grid/0007:\n\ntests/test_dir/grid/0008:\n\ntests/test_dir/grid/0009:\n\ntests/test_dir/grid/0010:\n\ntests/test_dir/grid/0011:\n\ntests/test_dir/grid/0012:\n\ntests/test_dir/grid/0013:\n\ntests/test_dir/grid/0014:\n\ntests/test_dir/grid/0015:\n\ntests/test_dir/grid/0016:\n\ntests/test_dir/grid/0017:\n\ntests/test_dir/grid/0018:\n\ntests/test_dir/grid/0019:\n\ntests/test_dir/grid/0020:\n\ntests/test_dir/grid/0021:\n\ntests/test_dir/grid/0022:\n\ntests/test_dir/grid/0023:\n\ntests/test_dir/grid/0024:\n\ntests/test_dir/grid/0025:\n\ntests/test_dir/grid/0026:\n\ntests/test_dir/grid/0027:\n\ntests/test_dir/grid/0028:\n\ntests/test_dir/grid/0029:\n\ntests/test_dir/grid/0030:\n\ntests/test_dir/grid/0031:\n\ntests/test_dir/grid/0032:\n\ntests/test_dir/grid/0033:\n\ntests/test_dir/grid/0034:\n\ntests/test_dir/grid/0035:\n\ntests/test_dir/grid/0036:\n\ntests/test_dir/grid/0037:\n\ntests/test_dir/grid/0038:\n\ntests/test_dir/grid/0039:\n\ntests/test_dir/grid/0040:\n\ntests/test_dir/grid/0041:\n\ntests/test_dir/grid/0042:\n\ntests/test_dir/grid/0043:\n\ntests/test_dir/grid/0044:\n\ntests/test_dir/grid/0045:\n\ntests/test_dir/grid/0046:\n\ntests/test_dir/grid/0047:\n\ntests/test_dir/grid/0048:\n\ntests/test_dir/grid/0049:\n\ntests/test_dir/grid/0050:\n\ntests/test_dir/grid/0051:\n\ntests/test_dir/grid/0052:\n\ntests/test_dir/grid/0053:\n\ntests/test_dir/grid/0054:\n\ntests/test_dir/grid/0055:\n\ntests/test_dir/grid/0056:\n\ntests/test_dir/grid/0057:\n\ntests/test_dir/grid/0058:\n\ntests/test_dir/grid/0059:\n\ntests/test_dir/grid/0060:\n\ntests/test_dir/grid/0061:\n\ntests/test_dir/grid/0062:\n\ntests/test_dir/grid/0063:\n\ntests/test_dir/grid/0064:\n\ntests/test_dir/grid/0065:\n\ntests/test_dir/grid/0066:\n\ntests/test_dir/grid/0067:\n\ntests/test_dir/grid/0068:\n\ntests/test_dir/grid/0069:\n\ntests/test_dir/grid/0070:\n\ntests/test_dir/grid/0071:\n\ntests/test_dir/grid/0072:\n\ntests/test_dir/grid/0073:\n\ntests/test_dir/grid/0074:\n\ntests/test_dir/grid/0075:\n\ntests/test_dir/grid/0076:\n\ntests/test_dir/grid/0077:\n\ntests/test_dir/grid/0078:\n\ntests/test_dir/grid/0079:\n\ntests/test_dir/grid/0080:\n\ntests/test_dir/grid/0081:\n\ntests/test_dir/grid/0082:\n\ntests/test_dir/grid/0083:\n\ntests/test_dir/grid/0084:\n\ntests/test_dir/grid/0085:\n\ntests/test_dir/grid/0086:\n\ntests/test_dir/grid/0087:\n\ntests/test_dir/grid/0088:\n\ntests/test_dir/grid/0089:\n\ntests/test_dir/grid/0090:\n\ntests/test_dir/grid/0091:\n\ntests/test_dir/grid/0092:\n\ntests/test_dir/grid/0093:\n\ntests/test_dir/grid/0094:\n\ntests/test_dir/grid/0095:\n\ntests/test_dir/grid/0096:\n\ntests/test_dir/grid/0097:\n\ntests/test_dir/grid/0098:\n\ntests/test_dir/grid/0099:\n\ntests/test_dir/grid/0100:\n\ntests/test_dir/grid/0101:\n\ntests/test_dir/grid/0102:\n\ntests/test_dir/grid/0103:\n\ntests/test_dir/grid/0104:\n\ntests/test_dir/grid/0105:\n\ntests/test_dir/grid/0106:\n\ntests/test_dir/grid/0107:\n\ntests/test_dir/grid/0108:\n\ntests/test_dir/grid/0109:\n\ntests/test_dir/grid/0110:\n\ntests/test_dir/grid/0111:\n\ntests/test_dir/grid/0112:\n\ntests/test_dir/grid/0113:\n\ntests/test_dir/grid/0114:\n\ntests/test_dir/grid/0115:\n\ntests/test_dir/grid/0116:\n\ntests/test_dir/grid/0117:\n\ntests/test_dir/grid/0118:\n\ntests/test_dir/grid/0119:\n\ntests/test_dir/grid/0120:\n\ntests/test_dir/grid/0121:\n\ntests/test_dir/grid/0122:\n\ntests/test_dir/grid/0123:\n\ntests/test_dir/grid/0124:\n\ntests/test_dir/grid/0125:\n\ntests/test_dir/grid/0126:\n\ntests/test_dir/grid/0127:\n\ntests/test_dir/grid/0128:\n\ntests/test_dir/grid/0129:\n\ntests/test_dir/grid/0130:\n\ntests/test_dir/grid/0131:\n\ntests/test_dir/grid/0132:\n\ntests/test_dir/grid/0133:\n\ntests/test_dir/grid/0134:\n\ntests/test_dir/grid/0135:\n\ntests/test_dir/grid/0136:\n\ntests/test_dir/grid/0137:\n\ntests/test_dir/grid/0138:\n\ntests/test_dir/grid/0139:\n\ntests/test_dir/grid/0140:\n\ntests/test_dir/grid/0141:\n\ntests/test_dir/grid/0142:\n\ntests/test_dir/grid/0143:\n\ntests/test_dir/grid/0144:\n\ntests/test_dir/grid/0145:\n\ntests/test_dir/grid/0146:\n\ntests/test_dir/grid/0147:\n\ntests/test_dir/grid/0148:\n\ntests/test_dir/grid/0149:\n\ntests/test_dir/grid/0150:\n\ntests/test_dir/grid/0151:\n\ntests/test_dir/grid/0152:\n\ntests/test_dir/grid/0153:\n\ntests/test_dir/grid/0154:\n\ntests/test_dir/grid/0155:\n\ntests/test_dir/grid/0156:\n\ntests/test_dir/grid/0157:\n\ntests/test_dir/grid/0158:\n\ntests/test_dir/grid/0159:\n\ntests/test_dir/grid/0160:\n\ntests/test_dir/grid/0161:\n\ntests/test_dir/grid/0162:\n\ntests/test_dir/grid/0163:\n\ntests/test_dir/grid/0164:\n\ntests/test_dir/grid/0165:\n\ntests/test_dir/grid/0166:\n\ntests/test_dir/grid/0167:\n\ntests/test_dir/grid/0168:\n\ntests/test_dir/grid/0169:\n\ntests/test_dir/grid/0170:\n\ntests/test_dir/grid/0171:\n\ntests/test_dir/grid/0172:\n\ntests/test_dir/grid/0173:\n\ntests/test_dir/grid/0174:\n\ntests/test_dir/grid/0175:\n\ntests/test_dir/grid/0176:\n\ntests/test_dir/grid/0177:\n\ntests/test_dir/grid/0178:\n\ntests/test_dir/grid/0179:\n\ntests/test_dir/grid/0180:\n\ntests/test_dir/grid/0181:\n\ntests/test_dir/grid/0182:\n\ntests/test_dir/grid/0183:\n\ntests/test_dir/grid/0184:\n\ntests/test_dir/grid/0185:\n\ntests/test_dir/grid/0186:\n\ntests/test_dir/grid/0187:\n\ntests/test_dir/grid/0188:\n\ntests/test_dir/grid/0189:\n\ntests/test_dir/grid/0190:\n\ntests/test_dir/grid/0191:\n\ntests/test_dir/grid/0192:\n\ntests/test_dir/grid/0193:\n\ntests/test_dir/grid/0194:\n\ntests/test_dir/grid/0195:\n\ntests/test_dir/grid/0196:\n\ntests/test_dir/grid/0197:\n\ntests/test_dir/grid/0198:\n\ntests/test_dir/grid/0199:\n\ntests/test_dir/grid/0200:\n\ntests/test_dir/grid/0201:\n\ntests/test_dir/grid/0202:\n\ntests/test_dir/grid/0203:\n\ntests/test_dir/grid/0204:\n\ntests/test_dir/grid/0205:\n\ntests/test_dir/grid/0206:\n\ntests/test_dir/grid/0207:\n\ntests/test_dir/grid/0208:\n\ntests/test_dir/grid/0209:\n\ntests/test_dir/grid/0210:\n\ntests/test_dir/grid/0211:\n\ntests/test_dir/grid/0212:\n\ntests/test_dir/grid/0213:\n\ntests/test_dir/grid/0214:\n\ntests/test_dir/grid/0215:\n\ntests/test_dir/grid/0216:\n\ntests/test_dir/grid/0217:\n\ntests/test_dir/grid/0218:\n\ntests/test_dir/grid/0219:\n\ntests/test_dir/grid/0220:\n\ntests/test_dir/grid/0221:\n\ntests/test_dir/grid/0222:\n\ntests/test_dir/grid/0223:\n\ntests/test_dir/grid/0224:\n\ntests/test_dir/grid/0225:\n\ntests/test_dir/grid/0226:\n\ntests/test_dir/grid/0227:\n\ntests/test_dir/grid/0228:\n\ntests/test_dir/grid/0229:\n\ntests/test_dir/grid/0230:\n\ntests/test_dir/grid/0231:\n\ntests/test_dir/grid/0232:\n\ntests/test_dir/grid/0233:\n\ntests/test_dir/grid/0234:\n\ntests/test_dir/grid/0235:\n\ntests/test_dir/grid/0236:\n\ntests/test_dir/grid/0237:\n\ntests/test_dir/grid/0238:\n\ntests/test_dir/grid/0239:\n\ntests/test_dir/grid/0240:\n\ntests/test_dir/grid/0241:\n\ntests/test_dir/grid/0242:\n\ntests/test_dir/grid/0243:\n\ntests/test_dir/grid/0244:\n\ntests/test_dir/grid/0245:\n\ntests/test_dir/grid/0246:\n\ntests/test_dir/grid/0247:\n\ntests/test_dir/grid/0248:\n\ntests/test_dir/grid/0249:\n\ntests/test_dir/grid/0250:\n\ntests/test_dir/grid/0251:\n\ntests/test_dir/grid/0252:\n\ntests/test_dir/grid/0253:\n\ntests/test_dir/grid/0254:\n\ntests/test_dir/grid/0255:\n\ntests/test_dir/grid/0256:\n\ntests/test_dir/grid/0257:\n\ntests/test_dir/grid/0258:\n\ntests/test_dir/grid/0259:\n\ntests/test_dir/grid/0260:\n\ntests/test_dir/grid/0261:\n\ntests/test_dir/grid/0262:\n\ntests/test_dir/grid/0263:\n\ntests/test_dir/grid/0264:\n\ntests/test_dir/grid/0265:\n\ntests/test_dir/grid/0266:\n\ntests/test_dir/grid/0267:\n\ntests/test_dir/grid/0268:\n\ntests/test_dir/grid/0269:\n\ntests/test_dir/grid/0270:\n\ntests/test_dir/grid/0271:\n\ntests/test_dir/grid/0272:\n\ntests/test_dir/grid/0273:\n\ntests/test_dir/grid/0274:\n\ntests/test_dir/grid/0275:\n\ntests/test_dir/grid/0276:\n\ntests/test_dir/grid/0277:\n\ntests/test_dir/grid/0278:\n\ntests/test_dir/grid/0279:\n\ntests/test_dir/grid/0280:\n\ntests/test_dir/grid/0281:\n\ntests/test_dir/grid/0282:\n\ntests/test_dir/grid/0283:\n\ntests/test_dir/grid/0284:\n\ntests/test_dir/grid/0285:\n\ntests/test_dir/grid/0286:\n\ntests/test_dir/grid/0287:\n\ntests/test_dir/grid/0288:\n\ntests/test_dir/grid/0289:\n\ntests/test_dir/grid/0290:\n\ntests/test_dir/grid/0291:\n\ntests/test_dir/grid/0292:\n\ntests/test_dir/grid/0293:\n\ntests/test_dir/grid/0294:\n\ntests/test_dir/grid/0295:\n\ntests/test_dir/grid/0296:\n\ntests/test_dir/grid/0297:\n\ntests/test_dir/grid/0298:\n\ntests/test_dir/grid/0299:\n\ntests/test_dir/grid/0300:\n\ntests/test_dir/grid/0301:\n\ntests/test_dir/grid/0302:\n\ntests/test_dir/grid/0303:\n\ntests/test_dir/grid/0304:\n\ntests/test_dir/grid/0305:\n\ntests/test_dir/grid/0306:\n\ntests/test_dir/grid/0307:\n\ntests/test_dir/grid/0308:\n\ntests/test_dir/grid/0309:\n\ntests/test_dir/grid/0310:\n\ntests/test_dir/grid/0311:\n\ntests/test_dir/grid/0312:\n\ntests/test_dir/grid/0313:\n\ntests/test_dir/grid/0314:\n\ntests/test_dir/grid/0315:\n\ntests/test_dir/grid/0316:\n\ntests/test_dir/grid/0317:\n\ntests/test_dir/grid/0318:\n\ntests/test_dir/grid/0319:\n\ntests/test_dir/grid/0320:\n\ntests/test_dir/grid/0321:\n\ntests/test_dir/grid/0322:\n\ntests/test_dir/grid/0323:\n\ntests/test_dir/grid/0324:\n\ntests/test_dir/grid/0325:\n\ntests/test_dir/grid/0326:\n\ntests/test_dir/grid/0327:\n\ntests/test_dir/grid/0328:\n\ntests/test_dir/grid/0329:\n\ntests/test_dir/grid/0330:\n\ntests/test_dir/grid/0331:\n\ntests/test_dir/grid/0332:\n\ntests/test_dir/grid/0333:\n\ntests/test_dir/grid/0334:\n\ntests/test_dir/grid/0335:\n\ntests/test_dir/grid/0336:\n\ntests/test_dir/grid/0337:\n\ntests/test_dir/grid/0338:\n\ntests/test_dir/grid/0339:\n\ntests/test_dir/grid/0340:\n\ntests/test_dir/grid/0341:\n\ntests/test_dir/grid/0342:\n\ntests/test_dir/grid/0343:\n\ntests/test_dir/grid/0344:\n\ntests/test_dir/grid/0345:\n\ntests/test_dir/grid/0346:\n\ntests/test_dir/grid/0347:\n\ntests/test_dir/grid/0348:\n\ntests/test_dir/grid/0349:\n\ntests/test_dir/grid/0350:\n\ntests/test_dir/grid/0351:\n\ntests/test_dir/grid/0352:\n\ntests/test_dir/grid/0353:\n\ntests/test_dir/grid/0354:\n\ntests/test_dir/grid/0355:\n\ntests/test_dir/grid/0356:\n\ntests/test_dir/grid/0357:\n\ntests/test_dir/grid/0358:\n\ntests/test_dir/grid/0359:\n\ntests/test_dir/grid/0360:\n\ntests/test_dir/grid/0361:\n\ntests/test_dir/grid/0362:\n\ntests/test_dir/grid/0363:\n\ntests/test_dir/grid/0364:\n\ntests/test_dir/grid/0365:\n\ntests/test_dir/grid/0366:\n\ntests/test_dir/grid/0367:\n\ntests/test_dir/grid/0368:\n\ntests/test_dir/grid/0369:\n\ntests/test_dir/grid/0370:\n\ntests/test_dir/grid/0371:\n\ntests/test_dir/grid/0372:\n\ntests/test_dir/grid/0373:\n\ntests/test_dir/grid/0374:\n\ntests/test_dir/grid/0375:\n\ntests/test_dir/grid/0376:\n\ntests/test_dir/grid/0377:\n\ntests/test_dir/grid/0378:\n\ntests/test_dir/grid/0379:\n\ntests/test_dir/grid/0380:\n\ntests/test_dir/grid/0381:\n\ntests/test_dir/grid/0382:\n\ntests/test_dir/grid/0383:\n\ntests/test_dir/grid/0384:\n\ntests/test_dir/grid/0385:\n\ntests/test_dir/grid/0386:\n\ntests/test_dir/grid/0387:\n\ntests/test_dir/grid/0388:\n\ntests/test_dir/grid/0389:\n\ntests/test_dir/grid/0390:\n\ntests/test_dir/grid/0391:\n\ntests/test_dir/grid/0392:\n\ntests/test_dir/grid/0393:\n\ntests/test_dir/grid/0394:\n\ntests/test_dir/grid/0395:\n\ntests/test_dir/grid/0396:\n\ntests/test_dir/grid/0397:\n\ntests/test_dir/grid/0398:\n\ntests/test_dir/grid/0399:\n\ntests/test_dir/grid/0400:\n\ntests/test_dir/grid/0401:\n\ntests/test_dir/grid/0402:\n\ntests/test_dir/grid/0403:\n\ntests/test_dir/grid/0404:\n\ntests/test_dir/grid/0405:\n\ntests/test_dir/grid/0406:\n\ntests/test_dir/grid/0407:\n\ntests/test_dir/grid/0408:\n\ntests/test_dir/grid/0409:\n\ntests/test_dir/grid/0410:\n\ntests/test_dir/grid/0411:\n\ntests/test_dir/grid/0412:\n\ntests/test_dir/grid/0413:\n\ntests/test_dir/grid/0414:\n\ntests/test_dir/grid/0415:\n\ntests/test_dir/grid/0416:\n\ntests/test_dir/grid/0417:\n\ntests/test_dir/grid/0418:\n\ntests/test_dir/grid/0419:\n\ntests/test_dir/grid/0420:\n\ntests/test_dir/grid/0421:\n\ntests/test_dir/grid/0422:\n\ntests/test_dir/grid/0423:\n\ntests/test_dir/grid/0424:\n\ntests/test_dir/grid/0425:\n\ntests/test_dir/grid/0426:\n\ntests/test_dir/grid/0427:\n\ntests/test_dir/grid/0428:\n\ntests/test_dir/grid/0429:\n\ntests/test_dir/grid/0430:\n\ntests/test_dir/grid/0431:\n\ntests/test_dir/grid/0432:\n\ntests/test_dir/grid/0433:\n\ntests/test_dir/grid/0434:\n\ntests/test_dir/grid/0435:\n\ntests/test_dir/grid/0436:\n\ntests/test_dir/grid/0437:\n\ntests/test_dir/grid/0438:\n\ntests/test_dir/grid/0439:\n\ntests/test_dir/grid/0440:\n\ntests/test_dir/grid/0441:\n\ntests/test_dir/grid/0442:\n\ntests/test_dir/grid/0443:\n\ntests/test_dir/grid/0444:\n\ntests/test_dir/grid/0445:\n\ntests/test_dir/grid/0446:\n\ntests/test_dir/grid/0447:\n\ntests/test_dir/grid/0448:\n\ntests/test_dir/grid/0449:\n\ntests/test_dir/grid/0450:\n\ntests/test_dir/grid/0451:\n\ntests/test_dir/grid/0452:\n\ntests/test_dir/grid/0453:\n\ntests/test_dir/grid/0454:\n\ntests/test_dir/grid/0455:\n\ntests/test_dir/grid/0456:\n\ntests/test_dir/grid/0457:\n\ntests/test_dir/grid/0458:\n\ntests/test_dir/grid/0459:\n\ntests/test_dir/grid/0460:\n\ntests/test_dir/grid/0461:\n\ntests/test_dir/grid/0462:\n\ntests/test_dir/grid/0463:\n\ntests/test_dir/grid/0464:\n\ntests/test_dir/grid/0465:\n\ntests/test_dir/grid/0466:\n\ntests/test_dir/grid/0467:\n\ntests/test_dir/grid/0468:\n\ntests/test_dir/grid/0469:\n\ntests/test_dir/grid/0470:\n\ntests/test_dir/grid/0471:\n\ntests/test_dir/grid/0472:\n\ntests/test_dir/grid/0473:\n\ntests/test_dir/grid/0474:\n\ntests/test_dir/grid/0475:\n\ntests/test_dir/grid/0476:\n\ntests/test_dir/grid/0477:\n\ntests/test_dir/grid/0478:\n\ntests/test_dir/grid/0479:\n\ntests/test_dir/grid/0480:\n\ntests/test_dir/grid/0481:\n\ntests/test_dir/grid/0482:\n\ntests/test_dir/grid/0483:\n\ntests/test_dir/grid/0484:\n\ntests/test_dir/grid/0485:\n\ntests/test_dir/grid/0486:\n\ntests/test_dir/grid/0487:\n\ntests/test_dir/grid/0488:\n\ntests/test_dir/grid/0489:\n\ntests/test_dir/grid/0490:\n\ntests/test_dir/grid/0491:\n\ntests/test_dir/grid/0492:\n\ntests/test_dir/grid/0493:\n\ntests/test_dir/grid/0494:\n\ntests/test_dir/grid/0495:\n\ntests/test_dir/grid/0496:\n\ntests/test_dir/grid/0497:\n\ntests/test_dir/grid/0498:\n\ntests/test_dir/grid/0499:\n\ntests/test_dir/grid/0500:\n\ntests/test_dir/grid/0501:\n\ntests/test_dir/grid/0502:\n\ntests/test_dir/grid/0503:\n\ntests/test_dir/grid/0504:\n\ntests/test_dir/grid/0505:\n\ntests/test_dir/grid/0506:\n\ntests/test_dir/grid/0507:\n\ntests/test_dir/grid/0508:\n\ntests/test_dir/grid/0509:\n\ntests/test_dir/grid/0510:\n\ntests/test_dir/grid/0511:\n\ntests/test_dir/grid/0512:\n\ntests/test_dir/grid/0513:\n\ntests/test_dir/grid/0514:\n\ntests/test_dir/grid/0515:\n\ntests/test_dir/grid/0516:\n\ntests/test_dir/grid/0517:\n\ntests/test_dir/grid/0518:\n\ntests/test_dir/grid/0519:\n\ntests/test_dir/grid/0520:\n\ntests/test_dir/grid/0521:\n\ntests/test_dir/grid/0522:\n\ntests/test_dir/grid/0523:\n\ntests/test_dir/grid/0524:\n\ntests/test_dir/grid/0525:\n\ntests/test_dir/grid/0526:\n\ntests/test_dir/grid/0527:\n\ntests/test_dir/grid/0528:\n\ntests/test_dir/grid/0529:\n\ntests/test_dir/grid/0530:\n\ntests/test_dir/grid/0531:\n\ntests/test_dir/grid/0532:\n\ntests/test_dir/grid/0533:\n\ntests/test_dir/grid/0534:\n\ntests/test_dir/grid/0535:\n\ntests/test_dir/grid/0536:\n\ntests/test_dir/grid/0537:\n\ntests/test_dir/grid/0538:\n\ntests/test_dir/grid/0539:\n\ntests/test_dir/grid/0540:\n\ntests/test_dir/grid/0541:\n\ntests/test_dir/grid/0542:\n\ntests/test_dir/grid/0543:\n\ntests/test_dir/grid/0544:\n\ntests/test_dir/grid/0545:\n\ntests/test_dir/grid/0546:\n\ntests/test_dir/grid/0547:\n\ntests/test_dir/grid/0548:\n\ntests/test_dir/grid/0549:\n\ntests/test_dir/grid/0550:\n\ntests/test_dir/grid/0551:\n\ntests/test_dir/grid/0552:\n\ntests/test_dir/grid/0553:\n\ntests/test_dir/grid/0554:\n\ntests/test_dir/grid/0555:\n\ntests/test_dir/grid/0556:\n\ntests/test_dir/grid/0557:\n\ntests/test_dir/grid/0558:\n\ntests/test_dir/grid/0559:\n\ntests/test_dir/grid/0560:\n\ntests/test_dir/grid/0561:\n\ntests/test_dir/grid/0562:\n\ntests/test_dir/grid/0563:\n\ntests/test_dir/grid/0564:\n\ntests/test_dir/grid/0565:\n\ntests/test_dir/grid/0566:\n\ntests/test_dir/grid/0567:\n\ntests/test_dir/grid/0568:\n\ntests/test_dir/grid/0569:\n\ntests/test_dir/grid/0570:\n\ntests/test_dir/grid/0571:\n\ntests/test_dir/grid/0572:\n\ntests/test_dir/grid/0573:\n\ntests/test_dir/grid/0574:\n\ntests/test_dir/grid/0575:\n\ntests/test_dir/grid/0576:\n\ntests/test_dir/grid/0577:\n\ntests/test_dir/grid/0578:\n\ntests/test_dir/grid/0579:\n\ntests/test_dir/grid/0580:\n\ntests/test_dir/grid/0581:\n\ntests/test_dir/grid/0582:\n\ntests/test_dir/grid/0583:\n\ntests/test_dir/grid/0584:\n\ntests/test_dir/grid/0585:\n\ntests/test_dir/grid/0586:\n\ntests/test_dir/grid/0587:\n\ntests/test_dir/grid/0588:\n\ntests/test_dir/grid/0589:\n\ntests/test_dir/grid/0590:\n\ntests/test_dir/grid/0591:\n\ntests/test_dir/grid/0592:\n\ntests/test_dir/grid/0593:\n\ntests/test_dir/grid/0594:\n\ntests/test_dir/grid/0595:\n\ntests/test_dir/grid/0596:\n\ntests/test_dir/grid/0597:\n\ntests/test_dir/grid/0598:\n\ntests/test_dir/grid/0599:\n\ntests/test_dir/grid/0600:\n\ntests/test_dir/grid/0601:\n\ntests/test_dir/grid/0602:\n\ntests/test_dir/grid/0603:\n\ntests/test_dir/grid/0604:\n\ntests/test_dir/grid/0605:\n\ntests/test_dir/grid/0606:\n\ntests/test_dir/grid/0607:\n\ntests/test_dir/grid/0608:\n\ntests/test_dir/grid/0609:\n\ntests/test_dir/grid/0610:\n\ntests/test_dir/grid/0611:\n\ntests/test_dir/grid/0612:\n\ntests/test_dir/grid/0613:\n\ntests/test_dir/grid/0614:\n\ntests/test_dir/grid/0615:\n\ntests/test_dir/grid/0616:\n\ntests/test_dir/grid/0617:\n\ntests/test_dir/grid/0618:\n\ntests/test_dir/grid/0619:\n\ntests/test_dir/grid/0620:\n\ntests/test_dir/grid/0621:\n\ntests/test_dir/grid/0622:\n\ntests/test_dir/grid/0623:\n\ntests/test_dir/grid/0624:\n\ntests/test_dir/grid/0625:\n\ntests/test_dir/grid/0626:\n\ntests/test_dir/grid/0627:\n\ntests/test_dir/grid/0628:\n\ntests/test_dir/grid/0629:\n\ntests/test_dir/grid/0630:\n\ntests/test_dir/grid/0631:\n\ntests/test_dir/grid/0632:\n\ntests/test_dir/grid/0633:\n\ntests/test_dir/grid/0634:\n\ntests/test_dir/grid/0635:\n\ntests/test_dir/grid/0636:\n\ntests/test_dir/grid/0637:\n\ntests/test_dir/grid/0638:\n\ntests/test_dir/grid/0639:\n\ntests/test_dir/grid/0640:\n\ntests/test_dir/grid/0641:\n\ntests/test_dir/grid/0642:\n\ntests/test_dir/grid/0643:\n\ntests/test_dir/grid/0644:\n\ntests/test_dir/grid/0645:\n\ntests/test_dir/grid/0646:\n\ntests/test_dir/grid/0647:\n\ntests/test_dir/grid/0648:\n\ntests/test_dir/grid/0649:\n\ntests/test_dir/grid/0650:\n\ntests/test_dir/grid/0651:\n\ntests/test_dir/grid/0652:\n\ntests/test_dir/grid/0653:\n\ntests/test_dir/grid/0654:\n\ntests/test_dir/grid/0655:\n\ntests/test_dir/grid/0656:\n\ntests/test_dir/grid/0657:\n\ntests/test_dir/grid/0658:\n\ntests/test_dir/grid/0659:\n\ntests/test_dir/grid/0660:\n\ntests/test_dir/grid/0661:\n\ntests/test_dir/grid/0662:\n\ntests/test_dir/grid/0663:\n\ntests/test_dir/grid/0664:\n\ntests/test_dir/grid/0665:\n\ntests/test_dir/grid/0666:\n\ntests/test_dir/grid/0667:\n\ntests/test_dir/grid/0668:\n\ntests/test_dir/grid/0669:\n\ntests/test_dir/grid/0670:\n\ntests/test_dir/grid/0671:\n\ntests/test_dir/grid/0672:\n\ntests/test_dir/grid/0673:\n\ntests/test_dir/grid/0674:\n\ntests/test_dir/grid/0675:\n\ntests/test_dir/grid/0676:\n\ntests/test_dir/grid/0677:\n\ntests/test_dir/grid/0678:\n\ntests/test_dir/grid/0679:\n\ntests/test_dir/grid/0680:\n\ntests/test_dir/grid/0681:\n\ntests/test_dir/grid/0682:\n\ntests/test_dir/grid/0683:\n\ntests/test_dir/grid/0684:\n\ntests/test_dir/grid/0685:\n\ntests/test_dir/grid/0686:\n\ntests/test_dir/grid/0687:\n\ntests/test_dir/grid/0688:\n\ntests/test_dir/grid/0689:\n\ntests/test_dir/grid/0690:\n\ntests/test_dir/grid/0691:\n\ntests/test_dir/grid/0692:\n\ntests/test_dir/grid/0693:\n\ntests/test_dir/grid/0694:\n\ntests/test_dir/grid/0695:\n\ntests/test_dir/grid/0696:\n\ntests/test_dir/grid/0697:\n\ntests/test_dir/grid/0698:\n\ntests/test_dir/grid/0699:\n\ntests/test_dir/grid/0700:\n\ntests/test_dir/grid/0701:\n\ntests/test_dir/grid/0702:\n\ntests/test_dir/grid/0703:\n\ntests/test_dir/grid/0704:\n\ntests/test_dir/grid/0705:\n\ntests/test_dir/grid/0706:\n\ntests/test_dir/grid/0707:\n\ntests/test_dir/grid/0708:\n\ntests/test_dir/grid/0709:\n\ntests/test_dir/grid/0710:\n\ntests/test_dir/grid/0711:\n\ntests/test_dir/grid/0712:\n\ntests/test_dir/grid/0713:\n\ntests/test_dir/grid/0714:\n\ntests/test_dir/grid/0715:\n\ntests/test_dir/grid/0716:\n\ntests/test_dir/grid/0717:\n\ntests/test_dir/grid/0718:\n\ntests/test_dir/grid/0719:\n\ntests/test_dir/grid/0720:\n\ntests/test_dir/grid/0721:\n\ntests/test_dir/grid/0722:\n\ntests/test_dir/grid/0723:\n\ntests/test_dir/grid/0724:\n\ntests/test_dir/grid/0725:\n\ntests/test_dir/grid/0726:\n\ntests/test_dir/grid/0727:\n\ntests/test_dir/grid/0728:\n\ntests/test_dir/grid/0729:\n\ntests/test_dir/grid/0730:\n\ntests/test_dir/grid/0731:\n\ntests/test_dir/grid/0732:\n\ntests/test_dir/grid/0733:\n\ntests/test_dir/grid/0734:\n\ntests/test_dir/grid/0735:\n\ntests/test_dir/grid/0736:\n\ntests/test_dir/grid/0737:\n\ntests/test_dir/grid/0738:\n\ntests/test_dir/grid/0739:\n\ntests/test_dir/grid/0740:\n\ntests/test_dir/grid/0741:\n\ntests/test_dir/grid/0742:\n\ntests/test_dir/grid/0743:\n\ntests/test_dir/grid/0744:\n\ntests/test_dir/grid/0745:\n\ntests/test_dir/grid/0746:\n\ntests/test_dir/grid/0747:\n\ntests/test_dir/grid/0748:\n\ntests/test_dir/grid/0749:\n\ntests/test_dir/grid/0750:\n\ntests/test_dir/grid/0751:\n\ntests/test_dir/grid/0752:\n\ntests/test_dir/grid/0753:\n\ntests/test_dir/grid/0754:\n\ntests/test_dir/grid/0755:\n\ntests/test_dir/grid/0756:\n\ntests/test_dir/grid/0757:\n\ntests/test_dir/grid/0758:\n\ntests/test_dir/grid/0759:\n\ntests/test_dir/grid/0760:\n\ntests/test_dir/grid/0761:\n\ntests/test_dir/grid/0762:\n\ntests/test_dir/grid/0763:\n\ntests/test_dir/grid/0764:\n\ntests/test_dir/grid/0765:\n\ntests/test_dir/grid/0766:\n\ntests/test_dir/grid/0767:\n\ntests/test_dir/grid/0768:\n\ntests/test_dir/grid/0769:\n\ntests/test_dir/grid/0770:\n\ntests/test_dir/grid/0771:\n\ntests/test_dir/grid/0772:\n\ntests/test_dir/grid/0773:\n\ntests/test_dir/grid/0774:\n\ntests/test_dir/grid/0775:\n\ntests/test_dir/grid/0776:\n\ntests/test_dir/grid/0777:\n\ntests/test_dir/grid/0778:\n\ntests/test_dir/grid/0779:\n\ntests/test_dir/grid/0780:\n\ntests/test_dir/grid/0781:\n\ntests/test_dir/grid/0782:\n\ntests/test_dir/grid/0783:\n\ntests/test_dir/grid/0784:\n\ntests/test_dir/grid/0785:\n\ntests/test_dir/grid/0786:\n\ntests/test_dir/grid/0787:\n\ntests/test_dir/grid/0788:\n\ntests/test_dir/grid/0789:\n\ntests/test_dir/grid/0790:\n\ntests/test_dir/grid/0791:\n\ntests/test_dir/grid/0792:\n\ntests/test_dir/grid/0793:\n\ntests/test_dir/grid/0794:\n\ntests/test_dir/grid/0795:\n\ntests/test_dir/grid/0796:\n\ntests/test_dir/grid/0797:\n\ntests/test_dir/grid/0798:\n\ntests/test_dir/grid/0799:\n\ntests/test_dir/grid/0800:\n\ntests/test_dir/grid/0801:\n\ntests/test_dir/grid/0802:\n\ntests/test_dir/grid/0803:\n\ntests/test_dir/grid/0804:\n\ntests/test_dir/grid/0805:\n\ntests/test_dir/grid/0806:\n\ntests/test_dir/grid/0807:\n\ntests/test_dir/grid/0808:\n\ntests/test_dir/grid/0809:\n\ntests/test_dir/grid/0810:\n\ntests/test_dir/grid/0811:\n\ntests/test_dir/grid/0812:\n\ntests/test_dir/grid/0813:\n\ntests/test_dir/grid/0814:\n\ntests/test_dir/grid/0815:\n\ntests/test_dir/grid/0816:\n\ntests/test_dir/grid/0817:\n\ntests/test_dir/grid/0818:\n\ntests/test_dir/grid/0819:\n\ntests/test_dir/grid/0820:\n\ntests/test_dir/grid/0821:\n\ntests/test_dir/grid/0822:\n\ntests/test_dir/grid/0823:\n\ntests/test_dir/grid/0824:\n\ntests/test_dir/grid/0825:\n\ntests/test_dir/grid/0826:\n\ntests/test_dir/grid/0827:\n\ntests/test_dir/grid/0828:\n\ntests/test_dir/grid/0829:\n\ntests/test_dir/grid/0830:\n\ntests/test_dir/grid/0831:\n\ntests/test_dir/grid/0832:\n\ntests/test_dir/grid/0833:\n\ntests/test_dir/grid/0834:\n\ntests/test_dir/grid/0835:\n\ntests/test_dir/grid/0836:\n\ntests/test_dir/grid/0837:\n\ntests/test_dir/grid/0838:\n\ntests/test_dir/grid/0839:\n\ntests/test_dir/grid/0840:\n\ntests/test_dir/grid/0841:\n\ntests/test_dir/grid/0842:\n\ntests/test_dir/grid/0843:\n\ntests/test_dir/grid/0844:\n\ntests/test_dir/grid/0845:\n\ntests/test_dir/grid/0846:\n\ntests/test_dir/grid/0847:\n\ntests/test_dir/grid/0848:\n\ntests/test_dir/grid/0849:\n\ntests/test_dir/grid/0850:\n\ntests/test_dir/grid/0851:\n\ntests/test_dir/grid/0852:\n\ntests/test_dir/grid/0853:\n\ntests/test_dir/grid/0854:\n\ntests/test_dir/grid/0855:\n\ntests/test_dir/grid/0856:\n\ntests/test_dir/grid/0857:\n\ntests/test_dir/grid/0858:\n\ntests/test_dir/grid/0859:\n\ntests/test_dir/grid/0860:\n\ntests/test_dir/grid/0861:\n\ntests/test_dir/grid/0862:\n\ntests/test_dir/grid/0863:\n\ntests/test_dir/grid/0864:\n\ntests/test_dir/grid/0865:\n\ntests/test_dir/grid/0866:\n\ntests/test_dir/grid/0867:\n\ntests/test_dir/grid/0868:\n\ntests/test_dir/grid/0869:\n\ntests/test_dir/grid/0870:\n\ntests/test_dir/grid/0871:\n\ntests/test_dir/grid/0872:\n\ntests/test_dir/grid/0873:\n\ntests/test_dir/grid/0874:\n\ntests/test_dir/grid/0875:\n\ntests/test_dir/grid/0876:\n\ntests/test_dir/grid/0877:\n\ntests/test_dir/grid/0878:\n\ntests/test_dir/grid/0879:\n\ntests/test_dir/grid/0880:\n\ntests/test_dir/grid/0881:\n\ntests/test_dir/grid/0882:\n\ntests/test_dir/grid/0883:\n\ntests/test_dir/grid/0884:\n\ntests/test_dir/grid/0885:\n\ntests/test_dir/grid/0886:\n\ntests/test_dir/grid/0887:\n\ntests/test_dir/grid/0888:\n\ntests/test_dir/grid/0889:\n\ntests/test_dir/grid/0890:\n\ntests/test_dir/grid/0891:\n\ntests/test_dir/grid/0892:\n\ntests/test_dir/grid/0893:\n\ntests/test_dir/grid/0894:\n\ntests/test_dir/grid/0895:\n\ntests/test_dir/grid/0896:\n\ntests/test_dir/grid/0897:\n\ntests/test_dir/grid/0898:\n\ntests/test_dir/grid/0899:\n\ntests/test_dir/grid/0900:\n\ntests/test_dir/grid/0901:\n\ntests/test_dir/grid/0902:\n\ntests/test_dir/grid/0903:\n\ntests/test_dir/grid/0904:\n\ntests/test_dir/grid/0905:\n\ntests/test_dir/grid/0906:\n\ntests/test_dir/grid/0907:\n\ntests/test_dir/grid/0908:\n\ntests/test_dir/grid/0909:\n\ntests/test_dir/grid/0910:\n\ntests/test_dir/grid/0911:\n\ntests/test_dir/grid/0912:\n\ntests/test_dir/grid/0913:\n\ntests/test_dir/grid/0914:\n\ntests/test_dir/grid/0915:\n\ntests/test_dir/grid/0916:\n\ntests/test_dir/grid/0917:\n\ntests/test_dir/grid/0918:\n\ntests/test_dir/grid/0919:\n\ntests/test_dir/grid/0920:\n\ntests/test_dir/grid/0921:\n\ntests/test_dir/grid/0922:\n\ntests/test_dir/grid/0923:\n\ntests/test_dir/grid/0924:\n\ntests/test_dir/grid/0925:\n\ntests/test_dir/grid/0926:\n\ntests/test_dir/grid/0927:\n\ntests/test_dir/grid/0928:\n\ntests/test_dir/grid/0929:\n\ntests/test_dir/grid/0930:\n\ntests/test_dir/grid/0931:\n\ntests/test_dir/grid/0932:\n\ntests/test_dir/grid/0933:\n\ntests/test_dir/grid/0934:\n\ntests/test_dir/grid/0935:\n\ntests/test_dir/grid/0936:\n\ntests/test_dir/grid/0937:\n\ntests/test_dir/grid/0938:\n\ntests/test_dir/grid/0939:\n\ntests/test_dir/grid/0940:\n\ntests/test_dir/grid/0941:\n\ntests/test_dir/grid/0942:\n\ntests/test_dir/grid/0943:\n\ntests/test_dir/grid/0944:\n\ntests/test_dir/grid/0945:\n\ntests/test_dir/grid/0946:\n\ntests/test_dir/grid/0947:\n\ntests/test_dir/grid/0948:\n\ntests/test_dir/grid/0949:\n\ntests/test_dir/grid/0950:\n\ntests/test_dir/grid/0951:\n\ntests/test_dir/grid/0952:\n\ntests/test_dir/grid/0953:\n\ntests/test_dir/grid/0954:\n\ntests/test_dir/grid/0955:\n\ntests/test_dir/grid/0956:\n\ntests/test_dir/grid/0957:\n\ntests/test_dir/grid/0958:\n\ntests/test_dir/grid/0959:\n\ntests/test_dir/grid/0960:\n\ntests/test_dir/grid/0961:\n\ntests/test_dir/grid/0962:\n\ntests/test_dir/grid/0963:\n\ntests/test_dir/grid/0964:\n\ntests/test_dir/grid/0965:\n\ntests/test_dir/grid/0966:\n\ntests/test_dir/grid/0967:\n\ntests/test_dir/grid/0968:\n\ntests/test_dir/grid/0969:\n\ntests/test_dir/grid/0970:\n\ntests/test_dir/grid/0971:\n\ntests/test_dir/grid/0972:\n\ntests/test_dir/grid/0973:\n\ntests/test_dir/grid/0974:\n\ntests/test_dir/grid/0975:\n\ntests/test_dir/grid/0976:\n\ntests/test_dir/grid/0977:\n\ntests/test_dir/grid/0978:\n\ntests/test_dir/grid/0979:\n\ntests/test_dir/grid/0980:\n\ntests/test_dir/grid/0981:\n\ntests/test_dir/grid/0982:\n\ntests/test_dir/grid/0983:\n\ntests/test_dir/grid/0984:\n\ntests/test_dir/grid/0985:\n\ntests/test_dir/grid/0986:\n\ntests/test_dir/grid/0987:\n\ntests/test_dir/grid/0988:\n\ntests/test_dir/grid/0989:\n\ntests/test_dir/grid/0990:\n\ntests/test_dir/grid/0991:\n\ntests/test_dir/grid/0992:\n\ntests/test_dir/grid/0993:\n\ntests/test_dir/grid/0994:\n\ntests/test_dir/grid/0995:\n\ntests/test_dir/grid/0996:\n\ntests/test_dir/grid/0997:\n\ntests/test_dir/grid/0998:\n\ntests/test_dir/grid/0999:\n\ntests/test_dir/grid/1000:\n\ntests/test_dir/group:\n1 file\n\ntests/test_dir/icons:\n1 c++.cpp\n1 c.c\n1 css.css\n1 file\n1 go.go\n1 html.html\n1 java.java\n1 javascript.js\n1 man.1\n1 marked.md\n1 php.php\n1 python.py\n1 ruby.rb\n1 rust.rs\n1 shell.sh\n1 unknown.unknown\n\ntests/test_dir/perms:\n1 file\n1 file2\n\ntests/test_dir/size:\n1 1B\n1 1K\n1 1M\n1 1337\n\ntests/test_dir/specials:\n\ntests/test_dir/symlinks:\n2 dir\n1 file\n1 ' lorem ipsum'\n1 symlink -> file\n1 symlink2 -> symlink\n1 symlink3 -> dir\n1 symlink4 -> pipitek\n\ntests/test_dir/symlinks/dir:\n\ntests/test_dir/time:\n1 1d\n1 1h\n1 1m\n1 1s\n1 1y\n1 epoch\n"
  },
  {
    "path": "tests/gen/long_links_recurse_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --no-user --no-time --no-filesize --no-permissions --recurse --links\"\n"
  },
  {
    "path": "tests/gen/long_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_nix.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/gen/long_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long\"\n"
  },
  {
    "path": "tests/gen/long_octal_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_octal_nix.stdout",
    "content": "0755 drwxr-xr-x - nixbld  1 Jan  1970 git\n0755 drwxr-xr-x - nixbld  1 Jan  1970 grid\n0755 drwxr-xr-x - nixbld  1 Jan  1970 group\n0755 drwxr-xr-x - nixbld  1 Jan  1970 icons\n0755 drwxr-xr-x - nixbld  1 Jan  1970 perms\n0755 drwxr-xr-x - nixbld  1 Jan  1970 size\n0755 drwxr-xr-x - nixbld  1 Jan  1970 specials\n0755 drwxr-xr-x - nixbld  1 Jan  1970 symlinks\n0755 drwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/gen/long_octal_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --octal-permissions\"\n"
  },
  {
    "path": "tests/gen/long_recurse_with_level_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_recurse_with_level_unix.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/gen/long_recurse_with_level_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --no-user --no-permissions --no-time --no-filesize --recurse --level 2\"\n"
  },
  {
    "path": "tests/gen/long_time_style_custom_non_recent_and_recent_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_time_style_custom_non_recent_and_recent_nix.stdout",
    "content": "NON_RECENT 13_month\n    RECENT now\n"
  },
  {
    "path": "tests/gen/long_time_style_custom_non_recent_and_recent_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/timestamp_test_dir --long --no-permissions --no-filesize --no-user --sort=modified --time-style='+NON_RECENT\\n    RECENT'\"\n"
  },
  {
    "path": "tests/gen/long_time_style_custom_non_recent_empty_nix.stdout",
    "content": ""
  },
  {
    "path": "tests/gen/long_time_style_custom_non_recent_empty_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/timestamp_test_dir --long --no-permissions --no-filesize --no-user --sort=modified --time-style='+\\n'\"\nstatus.code = 2\n"
  },
  {
    "path": "tests/gen/long_time_style_custom_non_recent_none_nix.stdout",
    "content": ""
  },
  {
    "path": "tests/gen/long_time_style_custom_non_recent_none_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/timestamp_test_dir --long --no-permissions --no-filesize --no-user --sort=modified --time-style='+'\"\nstatus.code = 2\n"
  },
  {
    "path": "tests/gen/long_time_style_custom_non_recent_only_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_time_style_custom_non_recent_only_nix.stdout",
    "content": "NON_RECENT 13_month\nNON_RECENT now\n"
  },
  {
    "path": "tests/gen/long_time_style_custom_non_recent_only_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/timestamp_test_dir --long --no-permissions --no-filesize --no-user --sort=modified --time-style='+NON_RECENT'\"\n"
  },
  {
    "path": "tests/gen/long_time_style_custom_recent_empty_nix.stdout",
    "content": ""
  },
  {
    "path": "tests/gen/long_time_style_relative_nix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_time_style_relative_nix.stdout",
    "content": "drwxr-xr-x - nixbld 56 years git\ndrwxr-xr-x - nixbld 56 years grid\ndrwxr-xr-x - nixbld 56 years group\ndrwxr-xr-x - nixbld 56 years icons\ndrwxr-xr-x - nixbld 56 years perms\ndrwxr-xr-x - nixbld 56 years size\ndrwxr-xr-x - nixbld 56 years specials\ndrwxr-xr-x - nixbld 56 years symlinks\ndrwxr-xr-x - nixbld 56 years time\n"
  },
  {
    "path": "tests/gen/long_time_style_relative_nix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --time-style relative\"\n"
  },
  {
    "path": "tests/gen/long_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/long_unix.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/gen/long_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long --no-user --no-time --no-filesize --no-permissions\"\n"
  },
  {
    "path": "tests/gen/only_dir_recursive_long_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/only_dir_recursive_long_unix.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n\ntests/test_dir/git:\n001\n002\n003\n004\n005\n006\n007\n008\n009\n010\n\ntests/test_dir/git/001:\n\ntests/test_dir/git/002:\n\ntests/test_dir/git/003:\n\ntests/test_dir/git/004:\n\ntests/test_dir/git/005:\n\ntests/test_dir/git/006:\n\ntests/test_dir/git/007:\n\ntests/test_dir/git/008:\n\ntests/test_dir/git/009:\n\ntests/test_dir/git/010:\n\ntests/test_dir/grid:\n0001\n0002\n0003\n0004\n0005\n0006\n0007\n0008\n0009\n0010\n0011\n0012\n0013\n0014\n0015\n0016\n0017\n0018\n0019\n0020\n0021\n0022\n0023\n0024\n0025\n0026\n0027\n0028\n0029\n0030\n0031\n0032\n0033\n0034\n0035\n0036\n0037\n0038\n0039\n0040\n0041\n0042\n0043\n0044\n0045\n0046\n0047\n0048\n0049\n0050\n0051\n0052\n0053\n0054\n0055\n0056\n0057\n0058\n0059\n0060\n0061\n0062\n0063\n0064\n0065\n0066\n0067\n0068\n0069\n0070\n0071\n0072\n0073\n0074\n0075\n0076\n0077\n0078\n0079\n0080\n0081\n0082\n0083\n0084\n0085\n0086\n0087\n0088\n0089\n0090\n0091\n0092\n0093\n0094\n0095\n0096\n0097\n0098\n0099\n0100\n0101\n0102\n0103\n0104\n0105\n0106\n0107\n0108\n0109\n0110\n0111\n0112\n0113\n0114\n0115\n0116\n0117\n0118\n0119\n0120\n0121\n0122\n0123\n0124\n0125\n0126\n0127\n0128\n0129\n0130\n0131\n0132\n0133\n0134\n0135\n0136\n0137\n0138\n0139\n0140\n0141\n0142\n0143\n0144\n0145\n0146\n0147\n0148\n0149\n0150\n0151\n0152\n0153\n0154\n0155\n0156\n0157\n0158\n0159\n0160\n0161\n0162\n0163\n0164\n0165\n0166\n0167\n0168\n0169\n0170\n0171\n0172\n0173\n0174\n0175\n0176\n0177\n0178\n0179\n0180\n0181\n0182\n0183\n0184\n0185\n0186\n0187\n0188\n0189\n0190\n0191\n0192\n0193\n0194\n0195\n0196\n0197\n0198\n0199\n0200\n0201\n0202\n0203\n0204\n0205\n0206\n0207\n0208\n0209\n0210\n0211\n0212\n0213\n0214\n0215\n0216\n0217\n0218\n0219\n0220\n0221\n0222\n0223\n0224\n0225\n0226\n0227\n0228\n0229\n0230\n0231\n0232\n0233\n0234\n0235\n0236\n0237\n0238\n0239\n0240\n0241\n0242\n0243\n0244\n0245\n0246\n0247\n0248\n0249\n0250\n0251\n0252\n0253\n0254\n0255\n0256\n0257\n0258\n0259\n0260\n0261\n0262\n0263\n0264\n0265\n0266\n0267\n0268\n0269\n0270\n0271\n0272\n0273\n0274\n0275\n0276\n0277\n0278\n0279\n0280\n0281\n0282\n0283\n0284\n0285\n0286\n0287\n0288\n0289\n0290\n0291\n0292\n0293\n0294\n0295\n0296\n0297\n0298\n0299\n0300\n0301\n0302\n0303\n0304\n0305\n0306\n0307\n0308\n0309\n0310\n0311\n0312\n0313\n0314\n0315\n0316\n0317\n0318\n0319\n0320\n0321\n0322\n0323\n0324\n0325\n0326\n0327\n0328\n0329\n0330\n0331\n0332\n0333\n0334\n0335\n0336\n0337\n0338\n0339\n0340\n0341\n0342\n0343\n0344\n0345\n0346\n0347\n0348\n0349\n0350\n0351\n0352\n0353\n0354\n0355\n0356\n0357\n0358\n0359\n0360\n0361\n0362\n0363\n0364\n0365\n0366\n0367\n0368\n0369\n0370\n0371\n0372\n0373\n0374\n0375\n0376\n0377\n0378\n0379\n0380\n0381\n0382\n0383\n0384\n0385\n0386\n0387\n0388\n0389\n0390\n0391\n0392\n0393\n0394\n0395\n0396\n0397\n0398\n0399\n0400\n0401\n0402\n0403\n0404\n0405\n0406\n0407\n0408\n0409\n0410\n0411\n0412\n0413\n0414\n0415\n0416\n0417\n0418\n0419\n0420\n0421\n0422\n0423\n0424\n0425\n0426\n0427\n0428\n0429\n0430\n0431\n0432\n0433\n0434\n0435\n0436\n0437\n0438\n0439\n0440\n0441\n0442\n0443\n0444\n0445\n0446\n0447\n0448\n0449\n0450\n0451\n0452\n0453\n0454\n0455\n0456\n0457\n0458\n0459\n0460\n0461\n0462\n0463\n0464\n0465\n0466\n0467\n0468\n0469\n0470\n0471\n0472\n0473\n0474\n0475\n0476\n0477\n0478\n0479\n0480\n0481\n0482\n0483\n0484\n0485\n0486\n0487\n0488\n0489\n0490\n0491\n0492\n0493\n0494\n0495\n0496\n0497\n0498\n0499\n0500\n0501\n0502\n0503\n0504\n0505\n0506\n0507\n0508\n0509\n0510\n0511\n0512\n0513\n0514\n0515\n0516\n0517\n0518\n0519\n0520\n0521\n0522\n0523\n0524\n0525\n0526\n0527\n0528\n0529\n0530\n0531\n0532\n0533\n0534\n0535\n0536\n0537\n0538\n0539\n0540\n0541\n0542\n0543\n0544\n0545\n0546\n0547\n0548\n0549\n0550\n0551\n0552\n0553\n0554\n0555\n0556\n0557\n0558\n0559\n0560\n0561\n0562\n0563\n0564\n0565\n0566\n0567\n0568\n0569\n0570\n0571\n0572\n0573\n0574\n0575\n0576\n0577\n0578\n0579\n0580\n0581\n0582\n0583\n0584\n0585\n0586\n0587\n0588\n0589\n0590\n0591\n0592\n0593\n0594\n0595\n0596\n0597\n0598\n0599\n0600\n0601\n0602\n0603\n0604\n0605\n0606\n0607\n0608\n0609\n0610\n0611\n0612\n0613\n0614\n0615\n0616\n0617\n0618\n0619\n0620\n0621\n0622\n0623\n0624\n0625\n0626\n0627\n0628\n0629\n0630\n0631\n0632\n0633\n0634\n0635\n0636\n0637\n0638\n0639\n0640\n0641\n0642\n0643\n0644\n0645\n0646\n0647\n0648\n0649\n0650\n0651\n0652\n0653\n0654\n0655\n0656\n0657\n0658\n0659\n0660\n0661\n0662\n0663\n0664\n0665\n0666\n0667\n0668\n0669\n0670\n0671\n0672\n0673\n0674\n0675\n0676\n0677\n0678\n0679\n0680\n0681\n0682\n0683\n0684\n0685\n0686\n0687\n0688\n0689\n0690\n0691\n0692\n0693\n0694\n0695\n0696\n0697\n0698\n0699\n0700\n0701\n0702\n0703\n0704\n0705\n0706\n0707\n0708\n0709\n0710\n0711\n0712\n0713\n0714\n0715\n0716\n0717\n0718\n0719\n0720\n0721\n0722\n0723\n0724\n0725\n0726\n0727\n0728\n0729\n0730\n0731\n0732\n0733\n0734\n0735\n0736\n0737\n0738\n0739\n0740\n0741\n0742\n0743\n0744\n0745\n0746\n0747\n0748\n0749\n0750\n0751\n0752\n0753\n0754\n0755\n0756\n0757\n0758\n0759\n0760\n0761\n0762\n0763\n0764\n0765\n0766\n0767\n0768\n0769\n0770\n0771\n0772\n0773\n0774\n0775\n0776\n0777\n0778\n0779\n0780\n0781\n0782\n0783\n0784\n0785\n0786\n0787\n0788\n0789\n0790\n0791\n0792\n0793\n0794\n0795\n0796\n0797\n0798\n0799\n0800\n0801\n0802\n0803\n0804\n0805\n0806\n0807\n0808\n0809\n0810\n0811\n0812\n0813\n0814\n0815\n0816\n0817\n0818\n0819\n0820\n0821\n0822\n0823\n0824\n0825\n0826\n0827\n0828\n0829\n0830\n0831\n0832\n0833\n0834\n0835\n0836\n0837\n0838\n0839\n0840\n0841\n0842\n0843\n0844\n0845\n0846\n0847\n0848\n0849\n0850\n0851\n0852\n0853\n0854\n0855\n0856\n0857\n0858\n0859\n0860\n0861\n0862\n0863\n0864\n0865\n0866\n0867\n0868\n0869\n0870\n0871\n0872\n0873\n0874\n0875\n0876\n0877\n0878\n0879\n0880\n0881\n0882\n0883\n0884\n0885\n0886\n0887\n0888\n0889\n0890\n0891\n0892\n0893\n0894\n0895\n0896\n0897\n0898\n0899\n0900\n0901\n0902\n0903\n0904\n0905\n0906\n0907\n0908\n0909\n0910\n0911\n0912\n0913\n0914\n0915\n0916\n0917\n0918\n0919\n0920\n0921\n0922\n0923\n0924\n0925\n0926\n0927\n0928\n0929\n0930\n0931\n0932\n0933\n0934\n0935\n0936\n0937\n0938\n0939\n0940\n0941\n0942\n0943\n0944\n0945\n0946\n0947\n0948\n0949\n0950\n0951\n0952\n0953\n0954\n0955\n0956\n0957\n0958\n0959\n0960\n0961\n0962\n0963\n0964\n0965\n0966\n0967\n0968\n0969\n0970\n0971\n0972\n0973\n0974\n0975\n0976\n0977\n0978\n0979\n0980\n0981\n0982\n0983\n0984\n0985\n0986\n0987\n0988\n0989\n0990\n0991\n0992\n0993\n0994\n0995\n0996\n0997\n0998\n0999\n1000\n\ntests/test_dir/grid/0001:\n\ntests/test_dir/grid/0002:\n\ntests/test_dir/grid/0003:\n\ntests/test_dir/grid/0004:\n\ntests/test_dir/grid/0005:\n\ntests/test_dir/grid/0006:\n\ntests/test_dir/grid/0007:\n\ntests/test_dir/grid/0008:\n\ntests/test_dir/grid/0009:\n\ntests/test_dir/grid/0010:\n\ntests/test_dir/grid/0011:\n\ntests/test_dir/grid/0012:\n\ntests/test_dir/grid/0013:\n\ntests/test_dir/grid/0014:\n\ntests/test_dir/grid/0015:\n\ntests/test_dir/grid/0016:\n\ntests/test_dir/grid/0017:\n\ntests/test_dir/grid/0018:\n\ntests/test_dir/grid/0019:\n\ntests/test_dir/grid/0020:\n\ntests/test_dir/grid/0021:\n\ntests/test_dir/grid/0022:\n\ntests/test_dir/grid/0023:\n\ntests/test_dir/grid/0024:\n\ntests/test_dir/grid/0025:\n\ntests/test_dir/grid/0026:\n\ntests/test_dir/grid/0027:\n\ntests/test_dir/grid/0028:\n\ntests/test_dir/grid/0029:\n\ntests/test_dir/grid/0030:\n\ntests/test_dir/grid/0031:\n\ntests/test_dir/grid/0032:\n\ntests/test_dir/grid/0033:\n\ntests/test_dir/grid/0034:\n\ntests/test_dir/grid/0035:\n\ntests/test_dir/grid/0036:\n\ntests/test_dir/grid/0037:\n\ntests/test_dir/grid/0038:\n\ntests/test_dir/grid/0039:\n\ntests/test_dir/grid/0040:\n\ntests/test_dir/grid/0041:\n\ntests/test_dir/grid/0042:\n\ntests/test_dir/grid/0043:\n\ntests/test_dir/grid/0044:\n\ntests/test_dir/grid/0045:\n\ntests/test_dir/grid/0046:\n\ntests/test_dir/grid/0047:\n\ntests/test_dir/grid/0048:\n\ntests/test_dir/grid/0049:\n\ntests/test_dir/grid/0050:\n\ntests/test_dir/grid/0051:\n\ntests/test_dir/grid/0052:\n\ntests/test_dir/grid/0053:\n\ntests/test_dir/grid/0054:\n\ntests/test_dir/grid/0055:\n\ntests/test_dir/grid/0056:\n\ntests/test_dir/grid/0057:\n\ntests/test_dir/grid/0058:\n\ntests/test_dir/grid/0059:\n\ntests/test_dir/grid/0060:\n\ntests/test_dir/grid/0061:\n\ntests/test_dir/grid/0062:\n\ntests/test_dir/grid/0063:\n\ntests/test_dir/grid/0064:\n\ntests/test_dir/grid/0065:\n\ntests/test_dir/grid/0066:\n\ntests/test_dir/grid/0067:\n\ntests/test_dir/grid/0068:\n\ntests/test_dir/grid/0069:\n\ntests/test_dir/grid/0070:\n\ntests/test_dir/grid/0071:\n\ntests/test_dir/grid/0072:\n\ntests/test_dir/grid/0073:\n\ntests/test_dir/grid/0074:\n\ntests/test_dir/grid/0075:\n\ntests/test_dir/grid/0076:\n\ntests/test_dir/grid/0077:\n\ntests/test_dir/grid/0078:\n\ntests/test_dir/grid/0079:\n\ntests/test_dir/grid/0080:\n\ntests/test_dir/grid/0081:\n\ntests/test_dir/grid/0082:\n\ntests/test_dir/grid/0083:\n\ntests/test_dir/grid/0084:\n\ntests/test_dir/grid/0085:\n\ntests/test_dir/grid/0086:\n\ntests/test_dir/grid/0087:\n\ntests/test_dir/grid/0088:\n\ntests/test_dir/grid/0089:\n\ntests/test_dir/grid/0090:\n\ntests/test_dir/grid/0091:\n\ntests/test_dir/grid/0092:\n\ntests/test_dir/grid/0093:\n\ntests/test_dir/grid/0094:\n\ntests/test_dir/grid/0095:\n\ntests/test_dir/grid/0096:\n\ntests/test_dir/grid/0097:\n\ntests/test_dir/grid/0098:\n\ntests/test_dir/grid/0099:\n\ntests/test_dir/grid/0100:\n\ntests/test_dir/grid/0101:\n\ntests/test_dir/grid/0102:\n\ntests/test_dir/grid/0103:\n\ntests/test_dir/grid/0104:\n\ntests/test_dir/grid/0105:\n\ntests/test_dir/grid/0106:\n\ntests/test_dir/grid/0107:\n\ntests/test_dir/grid/0108:\n\ntests/test_dir/grid/0109:\n\ntests/test_dir/grid/0110:\n\ntests/test_dir/grid/0111:\n\ntests/test_dir/grid/0112:\n\ntests/test_dir/grid/0113:\n\ntests/test_dir/grid/0114:\n\ntests/test_dir/grid/0115:\n\ntests/test_dir/grid/0116:\n\ntests/test_dir/grid/0117:\n\ntests/test_dir/grid/0118:\n\ntests/test_dir/grid/0119:\n\ntests/test_dir/grid/0120:\n\ntests/test_dir/grid/0121:\n\ntests/test_dir/grid/0122:\n\ntests/test_dir/grid/0123:\n\ntests/test_dir/grid/0124:\n\ntests/test_dir/grid/0125:\n\ntests/test_dir/grid/0126:\n\ntests/test_dir/grid/0127:\n\ntests/test_dir/grid/0128:\n\ntests/test_dir/grid/0129:\n\ntests/test_dir/grid/0130:\n\ntests/test_dir/grid/0131:\n\ntests/test_dir/grid/0132:\n\ntests/test_dir/grid/0133:\n\ntests/test_dir/grid/0134:\n\ntests/test_dir/grid/0135:\n\ntests/test_dir/grid/0136:\n\ntests/test_dir/grid/0137:\n\ntests/test_dir/grid/0138:\n\ntests/test_dir/grid/0139:\n\ntests/test_dir/grid/0140:\n\ntests/test_dir/grid/0141:\n\ntests/test_dir/grid/0142:\n\ntests/test_dir/grid/0143:\n\ntests/test_dir/grid/0144:\n\ntests/test_dir/grid/0145:\n\ntests/test_dir/grid/0146:\n\ntests/test_dir/grid/0147:\n\ntests/test_dir/grid/0148:\n\ntests/test_dir/grid/0149:\n\ntests/test_dir/grid/0150:\n\ntests/test_dir/grid/0151:\n\ntests/test_dir/grid/0152:\n\ntests/test_dir/grid/0153:\n\ntests/test_dir/grid/0154:\n\ntests/test_dir/grid/0155:\n\ntests/test_dir/grid/0156:\n\ntests/test_dir/grid/0157:\n\ntests/test_dir/grid/0158:\n\ntests/test_dir/grid/0159:\n\ntests/test_dir/grid/0160:\n\ntests/test_dir/grid/0161:\n\ntests/test_dir/grid/0162:\n\ntests/test_dir/grid/0163:\n\ntests/test_dir/grid/0164:\n\ntests/test_dir/grid/0165:\n\ntests/test_dir/grid/0166:\n\ntests/test_dir/grid/0167:\n\ntests/test_dir/grid/0168:\n\ntests/test_dir/grid/0169:\n\ntests/test_dir/grid/0170:\n\ntests/test_dir/grid/0171:\n\ntests/test_dir/grid/0172:\n\ntests/test_dir/grid/0173:\n\ntests/test_dir/grid/0174:\n\ntests/test_dir/grid/0175:\n\ntests/test_dir/grid/0176:\n\ntests/test_dir/grid/0177:\n\ntests/test_dir/grid/0178:\n\ntests/test_dir/grid/0179:\n\ntests/test_dir/grid/0180:\n\ntests/test_dir/grid/0181:\n\ntests/test_dir/grid/0182:\n\ntests/test_dir/grid/0183:\n\ntests/test_dir/grid/0184:\n\ntests/test_dir/grid/0185:\n\ntests/test_dir/grid/0186:\n\ntests/test_dir/grid/0187:\n\ntests/test_dir/grid/0188:\n\ntests/test_dir/grid/0189:\n\ntests/test_dir/grid/0190:\n\ntests/test_dir/grid/0191:\n\ntests/test_dir/grid/0192:\n\ntests/test_dir/grid/0193:\n\ntests/test_dir/grid/0194:\n\ntests/test_dir/grid/0195:\n\ntests/test_dir/grid/0196:\n\ntests/test_dir/grid/0197:\n\ntests/test_dir/grid/0198:\n\ntests/test_dir/grid/0199:\n\ntests/test_dir/grid/0200:\n\ntests/test_dir/grid/0201:\n\ntests/test_dir/grid/0202:\n\ntests/test_dir/grid/0203:\n\ntests/test_dir/grid/0204:\n\ntests/test_dir/grid/0205:\n\ntests/test_dir/grid/0206:\n\ntests/test_dir/grid/0207:\n\ntests/test_dir/grid/0208:\n\ntests/test_dir/grid/0209:\n\ntests/test_dir/grid/0210:\n\ntests/test_dir/grid/0211:\n\ntests/test_dir/grid/0212:\n\ntests/test_dir/grid/0213:\n\ntests/test_dir/grid/0214:\n\ntests/test_dir/grid/0215:\n\ntests/test_dir/grid/0216:\n\ntests/test_dir/grid/0217:\n\ntests/test_dir/grid/0218:\n\ntests/test_dir/grid/0219:\n\ntests/test_dir/grid/0220:\n\ntests/test_dir/grid/0221:\n\ntests/test_dir/grid/0222:\n\ntests/test_dir/grid/0223:\n\ntests/test_dir/grid/0224:\n\ntests/test_dir/grid/0225:\n\ntests/test_dir/grid/0226:\n\ntests/test_dir/grid/0227:\n\ntests/test_dir/grid/0228:\n\ntests/test_dir/grid/0229:\n\ntests/test_dir/grid/0230:\n\ntests/test_dir/grid/0231:\n\ntests/test_dir/grid/0232:\n\ntests/test_dir/grid/0233:\n\ntests/test_dir/grid/0234:\n\ntests/test_dir/grid/0235:\n\ntests/test_dir/grid/0236:\n\ntests/test_dir/grid/0237:\n\ntests/test_dir/grid/0238:\n\ntests/test_dir/grid/0239:\n\ntests/test_dir/grid/0240:\n\ntests/test_dir/grid/0241:\n\ntests/test_dir/grid/0242:\n\ntests/test_dir/grid/0243:\n\ntests/test_dir/grid/0244:\n\ntests/test_dir/grid/0245:\n\ntests/test_dir/grid/0246:\n\ntests/test_dir/grid/0247:\n\ntests/test_dir/grid/0248:\n\ntests/test_dir/grid/0249:\n\ntests/test_dir/grid/0250:\n\ntests/test_dir/grid/0251:\n\ntests/test_dir/grid/0252:\n\ntests/test_dir/grid/0253:\n\ntests/test_dir/grid/0254:\n\ntests/test_dir/grid/0255:\n\ntests/test_dir/grid/0256:\n\ntests/test_dir/grid/0257:\n\ntests/test_dir/grid/0258:\n\ntests/test_dir/grid/0259:\n\ntests/test_dir/grid/0260:\n\ntests/test_dir/grid/0261:\n\ntests/test_dir/grid/0262:\n\ntests/test_dir/grid/0263:\n\ntests/test_dir/grid/0264:\n\ntests/test_dir/grid/0265:\n\ntests/test_dir/grid/0266:\n\ntests/test_dir/grid/0267:\n\ntests/test_dir/grid/0268:\n\ntests/test_dir/grid/0269:\n\ntests/test_dir/grid/0270:\n\ntests/test_dir/grid/0271:\n\ntests/test_dir/grid/0272:\n\ntests/test_dir/grid/0273:\n\ntests/test_dir/grid/0274:\n\ntests/test_dir/grid/0275:\n\ntests/test_dir/grid/0276:\n\ntests/test_dir/grid/0277:\n\ntests/test_dir/grid/0278:\n\ntests/test_dir/grid/0279:\n\ntests/test_dir/grid/0280:\n\ntests/test_dir/grid/0281:\n\ntests/test_dir/grid/0282:\n\ntests/test_dir/grid/0283:\n\ntests/test_dir/grid/0284:\n\ntests/test_dir/grid/0285:\n\ntests/test_dir/grid/0286:\n\ntests/test_dir/grid/0287:\n\ntests/test_dir/grid/0288:\n\ntests/test_dir/grid/0289:\n\ntests/test_dir/grid/0290:\n\ntests/test_dir/grid/0291:\n\ntests/test_dir/grid/0292:\n\ntests/test_dir/grid/0293:\n\ntests/test_dir/grid/0294:\n\ntests/test_dir/grid/0295:\n\ntests/test_dir/grid/0296:\n\ntests/test_dir/grid/0297:\n\ntests/test_dir/grid/0298:\n\ntests/test_dir/grid/0299:\n\ntests/test_dir/grid/0300:\n\ntests/test_dir/grid/0301:\n\ntests/test_dir/grid/0302:\n\ntests/test_dir/grid/0303:\n\ntests/test_dir/grid/0304:\n\ntests/test_dir/grid/0305:\n\ntests/test_dir/grid/0306:\n\ntests/test_dir/grid/0307:\n\ntests/test_dir/grid/0308:\n\ntests/test_dir/grid/0309:\n\ntests/test_dir/grid/0310:\n\ntests/test_dir/grid/0311:\n\ntests/test_dir/grid/0312:\n\ntests/test_dir/grid/0313:\n\ntests/test_dir/grid/0314:\n\ntests/test_dir/grid/0315:\n\ntests/test_dir/grid/0316:\n\ntests/test_dir/grid/0317:\n\ntests/test_dir/grid/0318:\n\ntests/test_dir/grid/0319:\n\ntests/test_dir/grid/0320:\n\ntests/test_dir/grid/0321:\n\ntests/test_dir/grid/0322:\n\ntests/test_dir/grid/0323:\n\ntests/test_dir/grid/0324:\n\ntests/test_dir/grid/0325:\n\ntests/test_dir/grid/0326:\n\ntests/test_dir/grid/0327:\n\ntests/test_dir/grid/0328:\n\ntests/test_dir/grid/0329:\n\ntests/test_dir/grid/0330:\n\ntests/test_dir/grid/0331:\n\ntests/test_dir/grid/0332:\n\ntests/test_dir/grid/0333:\n\ntests/test_dir/grid/0334:\n\ntests/test_dir/grid/0335:\n\ntests/test_dir/grid/0336:\n\ntests/test_dir/grid/0337:\n\ntests/test_dir/grid/0338:\n\ntests/test_dir/grid/0339:\n\ntests/test_dir/grid/0340:\n\ntests/test_dir/grid/0341:\n\ntests/test_dir/grid/0342:\n\ntests/test_dir/grid/0343:\n\ntests/test_dir/grid/0344:\n\ntests/test_dir/grid/0345:\n\ntests/test_dir/grid/0346:\n\ntests/test_dir/grid/0347:\n\ntests/test_dir/grid/0348:\n\ntests/test_dir/grid/0349:\n\ntests/test_dir/grid/0350:\n\ntests/test_dir/grid/0351:\n\ntests/test_dir/grid/0352:\n\ntests/test_dir/grid/0353:\n\ntests/test_dir/grid/0354:\n\ntests/test_dir/grid/0355:\n\ntests/test_dir/grid/0356:\n\ntests/test_dir/grid/0357:\n\ntests/test_dir/grid/0358:\n\ntests/test_dir/grid/0359:\n\ntests/test_dir/grid/0360:\n\ntests/test_dir/grid/0361:\n\ntests/test_dir/grid/0362:\n\ntests/test_dir/grid/0363:\n\ntests/test_dir/grid/0364:\n\ntests/test_dir/grid/0365:\n\ntests/test_dir/grid/0366:\n\ntests/test_dir/grid/0367:\n\ntests/test_dir/grid/0368:\n\ntests/test_dir/grid/0369:\n\ntests/test_dir/grid/0370:\n\ntests/test_dir/grid/0371:\n\ntests/test_dir/grid/0372:\n\ntests/test_dir/grid/0373:\n\ntests/test_dir/grid/0374:\n\ntests/test_dir/grid/0375:\n\ntests/test_dir/grid/0376:\n\ntests/test_dir/grid/0377:\n\ntests/test_dir/grid/0378:\n\ntests/test_dir/grid/0379:\n\ntests/test_dir/grid/0380:\n\ntests/test_dir/grid/0381:\n\ntests/test_dir/grid/0382:\n\ntests/test_dir/grid/0383:\n\ntests/test_dir/grid/0384:\n\ntests/test_dir/grid/0385:\n\ntests/test_dir/grid/0386:\n\ntests/test_dir/grid/0387:\n\ntests/test_dir/grid/0388:\n\ntests/test_dir/grid/0389:\n\ntests/test_dir/grid/0390:\n\ntests/test_dir/grid/0391:\n\ntests/test_dir/grid/0392:\n\ntests/test_dir/grid/0393:\n\ntests/test_dir/grid/0394:\n\ntests/test_dir/grid/0395:\n\ntests/test_dir/grid/0396:\n\ntests/test_dir/grid/0397:\n\ntests/test_dir/grid/0398:\n\ntests/test_dir/grid/0399:\n\ntests/test_dir/grid/0400:\n\ntests/test_dir/grid/0401:\n\ntests/test_dir/grid/0402:\n\ntests/test_dir/grid/0403:\n\ntests/test_dir/grid/0404:\n\ntests/test_dir/grid/0405:\n\ntests/test_dir/grid/0406:\n\ntests/test_dir/grid/0407:\n\ntests/test_dir/grid/0408:\n\ntests/test_dir/grid/0409:\n\ntests/test_dir/grid/0410:\n\ntests/test_dir/grid/0411:\n\ntests/test_dir/grid/0412:\n\ntests/test_dir/grid/0413:\n\ntests/test_dir/grid/0414:\n\ntests/test_dir/grid/0415:\n\ntests/test_dir/grid/0416:\n\ntests/test_dir/grid/0417:\n\ntests/test_dir/grid/0418:\n\ntests/test_dir/grid/0419:\n\ntests/test_dir/grid/0420:\n\ntests/test_dir/grid/0421:\n\ntests/test_dir/grid/0422:\n\ntests/test_dir/grid/0423:\n\ntests/test_dir/grid/0424:\n\ntests/test_dir/grid/0425:\n\ntests/test_dir/grid/0426:\n\ntests/test_dir/grid/0427:\n\ntests/test_dir/grid/0428:\n\ntests/test_dir/grid/0429:\n\ntests/test_dir/grid/0430:\n\ntests/test_dir/grid/0431:\n\ntests/test_dir/grid/0432:\n\ntests/test_dir/grid/0433:\n\ntests/test_dir/grid/0434:\n\ntests/test_dir/grid/0435:\n\ntests/test_dir/grid/0436:\n\ntests/test_dir/grid/0437:\n\ntests/test_dir/grid/0438:\n\ntests/test_dir/grid/0439:\n\ntests/test_dir/grid/0440:\n\ntests/test_dir/grid/0441:\n\ntests/test_dir/grid/0442:\n\ntests/test_dir/grid/0443:\n\ntests/test_dir/grid/0444:\n\ntests/test_dir/grid/0445:\n\ntests/test_dir/grid/0446:\n\ntests/test_dir/grid/0447:\n\ntests/test_dir/grid/0448:\n\ntests/test_dir/grid/0449:\n\ntests/test_dir/grid/0450:\n\ntests/test_dir/grid/0451:\n\ntests/test_dir/grid/0452:\n\ntests/test_dir/grid/0453:\n\ntests/test_dir/grid/0454:\n\ntests/test_dir/grid/0455:\n\ntests/test_dir/grid/0456:\n\ntests/test_dir/grid/0457:\n\ntests/test_dir/grid/0458:\n\ntests/test_dir/grid/0459:\n\ntests/test_dir/grid/0460:\n\ntests/test_dir/grid/0461:\n\ntests/test_dir/grid/0462:\n\ntests/test_dir/grid/0463:\n\ntests/test_dir/grid/0464:\n\ntests/test_dir/grid/0465:\n\ntests/test_dir/grid/0466:\n\ntests/test_dir/grid/0467:\n\ntests/test_dir/grid/0468:\n\ntests/test_dir/grid/0469:\n\ntests/test_dir/grid/0470:\n\ntests/test_dir/grid/0471:\n\ntests/test_dir/grid/0472:\n\ntests/test_dir/grid/0473:\n\ntests/test_dir/grid/0474:\n\ntests/test_dir/grid/0475:\n\ntests/test_dir/grid/0476:\n\ntests/test_dir/grid/0477:\n\ntests/test_dir/grid/0478:\n\ntests/test_dir/grid/0479:\n\ntests/test_dir/grid/0480:\n\ntests/test_dir/grid/0481:\n\ntests/test_dir/grid/0482:\n\ntests/test_dir/grid/0483:\n\ntests/test_dir/grid/0484:\n\ntests/test_dir/grid/0485:\n\ntests/test_dir/grid/0486:\n\ntests/test_dir/grid/0487:\n\ntests/test_dir/grid/0488:\n\ntests/test_dir/grid/0489:\n\ntests/test_dir/grid/0490:\n\ntests/test_dir/grid/0491:\n\ntests/test_dir/grid/0492:\n\ntests/test_dir/grid/0493:\n\ntests/test_dir/grid/0494:\n\ntests/test_dir/grid/0495:\n\ntests/test_dir/grid/0496:\n\ntests/test_dir/grid/0497:\n\ntests/test_dir/grid/0498:\n\ntests/test_dir/grid/0499:\n\ntests/test_dir/grid/0500:\n\ntests/test_dir/grid/0501:\n\ntests/test_dir/grid/0502:\n\ntests/test_dir/grid/0503:\n\ntests/test_dir/grid/0504:\n\ntests/test_dir/grid/0505:\n\ntests/test_dir/grid/0506:\n\ntests/test_dir/grid/0507:\n\ntests/test_dir/grid/0508:\n\ntests/test_dir/grid/0509:\n\ntests/test_dir/grid/0510:\n\ntests/test_dir/grid/0511:\n\ntests/test_dir/grid/0512:\n\ntests/test_dir/grid/0513:\n\ntests/test_dir/grid/0514:\n\ntests/test_dir/grid/0515:\n\ntests/test_dir/grid/0516:\n\ntests/test_dir/grid/0517:\n\ntests/test_dir/grid/0518:\n\ntests/test_dir/grid/0519:\n\ntests/test_dir/grid/0520:\n\ntests/test_dir/grid/0521:\n\ntests/test_dir/grid/0522:\n\ntests/test_dir/grid/0523:\n\ntests/test_dir/grid/0524:\n\ntests/test_dir/grid/0525:\n\ntests/test_dir/grid/0526:\n\ntests/test_dir/grid/0527:\n\ntests/test_dir/grid/0528:\n\ntests/test_dir/grid/0529:\n\ntests/test_dir/grid/0530:\n\ntests/test_dir/grid/0531:\n\ntests/test_dir/grid/0532:\n\ntests/test_dir/grid/0533:\n\ntests/test_dir/grid/0534:\n\ntests/test_dir/grid/0535:\n\ntests/test_dir/grid/0536:\n\ntests/test_dir/grid/0537:\n\ntests/test_dir/grid/0538:\n\ntests/test_dir/grid/0539:\n\ntests/test_dir/grid/0540:\n\ntests/test_dir/grid/0541:\n\ntests/test_dir/grid/0542:\n\ntests/test_dir/grid/0543:\n\ntests/test_dir/grid/0544:\n\ntests/test_dir/grid/0545:\n\ntests/test_dir/grid/0546:\n\ntests/test_dir/grid/0547:\n\ntests/test_dir/grid/0548:\n\ntests/test_dir/grid/0549:\n\ntests/test_dir/grid/0550:\n\ntests/test_dir/grid/0551:\n\ntests/test_dir/grid/0552:\n\ntests/test_dir/grid/0553:\n\ntests/test_dir/grid/0554:\n\ntests/test_dir/grid/0555:\n\ntests/test_dir/grid/0556:\n\ntests/test_dir/grid/0557:\n\ntests/test_dir/grid/0558:\n\ntests/test_dir/grid/0559:\n\ntests/test_dir/grid/0560:\n\ntests/test_dir/grid/0561:\n\ntests/test_dir/grid/0562:\n\ntests/test_dir/grid/0563:\n\ntests/test_dir/grid/0564:\n\ntests/test_dir/grid/0565:\n\ntests/test_dir/grid/0566:\n\ntests/test_dir/grid/0567:\n\ntests/test_dir/grid/0568:\n\ntests/test_dir/grid/0569:\n\ntests/test_dir/grid/0570:\n\ntests/test_dir/grid/0571:\n\ntests/test_dir/grid/0572:\n\ntests/test_dir/grid/0573:\n\ntests/test_dir/grid/0574:\n\ntests/test_dir/grid/0575:\n\ntests/test_dir/grid/0576:\n\ntests/test_dir/grid/0577:\n\ntests/test_dir/grid/0578:\n\ntests/test_dir/grid/0579:\n\ntests/test_dir/grid/0580:\n\ntests/test_dir/grid/0581:\n\ntests/test_dir/grid/0582:\n\ntests/test_dir/grid/0583:\n\ntests/test_dir/grid/0584:\n\ntests/test_dir/grid/0585:\n\ntests/test_dir/grid/0586:\n\ntests/test_dir/grid/0587:\n\ntests/test_dir/grid/0588:\n\ntests/test_dir/grid/0589:\n\ntests/test_dir/grid/0590:\n\ntests/test_dir/grid/0591:\n\ntests/test_dir/grid/0592:\n\ntests/test_dir/grid/0593:\n\ntests/test_dir/grid/0594:\n\ntests/test_dir/grid/0595:\n\ntests/test_dir/grid/0596:\n\ntests/test_dir/grid/0597:\n\ntests/test_dir/grid/0598:\n\ntests/test_dir/grid/0599:\n\ntests/test_dir/grid/0600:\n\ntests/test_dir/grid/0601:\n\ntests/test_dir/grid/0602:\n\ntests/test_dir/grid/0603:\n\ntests/test_dir/grid/0604:\n\ntests/test_dir/grid/0605:\n\ntests/test_dir/grid/0606:\n\ntests/test_dir/grid/0607:\n\ntests/test_dir/grid/0608:\n\ntests/test_dir/grid/0609:\n\ntests/test_dir/grid/0610:\n\ntests/test_dir/grid/0611:\n\ntests/test_dir/grid/0612:\n\ntests/test_dir/grid/0613:\n\ntests/test_dir/grid/0614:\n\ntests/test_dir/grid/0615:\n\ntests/test_dir/grid/0616:\n\ntests/test_dir/grid/0617:\n\ntests/test_dir/grid/0618:\n\ntests/test_dir/grid/0619:\n\ntests/test_dir/grid/0620:\n\ntests/test_dir/grid/0621:\n\ntests/test_dir/grid/0622:\n\ntests/test_dir/grid/0623:\n\ntests/test_dir/grid/0624:\n\ntests/test_dir/grid/0625:\n\ntests/test_dir/grid/0626:\n\ntests/test_dir/grid/0627:\n\ntests/test_dir/grid/0628:\n\ntests/test_dir/grid/0629:\n\ntests/test_dir/grid/0630:\n\ntests/test_dir/grid/0631:\n\ntests/test_dir/grid/0632:\n\ntests/test_dir/grid/0633:\n\ntests/test_dir/grid/0634:\n\ntests/test_dir/grid/0635:\n\ntests/test_dir/grid/0636:\n\ntests/test_dir/grid/0637:\n\ntests/test_dir/grid/0638:\n\ntests/test_dir/grid/0639:\n\ntests/test_dir/grid/0640:\n\ntests/test_dir/grid/0641:\n\ntests/test_dir/grid/0642:\n\ntests/test_dir/grid/0643:\n\ntests/test_dir/grid/0644:\n\ntests/test_dir/grid/0645:\n\ntests/test_dir/grid/0646:\n\ntests/test_dir/grid/0647:\n\ntests/test_dir/grid/0648:\n\ntests/test_dir/grid/0649:\n\ntests/test_dir/grid/0650:\n\ntests/test_dir/grid/0651:\n\ntests/test_dir/grid/0652:\n\ntests/test_dir/grid/0653:\n\ntests/test_dir/grid/0654:\n\ntests/test_dir/grid/0655:\n\ntests/test_dir/grid/0656:\n\ntests/test_dir/grid/0657:\n\ntests/test_dir/grid/0658:\n\ntests/test_dir/grid/0659:\n\ntests/test_dir/grid/0660:\n\ntests/test_dir/grid/0661:\n\ntests/test_dir/grid/0662:\n\ntests/test_dir/grid/0663:\n\ntests/test_dir/grid/0664:\n\ntests/test_dir/grid/0665:\n\ntests/test_dir/grid/0666:\n\ntests/test_dir/grid/0667:\n\ntests/test_dir/grid/0668:\n\ntests/test_dir/grid/0669:\n\ntests/test_dir/grid/0670:\n\ntests/test_dir/grid/0671:\n\ntests/test_dir/grid/0672:\n\ntests/test_dir/grid/0673:\n\ntests/test_dir/grid/0674:\n\ntests/test_dir/grid/0675:\n\ntests/test_dir/grid/0676:\n\ntests/test_dir/grid/0677:\n\ntests/test_dir/grid/0678:\n\ntests/test_dir/grid/0679:\n\ntests/test_dir/grid/0680:\n\ntests/test_dir/grid/0681:\n\ntests/test_dir/grid/0682:\n\ntests/test_dir/grid/0683:\n\ntests/test_dir/grid/0684:\n\ntests/test_dir/grid/0685:\n\ntests/test_dir/grid/0686:\n\ntests/test_dir/grid/0687:\n\ntests/test_dir/grid/0688:\n\ntests/test_dir/grid/0689:\n\ntests/test_dir/grid/0690:\n\ntests/test_dir/grid/0691:\n\ntests/test_dir/grid/0692:\n\ntests/test_dir/grid/0693:\n\ntests/test_dir/grid/0694:\n\ntests/test_dir/grid/0695:\n\ntests/test_dir/grid/0696:\n\ntests/test_dir/grid/0697:\n\ntests/test_dir/grid/0698:\n\ntests/test_dir/grid/0699:\n\ntests/test_dir/grid/0700:\n\ntests/test_dir/grid/0701:\n\ntests/test_dir/grid/0702:\n\ntests/test_dir/grid/0703:\n\ntests/test_dir/grid/0704:\n\ntests/test_dir/grid/0705:\n\ntests/test_dir/grid/0706:\n\ntests/test_dir/grid/0707:\n\ntests/test_dir/grid/0708:\n\ntests/test_dir/grid/0709:\n\ntests/test_dir/grid/0710:\n\ntests/test_dir/grid/0711:\n\ntests/test_dir/grid/0712:\n\ntests/test_dir/grid/0713:\n\ntests/test_dir/grid/0714:\n\ntests/test_dir/grid/0715:\n\ntests/test_dir/grid/0716:\n\ntests/test_dir/grid/0717:\n\ntests/test_dir/grid/0718:\n\ntests/test_dir/grid/0719:\n\ntests/test_dir/grid/0720:\n\ntests/test_dir/grid/0721:\n\ntests/test_dir/grid/0722:\n\ntests/test_dir/grid/0723:\n\ntests/test_dir/grid/0724:\n\ntests/test_dir/grid/0725:\n\ntests/test_dir/grid/0726:\n\ntests/test_dir/grid/0727:\n\ntests/test_dir/grid/0728:\n\ntests/test_dir/grid/0729:\n\ntests/test_dir/grid/0730:\n\ntests/test_dir/grid/0731:\n\ntests/test_dir/grid/0732:\n\ntests/test_dir/grid/0733:\n\ntests/test_dir/grid/0734:\n\ntests/test_dir/grid/0735:\n\ntests/test_dir/grid/0736:\n\ntests/test_dir/grid/0737:\n\ntests/test_dir/grid/0738:\n\ntests/test_dir/grid/0739:\n\ntests/test_dir/grid/0740:\n\ntests/test_dir/grid/0741:\n\ntests/test_dir/grid/0742:\n\ntests/test_dir/grid/0743:\n\ntests/test_dir/grid/0744:\n\ntests/test_dir/grid/0745:\n\ntests/test_dir/grid/0746:\n\ntests/test_dir/grid/0747:\n\ntests/test_dir/grid/0748:\n\ntests/test_dir/grid/0749:\n\ntests/test_dir/grid/0750:\n\ntests/test_dir/grid/0751:\n\ntests/test_dir/grid/0752:\n\ntests/test_dir/grid/0753:\n\ntests/test_dir/grid/0754:\n\ntests/test_dir/grid/0755:\n\ntests/test_dir/grid/0756:\n\ntests/test_dir/grid/0757:\n\ntests/test_dir/grid/0758:\n\ntests/test_dir/grid/0759:\n\ntests/test_dir/grid/0760:\n\ntests/test_dir/grid/0761:\n\ntests/test_dir/grid/0762:\n\ntests/test_dir/grid/0763:\n\ntests/test_dir/grid/0764:\n\ntests/test_dir/grid/0765:\n\ntests/test_dir/grid/0766:\n\ntests/test_dir/grid/0767:\n\ntests/test_dir/grid/0768:\n\ntests/test_dir/grid/0769:\n\ntests/test_dir/grid/0770:\n\ntests/test_dir/grid/0771:\n\ntests/test_dir/grid/0772:\n\ntests/test_dir/grid/0773:\n\ntests/test_dir/grid/0774:\n\ntests/test_dir/grid/0775:\n\ntests/test_dir/grid/0776:\n\ntests/test_dir/grid/0777:\n\ntests/test_dir/grid/0778:\n\ntests/test_dir/grid/0779:\n\ntests/test_dir/grid/0780:\n\ntests/test_dir/grid/0781:\n\ntests/test_dir/grid/0782:\n\ntests/test_dir/grid/0783:\n\ntests/test_dir/grid/0784:\n\ntests/test_dir/grid/0785:\n\ntests/test_dir/grid/0786:\n\ntests/test_dir/grid/0787:\n\ntests/test_dir/grid/0788:\n\ntests/test_dir/grid/0789:\n\ntests/test_dir/grid/0790:\n\ntests/test_dir/grid/0791:\n\ntests/test_dir/grid/0792:\n\ntests/test_dir/grid/0793:\n\ntests/test_dir/grid/0794:\n\ntests/test_dir/grid/0795:\n\ntests/test_dir/grid/0796:\n\ntests/test_dir/grid/0797:\n\ntests/test_dir/grid/0798:\n\ntests/test_dir/grid/0799:\n\ntests/test_dir/grid/0800:\n\ntests/test_dir/grid/0801:\n\ntests/test_dir/grid/0802:\n\ntests/test_dir/grid/0803:\n\ntests/test_dir/grid/0804:\n\ntests/test_dir/grid/0805:\n\ntests/test_dir/grid/0806:\n\ntests/test_dir/grid/0807:\n\ntests/test_dir/grid/0808:\n\ntests/test_dir/grid/0809:\n\ntests/test_dir/grid/0810:\n\ntests/test_dir/grid/0811:\n\ntests/test_dir/grid/0812:\n\ntests/test_dir/grid/0813:\n\ntests/test_dir/grid/0814:\n\ntests/test_dir/grid/0815:\n\ntests/test_dir/grid/0816:\n\ntests/test_dir/grid/0817:\n\ntests/test_dir/grid/0818:\n\ntests/test_dir/grid/0819:\n\ntests/test_dir/grid/0820:\n\ntests/test_dir/grid/0821:\n\ntests/test_dir/grid/0822:\n\ntests/test_dir/grid/0823:\n\ntests/test_dir/grid/0824:\n\ntests/test_dir/grid/0825:\n\ntests/test_dir/grid/0826:\n\ntests/test_dir/grid/0827:\n\ntests/test_dir/grid/0828:\n\ntests/test_dir/grid/0829:\n\ntests/test_dir/grid/0830:\n\ntests/test_dir/grid/0831:\n\ntests/test_dir/grid/0832:\n\ntests/test_dir/grid/0833:\n\ntests/test_dir/grid/0834:\n\ntests/test_dir/grid/0835:\n\ntests/test_dir/grid/0836:\n\ntests/test_dir/grid/0837:\n\ntests/test_dir/grid/0838:\n\ntests/test_dir/grid/0839:\n\ntests/test_dir/grid/0840:\n\ntests/test_dir/grid/0841:\n\ntests/test_dir/grid/0842:\n\ntests/test_dir/grid/0843:\n\ntests/test_dir/grid/0844:\n\ntests/test_dir/grid/0845:\n\ntests/test_dir/grid/0846:\n\ntests/test_dir/grid/0847:\n\ntests/test_dir/grid/0848:\n\ntests/test_dir/grid/0849:\n\ntests/test_dir/grid/0850:\n\ntests/test_dir/grid/0851:\n\ntests/test_dir/grid/0852:\n\ntests/test_dir/grid/0853:\n\ntests/test_dir/grid/0854:\n\ntests/test_dir/grid/0855:\n\ntests/test_dir/grid/0856:\n\ntests/test_dir/grid/0857:\n\ntests/test_dir/grid/0858:\n\ntests/test_dir/grid/0859:\n\ntests/test_dir/grid/0860:\n\ntests/test_dir/grid/0861:\n\ntests/test_dir/grid/0862:\n\ntests/test_dir/grid/0863:\n\ntests/test_dir/grid/0864:\n\ntests/test_dir/grid/0865:\n\ntests/test_dir/grid/0866:\n\ntests/test_dir/grid/0867:\n\ntests/test_dir/grid/0868:\n\ntests/test_dir/grid/0869:\n\ntests/test_dir/grid/0870:\n\ntests/test_dir/grid/0871:\n\ntests/test_dir/grid/0872:\n\ntests/test_dir/grid/0873:\n\ntests/test_dir/grid/0874:\n\ntests/test_dir/grid/0875:\n\ntests/test_dir/grid/0876:\n\ntests/test_dir/grid/0877:\n\ntests/test_dir/grid/0878:\n\ntests/test_dir/grid/0879:\n\ntests/test_dir/grid/0880:\n\ntests/test_dir/grid/0881:\n\ntests/test_dir/grid/0882:\n\ntests/test_dir/grid/0883:\n\ntests/test_dir/grid/0884:\n\ntests/test_dir/grid/0885:\n\ntests/test_dir/grid/0886:\n\ntests/test_dir/grid/0887:\n\ntests/test_dir/grid/0888:\n\ntests/test_dir/grid/0889:\n\ntests/test_dir/grid/0890:\n\ntests/test_dir/grid/0891:\n\ntests/test_dir/grid/0892:\n\ntests/test_dir/grid/0893:\n\ntests/test_dir/grid/0894:\n\ntests/test_dir/grid/0895:\n\ntests/test_dir/grid/0896:\n\ntests/test_dir/grid/0897:\n\ntests/test_dir/grid/0898:\n\ntests/test_dir/grid/0899:\n\ntests/test_dir/grid/0900:\n\ntests/test_dir/grid/0901:\n\ntests/test_dir/grid/0902:\n\ntests/test_dir/grid/0903:\n\ntests/test_dir/grid/0904:\n\ntests/test_dir/grid/0905:\n\ntests/test_dir/grid/0906:\n\ntests/test_dir/grid/0907:\n\ntests/test_dir/grid/0908:\n\ntests/test_dir/grid/0909:\n\ntests/test_dir/grid/0910:\n\ntests/test_dir/grid/0911:\n\ntests/test_dir/grid/0912:\n\ntests/test_dir/grid/0913:\n\ntests/test_dir/grid/0914:\n\ntests/test_dir/grid/0915:\n\ntests/test_dir/grid/0916:\n\ntests/test_dir/grid/0917:\n\ntests/test_dir/grid/0918:\n\ntests/test_dir/grid/0919:\n\ntests/test_dir/grid/0920:\n\ntests/test_dir/grid/0921:\n\ntests/test_dir/grid/0922:\n\ntests/test_dir/grid/0923:\n\ntests/test_dir/grid/0924:\n\ntests/test_dir/grid/0925:\n\ntests/test_dir/grid/0926:\n\ntests/test_dir/grid/0927:\n\ntests/test_dir/grid/0928:\n\ntests/test_dir/grid/0929:\n\ntests/test_dir/grid/0930:\n\ntests/test_dir/grid/0931:\n\ntests/test_dir/grid/0932:\n\ntests/test_dir/grid/0933:\n\ntests/test_dir/grid/0934:\n\ntests/test_dir/grid/0935:\n\ntests/test_dir/grid/0936:\n\ntests/test_dir/grid/0937:\n\ntests/test_dir/grid/0938:\n\ntests/test_dir/grid/0939:\n\ntests/test_dir/grid/0940:\n\ntests/test_dir/grid/0941:\n\ntests/test_dir/grid/0942:\n\ntests/test_dir/grid/0943:\n\ntests/test_dir/grid/0944:\n\ntests/test_dir/grid/0945:\n\ntests/test_dir/grid/0946:\n\ntests/test_dir/grid/0947:\n\ntests/test_dir/grid/0948:\n\ntests/test_dir/grid/0949:\n\ntests/test_dir/grid/0950:\n\ntests/test_dir/grid/0951:\n\ntests/test_dir/grid/0952:\n\ntests/test_dir/grid/0953:\n\ntests/test_dir/grid/0954:\n\ntests/test_dir/grid/0955:\n\ntests/test_dir/grid/0956:\n\ntests/test_dir/grid/0957:\n\ntests/test_dir/grid/0958:\n\ntests/test_dir/grid/0959:\n\ntests/test_dir/grid/0960:\n\ntests/test_dir/grid/0961:\n\ntests/test_dir/grid/0962:\n\ntests/test_dir/grid/0963:\n\ntests/test_dir/grid/0964:\n\ntests/test_dir/grid/0965:\n\ntests/test_dir/grid/0966:\n\ntests/test_dir/grid/0967:\n\ntests/test_dir/grid/0968:\n\ntests/test_dir/grid/0969:\n\ntests/test_dir/grid/0970:\n\ntests/test_dir/grid/0971:\n\ntests/test_dir/grid/0972:\n\ntests/test_dir/grid/0973:\n\ntests/test_dir/grid/0974:\n\ntests/test_dir/grid/0975:\n\ntests/test_dir/grid/0976:\n\ntests/test_dir/grid/0977:\n\ntests/test_dir/grid/0978:\n\ntests/test_dir/grid/0979:\n\ntests/test_dir/grid/0980:\n\ntests/test_dir/grid/0981:\n\ntests/test_dir/grid/0982:\n\ntests/test_dir/grid/0983:\n\ntests/test_dir/grid/0984:\n\ntests/test_dir/grid/0985:\n\ntests/test_dir/grid/0986:\n\ntests/test_dir/grid/0987:\n\ntests/test_dir/grid/0988:\n\ntests/test_dir/grid/0989:\n\ntests/test_dir/grid/0990:\n\ntests/test_dir/grid/0991:\n\ntests/test_dir/grid/0992:\n\ntests/test_dir/grid/0993:\n\ntests/test_dir/grid/0994:\n\ntests/test_dir/grid/0995:\n\ntests/test_dir/grid/0996:\n\ntests/test_dir/grid/0997:\n\ntests/test_dir/grid/0998:\n\ntests/test_dir/grid/0999:\n\ntests/test_dir/grid/1000:\n\ntests/test_dir/group:\n\ntests/test_dir/icons:\n\ntests/test_dir/perms:\n\ntests/test_dir/size:\n\ntests/test_dir/specials:\n\ntests/test_dir/symlinks:\ndir\n\ntests/test_dir/symlinks/dir:\n\ntests/test_dir/time:\n"
  },
  {
    "path": "tests/gen/only_dir_recursive_long_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --recurse --long --no-user --no-time --no-filesize --no-permissions --only-dirs\"\n"
  },
  {
    "path": "tests/gen/only_dir_recursive_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/only_dir_recursive_unix.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n\ntests/test_dir/git:\n001\n002\n003\n004\n005\n006\n007\n008\n009\n010\n\ntests/test_dir/git/001:\n\ntests/test_dir/git/002:\n\ntests/test_dir/git/003:\n\ntests/test_dir/git/004:\n\ntests/test_dir/git/005:\n\ntests/test_dir/git/006:\n\ntests/test_dir/git/007:\n\ntests/test_dir/git/008:\n\ntests/test_dir/git/009:\n\ntests/test_dir/git/010:\n\ntests/test_dir/grid:\n0001\n0002\n0003\n0004\n0005\n0006\n0007\n0008\n0009\n0010\n0011\n0012\n0013\n0014\n0015\n0016\n0017\n0018\n0019\n0020\n0021\n0022\n0023\n0024\n0025\n0026\n0027\n0028\n0029\n0030\n0031\n0032\n0033\n0034\n0035\n0036\n0037\n0038\n0039\n0040\n0041\n0042\n0043\n0044\n0045\n0046\n0047\n0048\n0049\n0050\n0051\n0052\n0053\n0054\n0055\n0056\n0057\n0058\n0059\n0060\n0061\n0062\n0063\n0064\n0065\n0066\n0067\n0068\n0069\n0070\n0071\n0072\n0073\n0074\n0075\n0076\n0077\n0078\n0079\n0080\n0081\n0082\n0083\n0084\n0085\n0086\n0087\n0088\n0089\n0090\n0091\n0092\n0093\n0094\n0095\n0096\n0097\n0098\n0099\n0100\n0101\n0102\n0103\n0104\n0105\n0106\n0107\n0108\n0109\n0110\n0111\n0112\n0113\n0114\n0115\n0116\n0117\n0118\n0119\n0120\n0121\n0122\n0123\n0124\n0125\n0126\n0127\n0128\n0129\n0130\n0131\n0132\n0133\n0134\n0135\n0136\n0137\n0138\n0139\n0140\n0141\n0142\n0143\n0144\n0145\n0146\n0147\n0148\n0149\n0150\n0151\n0152\n0153\n0154\n0155\n0156\n0157\n0158\n0159\n0160\n0161\n0162\n0163\n0164\n0165\n0166\n0167\n0168\n0169\n0170\n0171\n0172\n0173\n0174\n0175\n0176\n0177\n0178\n0179\n0180\n0181\n0182\n0183\n0184\n0185\n0186\n0187\n0188\n0189\n0190\n0191\n0192\n0193\n0194\n0195\n0196\n0197\n0198\n0199\n0200\n0201\n0202\n0203\n0204\n0205\n0206\n0207\n0208\n0209\n0210\n0211\n0212\n0213\n0214\n0215\n0216\n0217\n0218\n0219\n0220\n0221\n0222\n0223\n0224\n0225\n0226\n0227\n0228\n0229\n0230\n0231\n0232\n0233\n0234\n0235\n0236\n0237\n0238\n0239\n0240\n0241\n0242\n0243\n0244\n0245\n0246\n0247\n0248\n0249\n0250\n0251\n0252\n0253\n0254\n0255\n0256\n0257\n0258\n0259\n0260\n0261\n0262\n0263\n0264\n0265\n0266\n0267\n0268\n0269\n0270\n0271\n0272\n0273\n0274\n0275\n0276\n0277\n0278\n0279\n0280\n0281\n0282\n0283\n0284\n0285\n0286\n0287\n0288\n0289\n0290\n0291\n0292\n0293\n0294\n0295\n0296\n0297\n0298\n0299\n0300\n0301\n0302\n0303\n0304\n0305\n0306\n0307\n0308\n0309\n0310\n0311\n0312\n0313\n0314\n0315\n0316\n0317\n0318\n0319\n0320\n0321\n0322\n0323\n0324\n0325\n0326\n0327\n0328\n0329\n0330\n0331\n0332\n0333\n0334\n0335\n0336\n0337\n0338\n0339\n0340\n0341\n0342\n0343\n0344\n0345\n0346\n0347\n0348\n0349\n0350\n0351\n0352\n0353\n0354\n0355\n0356\n0357\n0358\n0359\n0360\n0361\n0362\n0363\n0364\n0365\n0366\n0367\n0368\n0369\n0370\n0371\n0372\n0373\n0374\n0375\n0376\n0377\n0378\n0379\n0380\n0381\n0382\n0383\n0384\n0385\n0386\n0387\n0388\n0389\n0390\n0391\n0392\n0393\n0394\n0395\n0396\n0397\n0398\n0399\n0400\n0401\n0402\n0403\n0404\n0405\n0406\n0407\n0408\n0409\n0410\n0411\n0412\n0413\n0414\n0415\n0416\n0417\n0418\n0419\n0420\n0421\n0422\n0423\n0424\n0425\n0426\n0427\n0428\n0429\n0430\n0431\n0432\n0433\n0434\n0435\n0436\n0437\n0438\n0439\n0440\n0441\n0442\n0443\n0444\n0445\n0446\n0447\n0448\n0449\n0450\n0451\n0452\n0453\n0454\n0455\n0456\n0457\n0458\n0459\n0460\n0461\n0462\n0463\n0464\n0465\n0466\n0467\n0468\n0469\n0470\n0471\n0472\n0473\n0474\n0475\n0476\n0477\n0478\n0479\n0480\n0481\n0482\n0483\n0484\n0485\n0486\n0487\n0488\n0489\n0490\n0491\n0492\n0493\n0494\n0495\n0496\n0497\n0498\n0499\n0500\n0501\n0502\n0503\n0504\n0505\n0506\n0507\n0508\n0509\n0510\n0511\n0512\n0513\n0514\n0515\n0516\n0517\n0518\n0519\n0520\n0521\n0522\n0523\n0524\n0525\n0526\n0527\n0528\n0529\n0530\n0531\n0532\n0533\n0534\n0535\n0536\n0537\n0538\n0539\n0540\n0541\n0542\n0543\n0544\n0545\n0546\n0547\n0548\n0549\n0550\n0551\n0552\n0553\n0554\n0555\n0556\n0557\n0558\n0559\n0560\n0561\n0562\n0563\n0564\n0565\n0566\n0567\n0568\n0569\n0570\n0571\n0572\n0573\n0574\n0575\n0576\n0577\n0578\n0579\n0580\n0581\n0582\n0583\n0584\n0585\n0586\n0587\n0588\n0589\n0590\n0591\n0592\n0593\n0594\n0595\n0596\n0597\n0598\n0599\n0600\n0601\n0602\n0603\n0604\n0605\n0606\n0607\n0608\n0609\n0610\n0611\n0612\n0613\n0614\n0615\n0616\n0617\n0618\n0619\n0620\n0621\n0622\n0623\n0624\n0625\n0626\n0627\n0628\n0629\n0630\n0631\n0632\n0633\n0634\n0635\n0636\n0637\n0638\n0639\n0640\n0641\n0642\n0643\n0644\n0645\n0646\n0647\n0648\n0649\n0650\n0651\n0652\n0653\n0654\n0655\n0656\n0657\n0658\n0659\n0660\n0661\n0662\n0663\n0664\n0665\n0666\n0667\n0668\n0669\n0670\n0671\n0672\n0673\n0674\n0675\n0676\n0677\n0678\n0679\n0680\n0681\n0682\n0683\n0684\n0685\n0686\n0687\n0688\n0689\n0690\n0691\n0692\n0693\n0694\n0695\n0696\n0697\n0698\n0699\n0700\n0701\n0702\n0703\n0704\n0705\n0706\n0707\n0708\n0709\n0710\n0711\n0712\n0713\n0714\n0715\n0716\n0717\n0718\n0719\n0720\n0721\n0722\n0723\n0724\n0725\n0726\n0727\n0728\n0729\n0730\n0731\n0732\n0733\n0734\n0735\n0736\n0737\n0738\n0739\n0740\n0741\n0742\n0743\n0744\n0745\n0746\n0747\n0748\n0749\n0750\n0751\n0752\n0753\n0754\n0755\n0756\n0757\n0758\n0759\n0760\n0761\n0762\n0763\n0764\n0765\n0766\n0767\n0768\n0769\n0770\n0771\n0772\n0773\n0774\n0775\n0776\n0777\n0778\n0779\n0780\n0781\n0782\n0783\n0784\n0785\n0786\n0787\n0788\n0789\n0790\n0791\n0792\n0793\n0794\n0795\n0796\n0797\n0798\n0799\n0800\n0801\n0802\n0803\n0804\n0805\n0806\n0807\n0808\n0809\n0810\n0811\n0812\n0813\n0814\n0815\n0816\n0817\n0818\n0819\n0820\n0821\n0822\n0823\n0824\n0825\n0826\n0827\n0828\n0829\n0830\n0831\n0832\n0833\n0834\n0835\n0836\n0837\n0838\n0839\n0840\n0841\n0842\n0843\n0844\n0845\n0846\n0847\n0848\n0849\n0850\n0851\n0852\n0853\n0854\n0855\n0856\n0857\n0858\n0859\n0860\n0861\n0862\n0863\n0864\n0865\n0866\n0867\n0868\n0869\n0870\n0871\n0872\n0873\n0874\n0875\n0876\n0877\n0878\n0879\n0880\n0881\n0882\n0883\n0884\n0885\n0886\n0887\n0888\n0889\n0890\n0891\n0892\n0893\n0894\n0895\n0896\n0897\n0898\n0899\n0900\n0901\n0902\n0903\n0904\n0905\n0906\n0907\n0908\n0909\n0910\n0911\n0912\n0913\n0914\n0915\n0916\n0917\n0918\n0919\n0920\n0921\n0922\n0923\n0924\n0925\n0926\n0927\n0928\n0929\n0930\n0931\n0932\n0933\n0934\n0935\n0936\n0937\n0938\n0939\n0940\n0941\n0942\n0943\n0944\n0945\n0946\n0947\n0948\n0949\n0950\n0951\n0952\n0953\n0954\n0955\n0956\n0957\n0958\n0959\n0960\n0961\n0962\n0963\n0964\n0965\n0966\n0967\n0968\n0969\n0970\n0971\n0972\n0973\n0974\n0975\n0976\n0977\n0978\n0979\n0980\n0981\n0982\n0983\n0984\n0985\n0986\n0987\n0988\n0989\n0990\n0991\n0992\n0993\n0994\n0995\n0996\n0997\n0998\n0999\n1000\n\ntests/test_dir/grid/0001:\n\ntests/test_dir/grid/0002:\n\ntests/test_dir/grid/0003:\n\ntests/test_dir/grid/0004:\n\ntests/test_dir/grid/0005:\n\ntests/test_dir/grid/0006:\n\ntests/test_dir/grid/0007:\n\ntests/test_dir/grid/0008:\n\ntests/test_dir/grid/0009:\n\ntests/test_dir/grid/0010:\n\ntests/test_dir/grid/0011:\n\ntests/test_dir/grid/0012:\n\ntests/test_dir/grid/0013:\n\ntests/test_dir/grid/0014:\n\ntests/test_dir/grid/0015:\n\ntests/test_dir/grid/0016:\n\ntests/test_dir/grid/0017:\n\ntests/test_dir/grid/0018:\n\ntests/test_dir/grid/0019:\n\ntests/test_dir/grid/0020:\n\ntests/test_dir/grid/0021:\n\ntests/test_dir/grid/0022:\n\ntests/test_dir/grid/0023:\n\ntests/test_dir/grid/0024:\n\ntests/test_dir/grid/0025:\n\ntests/test_dir/grid/0026:\n\ntests/test_dir/grid/0027:\n\ntests/test_dir/grid/0028:\n\ntests/test_dir/grid/0029:\n\ntests/test_dir/grid/0030:\n\ntests/test_dir/grid/0031:\n\ntests/test_dir/grid/0032:\n\ntests/test_dir/grid/0033:\n\ntests/test_dir/grid/0034:\n\ntests/test_dir/grid/0035:\n\ntests/test_dir/grid/0036:\n\ntests/test_dir/grid/0037:\n\ntests/test_dir/grid/0038:\n\ntests/test_dir/grid/0039:\n\ntests/test_dir/grid/0040:\n\ntests/test_dir/grid/0041:\n\ntests/test_dir/grid/0042:\n\ntests/test_dir/grid/0043:\n\ntests/test_dir/grid/0044:\n\ntests/test_dir/grid/0045:\n\ntests/test_dir/grid/0046:\n\ntests/test_dir/grid/0047:\n\ntests/test_dir/grid/0048:\n\ntests/test_dir/grid/0049:\n\ntests/test_dir/grid/0050:\n\ntests/test_dir/grid/0051:\n\ntests/test_dir/grid/0052:\n\ntests/test_dir/grid/0053:\n\ntests/test_dir/grid/0054:\n\ntests/test_dir/grid/0055:\n\ntests/test_dir/grid/0056:\n\ntests/test_dir/grid/0057:\n\ntests/test_dir/grid/0058:\n\ntests/test_dir/grid/0059:\n\ntests/test_dir/grid/0060:\n\ntests/test_dir/grid/0061:\n\ntests/test_dir/grid/0062:\n\ntests/test_dir/grid/0063:\n\ntests/test_dir/grid/0064:\n\ntests/test_dir/grid/0065:\n\ntests/test_dir/grid/0066:\n\ntests/test_dir/grid/0067:\n\ntests/test_dir/grid/0068:\n\ntests/test_dir/grid/0069:\n\ntests/test_dir/grid/0070:\n\ntests/test_dir/grid/0071:\n\ntests/test_dir/grid/0072:\n\ntests/test_dir/grid/0073:\n\ntests/test_dir/grid/0074:\n\ntests/test_dir/grid/0075:\n\ntests/test_dir/grid/0076:\n\ntests/test_dir/grid/0077:\n\ntests/test_dir/grid/0078:\n\ntests/test_dir/grid/0079:\n\ntests/test_dir/grid/0080:\n\ntests/test_dir/grid/0081:\n\ntests/test_dir/grid/0082:\n\ntests/test_dir/grid/0083:\n\ntests/test_dir/grid/0084:\n\ntests/test_dir/grid/0085:\n\ntests/test_dir/grid/0086:\n\ntests/test_dir/grid/0087:\n\ntests/test_dir/grid/0088:\n\ntests/test_dir/grid/0089:\n\ntests/test_dir/grid/0090:\n\ntests/test_dir/grid/0091:\n\ntests/test_dir/grid/0092:\n\ntests/test_dir/grid/0093:\n\ntests/test_dir/grid/0094:\n\ntests/test_dir/grid/0095:\n\ntests/test_dir/grid/0096:\n\ntests/test_dir/grid/0097:\n\ntests/test_dir/grid/0098:\n\ntests/test_dir/grid/0099:\n\ntests/test_dir/grid/0100:\n\ntests/test_dir/grid/0101:\n\ntests/test_dir/grid/0102:\n\ntests/test_dir/grid/0103:\n\ntests/test_dir/grid/0104:\n\ntests/test_dir/grid/0105:\n\ntests/test_dir/grid/0106:\n\ntests/test_dir/grid/0107:\n\ntests/test_dir/grid/0108:\n\ntests/test_dir/grid/0109:\n\ntests/test_dir/grid/0110:\n\ntests/test_dir/grid/0111:\n\ntests/test_dir/grid/0112:\n\ntests/test_dir/grid/0113:\n\ntests/test_dir/grid/0114:\n\ntests/test_dir/grid/0115:\n\ntests/test_dir/grid/0116:\n\ntests/test_dir/grid/0117:\n\ntests/test_dir/grid/0118:\n\ntests/test_dir/grid/0119:\n\ntests/test_dir/grid/0120:\n\ntests/test_dir/grid/0121:\n\ntests/test_dir/grid/0122:\n\ntests/test_dir/grid/0123:\n\ntests/test_dir/grid/0124:\n\ntests/test_dir/grid/0125:\n\ntests/test_dir/grid/0126:\n\ntests/test_dir/grid/0127:\n\ntests/test_dir/grid/0128:\n\ntests/test_dir/grid/0129:\n\ntests/test_dir/grid/0130:\n\ntests/test_dir/grid/0131:\n\ntests/test_dir/grid/0132:\n\ntests/test_dir/grid/0133:\n\ntests/test_dir/grid/0134:\n\ntests/test_dir/grid/0135:\n\ntests/test_dir/grid/0136:\n\ntests/test_dir/grid/0137:\n\ntests/test_dir/grid/0138:\n\ntests/test_dir/grid/0139:\n\ntests/test_dir/grid/0140:\n\ntests/test_dir/grid/0141:\n\ntests/test_dir/grid/0142:\n\ntests/test_dir/grid/0143:\n\ntests/test_dir/grid/0144:\n\ntests/test_dir/grid/0145:\n\ntests/test_dir/grid/0146:\n\ntests/test_dir/grid/0147:\n\ntests/test_dir/grid/0148:\n\ntests/test_dir/grid/0149:\n\ntests/test_dir/grid/0150:\n\ntests/test_dir/grid/0151:\n\ntests/test_dir/grid/0152:\n\ntests/test_dir/grid/0153:\n\ntests/test_dir/grid/0154:\n\ntests/test_dir/grid/0155:\n\ntests/test_dir/grid/0156:\n\ntests/test_dir/grid/0157:\n\ntests/test_dir/grid/0158:\n\ntests/test_dir/grid/0159:\n\ntests/test_dir/grid/0160:\n\ntests/test_dir/grid/0161:\n\ntests/test_dir/grid/0162:\n\ntests/test_dir/grid/0163:\n\ntests/test_dir/grid/0164:\n\ntests/test_dir/grid/0165:\n\ntests/test_dir/grid/0166:\n\ntests/test_dir/grid/0167:\n\ntests/test_dir/grid/0168:\n\ntests/test_dir/grid/0169:\n\ntests/test_dir/grid/0170:\n\ntests/test_dir/grid/0171:\n\ntests/test_dir/grid/0172:\n\ntests/test_dir/grid/0173:\n\ntests/test_dir/grid/0174:\n\ntests/test_dir/grid/0175:\n\ntests/test_dir/grid/0176:\n\ntests/test_dir/grid/0177:\n\ntests/test_dir/grid/0178:\n\ntests/test_dir/grid/0179:\n\ntests/test_dir/grid/0180:\n\ntests/test_dir/grid/0181:\n\ntests/test_dir/grid/0182:\n\ntests/test_dir/grid/0183:\n\ntests/test_dir/grid/0184:\n\ntests/test_dir/grid/0185:\n\ntests/test_dir/grid/0186:\n\ntests/test_dir/grid/0187:\n\ntests/test_dir/grid/0188:\n\ntests/test_dir/grid/0189:\n\ntests/test_dir/grid/0190:\n\ntests/test_dir/grid/0191:\n\ntests/test_dir/grid/0192:\n\ntests/test_dir/grid/0193:\n\ntests/test_dir/grid/0194:\n\ntests/test_dir/grid/0195:\n\ntests/test_dir/grid/0196:\n\ntests/test_dir/grid/0197:\n\ntests/test_dir/grid/0198:\n\ntests/test_dir/grid/0199:\n\ntests/test_dir/grid/0200:\n\ntests/test_dir/grid/0201:\n\ntests/test_dir/grid/0202:\n\ntests/test_dir/grid/0203:\n\ntests/test_dir/grid/0204:\n\ntests/test_dir/grid/0205:\n\ntests/test_dir/grid/0206:\n\ntests/test_dir/grid/0207:\n\ntests/test_dir/grid/0208:\n\ntests/test_dir/grid/0209:\n\ntests/test_dir/grid/0210:\n\ntests/test_dir/grid/0211:\n\ntests/test_dir/grid/0212:\n\ntests/test_dir/grid/0213:\n\ntests/test_dir/grid/0214:\n\ntests/test_dir/grid/0215:\n\ntests/test_dir/grid/0216:\n\ntests/test_dir/grid/0217:\n\ntests/test_dir/grid/0218:\n\ntests/test_dir/grid/0219:\n\ntests/test_dir/grid/0220:\n\ntests/test_dir/grid/0221:\n\ntests/test_dir/grid/0222:\n\ntests/test_dir/grid/0223:\n\ntests/test_dir/grid/0224:\n\ntests/test_dir/grid/0225:\n\ntests/test_dir/grid/0226:\n\ntests/test_dir/grid/0227:\n\ntests/test_dir/grid/0228:\n\ntests/test_dir/grid/0229:\n\ntests/test_dir/grid/0230:\n\ntests/test_dir/grid/0231:\n\ntests/test_dir/grid/0232:\n\ntests/test_dir/grid/0233:\n\ntests/test_dir/grid/0234:\n\ntests/test_dir/grid/0235:\n\ntests/test_dir/grid/0236:\n\ntests/test_dir/grid/0237:\n\ntests/test_dir/grid/0238:\n\ntests/test_dir/grid/0239:\n\ntests/test_dir/grid/0240:\n\ntests/test_dir/grid/0241:\n\ntests/test_dir/grid/0242:\n\ntests/test_dir/grid/0243:\n\ntests/test_dir/grid/0244:\n\ntests/test_dir/grid/0245:\n\ntests/test_dir/grid/0246:\n\ntests/test_dir/grid/0247:\n\ntests/test_dir/grid/0248:\n\ntests/test_dir/grid/0249:\n\ntests/test_dir/grid/0250:\n\ntests/test_dir/grid/0251:\n\ntests/test_dir/grid/0252:\n\ntests/test_dir/grid/0253:\n\ntests/test_dir/grid/0254:\n\ntests/test_dir/grid/0255:\n\ntests/test_dir/grid/0256:\n\ntests/test_dir/grid/0257:\n\ntests/test_dir/grid/0258:\n\ntests/test_dir/grid/0259:\n\ntests/test_dir/grid/0260:\n\ntests/test_dir/grid/0261:\n\ntests/test_dir/grid/0262:\n\ntests/test_dir/grid/0263:\n\ntests/test_dir/grid/0264:\n\ntests/test_dir/grid/0265:\n\ntests/test_dir/grid/0266:\n\ntests/test_dir/grid/0267:\n\ntests/test_dir/grid/0268:\n\ntests/test_dir/grid/0269:\n\ntests/test_dir/grid/0270:\n\ntests/test_dir/grid/0271:\n\ntests/test_dir/grid/0272:\n\ntests/test_dir/grid/0273:\n\ntests/test_dir/grid/0274:\n\ntests/test_dir/grid/0275:\n\ntests/test_dir/grid/0276:\n\ntests/test_dir/grid/0277:\n\ntests/test_dir/grid/0278:\n\ntests/test_dir/grid/0279:\n\ntests/test_dir/grid/0280:\n\ntests/test_dir/grid/0281:\n\ntests/test_dir/grid/0282:\n\ntests/test_dir/grid/0283:\n\ntests/test_dir/grid/0284:\n\ntests/test_dir/grid/0285:\n\ntests/test_dir/grid/0286:\n\ntests/test_dir/grid/0287:\n\ntests/test_dir/grid/0288:\n\ntests/test_dir/grid/0289:\n\ntests/test_dir/grid/0290:\n\ntests/test_dir/grid/0291:\n\ntests/test_dir/grid/0292:\n\ntests/test_dir/grid/0293:\n\ntests/test_dir/grid/0294:\n\ntests/test_dir/grid/0295:\n\ntests/test_dir/grid/0296:\n\ntests/test_dir/grid/0297:\n\ntests/test_dir/grid/0298:\n\ntests/test_dir/grid/0299:\n\ntests/test_dir/grid/0300:\n\ntests/test_dir/grid/0301:\n\ntests/test_dir/grid/0302:\n\ntests/test_dir/grid/0303:\n\ntests/test_dir/grid/0304:\n\ntests/test_dir/grid/0305:\n\ntests/test_dir/grid/0306:\n\ntests/test_dir/grid/0307:\n\ntests/test_dir/grid/0308:\n\ntests/test_dir/grid/0309:\n\ntests/test_dir/grid/0310:\n\ntests/test_dir/grid/0311:\n\ntests/test_dir/grid/0312:\n\ntests/test_dir/grid/0313:\n\ntests/test_dir/grid/0314:\n\ntests/test_dir/grid/0315:\n\ntests/test_dir/grid/0316:\n\ntests/test_dir/grid/0317:\n\ntests/test_dir/grid/0318:\n\ntests/test_dir/grid/0319:\n\ntests/test_dir/grid/0320:\n\ntests/test_dir/grid/0321:\n\ntests/test_dir/grid/0322:\n\ntests/test_dir/grid/0323:\n\ntests/test_dir/grid/0324:\n\ntests/test_dir/grid/0325:\n\ntests/test_dir/grid/0326:\n\ntests/test_dir/grid/0327:\n\ntests/test_dir/grid/0328:\n\ntests/test_dir/grid/0329:\n\ntests/test_dir/grid/0330:\n\ntests/test_dir/grid/0331:\n\ntests/test_dir/grid/0332:\n\ntests/test_dir/grid/0333:\n\ntests/test_dir/grid/0334:\n\ntests/test_dir/grid/0335:\n\ntests/test_dir/grid/0336:\n\ntests/test_dir/grid/0337:\n\ntests/test_dir/grid/0338:\n\ntests/test_dir/grid/0339:\n\ntests/test_dir/grid/0340:\n\ntests/test_dir/grid/0341:\n\ntests/test_dir/grid/0342:\n\ntests/test_dir/grid/0343:\n\ntests/test_dir/grid/0344:\n\ntests/test_dir/grid/0345:\n\ntests/test_dir/grid/0346:\n\ntests/test_dir/grid/0347:\n\ntests/test_dir/grid/0348:\n\ntests/test_dir/grid/0349:\n\ntests/test_dir/grid/0350:\n\ntests/test_dir/grid/0351:\n\ntests/test_dir/grid/0352:\n\ntests/test_dir/grid/0353:\n\ntests/test_dir/grid/0354:\n\ntests/test_dir/grid/0355:\n\ntests/test_dir/grid/0356:\n\ntests/test_dir/grid/0357:\n\ntests/test_dir/grid/0358:\n\ntests/test_dir/grid/0359:\n\ntests/test_dir/grid/0360:\n\ntests/test_dir/grid/0361:\n\ntests/test_dir/grid/0362:\n\ntests/test_dir/grid/0363:\n\ntests/test_dir/grid/0364:\n\ntests/test_dir/grid/0365:\n\ntests/test_dir/grid/0366:\n\ntests/test_dir/grid/0367:\n\ntests/test_dir/grid/0368:\n\ntests/test_dir/grid/0369:\n\ntests/test_dir/grid/0370:\n\ntests/test_dir/grid/0371:\n\ntests/test_dir/grid/0372:\n\ntests/test_dir/grid/0373:\n\ntests/test_dir/grid/0374:\n\ntests/test_dir/grid/0375:\n\ntests/test_dir/grid/0376:\n\ntests/test_dir/grid/0377:\n\ntests/test_dir/grid/0378:\n\ntests/test_dir/grid/0379:\n\ntests/test_dir/grid/0380:\n\ntests/test_dir/grid/0381:\n\ntests/test_dir/grid/0382:\n\ntests/test_dir/grid/0383:\n\ntests/test_dir/grid/0384:\n\ntests/test_dir/grid/0385:\n\ntests/test_dir/grid/0386:\n\ntests/test_dir/grid/0387:\n\ntests/test_dir/grid/0388:\n\ntests/test_dir/grid/0389:\n\ntests/test_dir/grid/0390:\n\ntests/test_dir/grid/0391:\n\ntests/test_dir/grid/0392:\n\ntests/test_dir/grid/0393:\n\ntests/test_dir/grid/0394:\n\ntests/test_dir/grid/0395:\n\ntests/test_dir/grid/0396:\n\ntests/test_dir/grid/0397:\n\ntests/test_dir/grid/0398:\n\ntests/test_dir/grid/0399:\n\ntests/test_dir/grid/0400:\n\ntests/test_dir/grid/0401:\n\ntests/test_dir/grid/0402:\n\ntests/test_dir/grid/0403:\n\ntests/test_dir/grid/0404:\n\ntests/test_dir/grid/0405:\n\ntests/test_dir/grid/0406:\n\ntests/test_dir/grid/0407:\n\ntests/test_dir/grid/0408:\n\ntests/test_dir/grid/0409:\n\ntests/test_dir/grid/0410:\n\ntests/test_dir/grid/0411:\n\ntests/test_dir/grid/0412:\n\ntests/test_dir/grid/0413:\n\ntests/test_dir/grid/0414:\n\ntests/test_dir/grid/0415:\n\ntests/test_dir/grid/0416:\n\ntests/test_dir/grid/0417:\n\ntests/test_dir/grid/0418:\n\ntests/test_dir/grid/0419:\n\ntests/test_dir/grid/0420:\n\ntests/test_dir/grid/0421:\n\ntests/test_dir/grid/0422:\n\ntests/test_dir/grid/0423:\n\ntests/test_dir/grid/0424:\n\ntests/test_dir/grid/0425:\n\ntests/test_dir/grid/0426:\n\ntests/test_dir/grid/0427:\n\ntests/test_dir/grid/0428:\n\ntests/test_dir/grid/0429:\n\ntests/test_dir/grid/0430:\n\ntests/test_dir/grid/0431:\n\ntests/test_dir/grid/0432:\n\ntests/test_dir/grid/0433:\n\ntests/test_dir/grid/0434:\n\ntests/test_dir/grid/0435:\n\ntests/test_dir/grid/0436:\n\ntests/test_dir/grid/0437:\n\ntests/test_dir/grid/0438:\n\ntests/test_dir/grid/0439:\n\ntests/test_dir/grid/0440:\n\ntests/test_dir/grid/0441:\n\ntests/test_dir/grid/0442:\n\ntests/test_dir/grid/0443:\n\ntests/test_dir/grid/0444:\n\ntests/test_dir/grid/0445:\n\ntests/test_dir/grid/0446:\n\ntests/test_dir/grid/0447:\n\ntests/test_dir/grid/0448:\n\ntests/test_dir/grid/0449:\n\ntests/test_dir/grid/0450:\n\ntests/test_dir/grid/0451:\n\ntests/test_dir/grid/0452:\n\ntests/test_dir/grid/0453:\n\ntests/test_dir/grid/0454:\n\ntests/test_dir/grid/0455:\n\ntests/test_dir/grid/0456:\n\ntests/test_dir/grid/0457:\n\ntests/test_dir/grid/0458:\n\ntests/test_dir/grid/0459:\n\ntests/test_dir/grid/0460:\n\ntests/test_dir/grid/0461:\n\ntests/test_dir/grid/0462:\n\ntests/test_dir/grid/0463:\n\ntests/test_dir/grid/0464:\n\ntests/test_dir/grid/0465:\n\ntests/test_dir/grid/0466:\n\ntests/test_dir/grid/0467:\n\ntests/test_dir/grid/0468:\n\ntests/test_dir/grid/0469:\n\ntests/test_dir/grid/0470:\n\ntests/test_dir/grid/0471:\n\ntests/test_dir/grid/0472:\n\ntests/test_dir/grid/0473:\n\ntests/test_dir/grid/0474:\n\ntests/test_dir/grid/0475:\n\ntests/test_dir/grid/0476:\n\ntests/test_dir/grid/0477:\n\ntests/test_dir/grid/0478:\n\ntests/test_dir/grid/0479:\n\ntests/test_dir/grid/0480:\n\ntests/test_dir/grid/0481:\n\ntests/test_dir/grid/0482:\n\ntests/test_dir/grid/0483:\n\ntests/test_dir/grid/0484:\n\ntests/test_dir/grid/0485:\n\ntests/test_dir/grid/0486:\n\ntests/test_dir/grid/0487:\n\ntests/test_dir/grid/0488:\n\ntests/test_dir/grid/0489:\n\ntests/test_dir/grid/0490:\n\ntests/test_dir/grid/0491:\n\ntests/test_dir/grid/0492:\n\ntests/test_dir/grid/0493:\n\ntests/test_dir/grid/0494:\n\ntests/test_dir/grid/0495:\n\ntests/test_dir/grid/0496:\n\ntests/test_dir/grid/0497:\n\ntests/test_dir/grid/0498:\n\ntests/test_dir/grid/0499:\n\ntests/test_dir/grid/0500:\n\ntests/test_dir/grid/0501:\n\ntests/test_dir/grid/0502:\n\ntests/test_dir/grid/0503:\n\ntests/test_dir/grid/0504:\n\ntests/test_dir/grid/0505:\n\ntests/test_dir/grid/0506:\n\ntests/test_dir/grid/0507:\n\ntests/test_dir/grid/0508:\n\ntests/test_dir/grid/0509:\n\ntests/test_dir/grid/0510:\n\ntests/test_dir/grid/0511:\n\ntests/test_dir/grid/0512:\n\ntests/test_dir/grid/0513:\n\ntests/test_dir/grid/0514:\n\ntests/test_dir/grid/0515:\n\ntests/test_dir/grid/0516:\n\ntests/test_dir/grid/0517:\n\ntests/test_dir/grid/0518:\n\ntests/test_dir/grid/0519:\n\ntests/test_dir/grid/0520:\n\ntests/test_dir/grid/0521:\n\ntests/test_dir/grid/0522:\n\ntests/test_dir/grid/0523:\n\ntests/test_dir/grid/0524:\n\ntests/test_dir/grid/0525:\n\ntests/test_dir/grid/0526:\n\ntests/test_dir/grid/0527:\n\ntests/test_dir/grid/0528:\n\ntests/test_dir/grid/0529:\n\ntests/test_dir/grid/0530:\n\ntests/test_dir/grid/0531:\n\ntests/test_dir/grid/0532:\n\ntests/test_dir/grid/0533:\n\ntests/test_dir/grid/0534:\n\ntests/test_dir/grid/0535:\n\ntests/test_dir/grid/0536:\n\ntests/test_dir/grid/0537:\n\ntests/test_dir/grid/0538:\n\ntests/test_dir/grid/0539:\n\ntests/test_dir/grid/0540:\n\ntests/test_dir/grid/0541:\n\ntests/test_dir/grid/0542:\n\ntests/test_dir/grid/0543:\n\ntests/test_dir/grid/0544:\n\ntests/test_dir/grid/0545:\n\ntests/test_dir/grid/0546:\n\ntests/test_dir/grid/0547:\n\ntests/test_dir/grid/0548:\n\ntests/test_dir/grid/0549:\n\ntests/test_dir/grid/0550:\n\ntests/test_dir/grid/0551:\n\ntests/test_dir/grid/0552:\n\ntests/test_dir/grid/0553:\n\ntests/test_dir/grid/0554:\n\ntests/test_dir/grid/0555:\n\ntests/test_dir/grid/0556:\n\ntests/test_dir/grid/0557:\n\ntests/test_dir/grid/0558:\n\ntests/test_dir/grid/0559:\n\ntests/test_dir/grid/0560:\n\ntests/test_dir/grid/0561:\n\ntests/test_dir/grid/0562:\n\ntests/test_dir/grid/0563:\n\ntests/test_dir/grid/0564:\n\ntests/test_dir/grid/0565:\n\ntests/test_dir/grid/0566:\n\ntests/test_dir/grid/0567:\n\ntests/test_dir/grid/0568:\n\ntests/test_dir/grid/0569:\n\ntests/test_dir/grid/0570:\n\ntests/test_dir/grid/0571:\n\ntests/test_dir/grid/0572:\n\ntests/test_dir/grid/0573:\n\ntests/test_dir/grid/0574:\n\ntests/test_dir/grid/0575:\n\ntests/test_dir/grid/0576:\n\ntests/test_dir/grid/0577:\n\ntests/test_dir/grid/0578:\n\ntests/test_dir/grid/0579:\n\ntests/test_dir/grid/0580:\n\ntests/test_dir/grid/0581:\n\ntests/test_dir/grid/0582:\n\ntests/test_dir/grid/0583:\n\ntests/test_dir/grid/0584:\n\ntests/test_dir/grid/0585:\n\ntests/test_dir/grid/0586:\n\ntests/test_dir/grid/0587:\n\ntests/test_dir/grid/0588:\n\ntests/test_dir/grid/0589:\n\ntests/test_dir/grid/0590:\n\ntests/test_dir/grid/0591:\n\ntests/test_dir/grid/0592:\n\ntests/test_dir/grid/0593:\n\ntests/test_dir/grid/0594:\n\ntests/test_dir/grid/0595:\n\ntests/test_dir/grid/0596:\n\ntests/test_dir/grid/0597:\n\ntests/test_dir/grid/0598:\n\ntests/test_dir/grid/0599:\n\ntests/test_dir/grid/0600:\n\ntests/test_dir/grid/0601:\n\ntests/test_dir/grid/0602:\n\ntests/test_dir/grid/0603:\n\ntests/test_dir/grid/0604:\n\ntests/test_dir/grid/0605:\n\ntests/test_dir/grid/0606:\n\ntests/test_dir/grid/0607:\n\ntests/test_dir/grid/0608:\n\ntests/test_dir/grid/0609:\n\ntests/test_dir/grid/0610:\n\ntests/test_dir/grid/0611:\n\ntests/test_dir/grid/0612:\n\ntests/test_dir/grid/0613:\n\ntests/test_dir/grid/0614:\n\ntests/test_dir/grid/0615:\n\ntests/test_dir/grid/0616:\n\ntests/test_dir/grid/0617:\n\ntests/test_dir/grid/0618:\n\ntests/test_dir/grid/0619:\n\ntests/test_dir/grid/0620:\n\ntests/test_dir/grid/0621:\n\ntests/test_dir/grid/0622:\n\ntests/test_dir/grid/0623:\n\ntests/test_dir/grid/0624:\n\ntests/test_dir/grid/0625:\n\ntests/test_dir/grid/0626:\n\ntests/test_dir/grid/0627:\n\ntests/test_dir/grid/0628:\n\ntests/test_dir/grid/0629:\n\ntests/test_dir/grid/0630:\n\ntests/test_dir/grid/0631:\n\ntests/test_dir/grid/0632:\n\ntests/test_dir/grid/0633:\n\ntests/test_dir/grid/0634:\n\ntests/test_dir/grid/0635:\n\ntests/test_dir/grid/0636:\n\ntests/test_dir/grid/0637:\n\ntests/test_dir/grid/0638:\n\ntests/test_dir/grid/0639:\n\ntests/test_dir/grid/0640:\n\ntests/test_dir/grid/0641:\n\ntests/test_dir/grid/0642:\n\ntests/test_dir/grid/0643:\n\ntests/test_dir/grid/0644:\n\ntests/test_dir/grid/0645:\n\ntests/test_dir/grid/0646:\n\ntests/test_dir/grid/0647:\n\ntests/test_dir/grid/0648:\n\ntests/test_dir/grid/0649:\n\ntests/test_dir/grid/0650:\n\ntests/test_dir/grid/0651:\n\ntests/test_dir/grid/0652:\n\ntests/test_dir/grid/0653:\n\ntests/test_dir/grid/0654:\n\ntests/test_dir/grid/0655:\n\ntests/test_dir/grid/0656:\n\ntests/test_dir/grid/0657:\n\ntests/test_dir/grid/0658:\n\ntests/test_dir/grid/0659:\n\ntests/test_dir/grid/0660:\n\ntests/test_dir/grid/0661:\n\ntests/test_dir/grid/0662:\n\ntests/test_dir/grid/0663:\n\ntests/test_dir/grid/0664:\n\ntests/test_dir/grid/0665:\n\ntests/test_dir/grid/0666:\n\ntests/test_dir/grid/0667:\n\ntests/test_dir/grid/0668:\n\ntests/test_dir/grid/0669:\n\ntests/test_dir/grid/0670:\n\ntests/test_dir/grid/0671:\n\ntests/test_dir/grid/0672:\n\ntests/test_dir/grid/0673:\n\ntests/test_dir/grid/0674:\n\ntests/test_dir/grid/0675:\n\ntests/test_dir/grid/0676:\n\ntests/test_dir/grid/0677:\n\ntests/test_dir/grid/0678:\n\ntests/test_dir/grid/0679:\n\ntests/test_dir/grid/0680:\n\ntests/test_dir/grid/0681:\n\ntests/test_dir/grid/0682:\n\ntests/test_dir/grid/0683:\n\ntests/test_dir/grid/0684:\n\ntests/test_dir/grid/0685:\n\ntests/test_dir/grid/0686:\n\ntests/test_dir/grid/0687:\n\ntests/test_dir/grid/0688:\n\ntests/test_dir/grid/0689:\n\ntests/test_dir/grid/0690:\n\ntests/test_dir/grid/0691:\n\ntests/test_dir/grid/0692:\n\ntests/test_dir/grid/0693:\n\ntests/test_dir/grid/0694:\n\ntests/test_dir/grid/0695:\n\ntests/test_dir/grid/0696:\n\ntests/test_dir/grid/0697:\n\ntests/test_dir/grid/0698:\n\ntests/test_dir/grid/0699:\n\ntests/test_dir/grid/0700:\n\ntests/test_dir/grid/0701:\n\ntests/test_dir/grid/0702:\n\ntests/test_dir/grid/0703:\n\ntests/test_dir/grid/0704:\n\ntests/test_dir/grid/0705:\n\ntests/test_dir/grid/0706:\n\ntests/test_dir/grid/0707:\n\ntests/test_dir/grid/0708:\n\ntests/test_dir/grid/0709:\n\ntests/test_dir/grid/0710:\n\ntests/test_dir/grid/0711:\n\ntests/test_dir/grid/0712:\n\ntests/test_dir/grid/0713:\n\ntests/test_dir/grid/0714:\n\ntests/test_dir/grid/0715:\n\ntests/test_dir/grid/0716:\n\ntests/test_dir/grid/0717:\n\ntests/test_dir/grid/0718:\n\ntests/test_dir/grid/0719:\n\ntests/test_dir/grid/0720:\n\ntests/test_dir/grid/0721:\n\ntests/test_dir/grid/0722:\n\ntests/test_dir/grid/0723:\n\ntests/test_dir/grid/0724:\n\ntests/test_dir/grid/0725:\n\ntests/test_dir/grid/0726:\n\ntests/test_dir/grid/0727:\n\ntests/test_dir/grid/0728:\n\ntests/test_dir/grid/0729:\n\ntests/test_dir/grid/0730:\n\ntests/test_dir/grid/0731:\n\ntests/test_dir/grid/0732:\n\ntests/test_dir/grid/0733:\n\ntests/test_dir/grid/0734:\n\ntests/test_dir/grid/0735:\n\ntests/test_dir/grid/0736:\n\ntests/test_dir/grid/0737:\n\ntests/test_dir/grid/0738:\n\ntests/test_dir/grid/0739:\n\ntests/test_dir/grid/0740:\n\ntests/test_dir/grid/0741:\n\ntests/test_dir/grid/0742:\n\ntests/test_dir/grid/0743:\n\ntests/test_dir/grid/0744:\n\ntests/test_dir/grid/0745:\n\ntests/test_dir/grid/0746:\n\ntests/test_dir/grid/0747:\n\ntests/test_dir/grid/0748:\n\ntests/test_dir/grid/0749:\n\ntests/test_dir/grid/0750:\n\ntests/test_dir/grid/0751:\n\ntests/test_dir/grid/0752:\n\ntests/test_dir/grid/0753:\n\ntests/test_dir/grid/0754:\n\ntests/test_dir/grid/0755:\n\ntests/test_dir/grid/0756:\n\ntests/test_dir/grid/0757:\n\ntests/test_dir/grid/0758:\n\ntests/test_dir/grid/0759:\n\ntests/test_dir/grid/0760:\n\ntests/test_dir/grid/0761:\n\ntests/test_dir/grid/0762:\n\ntests/test_dir/grid/0763:\n\ntests/test_dir/grid/0764:\n\ntests/test_dir/grid/0765:\n\ntests/test_dir/grid/0766:\n\ntests/test_dir/grid/0767:\n\ntests/test_dir/grid/0768:\n\ntests/test_dir/grid/0769:\n\ntests/test_dir/grid/0770:\n\ntests/test_dir/grid/0771:\n\ntests/test_dir/grid/0772:\n\ntests/test_dir/grid/0773:\n\ntests/test_dir/grid/0774:\n\ntests/test_dir/grid/0775:\n\ntests/test_dir/grid/0776:\n\ntests/test_dir/grid/0777:\n\ntests/test_dir/grid/0778:\n\ntests/test_dir/grid/0779:\n\ntests/test_dir/grid/0780:\n\ntests/test_dir/grid/0781:\n\ntests/test_dir/grid/0782:\n\ntests/test_dir/grid/0783:\n\ntests/test_dir/grid/0784:\n\ntests/test_dir/grid/0785:\n\ntests/test_dir/grid/0786:\n\ntests/test_dir/grid/0787:\n\ntests/test_dir/grid/0788:\n\ntests/test_dir/grid/0789:\n\ntests/test_dir/grid/0790:\n\ntests/test_dir/grid/0791:\n\ntests/test_dir/grid/0792:\n\ntests/test_dir/grid/0793:\n\ntests/test_dir/grid/0794:\n\ntests/test_dir/grid/0795:\n\ntests/test_dir/grid/0796:\n\ntests/test_dir/grid/0797:\n\ntests/test_dir/grid/0798:\n\ntests/test_dir/grid/0799:\n\ntests/test_dir/grid/0800:\n\ntests/test_dir/grid/0801:\n\ntests/test_dir/grid/0802:\n\ntests/test_dir/grid/0803:\n\ntests/test_dir/grid/0804:\n\ntests/test_dir/grid/0805:\n\ntests/test_dir/grid/0806:\n\ntests/test_dir/grid/0807:\n\ntests/test_dir/grid/0808:\n\ntests/test_dir/grid/0809:\n\ntests/test_dir/grid/0810:\n\ntests/test_dir/grid/0811:\n\ntests/test_dir/grid/0812:\n\ntests/test_dir/grid/0813:\n\ntests/test_dir/grid/0814:\n\ntests/test_dir/grid/0815:\n\ntests/test_dir/grid/0816:\n\ntests/test_dir/grid/0817:\n\ntests/test_dir/grid/0818:\n\ntests/test_dir/grid/0819:\n\ntests/test_dir/grid/0820:\n\ntests/test_dir/grid/0821:\n\ntests/test_dir/grid/0822:\n\ntests/test_dir/grid/0823:\n\ntests/test_dir/grid/0824:\n\ntests/test_dir/grid/0825:\n\ntests/test_dir/grid/0826:\n\ntests/test_dir/grid/0827:\n\ntests/test_dir/grid/0828:\n\ntests/test_dir/grid/0829:\n\ntests/test_dir/grid/0830:\n\ntests/test_dir/grid/0831:\n\ntests/test_dir/grid/0832:\n\ntests/test_dir/grid/0833:\n\ntests/test_dir/grid/0834:\n\ntests/test_dir/grid/0835:\n\ntests/test_dir/grid/0836:\n\ntests/test_dir/grid/0837:\n\ntests/test_dir/grid/0838:\n\ntests/test_dir/grid/0839:\n\ntests/test_dir/grid/0840:\n\ntests/test_dir/grid/0841:\n\ntests/test_dir/grid/0842:\n\ntests/test_dir/grid/0843:\n\ntests/test_dir/grid/0844:\n\ntests/test_dir/grid/0845:\n\ntests/test_dir/grid/0846:\n\ntests/test_dir/grid/0847:\n\ntests/test_dir/grid/0848:\n\ntests/test_dir/grid/0849:\n\ntests/test_dir/grid/0850:\n\ntests/test_dir/grid/0851:\n\ntests/test_dir/grid/0852:\n\ntests/test_dir/grid/0853:\n\ntests/test_dir/grid/0854:\n\ntests/test_dir/grid/0855:\n\ntests/test_dir/grid/0856:\n\ntests/test_dir/grid/0857:\n\ntests/test_dir/grid/0858:\n\ntests/test_dir/grid/0859:\n\ntests/test_dir/grid/0860:\n\ntests/test_dir/grid/0861:\n\ntests/test_dir/grid/0862:\n\ntests/test_dir/grid/0863:\n\ntests/test_dir/grid/0864:\n\ntests/test_dir/grid/0865:\n\ntests/test_dir/grid/0866:\n\ntests/test_dir/grid/0867:\n\ntests/test_dir/grid/0868:\n\ntests/test_dir/grid/0869:\n\ntests/test_dir/grid/0870:\n\ntests/test_dir/grid/0871:\n\ntests/test_dir/grid/0872:\n\ntests/test_dir/grid/0873:\n\ntests/test_dir/grid/0874:\n\ntests/test_dir/grid/0875:\n\ntests/test_dir/grid/0876:\n\ntests/test_dir/grid/0877:\n\ntests/test_dir/grid/0878:\n\ntests/test_dir/grid/0879:\n\ntests/test_dir/grid/0880:\n\ntests/test_dir/grid/0881:\n\ntests/test_dir/grid/0882:\n\ntests/test_dir/grid/0883:\n\ntests/test_dir/grid/0884:\n\ntests/test_dir/grid/0885:\n\ntests/test_dir/grid/0886:\n\ntests/test_dir/grid/0887:\n\ntests/test_dir/grid/0888:\n\ntests/test_dir/grid/0889:\n\ntests/test_dir/grid/0890:\n\ntests/test_dir/grid/0891:\n\ntests/test_dir/grid/0892:\n\ntests/test_dir/grid/0893:\n\ntests/test_dir/grid/0894:\n\ntests/test_dir/grid/0895:\n\ntests/test_dir/grid/0896:\n\ntests/test_dir/grid/0897:\n\ntests/test_dir/grid/0898:\n\ntests/test_dir/grid/0899:\n\ntests/test_dir/grid/0900:\n\ntests/test_dir/grid/0901:\n\ntests/test_dir/grid/0902:\n\ntests/test_dir/grid/0903:\n\ntests/test_dir/grid/0904:\n\ntests/test_dir/grid/0905:\n\ntests/test_dir/grid/0906:\n\ntests/test_dir/grid/0907:\n\ntests/test_dir/grid/0908:\n\ntests/test_dir/grid/0909:\n\ntests/test_dir/grid/0910:\n\ntests/test_dir/grid/0911:\n\ntests/test_dir/grid/0912:\n\ntests/test_dir/grid/0913:\n\ntests/test_dir/grid/0914:\n\ntests/test_dir/grid/0915:\n\ntests/test_dir/grid/0916:\n\ntests/test_dir/grid/0917:\n\ntests/test_dir/grid/0918:\n\ntests/test_dir/grid/0919:\n\ntests/test_dir/grid/0920:\n\ntests/test_dir/grid/0921:\n\ntests/test_dir/grid/0922:\n\ntests/test_dir/grid/0923:\n\ntests/test_dir/grid/0924:\n\ntests/test_dir/grid/0925:\n\ntests/test_dir/grid/0926:\n\ntests/test_dir/grid/0927:\n\ntests/test_dir/grid/0928:\n\ntests/test_dir/grid/0929:\n\ntests/test_dir/grid/0930:\n\ntests/test_dir/grid/0931:\n\ntests/test_dir/grid/0932:\n\ntests/test_dir/grid/0933:\n\ntests/test_dir/grid/0934:\n\ntests/test_dir/grid/0935:\n\ntests/test_dir/grid/0936:\n\ntests/test_dir/grid/0937:\n\ntests/test_dir/grid/0938:\n\ntests/test_dir/grid/0939:\n\ntests/test_dir/grid/0940:\n\ntests/test_dir/grid/0941:\n\ntests/test_dir/grid/0942:\n\ntests/test_dir/grid/0943:\n\ntests/test_dir/grid/0944:\n\ntests/test_dir/grid/0945:\n\ntests/test_dir/grid/0946:\n\ntests/test_dir/grid/0947:\n\ntests/test_dir/grid/0948:\n\ntests/test_dir/grid/0949:\n\ntests/test_dir/grid/0950:\n\ntests/test_dir/grid/0951:\n\ntests/test_dir/grid/0952:\n\ntests/test_dir/grid/0953:\n\ntests/test_dir/grid/0954:\n\ntests/test_dir/grid/0955:\n\ntests/test_dir/grid/0956:\n\ntests/test_dir/grid/0957:\n\ntests/test_dir/grid/0958:\n\ntests/test_dir/grid/0959:\n\ntests/test_dir/grid/0960:\n\ntests/test_dir/grid/0961:\n\ntests/test_dir/grid/0962:\n\ntests/test_dir/grid/0963:\n\ntests/test_dir/grid/0964:\n\ntests/test_dir/grid/0965:\n\ntests/test_dir/grid/0966:\n\ntests/test_dir/grid/0967:\n\ntests/test_dir/grid/0968:\n\ntests/test_dir/grid/0969:\n\ntests/test_dir/grid/0970:\n\ntests/test_dir/grid/0971:\n\ntests/test_dir/grid/0972:\n\ntests/test_dir/grid/0973:\n\ntests/test_dir/grid/0974:\n\ntests/test_dir/grid/0975:\n\ntests/test_dir/grid/0976:\n\ntests/test_dir/grid/0977:\n\ntests/test_dir/grid/0978:\n\ntests/test_dir/grid/0979:\n\ntests/test_dir/grid/0980:\n\ntests/test_dir/grid/0981:\n\ntests/test_dir/grid/0982:\n\ntests/test_dir/grid/0983:\n\ntests/test_dir/grid/0984:\n\ntests/test_dir/grid/0985:\n\ntests/test_dir/grid/0986:\n\ntests/test_dir/grid/0987:\n\ntests/test_dir/grid/0988:\n\ntests/test_dir/grid/0989:\n\ntests/test_dir/grid/0990:\n\ntests/test_dir/grid/0991:\n\ntests/test_dir/grid/0992:\n\ntests/test_dir/grid/0993:\n\ntests/test_dir/grid/0994:\n\ntests/test_dir/grid/0995:\n\ntests/test_dir/grid/0996:\n\ntests/test_dir/grid/0997:\n\ntests/test_dir/grid/0998:\n\ntests/test_dir/grid/0999:\n\ntests/test_dir/grid/1000:\n\ntests/test_dir/group:\n\ntests/test_dir/icons:\n\ntests/test_dir/perms:\n\ntests/test_dir/size:\n\ntests/test_dir/specials:\n\ntests/test_dir/symlinks:\ndir\n\ntests/test_dir/symlinks/dir:\n\ntests/test_dir/time:\n"
  },
  {
    "path": "tests/gen/only_dir_recursive_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --only-dirs --recurse\"\n"
  },
  {
    "path": "tests/gen/only_dir_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/only_dir_unix.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/gen/only_dir_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --only-dirs\"\n"
  },
  {
    "path": "tests/gen/only_file_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/only_file_unix.stdout",
    "content": ""
  },
  {
    "path": "tests/gen/only_file_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --only-files\"\n"
  },
  {
    "path": "tests/gen/ptest_19a666ddec321ae2.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/ptest_19a666ddec321ae2.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/gen/ptest_2dbc2104ddb934cd.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/ptest_2dbc2104ddb934cd.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/gen/ptest_4b30f7de50929327.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/ptest_4b30f7de50929327.stdout",
    "content": "/build/source/tests/test_dir/git\n/build/source/tests/test_dir/grid\n/build/source/tests/test_dir/group\n/build/source/tests/test_dir/icons\n/build/source/tests/test_dir/perms\n/build/source/tests/test_dir/size\n/build/source/tests/test_dir/specials\n/build/source/tests/test_dir/symlinks\n/build/source/tests/test_dir/time\n"
  },
  {
    "path": "tests/gen/ptest_4b7165c936488151.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/ptest_4b7165c936488151.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/gen/ptest_82a40fefd797654.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/ptest_82a40fefd797654.stdout",
    "content": "/build/source/tests/test_dir/git\n/build/source/tests/test_dir/grid\n/build/source/tests/test_dir/group\n/build/source/tests/test_dir/icons\n/build/source/tests/test_dir/perms\n/build/source/tests/test_dir/size\n/build/source/tests/test_dir/specials\n/build/source/tests/test_dir/symlinks\n/build/source/tests/test_dir/time\n"
  },
  {
    "path": "tests/gen/ptest_a920233617a69b55.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/ptest_a920233617a69b55.stdout",
    "content": "/build/source/tests/test_dir/git\n/build/source/tests/test_dir/grid\n/build/source/tests/test_dir/group\n/build/source/tests/test_dir/icons\n/build/source/tests/test_dir/perms\n/build/source/tests/test_dir/size\n/build/source/tests/test_dir/specials\n/build/source/tests/test_dir/symlinks\n/build/source/tests/test_dir/time\n"
  },
  {
    "path": "tests/gen/ptest_f90d48e69d70b41.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/ptest_f90d48e69d70b41.stdout",
    "content": "/build/source/tests/test_dir/git\n/build/source/tests/test_dir/grid\n/build/source/tests/test_dir/group\n/build/source/tests/test_dir/icons\n/build/source/tests/test_dir/perms\n/build/source/tests/test_dir/size\n/build/source/tests/test_dir/specials\n/build/source/tests/test_dir/symlinks\n/build/source/tests/test_dir/time\n"
  },
  {
    "path": "tests/gen/recursive_long_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/recursive_long_unix.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n\ntests/test_dir/git:\n001\n002\n003\n004\n005\n006\n007\n008\n009\n010\n\ntests/test_dir/git/001:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/002:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/003:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/004:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/005:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/006:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/007:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/008:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/009:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/010:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/grid:\n0001\n0002\n0003\n0004\n0005\n0006\n0007\n0008\n0009\n0010\n0011\n0012\n0013\n0014\n0015\n0016\n0017\n0018\n0019\n0020\n0021\n0022\n0023\n0024\n0025\n0026\n0027\n0028\n0029\n0030\n0031\n0032\n0033\n0034\n0035\n0036\n0037\n0038\n0039\n0040\n0041\n0042\n0043\n0044\n0045\n0046\n0047\n0048\n0049\n0050\n0051\n0052\n0053\n0054\n0055\n0056\n0057\n0058\n0059\n0060\n0061\n0062\n0063\n0064\n0065\n0066\n0067\n0068\n0069\n0070\n0071\n0072\n0073\n0074\n0075\n0076\n0077\n0078\n0079\n0080\n0081\n0082\n0083\n0084\n0085\n0086\n0087\n0088\n0089\n0090\n0091\n0092\n0093\n0094\n0095\n0096\n0097\n0098\n0099\n0100\n0101\n0102\n0103\n0104\n0105\n0106\n0107\n0108\n0109\n0110\n0111\n0112\n0113\n0114\n0115\n0116\n0117\n0118\n0119\n0120\n0121\n0122\n0123\n0124\n0125\n0126\n0127\n0128\n0129\n0130\n0131\n0132\n0133\n0134\n0135\n0136\n0137\n0138\n0139\n0140\n0141\n0142\n0143\n0144\n0145\n0146\n0147\n0148\n0149\n0150\n0151\n0152\n0153\n0154\n0155\n0156\n0157\n0158\n0159\n0160\n0161\n0162\n0163\n0164\n0165\n0166\n0167\n0168\n0169\n0170\n0171\n0172\n0173\n0174\n0175\n0176\n0177\n0178\n0179\n0180\n0181\n0182\n0183\n0184\n0185\n0186\n0187\n0188\n0189\n0190\n0191\n0192\n0193\n0194\n0195\n0196\n0197\n0198\n0199\n0200\n0201\n0202\n0203\n0204\n0205\n0206\n0207\n0208\n0209\n0210\n0211\n0212\n0213\n0214\n0215\n0216\n0217\n0218\n0219\n0220\n0221\n0222\n0223\n0224\n0225\n0226\n0227\n0228\n0229\n0230\n0231\n0232\n0233\n0234\n0235\n0236\n0237\n0238\n0239\n0240\n0241\n0242\n0243\n0244\n0245\n0246\n0247\n0248\n0249\n0250\n0251\n0252\n0253\n0254\n0255\n0256\n0257\n0258\n0259\n0260\n0261\n0262\n0263\n0264\n0265\n0266\n0267\n0268\n0269\n0270\n0271\n0272\n0273\n0274\n0275\n0276\n0277\n0278\n0279\n0280\n0281\n0282\n0283\n0284\n0285\n0286\n0287\n0288\n0289\n0290\n0291\n0292\n0293\n0294\n0295\n0296\n0297\n0298\n0299\n0300\n0301\n0302\n0303\n0304\n0305\n0306\n0307\n0308\n0309\n0310\n0311\n0312\n0313\n0314\n0315\n0316\n0317\n0318\n0319\n0320\n0321\n0322\n0323\n0324\n0325\n0326\n0327\n0328\n0329\n0330\n0331\n0332\n0333\n0334\n0335\n0336\n0337\n0338\n0339\n0340\n0341\n0342\n0343\n0344\n0345\n0346\n0347\n0348\n0349\n0350\n0351\n0352\n0353\n0354\n0355\n0356\n0357\n0358\n0359\n0360\n0361\n0362\n0363\n0364\n0365\n0366\n0367\n0368\n0369\n0370\n0371\n0372\n0373\n0374\n0375\n0376\n0377\n0378\n0379\n0380\n0381\n0382\n0383\n0384\n0385\n0386\n0387\n0388\n0389\n0390\n0391\n0392\n0393\n0394\n0395\n0396\n0397\n0398\n0399\n0400\n0401\n0402\n0403\n0404\n0405\n0406\n0407\n0408\n0409\n0410\n0411\n0412\n0413\n0414\n0415\n0416\n0417\n0418\n0419\n0420\n0421\n0422\n0423\n0424\n0425\n0426\n0427\n0428\n0429\n0430\n0431\n0432\n0433\n0434\n0435\n0436\n0437\n0438\n0439\n0440\n0441\n0442\n0443\n0444\n0445\n0446\n0447\n0448\n0449\n0450\n0451\n0452\n0453\n0454\n0455\n0456\n0457\n0458\n0459\n0460\n0461\n0462\n0463\n0464\n0465\n0466\n0467\n0468\n0469\n0470\n0471\n0472\n0473\n0474\n0475\n0476\n0477\n0478\n0479\n0480\n0481\n0482\n0483\n0484\n0485\n0486\n0487\n0488\n0489\n0490\n0491\n0492\n0493\n0494\n0495\n0496\n0497\n0498\n0499\n0500\n0501\n0502\n0503\n0504\n0505\n0506\n0507\n0508\n0509\n0510\n0511\n0512\n0513\n0514\n0515\n0516\n0517\n0518\n0519\n0520\n0521\n0522\n0523\n0524\n0525\n0526\n0527\n0528\n0529\n0530\n0531\n0532\n0533\n0534\n0535\n0536\n0537\n0538\n0539\n0540\n0541\n0542\n0543\n0544\n0545\n0546\n0547\n0548\n0549\n0550\n0551\n0552\n0553\n0554\n0555\n0556\n0557\n0558\n0559\n0560\n0561\n0562\n0563\n0564\n0565\n0566\n0567\n0568\n0569\n0570\n0571\n0572\n0573\n0574\n0575\n0576\n0577\n0578\n0579\n0580\n0581\n0582\n0583\n0584\n0585\n0586\n0587\n0588\n0589\n0590\n0591\n0592\n0593\n0594\n0595\n0596\n0597\n0598\n0599\n0600\n0601\n0602\n0603\n0604\n0605\n0606\n0607\n0608\n0609\n0610\n0611\n0612\n0613\n0614\n0615\n0616\n0617\n0618\n0619\n0620\n0621\n0622\n0623\n0624\n0625\n0626\n0627\n0628\n0629\n0630\n0631\n0632\n0633\n0634\n0635\n0636\n0637\n0638\n0639\n0640\n0641\n0642\n0643\n0644\n0645\n0646\n0647\n0648\n0649\n0650\n0651\n0652\n0653\n0654\n0655\n0656\n0657\n0658\n0659\n0660\n0661\n0662\n0663\n0664\n0665\n0666\n0667\n0668\n0669\n0670\n0671\n0672\n0673\n0674\n0675\n0676\n0677\n0678\n0679\n0680\n0681\n0682\n0683\n0684\n0685\n0686\n0687\n0688\n0689\n0690\n0691\n0692\n0693\n0694\n0695\n0696\n0697\n0698\n0699\n0700\n0701\n0702\n0703\n0704\n0705\n0706\n0707\n0708\n0709\n0710\n0711\n0712\n0713\n0714\n0715\n0716\n0717\n0718\n0719\n0720\n0721\n0722\n0723\n0724\n0725\n0726\n0727\n0728\n0729\n0730\n0731\n0732\n0733\n0734\n0735\n0736\n0737\n0738\n0739\n0740\n0741\n0742\n0743\n0744\n0745\n0746\n0747\n0748\n0749\n0750\n0751\n0752\n0753\n0754\n0755\n0756\n0757\n0758\n0759\n0760\n0761\n0762\n0763\n0764\n0765\n0766\n0767\n0768\n0769\n0770\n0771\n0772\n0773\n0774\n0775\n0776\n0777\n0778\n0779\n0780\n0781\n0782\n0783\n0784\n0785\n0786\n0787\n0788\n0789\n0790\n0791\n0792\n0793\n0794\n0795\n0796\n0797\n0798\n0799\n0800\n0801\n0802\n0803\n0804\n0805\n0806\n0807\n0808\n0809\n0810\n0811\n0812\n0813\n0814\n0815\n0816\n0817\n0818\n0819\n0820\n0821\n0822\n0823\n0824\n0825\n0826\n0827\n0828\n0829\n0830\n0831\n0832\n0833\n0834\n0835\n0836\n0837\n0838\n0839\n0840\n0841\n0842\n0843\n0844\n0845\n0846\n0847\n0848\n0849\n0850\n0851\n0852\n0853\n0854\n0855\n0856\n0857\n0858\n0859\n0860\n0861\n0862\n0863\n0864\n0865\n0866\n0867\n0868\n0869\n0870\n0871\n0872\n0873\n0874\n0875\n0876\n0877\n0878\n0879\n0880\n0881\n0882\n0883\n0884\n0885\n0886\n0887\n0888\n0889\n0890\n0891\n0892\n0893\n0894\n0895\n0896\n0897\n0898\n0899\n0900\n0901\n0902\n0903\n0904\n0905\n0906\n0907\n0908\n0909\n0910\n0911\n0912\n0913\n0914\n0915\n0916\n0917\n0918\n0919\n0920\n0921\n0922\n0923\n0924\n0925\n0926\n0927\n0928\n0929\n0930\n0931\n0932\n0933\n0934\n0935\n0936\n0937\n0938\n0939\n0940\n0941\n0942\n0943\n0944\n0945\n0946\n0947\n0948\n0949\n0950\n0951\n0952\n0953\n0954\n0955\n0956\n0957\n0958\n0959\n0960\n0961\n0962\n0963\n0964\n0965\n0966\n0967\n0968\n0969\n0970\n0971\n0972\n0973\n0974\n0975\n0976\n0977\n0978\n0979\n0980\n0981\n0982\n0983\n0984\n0985\n0986\n0987\n0988\n0989\n0990\n0991\n0992\n0993\n0994\n0995\n0996\n0997\n0998\n0999\n1000\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\nfile_010\nfile_011\nfile_012\nfile_013\nfile_014\nfile_015\nfile_016\nfile_017\nfile_018\nfile_019\nfile_020\nfile_021\nfile_022\nfile_023\nfile_024\nfile_025\nfile_026\nfile_027\nfile_028\nfile_029\nfile_030\nfile_031\nfile_032\nfile_033\nfile_034\nfile_035\nfile_036\nfile_037\nfile_038\nfile_039\nfile_040\nfile_041\nfile_042\nfile_043\nfile_044\nfile_045\nfile_046\nfile_047\nfile_048\nfile_049\nfile_050\nfile_051\nfile_052\nfile_053\nfile_054\nfile_055\nfile_056\nfile_057\nfile_058\nfile_059\nfile_060\nfile_061\nfile_062\nfile_063\nfile_064\nfile_065\nfile_066\nfile_067\nfile_068\nfile_069\nfile_070\nfile_071\nfile_072\nfile_073\nfile_074\nfile_075\nfile_076\nfile_077\nfile_078\nfile_079\nfile_080\nfile_081\nfile_082\nfile_083\nfile_084\nfile_085\nfile_086\nfile_087\nfile_088\nfile_089\nfile_090\nfile_091\nfile_092\nfile_093\nfile_094\nfile_095\nfile_096\nfile_097\nfile_098\nfile_099\nfile_100\nfile_101\nfile_102\nfile_103\nfile_104\nfile_105\nfile_106\nfile_107\nfile_108\nfile_109\nfile_110\nfile_111\nfile_112\nfile_113\nfile_114\nfile_115\nfile_116\nfile_117\nfile_118\nfile_119\nfile_120\nfile_121\nfile_122\nfile_123\nfile_124\nfile_125\nfile_126\nfile_127\nfile_128\nfile_129\nfile_130\nfile_131\nfile_132\nfile_133\nfile_134\nfile_135\nfile_136\nfile_137\nfile_138\nfile_139\nfile_140\nfile_141\nfile_142\nfile_143\nfile_144\nfile_145\nfile_146\nfile_147\nfile_148\nfile_149\nfile_150\nfile_151\nfile_152\nfile_153\nfile_154\nfile_155\nfile_156\nfile_157\nfile_158\nfile_159\nfile_160\nfile_161\nfile_162\nfile_163\nfile_164\nfile_165\nfile_166\nfile_167\nfile_168\nfile_169\nfile_170\nfile_171\nfile_172\nfile_173\nfile_174\nfile_175\nfile_176\nfile_177\nfile_178\nfile_179\nfile_180\nfile_181\nfile_182\nfile_183\nfile_184\nfile_185\nfile_186\nfile_187\nfile_188\nfile_189\nfile_190\nfile_191\nfile_192\nfile_193\nfile_194\nfile_195\nfile_196\nfile_197\nfile_198\nfile_199\nfile_200\nfile_201\nfile_202\nfile_203\nfile_204\nfile_205\nfile_206\nfile_207\nfile_208\nfile_209\nfile_210\nfile_211\nfile_212\nfile_213\nfile_214\nfile_215\nfile_216\nfile_217\nfile_218\nfile_219\nfile_220\nfile_221\nfile_222\nfile_223\nfile_224\nfile_225\nfile_226\nfile_227\nfile_228\nfile_229\nfile_230\nfile_231\nfile_232\nfile_233\nfile_234\nfile_235\nfile_236\nfile_237\nfile_238\nfile_239\nfile_240\nfile_241\nfile_242\nfile_243\nfile_244\nfile_245\nfile_246\nfile_247\nfile_248\nfile_249\nfile_250\nfile_251\nfile_252\nfile_253\nfile_254\nfile_255\nfile_256\nfile_257\nfile_258\nfile_259\nfile_260\nfile_261\nfile_262\nfile_263\nfile_264\nfile_265\nfile_266\nfile_267\nfile_268\nfile_269\nfile_270\nfile_271\nfile_272\nfile_273\nfile_274\nfile_275\nfile_276\nfile_277\nfile_278\nfile_279\nfile_280\nfile_281\nfile_282\nfile_283\nfile_284\nfile_285\nfile_286\nfile_287\nfile_288\nfile_289\nfile_290\nfile_291\nfile_292\nfile_293\nfile_294\nfile_295\nfile_296\nfile_297\nfile_298\nfile_299\nfile_300\nfile_301\nfile_302\nfile_303\nfile_304\nfile_305\nfile_306\nfile_307\nfile_308\nfile_309\nfile_310\nfile_311\nfile_312\nfile_313\nfile_314\nfile_315\nfile_316\nfile_317\nfile_318\nfile_319\nfile_320\nfile_321\nfile_322\nfile_323\nfile_324\nfile_325\nfile_326\nfile_327\nfile_328\nfile_329\nfile_330\nfile_331\nfile_332\nfile_333\nfile_334\nfile_335\nfile_336\nfile_337\nfile_338\nfile_339\nfile_340\nfile_341\nfile_342\nfile_343\nfile_344\nfile_345\nfile_346\nfile_347\nfile_348\nfile_349\nfile_350\nfile_351\nfile_352\nfile_353\nfile_354\nfile_355\nfile_356\nfile_357\nfile_358\nfile_359\nfile_360\nfile_361\nfile_362\nfile_363\nfile_364\nfile_365\nfile_366\nfile_367\nfile_368\nfile_369\nfile_370\nfile_371\nfile_372\nfile_373\nfile_374\nfile_375\nfile_376\nfile_377\nfile_378\nfile_379\nfile_380\nfile_381\nfile_382\nfile_383\nfile_384\nfile_385\nfile_386\nfile_387\nfile_388\nfile_389\nfile_390\nfile_391\nfile_392\nfile_393\nfile_394\nfile_395\nfile_396\nfile_397\nfile_398\nfile_399\nfile_400\nfile_401\nfile_402\nfile_403\nfile_404\nfile_405\nfile_406\nfile_407\nfile_408\nfile_409\nfile_410\nfile_411\nfile_412\nfile_413\nfile_414\nfile_415\nfile_416\nfile_417\nfile_418\nfile_419\nfile_420\nfile_421\nfile_422\nfile_423\nfile_424\nfile_425\nfile_426\nfile_427\nfile_428\nfile_429\nfile_430\nfile_431\nfile_432\nfile_433\nfile_434\nfile_435\nfile_436\nfile_437\nfile_438\nfile_439\nfile_440\nfile_441\nfile_442\nfile_443\nfile_444\nfile_445\nfile_446\nfile_447\nfile_448\nfile_449\nfile_450\nfile_451\nfile_452\nfile_453\nfile_454\nfile_455\nfile_456\nfile_457\nfile_458\nfile_459\nfile_460\nfile_461\nfile_462\nfile_463\nfile_464\nfile_465\nfile_466\nfile_467\nfile_468\nfile_469\nfile_470\nfile_471\nfile_472\nfile_473\nfile_474\nfile_475\nfile_476\nfile_477\nfile_478\nfile_479\nfile_480\nfile_481\nfile_482\nfile_483\nfile_484\nfile_485\nfile_486\nfile_487\nfile_488\nfile_489\nfile_490\nfile_491\nfile_492\nfile_493\nfile_494\nfile_495\nfile_496\nfile_497\nfile_498\nfile_499\nfile_500\nfile_501\nfile_502\nfile_503\nfile_504\nfile_505\nfile_506\nfile_507\nfile_508\nfile_509\nfile_510\nfile_511\nfile_512\nfile_513\nfile_514\nfile_515\nfile_516\nfile_517\nfile_518\nfile_519\nfile_520\nfile_521\nfile_522\nfile_523\nfile_524\nfile_525\nfile_526\nfile_527\nfile_528\nfile_529\nfile_530\nfile_531\nfile_532\nfile_533\nfile_534\nfile_535\nfile_536\nfile_537\nfile_538\nfile_539\nfile_540\nfile_541\nfile_542\nfile_543\nfile_544\nfile_545\nfile_546\nfile_547\nfile_548\nfile_549\nfile_550\nfile_551\nfile_552\nfile_553\nfile_554\nfile_555\nfile_556\nfile_557\nfile_558\nfile_559\nfile_560\nfile_561\nfile_562\nfile_563\nfile_564\nfile_565\nfile_566\nfile_567\nfile_568\nfile_569\nfile_570\nfile_571\nfile_572\nfile_573\nfile_574\nfile_575\nfile_576\nfile_577\nfile_578\nfile_579\nfile_580\nfile_581\nfile_582\nfile_583\nfile_584\nfile_585\nfile_586\nfile_587\nfile_588\nfile_589\nfile_590\nfile_591\nfile_592\nfile_593\nfile_594\nfile_595\nfile_596\nfile_597\nfile_598\nfile_599\nfile_600\nfile_601\nfile_602\nfile_603\nfile_604\nfile_605\nfile_606\nfile_607\nfile_608\nfile_609\nfile_610\nfile_611\nfile_612\nfile_613\nfile_614\nfile_615\nfile_616\nfile_617\nfile_618\nfile_619\nfile_620\nfile_621\nfile_622\nfile_623\nfile_624\nfile_625\nfile_626\nfile_627\nfile_628\nfile_629\nfile_630\nfile_631\nfile_632\nfile_633\nfile_634\nfile_635\nfile_636\nfile_637\nfile_638\nfile_639\nfile_640\nfile_641\nfile_642\nfile_643\nfile_644\nfile_645\nfile_646\nfile_647\nfile_648\nfile_649\nfile_650\nfile_651\nfile_652\nfile_653\nfile_654\nfile_655\nfile_656\nfile_657\nfile_658\nfile_659\nfile_660\nfile_661\nfile_662\nfile_663\nfile_664\nfile_665\nfile_666\nfile_667\nfile_668\nfile_669\nfile_670\nfile_671\nfile_672\nfile_673\nfile_674\nfile_675\nfile_676\nfile_677\nfile_678\nfile_679\nfile_680\nfile_681\nfile_682\nfile_683\nfile_684\nfile_685\nfile_686\nfile_687\nfile_688\nfile_689\nfile_690\nfile_691\nfile_692\nfile_693\nfile_694\nfile_695\nfile_696\nfile_697\nfile_698\nfile_699\nfile_700\nfile_701\nfile_702\nfile_703\nfile_704\nfile_705\nfile_706\nfile_707\nfile_708\nfile_709\nfile_710\nfile_711\nfile_712\nfile_713\nfile_714\nfile_715\nfile_716\nfile_717\nfile_718\nfile_719\nfile_720\nfile_721\nfile_722\nfile_723\nfile_724\nfile_725\nfile_726\nfile_727\nfile_728\nfile_729\nfile_730\nfile_731\nfile_732\nfile_733\nfile_734\nfile_735\nfile_736\nfile_737\nfile_738\nfile_739\nfile_740\nfile_741\nfile_742\nfile_743\nfile_744\nfile_745\nfile_746\nfile_747\nfile_748\nfile_749\nfile_750\nfile_751\nfile_752\nfile_753\nfile_754\nfile_755\nfile_756\nfile_757\nfile_758\nfile_759\nfile_760\nfile_761\nfile_762\nfile_763\nfile_764\nfile_765\nfile_766\nfile_767\nfile_768\nfile_769\nfile_770\nfile_771\nfile_772\nfile_773\nfile_774\nfile_775\nfile_776\nfile_777\nfile_778\nfile_779\nfile_780\nfile_781\nfile_782\nfile_783\nfile_784\nfile_785\nfile_786\nfile_787\nfile_788\nfile_789\nfile_790\nfile_791\nfile_792\nfile_793\nfile_794\nfile_795\nfile_796\nfile_797\nfile_798\nfile_799\nfile_800\nfile_801\nfile_802\nfile_803\nfile_804\nfile_805\nfile_806\nfile_807\nfile_808\nfile_809\nfile_810\nfile_811\nfile_812\nfile_813\nfile_814\nfile_815\nfile_816\nfile_817\nfile_818\nfile_819\nfile_820\nfile_821\nfile_822\nfile_823\nfile_824\nfile_825\nfile_826\nfile_827\nfile_828\nfile_829\nfile_830\nfile_831\nfile_832\nfile_833\nfile_834\nfile_835\nfile_836\nfile_837\nfile_838\nfile_839\nfile_840\nfile_841\nfile_842\nfile_843\nfile_844\nfile_845\nfile_846\nfile_847\nfile_848\nfile_849\nfile_850\nfile_851\nfile_852\nfile_853\nfile_854\nfile_855\nfile_856\nfile_857\nfile_858\nfile_859\nfile_860\nfile_861\nfile_862\nfile_863\nfile_864\nfile_865\nfile_866\nfile_867\nfile_868\nfile_869\nfile_870\nfile_871\nfile_872\nfile_873\nfile_874\nfile_875\nfile_876\nfile_877\nfile_878\nfile_879\nfile_880\nfile_881\nfile_882\nfile_883\nfile_884\nfile_885\nfile_886\nfile_887\nfile_888\nfile_889\nfile_890\nfile_891\nfile_892\nfile_893\nfile_894\nfile_895\nfile_896\nfile_897\nfile_898\nfile_899\nfile_900\nfile_901\nfile_902\nfile_903\nfile_904\nfile_905\nfile_906\nfile_907\nfile_908\nfile_909\nfile_910\nfile_911\nfile_912\nfile_913\nfile_914\nfile_915\nfile_916\nfile_917\nfile_918\nfile_919\nfile_920\nfile_921\nfile_922\nfile_923\nfile_924\nfile_925\nfile_926\nfile_927\nfile_928\nfile_929\nfile_930\nfile_931\nfile_932\nfile_933\nfile_934\nfile_935\nfile_936\nfile_937\nfile_938\nfile_939\nfile_940\nfile_941\nfile_942\nfile_943\nfile_944\nfile_945\nfile_946\nfile_947\nfile_948\nfile_949\nfile_950\nfile_951\nfile_952\nfile_953\nfile_954\nfile_955\nfile_956\nfile_957\nfile_958\nfile_959\nfile_960\nfile_961\nfile_962\nfile_963\nfile_964\nfile_965\nfile_966\nfile_967\nfile_968\nfile_969\nfile_970\nfile_971\nfile_972\nfile_973\nfile_974\nfile_975\nfile_976\nfile_977\nfile_978\nfile_979\nfile_980\nfile_981\nfile_982\nfile_983\nfile_984\nfile_985\nfile_986\nfile_987\nfile_988\nfile_989\nfile_990\nfile_991\nfile_992\nfile_993\nfile_994\nfile_995\nfile_996\nfile_997\nfile_998\nfile_999\n\ntests/test_dir/grid/0001:\n\ntests/test_dir/grid/0002:\n\ntests/test_dir/grid/0003:\n\ntests/test_dir/grid/0004:\n\ntests/test_dir/grid/0005:\n\ntests/test_dir/grid/0006:\n\ntests/test_dir/grid/0007:\n\ntests/test_dir/grid/0008:\n\ntests/test_dir/grid/0009:\n\ntests/test_dir/grid/0010:\n\ntests/test_dir/grid/0011:\n\ntests/test_dir/grid/0012:\n\ntests/test_dir/grid/0013:\n\ntests/test_dir/grid/0014:\n\ntests/test_dir/grid/0015:\n\ntests/test_dir/grid/0016:\n\ntests/test_dir/grid/0017:\n\ntests/test_dir/grid/0018:\n\ntests/test_dir/grid/0019:\n\ntests/test_dir/grid/0020:\n\ntests/test_dir/grid/0021:\n\ntests/test_dir/grid/0022:\n\ntests/test_dir/grid/0023:\n\ntests/test_dir/grid/0024:\n\ntests/test_dir/grid/0025:\n\ntests/test_dir/grid/0026:\n\ntests/test_dir/grid/0027:\n\ntests/test_dir/grid/0028:\n\ntests/test_dir/grid/0029:\n\ntests/test_dir/grid/0030:\n\ntests/test_dir/grid/0031:\n\ntests/test_dir/grid/0032:\n\ntests/test_dir/grid/0033:\n\ntests/test_dir/grid/0034:\n\ntests/test_dir/grid/0035:\n\ntests/test_dir/grid/0036:\n\ntests/test_dir/grid/0037:\n\ntests/test_dir/grid/0038:\n\ntests/test_dir/grid/0039:\n\ntests/test_dir/grid/0040:\n\ntests/test_dir/grid/0041:\n\ntests/test_dir/grid/0042:\n\ntests/test_dir/grid/0043:\n\ntests/test_dir/grid/0044:\n\ntests/test_dir/grid/0045:\n\ntests/test_dir/grid/0046:\n\ntests/test_dir/grid/0047:\n\ntests/test_dir/grid/0048:\n\ntests/test_dir/grid/0049:\n\ntests/test_dir/grid/0050:\n\ntests/test_dir/grid/0051:\n\ntests/test_dir/grid/0052:\n\ntests/test_dir/grid/0053:\n\ntests/test_dir/grid/0054:\n\ntests/test_dir/grid/0055:\n\ntests/test_dir/grid/0056:\n\ntests/test_dir/grid/0057:\n\ntests/test_dir/grid/0058:\n\ntests/test_dir/grid/0059:\n\ntests/test_dir/grid/0060:\n\ntests/test_dir/grid/0061:\n\ntests/test_dir/grid/0062:\n\ntests/test_dir/grid/0063:\n\ntests/test_dir/grid/0064:\n\ntests/test_dir/grid/0065:\n\ntests/test_dir/grid/0066:\n\ntests/test_dir/grid/0067:\n\ntests/test_dir/grid/0068:\n\ntests/test_dir/grid/0069:\n\ntests/test_dir/grid/0070:\n\ntests/test_dir/grid/0071:\n\ntests/test_dir/grid/0072:\n\ntests/test_dir/grid/0073:\n\ntests/test_dir/grid/0074:\n\ntests/test_dir/grid/0075:\n\ntests/test_dir/grid/0076:\n\ntests/test_dir/grid/0077:\n\ntests/test_dir/grid/0078:\n\ntests/test_dir/grid/0079:\n\ntests/test_dir/grid/0080:\n\ntests/test_dir/grid/0081:\n\ntests/test_dir/grid/0082:\n\ntests/test_dir/grid/0083:\n\ntests/test_dir/grid/0084:\n\ntests/test_dir/grid/0085:\n\ntests/test_dir/grid/0086:\n\ntests/test_dir/grid/0087:\n\ntests/test_dir/grid/0088:\n\ntests/test_dir/grid/0089:\n\ntests/test_dir/grid/0090:\n\ntests/test_dir/grid/0091:\n\ntests/test_dir/grid/0092:\n\ntests/test_dir/grid/0093:\n\ntests/test_dir/grid/0094:\n\ntests/test_dir/grid/0095:\n\ntests/test_dir/grid/0096:\n\ntests/test_dir/grid/0097:\n\ntests/test_dir/grid/0098:\n\ntests/test_dir/grid/0099:\n\ntests/test_dir/grid/0100:\n\ntests/test_dir/grid/0101:\n\ntests/test_dir/grid/0102:\n\ntests/test_dir/grid/0103:\n\ntests/test_dir/grid/0104:\n\ntests/test_dir/grid/0105:\n\ntests/test_dir/grid/0106:\n\ntests/test_dir/grid/0107:\n\ntests/test_dir/grid/0108:\n\ntests/test_dir/grid/0109:\n\ntests/test_dir/grid/0110:\n\ntests/test_dir/grid/0111:\n\ntests/test_dir/grid/0112:\n\ntests/test_dir/grid/0113:\n\ntests/test_dir/grid/0114:\n\ntests/test_dir/grid/0115:\n\ntests/test_dir/grid/0116:\n\ntests/test_dir/grid/0117:\n\ntests/test_dir/grid/0118:\n\ntests/test_dir/grid/0119:\n\ntests/test_dir/grid/0120:\n\ntests/test_dir/grid/0121:\n\ntests/test_dir/grid/0122:\n\ntests/test_dir/grid/0123:\n\ntests/test_dir/grid/0124:\n\ntests/test_dir/grid/0125:\n\ntests/test_dir/grid/0126:\n\ntests/test_dir/grid/0127:\n\ntests/test_dir/grid/0128:\n\ntests/test_dir/grid/0129:\n\ntests/test_dir/grid/0130:\n\ntests/test_dir/grid/0131:\n\ntests/test_dir/grid/0132:\n\ntests/test_dir/grid/0133:\n\ntests/test_dir/grid/0134:\n\ntests/test_dir/grid/0135:\n\ntests/test_dir/grid/0136:\n\ntests/test_dir/grid/0137:\n\ntests/test_dir/grid/0138:\n\ntests/test_dir/grid/0139:\n\ntests/test_dir/grid/0140:\n\ntests/test_dir/grid/0141:\n\ntests/test_dir/grid/0142:\n\ntests/test_dir/grid/0143:\n\ntests/test_dir/grid/0144:\n\ntests/test_dir/grid/0145:\n\ntests/test_dir/grid/0146:\n\ntests/test_dir/grid/0147:\n\ntests/test_dir/grid/0148:\n\ntests/test_dir/grid/0149:\n\ntests/test_dir/grid/0150:\n\ntests/test_dir/grid/0151:\n\ntests/test_dir/grid/0152:\n\ntests/test_dir/grid/0153:\n\ntests/test_dir/grid/0154:\n\ntests/test_dir/grid/0155:\n\ntests/test_dir/grid/0156:\n\ntests/test_dir/grid/0157:\n\ntests/test_dir/grid/0158:\n\ntests/test_dir/grid/0159:\n\ntests/test_dir/grid/0160:\n\ntests/test_dir/grid/0161:\n\ntests/test_dir/grid/0162:\n\ntests/test_dir/grid/0163:\n\ntests/test_dir/grid/0164:\n\ntests/test_dir/grid/0165:\n\ntests/test_dir/grid/0166:\n\ntests/test_dir/grid/0167:\n\ntests/test_dir/grid/0168:\n\ntests/test_dir/grid/0169:\n\ntests/test_dir/grid/0170:\n\ntests/test_dir/grid/0171:\n\ntests/test_dir/grid/0172:\n\ntests/test_dir/grid/0173:\n\ntests/test_dir/grid/0174:\n\ntests/test_dir/grid/0175:\n\ntests/test_dir/grid/0176:\n\ntests/test_dir/grid/0177:\n\ntests/test_dir/grid/0178:\n\ntests/test_dir/grid/0179:\n\ntests/test_dir/grid/0180:\n\ntests/test_dir/grid/0181:\n\ntests/test_dir/grid/0182:\n\ntests/test_dir/grid/0183:\n\ntests/test_dir/grid/0184:\n\ntests/test_dir/grid/0185:\n\ntests/test_dir/grid/0186:\n\ntests/test_dir/grid/0187:\n\ntests/test_dir/grid/0188:\n\ntests/test_dir/grid/0189:\n\ntests/test_dir/grid/0190:\n\ntests/test_dir/grid/0191:\n\ntests/test_dir/grid/0192:\n\ntests/test_dir/grid/0193:\n\ntests/test_dir/grid/0194:\n\ntests/test_dir/grid/0195:\n\ntests/test_dir/grid/0196:\n\ntests/test_dir/grid/0197:\n\ntests/test_dir/grid/0198:\n\ntests/test_dir/grid/0199:\n\ntests/test_dir/grid/0200:\n\ntests/test_dir/grid/0201:\n\ntests/test_dir/grid/0202:\n\ntests/test_dir/grid/0203:\n\ntests/test_dir/grid/0204:\n\ntests/test_dir/grid/0205:\n\ntests/test_dir/grid/0206:\n\ntests/test_dir/grid/0207:\n\ntests/test_dir/grid/0208:\n\ntests/test_dir/grid/0209:\n\ntests/test_dir/grid/0210:\n\ntests/test_dir/grid/0211:\n\ntests/test_dir/grid/0212:\n\ntests/test_dir/grid/0213:\n\ntests/test_dir/grid/0214:\n\ntests/test_dir/grid/0215:\n\ntests/test_dir/grid/0216:\n\ntests/test_dir/grid/0217:\n\ntests/test_dir/grid/0218:\n\ntests/test_dir/grid/0219:\n\ntests/test_dir/grid/0220:\n\ntests/test_dir/grid/0221:\n\ntests/test_dir/grid/0222:\n\ntests/test_dir/grid/0223:\n\ntests/test_dir/grid/0224:\n\ntests/test_dir/grid/0225:\n\ntests/test_dir/grid/0226:\n\ntests/test_dir/grid/0227:\n\ntests/test_dir/grid/0228:\n\ntests/test_dir/grid/0229:\n\ntests/test_dir/grid/0230:\n\ntests/test_dir/grid/0231:\n\ntests/test_dir/grid/0232:\n\ntests/test_dir/grid/0233:\n\ntests/test_dir/grid/0234:\n\ntests/test_dir/grid/0235:\n\ntests/test_dir/grid/0236:\n\ntests/test_dir/grid/0237:\n\ntests/test_dir/grid/0238:\n\ntests/test_dir/grid/0239:\n\ntests/test_dir/grid/0240:\n\ntests/test_dir/grid/0241:\n\ntests/test_dir/grid/0242:\n\ntests/test_dir/grid/0243:\n\ntests/test_dir/grid/0244:\n\ntests/test_dir/grid/0245:\n\ntests/test_dir/grid/0246:\n\ntests/test_dir/grid/0247:\n\ntests/test_dir/grid/0248:\n\ntests/test_dir/grid/0249:\n\ntests/test_dir/grid/0250:\n\ntests/test_dir/grid/0251:\n\ntests/test_dir/grid/0252:\n\ntests/test_dir/grid/0253:\n\ntests/test_dir/grid/0254:\n\ntests/test_dir/grid/0255:\n\ntests/test_dir/grid/0256:\n\ntests/test_dir/grid/0257:\n\ntests/test_dir/grid/0258:\n\ntests/test_dir/grid/0259:\n\ntests/test_dir/grid/0260:\n\ntests/test_dir/grid/0261:\n\ntests/test_dir/grid/0262:\n\ntests/test_dir/grid/0263:\n\ntests/test_dir/grid/0264:\n\ntests/test_dir/grid/0265:\n\ntests/test_dir/grid/0266:\n\ntests/test_dir/grid/0267:\n\ntests/test_dir/grid/0268:\n\ntests/test_dir/grid/0269:\n\ntests/test_dir/grid/0270:\n\ntests/test_dir/grid/0271:\n\ntests/test_dir/grid/0272:\n\ntests/test_dir/grid/0273:\n\ntests/test_dir/grid/0274:\n\ntests/test_dir/grid/0275:\n\ntests/test_dir/grid/0276:\n\ntests/test_dir/grid/0277:\n\ntests/test_dir/grid/0278:\n\ntests/test_dir/grid/0279:\n\ntests/test_dir/grid/0280:\n\ntests/test_dir/grid/0281:\n\ntests/test_dir/grid/0282:\n\ntests/test_dir/grid/0283:\n\ntests/test_dir/grid/0284:\n\ntests/test_dir/grid/0285:\n\ntests/test_dir/grid/0286:\n\ntests/test_dir/grid/0287:\n\ntests/test_dir/grid/0288:\n\ntests/test_dir/grid/0289:\n\ntests/test_dir/grid/0290:\n\ntests/test_dir/grid/0291:\n\ntests/test_dir/grid/0292:\n\ntests/test_dir/grid/0293:\n\ntests/test_dir/grid/0294:\n\ntests/test_dir/grid/0295:\n\ntests/test_dir/grid/0296:\n\ntests/test_dir/grid/0297:\n\ntests/test_dir/grid/0298:\n\ntests/test_dir/grid/0299:\n\ntests/test_dir/grid/0300:\n\ntests/test_dir/grid/0301:\n\ntests/test_dir/grid/0302:\n\ntests/test_dir/grid/0303:\n\ntests/test_dir/grid/0304:\n\ntests/test_dir/grid/0305:\n\ntests/test_dir/grid/0306:\n\ntests/test_dir/grid/0307:\n\ntests/test_dir/grid/0308:\n\ntests/test_dir/grid/0309:\n\ntests/test_dir/grid/0310:\n\ntests/test_dir/grid/0311:\n\ntests/test_dir/grid/0312:\n\ntests/test_dir/grid/0313:\n\ntests/test_dir/grid/0314:\n\ntests/test_dir/grid/0315:\n\ntests/test_dir/grid/0316:\n\ntests/test_dir/grid/0317:\n\ntests/test_dir/grid/0318:\n\ntests/test_dir/grid/0319:\n\ntests/test_dir/grid/0320:\n\ntests/test_dir/grid/0321:\n\ntests/test_dir/grid/0322:\n\ntests/test_dir/grid/0323:\n\ntests/test_dir/grid/0324:\n\ntests/test_dir/grid/0325:\n\ntests/test_dir/grid/0326:\n\ntests/test_dir/grid/0327:\n\ntests/test_dir/grid/0328:\n\ntests/test_dir/grid/0329:\n\ntests/test_dir/grid/0330:\n\ntests/test_dir/grid/0331:\n\ntests/test_dir/grid/0332:\n\ntests/test_dir/grid/0333:\n\ntests/test_dir/grid/0334:\n\ntests/test_dir/grid/0335:\n\ntests/test_dir/grid/0336:\n\ntests/test_dir/grid/0337:\n\ntests/test_dir/grid/0338:\n\ntests/test_dir/grid/0339:\n\ntests/test_dir/grid/0340:\n\ntests/test_dir/grid/0341:\n\ntests/test_dir/grid/0342:\n\ntests/test_dir/grid/0343:\n\ntests/test_dir/grid/0344:\n\ntests/test_dir/grid/0345:\n\ntests/test_dir/grid/0346:\n\ntests/test_dir/grid/0347:\n\ntests/test_dir/grid/0348:\n\ntests/test_dir/grid/0349:\n\ntests/test_dir/grid/0350:\n\ntests/test_dir/grid/0351:\n\ntests/test_dir/grid/0352:\n\ntests/test_dir/grid/0353:\n\ntests/test_dir/grid/0354:\n\ntests/test_dir/grid/0355:\n\ntests/test_dir/grid/0356:\n\ntests/test_dir/grid/0357:\n\ntests/test_dir/grid/0358:\n\ntests/test_dir/grid/0359:\n\ntests/test_dir/grid/0360:\n\ntests/test_dir/grid/0361:\n\ntests/test_dir/grid/0362:\n\ntests/test_dir/grid/0363:\n\ntests/test_dir/grid/0364:\n\ntests/test_dir/grid/0365:\n\ntests/test_dir/grid/0366:\n\ntests/test_dir/grid/0367:\n\ntests/test_dir/grid/0368:\n\ntests/test_dir/grid/0369:\n\ntests/test_dir/grid/0370:\n\ntests/test_dir/grid/0371:\n\ntests/test_dir/grid/0372:\n\ntests/test_dir/grid/0373:\n\ntests/test_dir/grid/0374:\n\ntests/test_dir/grid/0375:\n\ntests/test_dir/grid/0376:\n\ntests/test_dir/grid/0377:\n\ntests/test_dir/grid/0378:\n\ntests/test_dir/grid/0379:\n\ntests/test_dir/grid/0380:\n\ntests/test_dir/grid/0381:\n\ntests/test_dir/grid/0382:\n\ntests/test_dir/grid/0383:\n\ntests/test_dir/grid/0384:\n\ntests/test_dir/grid/0385:\n\ntests/test_dir/grid/0386:\n\ntests/test_dir/grid/0387:\n\ntests/test_dir/grid/0388:\n\ntests/test_dir/grid/0389:\n\ntests/test_dir/grid/0390:\n\ntests/test_dir/grid/0391:\n\ntests/test_dir/grid/0392:\n\ntests/test_dir/grid/0393:\n\ntests/test_dir/grid/0394:\n\ntests/test_dir/grid/0395:\n\ntests/test_dir/grid/0396:\n\ntests/test_dir/grid/0397:\n\ntests/test_dir/grid/0398:\n\ntests/test_dir/grid/0399:\n\ntests/test_dir/grid/0400:\n\ntests/test_dir/grid/0401:\n\ntests/test_dir/grid/0402:\n\ntests/test_dir/grid/0403:\n\ntests/test_dir/grid/0404:\n\ntests/test_dir/grid/0405:\n\ntests/test_dir/grid/0406:\n\ntests/test_dir/grid/0407:\n\ntests/test_dir/grid/0408:\n\ntests/test_dir/grid/0409:\n\ntests/test_dir/grid/0410:\n\ntests/test_dir/grid/0411:\n\ntests/test_dir/grid/0412:\n\ntests/test_dir/grid/0413:\n\ntests/test_dir/grid/0414:\n\ntests/test_dir/grid/0415:\n\ntests/test_dir/grid/0416:\n\ntests/test_dir/grid/0417:\n\ntests/test_dir/grid/0418:\n\ntests/test_dir/grid/0419:\n\ntests/test_dir/grid/0420:\n\ntests/test_dir/grid/0421:\n\ntests/test_dir/grid/0422:\n\ntests/test_dir/grid/0423:\n\ntests/test_dir/grid/0424:\n\ntests/test_dir/grid/0425:\n\ntests/test_dir/grid/0426:\n\ntests/test_dir/grid/0427:\n\ntests/test_dir/grid/0428:\n\ntests/test_dir/grid/0429:\n\ntests/test_dir/grid/0430:\n\ntests/test_dir/grid/0431:\n\ntests/test_dir/grid/0432:\n\ntests/test_dir/grid/0433:\n\ntests/test_dir/grid/0434:\n\ntests/test_dir/grid/0435:\n\ntests/test_dir/grid/0436:\n\ntests/test_dir/grid/0437:\n\ntests/test_dir/grid/0438:\n\ntests/test_dir/grid/0439:\n\ntests/test_dir/grid/0440:\n\ntests/test_dir/grid/0441:\n\ntests/test_dir/grid/0442:\n\ntests/test_dir/grid/0443:\n\ntests/test_dir/grid/0444:\n\ntests/test_dir/grid/0445:\n\ntests/test_dir/grid/0446:\n\ntests/test_dir/grid/0447:\n\ntests/test_dir/grid/0448:\n\ntests/test_dir/grid/0449:\n\ntests/test_dir/grid/0450:\n\ntests/test_dir/grid/0451:\n\ntests/test_dir/grid/0452:\n\ntests/test_dir/grid/0453:\n\ntests/test_dir/grid/0454:\n\ntests/test_dir/grid/0455:\n\ntests/test_dir/grid/0456:\n\ntests/test_dir/grid/0457:\n\ntests/test_dir/grid/0458:\n\ntests/test_dir/grid/0459:\n\ntests/test_dir/grid/0460:\n\ntests/test_dir/grid/0461:\n\ntests/test_dir/grid/0462:\n\ntests/test_dir/grid/0463:\n\ntests/test_dir/grid/0464:\n\ntests/test_dir/grid/0465:\n\ntests/test_dir/grid/0466:\n\ntests/test_dir/grid/0467:\n\ntests/test_dir/grid/0468:\n\ntests/test_dir/grid/0469:\n\ntests/test_dir/grid/0470:\n\ntests/test_dir/grid/0471:\n\ntests/test_dir/grid/0472:\n\ntests/test_dir/grid/0473:\n\ntests/test_dir/grid/0474:\n\ntests/test_dir/grid/0475:\n\ntests/test_dir/grid/0476:\n\ntests/test_dir/grid/0477:\n\ntests/test_dir/grid/0478:\n\ntests/test_dir/grid/0479:\n\ntests/test_dir/grid/0480:\n\ntests/test_dir/grid/0481:\n\ntests/test_dir/grid/0482:\n\ntests/test_dir/grid/0483:\n\ntests/test_dir/grid/0484:\n\ntests/test_dir/grid/0485:\n\ntests/test_dir/grid/0486:\n\ntests/test_dir/grid/0487:\n\ntests/test_dir/grid/0488:\n\ntests/test_dir/grid/0489:\n\ntests/test_dir/grid/0490:\n\ntests/test_dir/grid/0491:\n\ntests/test_dir/grid/0492:\n\ntests/test_dir/grid/0493:\n\ntests/test_dir/grid/0494:\n\ntests/test_dir/grid/0495:\n\ntests/test_dir/grid/0496:\n\ntests/test_dir/grid/0497:\n\ntests/test_dir/grid/0498:\n\ntests/test_dir/grid/0499:\n\ntests/test_dir/grid/0500:\n\ntests/test_dir/grid/0501:\n\ntests/test_dir/grid/0502:\n\ntests/test_dir/grid/0503:\n\ntests/test_dir/grid/0504:\n\ntests/test_dir/grid/0505:\n\ntests/test_dir/grid/0506:\n\ntests/test_dir/grid/0507:\n\ntests/test_dir/grid/0508:\n\ntests/test_dir/grid/0509:\n\ntests/test_dir/grid/0510:\n\ntests/test_dir/grid/0511:\n\ntests/test_dir/grid/0512:\n\ntests/test_dir/grid/0513:\n\ntests/test_dir/grid/0514:\n\ntests/test_dir/grid/0515:\n\ntests/test_dir/grid/0516:\n\ntests/test_dir/grid/0517:\n\ntests/test_dir/grid/0518:\n\ntests/test_dir/grid/0519:\n\ntests/test_dir/grid/0520:\n\ntests/test_dir/grid/0521:\n\ntests/test_dir/grid/0522:\n\ntests/test_dir/grid/0523:\n\ntests/test_dir/grid/0524:\n\ntests/test_dir/grid/0525:\n\ntests/test_dir/grid/0526:\n\ntests/test_dir/grid/0527:\n\ntests/test_dir/grid/0528:\n\ntests/test_dir/grid/0529:\n\ntests/test_dir/grid/0530:\n\ntests/test_dir/grid/0531:\n\ntests/test_dir/grid/0532:\n\ntests/test_dir/grid/0533:\n\ntests/test_dir/grid/0534:\n\ntests/test_dir/grid/0535:\n\ntests/test_dir/grid/0536:\n\ntests/test_dir/grid/0537:\n\ntests/test_dir/grid/0538:\n\ntests/test_dir/grid/0539:\n\ntests/test_dir/grid/0540:\n\ntests/test_dir/grid/0541:\n\ntests/test_dir/grid/0542:\n\ntests/test_dir/grid/0543:\n\ntests/test_dir/grid/0544:\n\ntests/test_dir/grid/0545:\n\ntests/test_dir/grid/0546:\n\ntests/test_dir/grid/0547:\n\ntests/test_dir/grid/0548:\n\ntests/test_dir/grid/0549:\n\ntests/test_dir/grid/0550:\n\ntests/test_dir/grid/0551:\n\ntests/test_dir/grid/0552:\n\ntests/test_dir/grid/0553:\n\ntests/test_dir/grid/0554:\n\ntests/test_dir/grid/0555:\n\ntests/test_dir/grid/0556:\n\ntests/test_dir/grid/0557:\n\ntests/test_dir/grid/0558:\n\ntests/test_dir/grid/0559:\n\ntests/test_dir/grid/0560:\n\ntests/test_dir/grid/0561:\n\ntests/test_dir/grid/0562:\n\ntests/test_dir/grid/0563:\n\ntests/test_dir/grid/0564:\n\ntests/test_dir/grid/0565:\n\ntests/test_dir/grid/0566:\n\ntests/test_dir/grid/0567:\n\ntests/test_dir/grid/0568:\n\ntests/test_dir/grid/0569:\n\ntests/test_dir/grid/0570:\n\ntests/test_dir/grid/0571:\n\ntests/test_dir/grid/0572:\n\ntests/test_dir/grid/0573:\n\ntests/test_dir/grid/0574:\n\ntests/test_dir/grid/0575:\n\ntests/test_dir/grid/0576:\n\ntests/test_dir/grid/0577:\n\ntests/test_dir/grid/0578:\n\ntests/test_dir/grid/0579:\n\ntests/test_dir/grid/0580:\n\ntests/test_dir/grid/0581:\n\ntests/test_dir/grid/0582:\n\ntests/test_dir/grid/0583:\n\ntests/test_dir/grid/0584:\n\ntests/test_dir/grid/0585:\n\ntests/test_dir/grid/0586:\n\ntests/test_dir/grid/0587:\n\ntests/test_dir/grid/0588:\n\ntests/test_dir/grid/0589:\n\ntests/test_dir/grid/0590:\n\ntests/test_dir/grid/0591:\n\ntests/test_dir/grid/0592:\n\ntests/test_dir/grid/0593:\n\ntests/test_dir/grid/0594:\n\ntests/test_dir/grid/0595:\n\ntests/test_dir/grid/0596:\n\ntests/test_dir/grid/0597:\n\ntests/test_dir/grid/0598:\n\ntests/test_dir/grid/0599:\n\ntests/test_dir/grid/0600:\n\ntests/test_dir/grid/0601:\n\ntests/test_dir/grid/0602:\n\ntests/test_dir/grid/0603:\n\ntests/test_dir/grid/0604:\n\ntests/test_dir/grid/0605:\n\ntests/test_dir/grid/0606:\n\ntests/test_dir/grid/0607:\n\ntests/test_dir/grid/0608:\n\ntests/test_dir/grid/0609:\n\ntests/test_dir/grid/0610:\n\ntests/test_dir/grid/0611:\n\ntests/test_dir/grid/0612:\n\ntests/test_dir/grid/0613:\n\ntests/test_dir/grid/0614:\n\ntests/test_dir/grid/0615:\n\ntests/test_dir/grid/0616:\n\ntests/test_dir/grid/0617:\n\ntests/test_dir/grid/0618:\n\ntests/test_dir/grid/0619:\n\ntests/test_dir/grid/0620:\n\ntests/test_dir/grid/0621:\n\ntests/test_dir/grid/0622:\n\ntests/test_dir/grid/0623:\n\ntests/test_dir/grid/0624:\n\ntests/test_dir/grid/0625:\n\ntests/test_dir/grid/0626:\n\ntests/test_dir/grid/0627:\n\ntests/test_dir/grid/0628:\n\ntests/test_dir/grid/0629:\n\ntests/test_dir/grid/0630:\n\ntests/test_dir/grid/0631:\n\ntests/test_dir/grid/0632:\n\ntests/test_dir/grid/0633:\n\ntests/test_dir/grid/0634:\n\ntests/test_dir/grid/0635:\n\ntests/test_dir/grid/0636:\n\ntests/test_dir/grid/0637:\n\ntests/test_dir/grid/0638:\n\ntests/test_dir/grid/0639:\n\ntests/test_dir/grid/0640:\n\ntests/test_dir/grid/0641:\n\ntests/test_dir/grid/0642:\n\ntests/test_dir/grid/0643:\n\ntests/test_dir/grid/0644:\n\ntests/test_dir/grid/0645:\n\ntests/test_dir/grid/0646:\n\ntests/test_dir/grid/0647:\n\ntests/test_dir/grid/0648:\n\ntests/test_dir/grid/0649:\n\ntests/test_dir/grid/0650:\n\ntests/test_dir/grid/0651:\n\ntests/test_dir/grid/0652:\n\ntests/test_dir/grid/0653:\n\ntests/test_dir/grid/0654:\n\ntests/test_dir/grid/0655:\n\ntests/test_dir/grid/0656:\n\ntests/test_dir/grid/0657:\n\ntests/test_dir/grid/0658:\n\ntests/test_dir/grid/0659:\n\ntests/test_dir/grid/0660:\n\ntests/test_dir/grid/0661:\n\ntests/test_dir/grid/0662:\n\ntests/test_dir/grid/0663:\n\ntests/test_dir/grid/0664:\n\ntests/test_dir/grid/0665:\n\ntests/test_dir/grid/0666:\n\ntests/test_dir/grid/0667:\n\ntests/test_dir/grid/0668:\n\ntests/test_dir/grid/0669:\n\ntests/test_dir/grid/0670:\n\ntests/test_dir/grid/0671:\n\ntests/test_dir/grid/0672:\n\ntests/test_dir/grid/0673:\n\ntests/test_dir/grid/0674:\n\ntests/test_dir/grid/0675:\n\ntests/test_dir/grid/0676:\n\ntests/test_dir/grid/0677:\n\ntests/test_dir/grid/0678:\n\ntests/test_dir/grid/0679:\n\ntests/test_dir/grid/0680:\n\ntests/test_dir/grid/0681:\n\ntests/test_dir/grid/0682:\n\ntests/test_dir/grid/0683:\n\ntests/test_dir/grid/0684:\n\ntests/test_dir/grid/0685:\n\ntests/test_dir/grid/0686:\n\ntests/test_dir/grid/0687:\n\ntests/test_dir/grid/0688:\n\ntests/test_dir/grid/0689:\n\ntests/test_dir/grid/0690:\n\ntests/test_dir/grid/0691:\n\ntests/test_dir/grid/0692:\n\ntests/test_dir/grid/0693:\n\ntests/test_dir/grid/0694:\n\ntests/test_dir/grid/0695:\n\ntests/test_dir/grid/0696:\n\ntests/test_dir/grid/0697:\n\ntests/test_dir/grid/0698:\n\ntests/test_dir/grid/0699:\n\ntests/test_dir/grid/0700:\n\ntests/test_dir/grid/0701:\n\ntests/test_dir/grid/0702:\n\ntests/test_dir/grid/0703:\n\ntests/test_dir/grid/0704:\n\ntests/test_dir/grid/0705:\n\ntests/test_dir/grid/0706:\n\ntests/test_dir/grid/0707:\n\ntests/test_dir/grid/0708:\n\ntests/test_dir/grid/0709:\n\ntests/test_dir/grid/0710:\n\ntests/test_dir/grid/0711:\n\ntests/test_dir/grid/0712:\n\ntests/test_dir/grid/0713:\n\ntests/test_dir/grid/0714:\n\ntests/test_dir/grid/0715:\n\ntests/test_dir/grid/0716:\n\ntests/test_dir/grid/0717:\n\ntests/test_dir/grid/0718:\n\ntests/test_dir/grid/0719:\n\ntests/test_dir/grid/0720:\n\ntests/test_dir/grid/0721:\n\ntests/test_dir/grid/0722:\n\ntests/test_dir/grid/0723:\n\ntests/test_dir/grid/0724:\n\ntests/test_dir/grid/0725:\n\ntests/test_dir/grid/0726:\n\ntests/test_dir/grid/0727:\n\ntests/test_dir/grid/0728:\n\ntests/test_dir/grid/0729:\n\ntests/test_dir/grid/0730:\n\ntests/test_dir/grid/0731:\n\ntests/test_dir/grid/0732:\n\ntests/test_dir/grid/0733:\n\ntests/test_dir/grid/0734:\n\ntests/test_dir/grid/0735:\n\ntests/test_dir/grid/0736:\n\ntests/test_dir/grid/0737:\n\ntests/test_dir/grid/0738:\n\ntests/test_dir/grid/0739:\n\ntests/test_dir/grid/0740:\n\ntests/test_dir/grid/0741:\n\ntests/test_dir/grid/0742:\n\ntests/test_dir/grid/0743:\n\ntests/test_dir/grid/0744:\n\ntests/test_dir/grid/0745:\n\ntests/test_dir/grid/0746:\n\ntests/test_dir/grid/0747:\n\ntests/test_dir/grid/0748:\n\ntests/test_dir/grid/0749:\n\ntests/test_dir/grid/0750:\n\ntests/test_dir/grid/0751:\n\ntests/test_dir/grid/0752:\n\ntests/test_dir/grid/0753:\n\ntests/test_dir/grid/0754:\n\ntests/test_dir/grid/0755:\n\ntests/test_dir/grid/0756:\n\ntests/test_dir/grid/0757:\n\ntests/test_dir/grid/0758:\n\ntests/test_dir/grid/0759:\n\ntests/test_dir/grid/0760:\n\ntests/test_dir/grid/0761:\n\ntests/test_dir/grid/0762:\n\ntests/test_dir/grid/0763:\n\ntests/test_dir/grid/0764:\n\ntests/test_dir/grid/0765:\n\ntests/test_dir/grid/0766:\n\ntests/test_dir/grid/0767:\n\ntests/test_dir/grid/0768:\n\ntests/test_dir/grid/0769:\n\ntests/test_dir/grid/0770:\n\ntests/test_dir/grid/0771:\n\ntests/test_dir/grid/0772:\n\ntests/test_dir/grid/0773:\n\ntests/test_dir/grid/0774:\n\ntests/test_dir/grid/0775:\n\ntests/test_dir/grid/0776:\n\ntests/test_dir/grid/0777:\n\ntests/test_dir/grid/0778:\n\ntests/test_dir/grid/0779:\n\ntests/test_dir/grid/0780:\n\ntests/test_dir/grid/0781:\n\ntests/test_dir/grid/0782:\n\ntests/test_dir/grid/0783:\n\ntests/test_dir/grid/0784:\n\ntests/test_dir/grid/0785:\n\ntests/test_dir/grid/0786:\n\ntests/test_dir/grid/0787:\n\ntests/test_dir/grid/0788:\n\ntests/test_dir/grid/0789:\n\ntests/test_dir/grid/0790:\n\ntests/test_dir/grid/0791:\n\ntests/test_dir/grid/0792:\n\ntests/test_dir/grid/0793:\n\ntests/test_dir/grid/0794:\n\ntests/test_dir/grid/0795:\n\ntests/test_dir/grid/0796:\n\ntests/test_dir/grid/0797:\n\ntests/test_dir/grid/0798:\n\ntests/test_dir/grid/0799:\n\ntests/test_dir/grid/0800:\n\ntests/test_dir/grid/0801:\n\ntests/test_dir/grid/0802:\n\ntests/test_dir/grid/0803:\n\ntests/test_dir/grid/0804:\n\ntests/test_dir/grid/0805:\n\ntests/test_dir/grid/0806:\n\ntests/test_dir/grid/0807:\n\ntests/test_dir/grid/0808:\n\ntests/test_dir/grid/0809:\n\ntests/test_dir/grid/0810:\n\ntests/test_dir/grid/0811:\n\ntests/test_dir/grid/0812:\n\ntests/test_dir/grid/0813:\n\ntests/test_dir/grid/0814:\n\ntests/test_dir/grid/0815:\n\ntests/test_dir/grid/0816:\n\ntests/test_dir/grid/0817:\n\ntests/test_dir/grid/0818:\n\ntests/test_dir/grid/0819:\n\ntests/test_dir/grid/0820:\n\ntests/test_dir/grid/0821:\n\ntests/test_dir/grid/0822:\n\ntests/test_dir/grid/0823:\n\ntests/test_dir/grid/0824:\n\ntests/test_dir/grid/0825:\n\ntests/test_dir/grid/0826:\n\ntests/test_dir/grid/0827:\n\ntests/test_dir/grid/0828:\n\ntests/test_dir/grid/0829:\n\ntests/test_dir/grid/0830:\n\ntests/test_dir/grid/0831:\n\ntests/test_dir/grid/0832:\n\ntests/test_dir/grid/0833:\n\ntests/test_dir/grid/0834:\n\ntests/test_dir/grid/0835:\n\ntests/test_dir/grid/0836:\n\ntests/test_dir/grid/0837:\n\ntests/test_dir/grid/0838:\n\ntests/test_dir/grid/0839:\n\ntests/test_dir/grid/0840:\n\ntests/test_dir/grid/0841:\n\ntests/test_dir/grid/0842:\n\ntests/test_dir/grid/0843:\n\ntests/test_dir/grid/0844:\n\ntests/test_dir/grid/0845:\n\ntests/test_dir/grid/0846:\n\ntests/test_dir/grid/0847:\n\ntests/test_dir/grid/0848:\n\ntests/test_dir/grid/0849:\n\ntests/test_dir/grid/0850:\n\ntests/test_dir/grid/0851:\n\ntests/test_dir/grid/0852:\n\ntests/test_dir/grid/0853:\n\ntests/test_dir/grid/0854:\n\ntests/test_dir/grid/0855:\n\ntests/test_dir/grid/0856:\n\ntests/test_dir/grid/0857:\n\ntests/test_dir/grid/0858:\n\ntests/test_dir/grid/0859:\n\ntests/test_dir/grid/0860:\n\ntests/test_dir/grid/0861:\n\ntests/test_dir/grid/0862:\n\ntests/test_dir/grid/0863:\n\ntests/test_dir/grid/0864:\n\ntests/test_dir/grid/0865:\n\ntests/test_dir/grid/0866:\n\ntests/test_dir/grid/0867:\n\ntests/test_dir/grid/0868:\n\ntests/test_dir/grid/0869:\n\ntests/test_dir/grid/0870:\n\ntests/test_dir/grid/0871:\n\ntests/test_dir/grid/0872:\n\ntests/test_dir/grid/0873:\n\ntests/test_dir/grid/0874:\n\ntests/test_dir/grid/0875:\n\ntests/test_dir/grid/0876:\n\ntests/test_dir/grid/0877:\n\ntests/test_dir/grid/0878:\n\ntests/test_dir/grid/0879:\n\ntests/test_dir/grid/0880:\n\ntests/test_dir/grid/0881:\n\ntests/test_dir/grid/0882:\n\ntests/test_dir/grid/0883:\n\ntests/test_dir/grid/0884:\n\ntests/test_dir/grid/0885:\n\ntests/test_dir/grid/0886:\n\ntests/test_dir/grid/0887:\n\ntests/test_dir/grid/0888:\n\ntests/test_dir/grid/0889:\n\ntests/test_dir/grid/0890:\n\ntests/test_dir/grid/0891:\n\ntests/test_dir/grid/0892:\n\ntests/test_dir/grid/0893:\n\ntests/test_dir/grid/0894:\n\ntests/test_dir/grid/0895:\n\ntests/test_dir/grid/0896:\n\ntests/test_dir/grid/0897:\n\ntests/test_dir/grid/0898:\n\ntests/test_dir/grid/0899:\n\ntests/test_dir/grid/0900:\n\ntests/test_dir/grid/0901:\n\ntests/test_dir/grid/0902:\n\ntests/test_dir/grid/0903:\n\ntests/test_dir/grid/0904:\n\ntests/test_dir/grid/0905:\n\ntests/test_dir/grid/0906:\n\ntests/test_dir/grid/0907:\n\ntests/test_dir/grid/0908:\n\ntests/test_dir/grid/0909:\n\ntests/test_dir/grid/0910:\n\ntests/test_dir/grid/0911:\n\ntests/test_dir/grid/0912:\n\ntests/test_dir/grid/0913:\n\ntests/test_dir/grid/0914:\n\ntests/test_dir/grid/0915:\n\ntests/test_dir/grid/0916:\n\ntests/test_dir/grid/0917:\n\ntests/test_dir/grid/0918:\n\ntests/test_dir/grid/0919:\n\ntests/test_dir/grid/0920:\n\ntests/test_dir/grid/0921:\n\ntests/test_dir/grid/0922:\n\ntests/test_dir/grid/0923:\n\ntests/test_dir/grid/0924:\n\ntests/test_dir/grid/0925:\n\ntests/test_dir/grid/0926:\n\ntests/test_dir/grid/0927:\n\ntests/test_dir/grid/0928:\n\ntests/test_dir/grid/0929:\n\ntests/test_dir/grid/0930:\n\ntests/test_dir/grid/0931:\n\ntests/test_dir/grid/0932:\n\ntests/test_dir/grid/0933:\n\ntests/test_dir/grid/0934:\n\ntests/test_dir/grid/0935:\n\ntests/test_dir/grid/0936:\n\ntests/test_dir/grid/0937:\n\ntests/test_dir/grid/0938:\n\ntests/test_dir/grid/0939:\n\ntests/test_dir/grid/0940:\n\ntests/test_dir/grid/0941:\n\ntests/test_dir/grid/0942:\n\ntests/test_dir/grid/0943:\n\ntests/test_dir/grid/0944:\n\ntests/test_dir/grid/0945:\n\ntests/test_dir/grid/0946:\n\ntests/test_dir/grid/0947:\n\ntests/test_dir/grid/0948:\n\ntests/test_dir/grid/0949:\n\ntests/test_dir/grid/0950:\n\ntests/test_dir/grid/0951:\n\ntests/test_dir/grid/0952:\n\ntests/test_dir/grid/0953:\n\ntests/test_dir/grid/0954:\n\ntests/test_dir/grid/0955:\n\ntests/test_dir/grid/0956:\n\ntests/test_dir/grid/0957:\n\ntests/test_dir/grid/0958:\n\ntests/test_dir/grid/0959:\n\ntests/test_dir/grid/0960:\n\ntests/test_dir/grid/0961:\n\ntests/test_dir/grid/0962:\n\ntests/test_dir/grid/0963:\n\ntests/test_dir/grid/0964:\n\ntests/test_dir/grid/0965:\n\ntests/test_dir/grid/0966:\n\ntests/test_dir/grid/0967:\n\ntests/test_dir/grid/0968:\n\ntests/test_dir/grid/0969:\n\ntests/test_dir/grid/0970:\n\ntests/test_dir/grid/0971:\n\ntests/test_dir/grid/0972:\n\ntests/test_dir/grid/0973:\n\ntests/test_dir/grid/0974:\n\ntests/test_dir/grid/0975:\n\ntests/test_dir/grid/0976:\n\ntests/test_dir/grid/0977:\n\ntests/test_dir/grid/0978:\n\ntests/test_dir/grid/0979:\n\ntests/test_dir/grid/0980:\n\ntests/test_dir/grid/0981:\n\ntests/test_dir/grid/0982:\n\ntests/test_dir/grid/0983:\n\ntests/test_dir/grid/0984:\n\ntests/test_dir/grid/0985:\n\ntests/test_dir/grid/0986:\n\ntests/test_dir/grid/0987:\n\ntests/test_dir/grid/0988:\n\ntests/test_dir/grid/0989:\n\ntests/test_dir/grid/0990:\n\ntests/test_dir/grid/0991:\n\ntests/test_dir/grid/0992:\n\ntests/test_dir/grid/0993:\n\ntests/test_dir/grid/0994:\n\ntests/test_dir/grid/0995:\n\ntests/test_dir/grid/0996:\n\ntests/test_dir/grid/0997:\n\ntests/test_dir/grid/0998:\n\ntests/test_dir/grid/0999:\n\ntests/test_dir/grid/1000:\n\ntests/test_dir/group:\nfile\n\ntests/test_dir/icons:\nc++.cpp\nc.c\ncss.css\nfile\ngo.go\nhtml.html\njava.java\njavascript.js\nman.1\nmarked.md\nphp.php\npython.py\nruby.rb\nrust.rs\nshell.sh\nunknown.unknown\n\ntests/test_dir/perms:\nfile\nfile2\n\ntests/test_dir/size:\n1B\n1K\n1M\n1337\n\ntests/test_dir/specials:\n\ntests/test_dir/symlinks:\ndir\nfile\n' lorem ipsum'\nsymlink -> file\nsymlink2 -> symlink\nsymlink3 -> dir\nsymlink4 -> pipitek\n\ntests/test_dir/symlinks/dir:\n\ntests/test_dir/time:\n1d\n1h\n1m\n1s\n1y\nepoch\n"
  },
  {
    "path": "tests/gen/recursive_long_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --recurse --long --no-user --no-time --no-filesize --no-permissions\"\n"
  },
  {
    "path": "tests/gen/recursive_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/recursive_unix.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n\ntests/test_dir/git:\n001\n002\n003\n004\n005\n006\n007\n008\n009\n010\n\ntests/test_dir/git/001:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/002:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/003:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/004:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/005:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/006:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/007:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/008:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/009:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/010:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/grid:\n0001\n0002\n0003\n0004\n0005\n0006\n0007\n0008\n0009\n0010\n0011\n0012\n0013\n0014\n0015\n0016\n0017\n0018\n0019\n0020\n0021\n0022\n0023\n0024\n0025\n0026\n0027\n0028\n0029\n0030\n0031\n0032\n0033\n0034\n0035\n0036\n0037\n0038\n0039\n0040\n0041\n0042\n0043\n0044\n0045\n0046\n0047\n0048\n0049\n0050\n0051\n0052\n0053\n0054\n0055\n0056\n0057\n0058\n0059\n0060\n0061\n0062\n0063\n0064\n0065\n0066\n0067\n0068\n0069\n0070\n0071\n0072\n0073\n0074\n0075\n0076\n0077\n0078\n0079\n0080\n0081\n0082\n0083\n0084\n0085\n0086\n0087\n0088\n0089\n0090\n0091\n0092\n0093\n0094\n0095\n0096\n0097\n0098\n0099\n0100\n0101\n0102\n0103\n0104\n0105\n0106\n0107\n0108\n0109\n0110\n0111\n0112\n0113\n0114\n0115\n0116\n0117\n0118\n0119\n0120\n0121\n0122\n0123\n0124\n0125\n0126\n0127\n0128\n0129\n0130\n0131\n0132\n0133\n0134\n0135\n0136\n0137\n0138\n0139\n0140\n0141\n0142\n0143\n0144\n0145\n0146\n0147\n0148\n0149\n0150\n0151\n0152\n0153\n0154\n0155\n0156\n0157\n0158\n0159\n0160\n0161\n0162\n0163\n0164\n0165\n0166\n0167\n0168\n0169\n0170\n0171\n0172\n0173\n0174\n0175\n0176\n0177\n0178\n0179\n0180\n0181\n0182\n0183\n0184\n0185\n0186\n0187\n0188\n0189\n0190\n0191\n0192\n0193\n0194\n0195\n0196\n0197\n0198\n0199\n0200\n0201\n0202\n0203\n0204\n0205\n0206\n0207\n0208\n0209\n0210\n0211\n0212\n0213\n0214\n0215\n0216\n0217\n0218\n0219\n0220\n0221\n0222\n0223\n0224\n0225\n0226\n0227\n0228\n0229\n0230\n0231\n0232\n0233\n0234\n0235\n0236\n0237\n0238\n0239\n0240\n0241\n0242\n0243\n0244\n0245\n0246\n0247\n0248\n0249\n0250\n0251\n0252\n0253\n0254\n0255\n0256\n0257\n0258\n0259\n0260\n0261\n0262\n0263\n0264\n0265\n0266\n0267\n0268\n0269\n0270\n0271\n0272\n0273\n0274\n0275\n0276\n0277\n0278\n0279\n0280\n0281\n0282\n0283\n0284\n0285\n0286\n0287\n0288\n0289\n0290\n0291\n0292\n0293\n0294\n0295\n0296\n0297\n0298\n0299\n0300\n0301\n0302\n0303\n0304\n0305\n0306\n0307\n0308\n0309\n0310\n0311\n0312\n0313\n0314\n0315\n0316\n0317\n0318\n0319\n0320\n0321\n0322\n0323\n0324\n0325\n0326\n0327\n0328\n0329\n0330\n0331\n0332\n0333\n0334\n0335\n0336\n0337\n0338\n0339\n0340\n0341\n0342\n0343\n0344\n0345\n0346\n0347\n0348\n0349\n0350\n0351\n0352\n0353\n0354\n0355\n0356\n0357\n0358\n0359\n0360\n0361\n0362\n0363\n0364\n0365\n0366\n0367\n0368\n0369\n0370\n0371\n0372\n0373\n0374\n0375\n0376\n0377\n0378\n0379\n0380\n0381\n0382\n0383\n0384\n0385\n0386\n0387\n0388\n0389\n0390\n0391\n0392\n0393\n0394\n0395\n0396\n0397\n0398\n0399\n0400\n0401\n0402\n0403\n0404\n0405\n0406\n0407\n0408\n0409\n0410\n0411\n0412\n0413\n0414\n0415\n0416\n0417\n0418\n0419\n0420\n0421\n0422\n0423\n0424\n0425\n0426\n0427\n0428\n0429\n0430\n0431\n0432\n0433\n0434\n0435\n0436\n0437\n0438\n0439\n0440\n0441\n0442\n0443\n0444\n0445\n0446\n0447\n0448\n0449\n0450\n0451\n0452\n0453\n0454\n0455\n0456\n0457\n0458\n0459\n0460\n0461\n0462\n0463\n0464\n0465\n0466\n0467\n0468\n0469\n0470\n0471\n0472\n0473\n0474\n0475\n0476\n0477\n0478\n0479\n0480\n0481\n0482\n0483\n0484\n0485\n0486\n0487\n0488\n0489\n0490\n0491\n0492\n0493\n0494\n0495\n0496\n0497\n0498\n0499\n0500\n0501\n0502\n0503\n0504\n0505\n0506\n0507\n0508\n0509\n0510\n0511\n0512\n0513\n0514\n0515\n0516\n0517\n0518\n0519\n0520\n0521\n0522\n0523\n0524\n0525\n0526\n0527\n0528\n0529\n0530\n0531\n0532\n0533\n0534\n0535\n0536\n0537\n0538\n0539\n0540\n0541\n0542\n0543\n0544\n0545\n0546\n0547\n0548\n0549\n0550\n0551\n0552\n0553\n0554\n0555\n0556\n0557\n0558\n0559\n0560\n0561\n0562\n0563\n0564\n0565\n0566\n0567\n0568\n0569\n0570\n0571\n0572\n0573\n0574\n0575\n0576\n0577\n0578\n0579\n0580\n0581\n0582\n0583\n0584\n0585\n0586\n0587\n0588\n0589\n0590\n0591\n0592\n0593\n0594\n0595\n0596\n0597\n0598\n0599\n0600\n0601\n0602\n0603\n0604\n0605\n0606\n0607\n0608\n0609\n0610\n0611\n0612\n0613\n0614\n0615\n0616\n0617\n0618\n0619\n0620\n0621\n0622\n0623\n0624\n0625\n0626\n0627\n0628\n0629\n0630\n0631\n0632\n0633\n0634\n0635\n0636\n0637\n0638\n0639\n0640\n0641\n0642\n0643\n0644\n0645\n0646\n0647\n0648\n0649\n0650\n0651\n0652\n0653\n0654\n0655\n0656\n0657\n0658\n0659\n0660\n0661\n0662\n0663\n0664\n0665\n0666\n0667\n0668\n0669\n0670\n0671\n0672\n0673\n0674\n0675\n0676\n0677\n0678\n0679\n0680\n0681\n0682\n0683\n0684\n0685\n0686\n0687\n0688\n0689\n0690\n0691\n0692\n0693\n0694\n0695\n0696\n0697\n0698\n0699\n0700\n0701\n0702\n0703\n0704\n0705\n0706\n0707\n0708\n0709\n0710\n0711\n0712\n0713\n0714\n0715\n0716\n0717\n0718\n0719\n0720\n0721\n0722\n0723\n0724\n0725\n0726\n0727\n0728\n0729\n0730\n0731\n0732\n0733\n0734\n0735\n0736\n0737\n0738\n0739\n0740\n0741\n0742\n0743\n0744\n0745\n0746\n0747\n0748\n0749\n0750\n0751\n0752\n0753\n0754\n0755\n0756\n0757\n0758\n0759\n0760\n0761\n0762\n0763\n0764\n0765\n0766\n0767\n0768\n0769\n0770\n0771\n0772\n0773\n0774\n0775\n0776\n0777\n0778\n0779\n0780\n0781\n0782\n0783\n0784\n0785\n0786\n0787\n0788\n0789\n0790\n0791\n0792\n0793\n0794\n0795\n0796\n0797\n0798\n0799\n0800\n0801\n0802\n0803\n0804\n0805\n0806\n0807\n0808\n0809\n0810\n0811\n0812\n0813\n0814\n0815\n0816\n0817\n0818\n0819\n0820\n0821\n0822\n0823\n0824\n0825\n0826\n0827\n0828\n0829\n0830\n0831\n0832\n0833\n0834\n0835\n0836\n0837\n0838\n0839\n0840\n0841\n0842\n0843\n0844\n0845\n0846\n0847\n0848\n0849\n0850\n0851\n0852\n0853\n0854\n0855\n0856\n0857\n0858\n0859\n0860\n0861\n0862\n0863\n0864\n0865\n0866\n0867\n0868\n0869\n0870\n0871\n0872\n0873\n0874\n0875\n0876\n0877\n0878\n0879\n0880\n0881\n0882\n0883\n0884\n0885\n0886\n0887\n0888\n0889\n0890\n0891\n0892\n0893\n0894\n0895\n0896\n0897\n0898\n0899\n0900\n0901\n0902\n0903\n0904\n0905\n0906\n0907\n0908\n0909\n0910\n0911\n0912\n0913\n0914\n0915\n0916\n0917\n0918\n0919\n0920\n0921\n0922\n0923\n0924\n0925\n0926\n0927\n0928\n0929\n0930\n0931\n0932\n0933\n0934\n0935\n0936\n0937\n0938\n0939\n0940\n0941\n0942\n0943\n0944\n0945\n0946\n0947\n0948\n0949\n0950\n0951\n0952\n0953\n0954\n0955\n0956\n0957\n0958\n0959\n0960\n0961\n0962\n0963\n0964\n0965\n0966\n0967\n0968\n0969\n0970\n0971\n0972\n0973\n0974\n0975\n0976\n0977\n0978\n0979\n0980\n0981\n0982\n0983\n0984\n0985\n0986\n0987\n0988\n0989\n0990\n0991\n0992\n0993\n0994\n0995\n0996\n0997\n0998\n0999\n1000\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\nfile_010\nfile_011\nfile_012\nfile_013\nfile_014\nfile_015\nfile_016\nfile_017\nfile_018\nfile_019\nfile_020\nfile_021\nfile_022\nfile_023\nfile_024\nfile_025\nfile_026\nfile_027\nfile_028\nfile_029\nfile_030\nfile_031\nfile_032\nfile_033\nfile_034\nfile_035\nfile_036\nfile_037\nfile_038\nfile_039\nfile_040\nfile_041\nfile_042\nfile_043\nfile_044\nfile_045\nfile_046\nfile_047\nfile_048\nfile_049\nfile_050\nfile_051\nfile_052\nfile_053\nfile_054\nfile_055\nfile_056\nfile_057\nfile_058\nfile_059\nfile_060\nfile_061\nfile_062\nfile_063\nfile_064\nfile_065\nfile_066\nfile_067\nfile_068\nfile_069\nfile_070\nfile_071\nfile_072\nfile_073\nfile_074\nfile_075\nfile_076\nfile_077\nfile_078\nfile_079\nfile_080\nfile_081\nfile_082\nfile_083\nfile_084\nfile_085\nfile_086\nfile_087\nfile_088\nfile_089\nfile_090\nfile_091\nfile_092\nfile_093\nfile_094\nfile_095\nfile_096\nfile_097\nfile_098\nfile_099\nfile_100\nfile_101\nfile_102\nfile_103\nfile_104\nfile_105\nfile_106\nfile_107\nfile_108\nfile_109\nfile_110\nfile_111\nfile_112\nfile_113\nfile_114\nfile_115\nfile_116\nfile_117\nfile_118\nfile_119\nfile_120\nfile_121\nfile_122\nfile_123\nfile_124\nfile_125\nfile_126\nfile_127\nfile_128\nfile_129\nfile_130\nfile_131\nfile_132\nfile_133\nfile_134\nfile_135\nfile_136\nfile_137\nfile_138\nfile_139\nfile_140\nfile_141\nfile_142\nfile_143\nfile_144\nfile_145\nfile_146\nfile_147\nfile_148\nfile_149\nfile_150\nfile_151\nfile_152\nfile_153\nfile_154\nfile_155\nfile_156\nfile_157\nfile_158\nfile_159\nfile_160\nfile_161\nfile_162\nfile_163\nfile_164\nfile_165\nfile_166\nfile_167\nfile_168\nfile_169\nfile_170\nfile_171\nfile_172\nfile_173\nfile_174\nfile_175\nfile_176\nfile_177\nfile_178\nfile_179\nfile_180\nfile_181\nfile_182\nfile_183\nfile_184\nfile_185\nfile_186\nfile_187\nfile_188\nfile_189\nfile_190\nfile_191\nfile_192\nfile_193\nfile_194\nfile_195\nfile_196\nfile_197\nfile_198\nfile_199\nfile_200\nfile_201\nfile_202\nfile_203\nfile_204\nfile_205\nfile_206\nfile_207\nfile_208\nfile_209\nfile_210\nfile_211\nfile_212\nfile_213\nfile_214\nfile_215\nfile_216\nfile_217\nfile_218\nfile_219\nfile_220\nfile_221\nfile_222\nfile_223\nfile_224\nfile_225\nfile_226\nfile_227\nfile_228\nfile_229\nfile_230\nfile_231\nfile_232\nfile_233\nfile_234\nfile_235\nfile_236\nfile_237\nfile_238\nfile_239\nfile_240\nfile_241\nfile_242\nfile_243\nfile_244\nfile_245\nfile_246\nfile_247\nfile_248\nfile_249\nfile_250\nfile_251\nfile_252\nfile_253\nfile_254\nfile_255\nfile_256\nfile_257\nfile_258\nfile_259\nfile_260\nfile_261\nfile_262\nfile_263\nfile_264\nfile_265\nfile_266\nfile_267\nfile_268\nfile_269\nfile_270\nfile_271\nfile_272\nfile_273\nfile_274\nfile_275\nfile_276\nfile_277\nfile_278\nfile_279\nfile_280\nfile_281\nfile_282\nfile_283\nfile_284\nfile_285\nfile_286\nfile_287\nfile_288\nfile_289\nfile_290\nfile_291\nfile_292\nfile_293\nfile_294\nfile_295\nfile_296\nfile_297\nfile_298\nfile_299\nfile_300\nfile_301\nfile_302\nfile_303\nfile_304\nfile_305\nfile_306\nfile_307\nfile_308\nfile_309\nfile_310\nfile_311\nfile_312\nfile_313\nfile_314\nfile_315\nfile_316\nfile_317\nfile_318\nfile_319\nfile_320\nfile_321\nfile_322\nfile_323\nfile_324\nfile_325\nfile_326\nfile_327\nfile_328\nfile_329\nfile_330\nfile_331\nfile_332\nfile_333\nfile_334\nfile_335\nfile_336\nfile_337\nfile_338\nfile_339\nfile_340\nfile_341\nfile_342\nfile_343\nfile_344\nfile_345\nfile_346\nfile_347\nfile_348\nfile_349\nfile_350\nfile_351\nfile_352\nfile_353\nfile_354\nfile_355\nfile_356\nfile_357\nfile_358\nfile_359\nfile_360\nfile_361\nfile_362\nfile_363\nfile_364\nfile_365\nfile_366\nfile_367\nfile_368\nfile_369\nfile_370\nfile_371\nfile_372\nfile_373\nfile_374\nfile_375\nfile_376\nfile_377\nfile_378\nfile_379\nfile_380\nfile_381\nfile_382\nfile_383\nfile_384\nfile_385\nfile_386\nfile_387\nfile_388\nfile_389\nfile_390\nfile_391\nfile_392\nfile_393\nfile_394\nfile_395\nfile_396\nfile_397\nfile_398\nfile_399\nfile_400\nfile_401\nfile_402\nfile_403\nfile_404\nfile_405\nfile_406\nfile_407\nfile_408\nfile_409\nfile_410\nfile_411\nfile_412\nfile_413\nfile_414\nfile_415\nfile_416\nfile_417\nfile_418\nfile_419\nfile_420\nfile_421\nfile_422\nfile_423\nfile_424\nfile_425\nfile_426\nfile_427\nfile_428\nfile_429\nfile_430\nfile_431\nfile_432\nfile_433\nfile_434\nfile_435\nfile_436\nfile_437\nfile_438\nfile_439\nfile_440\nfile_441\nfile_442\nfile_443\nfile_444\nfile_445\nfile_446\nfile_447\nfile_448\nfile_449\nfile_450\nfile_451\nfile_452\nfile_453\nfile_454\nfile_455\nfile_456\nfile_457\nfile_458\nfile_459\nfile_460\nfile_461\nfile_462\nfile_463\nfile_464\nfile_465\nfile_466\nfile_467\nfile_468\nfile_469\nfile_470\nfile_471\nfile_472\nfile_473\nfile_474\nfile_475\nfile_476\nfile_477\nfile_478\nfile_479\nfile_480\nfile_481\nfile_482\nfile_483\nfile_484\nfile_485\nfile_486\nfile_487\nfile_488\nfile_489\nfile_490\nfile_491\nfile_492\nfile_493\nfile_494\nfile_495\nfile_496\nfile_497\nfile_498\nfile_499\nfile_500\nfile_501\nfile_502\nfile_503\nfile_504\nfile_505\nfile_506\nfile_507\nfile_508\nfile_509\nfile_510\nfile_511\nfile_512\nfile_513\nfile_514\nfile_515\nfile_516\nfile_517\nfile_518\nfile_519\nfile_520\nfile_521\nfile_522\nfile_523\nfile_524\nfile_525\nfile_526\nfile_527\nfile_528\nfile_529\nfile_530\nfile_531\nfile_532\nfile_533\nfile_534\nfile_535\nfile_536\nfile_537\nfile_538\nfile_539\nfile_540\nfile_541\nfile_542\nfile_543\nfile_544\nfile_545\nfile_546\nfile_547\nfile_548\nfile_549\nfile_550\nfile_551\nfile_552\nfile_553\nfile_554\nfile_555\nfile_556\nfile_557\nfile_558\nfile_559\nfile_560\nfile_561\nfile_562\nfile_563\nfile_564\nfile_565\nfile_566\nfile_567\nfile_568\nfile_569\nfile_570\nfile_571\nfile_572\nfile_573\nfile_574\nfile_575\nfile_576\nfile_577\nfile_578\nfile_579\nfile_580\nfile_581\nfile_582\nfile_583\nfile_584\nfile_585\nfile_586\nfile_587\nfile_588\nfile_589\nfile_590\nfile_591\nfile_592\nfile_593\nfile_594\nfile_595\nfile_596\nfile_597\nfile_598\nfile_599\nfile_600\nfile_601\nfile_602\nfile_603\nfile_604\nfile_605\nfile_606\nfile_607\nfile_608\nfile_609\nfile_610\nfile_611\nfile_612\nfile_613\nfile_614\nfile_615\nfile_616\nfile_617\nfile_618\nfile_619\nfile_620\nfile_621\nfile_622\nfile_623\nfile_624\nfile_625\nfile_626\nfile_627\nfile_628\nfile_629\nfile_630\nfile_631\nfile_632\nfile_633\nfile_634\nfile_635\nfile_636\nfile_637\nfile_638\nfile_639\nfile_640\nfile_641\nfile_642\nfile_643\nfile_644\nfile_645\nfile_646\nfile_647\nfile_648\nfile_649\nfile_650\nfile_651\nfile_652\nfile_653\nfile_654\nfile_655\nfile_656\nfile_657\nfile_658\nfile_659\nfile_660\nfile_661\nfile_662\nfile_663\nfile_664\nfile_665\nfile_666\nfile_667\nfile_668\nfile_669\nfile_670\nfile_671\nfile_672\nfile_673\nfile_674\nfile_675\nfile_676\nfile_677\nfile_678\nfile_679\nfile_680\nfile_681\nfile_682\nfile_683\nfile_684\nfile_685\nfile_686\nfile_687\nfile_688\nfile_689\nfile_690\nfile_691\nfile_692\nfile_693\nfile_694\nfile_695\nfile_696\nfile_697\nfile_698\nfile_699\nfile_700\nfile_701\nfile_702\nfile_703\nfile_704\nfile_705\nfile_706\nfile_707\nfile_708\nfile_709\nfile_710\nfile_711\nfile_712\nfile_713\nfile_714\nfile_715\nfile_716\nfile_717\nfile_718\nfile_719\nfile_720\nfile_721\nfile_722\nfile_723\nfile_724\nfile_725\nfile_726\nfile_727\nfile_728\nfile_729\nfile_730\nfile_731\nfile_732\nfile_733\nfile_734\nfile_735\nfile_736\nfile_737\nfile_738\nfile_739\nfile_740\nfile_741\nfile_742\nfile_743\nfile_744\nfile_745\nfile_746\nfile_747\nfile_748\nfile_749\nfile_750\nfile_751\nfile_752\nfile_753\nfile_754\nfile_755\nfile_756\nfile_757\nfile_758\nfile_759\nfile_760\nfile_761\nfile_762\nfile_763\nfile_764\nfile_765\nfile_766\nfile_767\nfile_768\nfile_769\nfile_770\nfile_771\nfile_772\nfile_773\nfile_774\nfile_775\nfile_776\nfile_777\nfile_778\nfile_779\nfile_780\nfile_781\nfile_782\nfile_783\nfile_784\nfile_785\nfile_786\nfile_787\nfile_788\nfile_789\nfile_790\nfile_791\nfile_792\nfile_793\nfile_794\nfile_795\nfile_796\nfile_797\nfile_798\nfile_799\nfile_800\nfile_801\nfile_802\nfile_803\nfile_804\nfile_805\nfile_806\nfile_807\nfile_808\nfile_809\nfile_810\nfile_811\nfile_812\nfile_813\nfile_814\nfile_815\nfile_816\nfile_817\nfile_818\nfile_819\nfile_820\nfile_821\nfile_822\nfile_823\nfile_824\nfile_825\nfile_826\nfile_827\nfile_828\nfile_829\nfile_830\nfile_831\nfile_832\nfile_833\nfile_834\nfile_835\nfile_836\nfile_837\nfile_838\nfile_839\nfile_840\nfile_841\nfile_842\nfile_843\nfile_844\nfile_845\nfile_846\nfile_847\nfile_848\nfile_849\nfile_850\nfile_851\nfile_852\nfile_853\nfile_854\nfile_855\nfile_856\nfile_857\nfile_858\nfile_859\nfile_860\nfile_861\nfile_862\nfile_863\nfile_864\nfile_865\nfile_866\nfile_867\nfile_868\nfile_869\nfile_870\nfile_871\nfile_872\nfile_873\nfile_874\nfile_875\nfile_876\nfile_877\nfile_878\nfile_879\nfile_880\nfile_881\nfile_882\nfile_883\nfile_884\nfile_885\nfile_886\nfile_887\nfile_888\nfile_889\nfile_890\nfile_891\nfile_892\nfile_893\nfile_894\nfile_895\nfile_896\nfile_897\nfile_898\nfile_899\nfile_900\nfile_901\nfile_902\nfile_903\nfile_904\nfile_905\nfile_906\nfile_907\nfile_908\nfile_909\nfile_910\nfile_911\nfile_912\nfile_913\nfile_914\nfile_915\nfile_916\nfile_917\nfile_918\nfile_919\nfile_920\nfile_921\nfile_922\nfile_923\nfile_924\nfile_925\nfile_926\nfile_927\nfile_928\nfile_929\nfile_930\nfile_931\nfile_932\nfile_933\nfile_934\nfile_935\nfile_936\nfile_937\nfile_938\nfile_939\nfile_940\nfile_941\nfile_942\nfile_943\nfile_944\nfile_945\nfile_946\nfile_947\nfile_948\nfile_949\nfile_950\nfile_951\nfile_952\nfile_953\nfile_954\nfile_955\nfile_956\nfile_957\nfile_958\nfile_959\nfile_960\nfile_961\nfile_962\nfile_963\nfile_964\nfile_965\nfile_966\nfile_967\nfile_968\nfile_969\nfile_970\nfile_971\nfile_972\nfile_973\nfile_974\nfile_975\nfile_976\nfile_977\nfile_978\nfile_979\nfile_980\nfile_981\nfile_982\nfile_983\nfile_984\nfile_985\nfile_986\nfile_987\nfile_988\nfile_989\nfile_990\nfile_991\nfile_992\nfile_993\nfile_994\nfile_995\nfile_996\nfile_997\nfile_998\nfile_999\n\ntests/test_dir/grid/0001:\n\ntests/test_dir/grid/0002:\n\ntests/test_dir/grid/0003:\n\ntests/test_dir/grid/0004:\n\ntests/test_dir/grid/0005:\n\ntests/test_dir/grid/0006:\n\ntests/test_dir/grid/0007:\n\ntests/test_dir/grid/0008:\n\ntests/test_dir/grid/0009:\n\ntests/test_dir/grid/0010:\n\ntests/test_dir/grid/0011:\n\ntests/test_dir/grid/0012:\n\ntests/test_dir/grid/0013:\n\ntests/test_dir/grid/0014:\n\ntests/test_dir/grid/0015:\n\ntests/test_dir/grid/0016:\n\ntests/test_dir/grid/0017:\n\ntests/test_dir/grid/0018:\n\ntests/test_dir/grid/0019:\n\ntests/test_dir/grid/0020:\n\ntests/test_dir/grid/0021:\n\ntests/test_dir/grid/0022:\n\ntests/test_dir/grid/0023:\n\ntests/test_dir/grid/0024:\n\ntests/test_dir/grid/0025:\n\ntests/test_dir/grid/0026:\n\ntests/test_dir/grid/0027:\n\ntests/test_dir/grid/0028:\n\ntests/test_dir/grid/0029:\n\ntests/test_dir/grid/0030:\n\ntests/test_dir/grid/0031:\n\ntests/test_dir/grid/0032:\n\ntests/test_dir/grid/0033:\n\ntests/test_dir/grid/0034:\n\ntests/test_dir/grid/0035:\n\ntests/test_dir/grid/0036:\n\ntests/test_dir/grid/0037:\n\ntests/test_dir/grid/0038:\n\ntests/test_dir/grid/0039:\n\ntests/test_dir/grid/0040:\n\ntests/test_dir/grid/0041:\n\ntests/test_dir/grid/0042:\n\ntests/test_dir/grid/0043:\n\ntests/test_dir/grid/0044:\n\ntests/test_dir/grid/0045:\n\ntests/test_dir/grid/0046:\n\ntests/test_dir/grid/0047:\n\ntests/test_dir/grid/0048:\n\ntests/test_dir/grid/0049:\n\ntests/test_dir/grid/0050:\n\ntests/test_dir/grid/0051:\n\ntests/test_dir/grid/0052:\n\ntests/test_dir/grid/0053:\n\ntests/test_dir/grid/0054:\n\ntests/test_dir/grid/0055:\n\ntests/test_dir/grid/0056:\n\ntests/test_dir/grid/0057:\n\ntests/test_dir/grid/0058:\n\ntests/test_dir/grid/0059:\n\ntests/test_dir/grid/0060:\n\ntests/test_dir/grid/0061:\n\ntests/test_dir/grid/0062:\n\ntests/test_dir/grid/0063:\n\ntests/test_dir/grid/0064:\n\ntests/test_dir/grid/0065:\n\ntests/test_dir/grid/0066:\n\ntests/test_dir/grid/0067:\n\ntests/test_dir/grid/0068:\n\ntests/test_dir/grid/0069:\n\ntests/test_dir/grid/0070:\n\ntests/test_dir/grid/0071:\n\ntests/test_dir/grid/0072:\n\ntests/test_dir/grid/0073:\n\ntests/test_dir/grid/0074:\n\ntests/test_dir/grid/0075:\n\ntests/test_dir/grid/0076:\n\ntests/test_dir/grid/0077:\n\ntests/test_dir/grid/0078:\n\ntests/test_dir/grid/0079:\n\ntests/test_dir/grid/0080:\n\ntests/test_dir/grid/0081:\n\ntests/test_dir/grid/0082:\n\ntests/test_dir/grid/0083:\n\ntests/test_dir/grid/0084:\n\ntests/test_dir/grid/0085:\n\ntests/test_dir/grid/0086:\n\ntests/test_dir/grid/0087:\n\ntests/test_dir/grid/0088:\n\ntests/test_dir/grid/0089:\n\ntests/test_dir/grid/0090:\n\ntests/test_dir/grid/0091:\n\ntests/test_dir/grid/0092:\n\ntests/test_dir/grid/0093:\n\ntests/test_dir/grid/0094:\n\ntests/test_dir/grid/0095:\n\ntests/test_dir/grid/0096:\n\ntests/test_dir/grid/0097:\n\ntests/test_dir/grid/0098:\n\ntests/test_dir/grid/0099:\n\ntests/test_dir/grid/0100:\n\ntests/test_dir/grid/0101:\n\ntests/test_dir/grid/0102:\n\ntests/test_dir/grid/0103:\n\ntests/test_dir/grid/0104:\n\ntests/test_dir/grid/0105:\n\ntests/test_dir/grid/0106:\n\ntests/test_dir/grid/0107:\n\ntests/test_dir/grid/0108:\n\ntests/test_dir/grid/0109:\n\ntests/test_dir/grid/0110:\n\ntests/test_dir/grid/0111:\n\ntests/test_dir/grid/0112:\n\ntests/test_dir/grid/0113:\n\ntests/test_dir/grid/0114:\n\ntests/test_dir/grid/0115:\n\ntests/test_dir/grid/0116:\n\ntests/test_dir/grid/0117:\n\ntests/test_dir/grid/0118:\n\ntests/test_dir/grid/0119:\n\ntests/test_dir/grid/0120:\n\ntests/test_dir/grid/0121:\n\ntests/test_dir/grid/0122:\n\ntests/test_dir/grid/0123:\n\ntests/test_dir/grid/0124:\n\ntests/test_dir/grid/0125:\n\ntests/test_dir/grid/0126:\n\ntests/test_dir/grid/0127:\n\ntests/test_dir/grid/0128:\n\ntests/test_dir/grid/0129:\n\ntests/test_dir/grid/0130:\n\ntests/test_dir/grid/0131:\n\ntests/test_dir/grid/0132:\n\ntests/test_dir/grid/0133:\n\ntests/test_dir/grid/0134:\n\ntests/test_dir/grid/0135:\n\ntests/test_dir/grid/0136:\n\ntests/test_dir/grid/0137:\n\ntests/test_dir/grid/0138:\n\ntests/test_dir/grid/0139:\n\ntests/test_dir/grid/0140:\n\ntests/test_dir/grid/0141:\n\ntests/test_dir/grid/0142:\n\ntests/test_dir/grid/0143:\n\ntests/test_dir/grid/0144:\n\ntests/test_dir/grid/0145:\n\ntests/test_dir/grid/0146:\n\ntests/test_dir/grid/0147:\n\ntests/test_dir/grid/0148:\n\ntests/test_dir/grid/0149:\n\ntests/test_dir/grid/0150:\n\ntests/test_dir/grid/0151:\n\ntests/test_dir/grid/0152:\n\ntests/test_dir/grid/0153:\n\ntests/test_dir/grid/0154:\n\ntests/test_dir/grid/0155:\n\ntests/test_dir/grid/0156:\n\ntests/test_dir/grid/0157:\n\ntests/test_dir/grid/0158:\n\ntests/test_dir/grid/0159:\n\ntests/test_dir/grid/0160:\n\ntests/test_dir/grid/0161:\n\ntests/test_dir/grid/0162:\n\ntests/test_dir/grid/0163:\n\ntests/test_dir/grid/0164:\n\ntests/test_dir/grid/0165:\n\ntests/test_dir/grid/0166:\n\ntests/test_dir/grid/0167:\n\ntests/test_dir/grid/0168:\n\ntests/test_dir/grid/0169:\n\ntests/test_dir/grid/0170:\n\ntests/test_dir/grid/0171:\n\ntests/test_dir/grid/0172:\n\ntests/test_dir/grid/0173:\n\ntests/test_dir/grid/0174:\n\ntests/test_dir/grid/0175:\n\ntests/test_dir/grid/0176:\n\ntests/test_dir/grid/0177:\n\ntests/test_dir/grid/0178:\n\ntests/test_dir/grid/0179:\n\ntests/test_dir/grid/0180:\n\ntests/test_dir/grid/0181:\n\ntests/test_dir/grid/0182:\n\ntests/test_dir/grid/0183:\n\ntests/test_dir/grid/0184:\n\ntests/test_dir/grid/0185:\n\ntests/test_dir/grid/0186:\n\ntests/test_dir/grid/0187:\n\ntests/test_dir/grid/0188:\n\ntests/test_dir/grid/0189:\n\ntests/test_dir/grid/0190:\n\ntests/test_dir/grid/0191:\n\ntests/test_dir/grid/0192:\n\ntests/test_dir/grid/0193:\n\ntests/test_dir/grid/0194:\n\ntests/test_dir/grid/0195:\n\ntests/test_dir/grid/0196:\n\ntests/test_dir/grid/0197:\n\ntests/test_dir/grid/0198:\n\ntests/test_dir/grid/0199:\n\ntests/test_dir/grid/0200:\n\ntests/test_dir/grid/0201:\n\ntests/test_dir/grid/0202:\n\ntests/test_dir/grid/0203:\n\ntests/test_dir/grid/0204:\n\ntests/test_dir/grid/0205:\n\ntests/test_dir/grid/0206:\n\ntests/test_dir/grid/0207:\n\ntests/test_dir/grid/0208:\n\ntests/test_dir/grid/0209:\n\ntests/test_dir/grid/0210:\n\ntests/test_dir/grid/0211:\n\ntests/test_dir/grid/0212:\n\ntests/test_dir/grid/0213:\n\ntests/test_dir/grid/0214:\n\ntests/test_dir/grid/0215:\n\ntests/test_dir/grid/0216:\n\ntests/test_dir/grid/0217:\n\ntests/test_dir/grid/0218:\n\ntests/test_dir/grid/0219:\n\ntests/test_dir/grid/0220:\n\ntests/test_dir/grid/0221:\n\ntests/test_dir/grid/0222:\n\ntests/test_dir/grid/0223:\n\ntests/test_dir/grid/0224:\n\ntests/test_dir/grid/0225:\n\ntests/test_dir/grid/0226:\n\ntests/test_dir/grid/0227:\n\ntests/test_dir/grid/0228:\n\ntests/test_dir/grid/0229:\n\ntests/test_dir/grid/0230:\n\ntests/test_dir/grid/0231:\n\ntests/test_dir/grid/0232:\n\ntests/test_dir/grid/0233:\n\ntests/test_dir/grid/0234:\n\ntests/test_dir/grid/0235:\n\ntests/test_dir/grid/0236:\n\ntests/test_dir/grid/0237:\n\ntests/test_dir/grid/0238:\n\ntests/test_dir/grid/0239:\n\ntests/test_dir/grid/0240:\n\ntests/test_dir/grid/0241:\n\ntests/test_dir/grid/0242:\n\ntests/test_dir/grid/0243:\n\ntests/test_dir/grid/0244:\n\ntests/test_dir/grid/0245:\n\ntests/test_dir/grid/0246:\n\ntests/test_dir/grid/0247:\n\ntests/test_dir/grid/0248:\n\ntests/test_dir/grid/0249:\n\ntests/test_dir/grid/0250:\n\ntests/test_dir/grid/0251:\n\ntests/test_dir/grid/0252:\n\ntests/test_dir/grid/0253:\n\ntests/test_dir/grid/0254:\n\ntests/test_dir/grid/0255:\n\ntests/test_dir/grid/0256:\n\ntests/test_dir/grid/0257:\n\ntests/test_dir/grid/0258:\n\ntests/test_dir/grid/0259:\n\ntests/test_dir/grid/0260:\n\ntests/test_dir/grid/0261:\n\ntests/test_dir/grid/0262:\n\ntests/test_dir/grid/0263:\n\ntests/test_dir/grid/0264:\n\ntests/test_dir/grid/0265:\n\ntests/test_dir/grid/0266:\n\ntests/test_dir/grid/0267:\n\ntests/test_dir/grid/0268:\n\ntests/test_dir/grid/0269:\n\ntests/test_dir/grid/0270:\n\ntests/test_dir/grid/0271:\n\ntests/test_dir/grid/0272:\n\ntests/test_dir/grid/0273:\n\ntests/test_dir/grid/0274:\n\ntests/test_dir/grid/0275:\n\ntests/test_dir/grid/0276:\n\ntests/test_dir/grid/0277:\n\ntests/test_dir/grid/0278:\n\ntests/test_dir/grid/0279:\n\ntests/test_dir/grid/0280:\n\ntests/test_dir/grid/0281:\n\ntests/test_dir/grid/0282:\n\ntests/test_dir/grid/0283:\n\ntests/test_dir/grid/0284:\n\ntests/test_dir/grid/0285:\n\ntests/test_dir/grid/0286:\n\ntests/test_dir/grid/0287:\n\ntests/test_dir/grid/0288:\n\ntests/test_dir/grid/0289:\n\ntests/test_dir/grid/0290:\n\ntests/test_dir/grid/0291:\n\ntests/test_dir/grid/0292:\n\ntests/test_dir/grid/0293:\n\ntests/test_dir/grid/0294:\n\ntests/test_dir/grid/0295:\n\ntests/test_dir/grid/0296:\n\ntests/test_dir/grid/0297:\n\ntests/test_dir/grid/0298:\n\ntests/test_dir/grid/0299:\n\ntests/test_dir/grid/0300:\n\ntests/test_dir/grid/0301:\n\ntests/test_dir/grid/0302:\n\ntests/test_dir/grid/0303:\n\ntests/test_dir/grid/0304:\n\ntests/test_dir/grid/0305:\n\ntests/test_dir/grid/0306:\n\ntests/test_dir/grid/0307:\n\ntests/test_dir/grid/0308:\n\ntests/test_dir/grid/0309:\n\ntests/test_dir/grid/0310:\n\ntests/test_dir/grid/0311:\n\ntests/test_dir/grid/0312:\n\ntests/test_dir/grid/0313:\n\ntests/test_dir/grid/0314:\n\ntests/test_dir/grid/0315:\n\ntests/test_dir/grid/0316:\n\ntests/test_dir/grid/0317:\n\ntests/test_dir/grid/0318:\n\ntests/test_dir/grid/0319:\n\ntests/test_dir/grid/0320:\n\ntests/test_dir/grid/0321:\n\ntests/test_dir/grid/0322:\n\ntests/test_dir/grid/0323:\n\ntests/test_dir/grid/0324:\n\ntests/test_dir/grid/0325:\n\ntests/test_dir/grid/0326:\n\ntests/test_dir/grid/0327:\n\ntests/test_dir/grid/0328:\n\ntests/test_dir/grid/0329:\n\ntests/test_dir/grid/0330:\n\ntests/test_dir/grid/0331:\n\ntests/test_dir/grid/0332:\n\ntests/test_dir/grid/0333:\n\ntests/test_dir/grid/0334:\n\ntests/test_dir/grid/0335:\n\ntests/test_dir/grid/0336:\n\ntests/test_dir/grid/0337:\n\ntests/test_dir/grid/0338:\n\ntests/test_dir/grid/0339:\n\ntests/test_dir/grid/0340:\n\ntests/test_dir/grid/0341:\n\ntests/test_dir/grid/0342:\n\ntests/test_dir/grid/0343:\n\ntests/test_dir/grid/0344:\n\ntests/test_dir/grid/0345:\n\ntests/test_dir/grid/0346:\n\ntests/test_dir/grid/0347:\n\ntests/test_dir/grid/0348:\n\ntests/test_dir/grid/0349:\n\ntests/test_dir/grid/0350:\n\ntests/test_dir/grid/0351:\n\ntests/test_dir/grid/0352:\n\ntests/test_dir/grid/0353:\n\ntests/test_dir/grid/0354:\n\ntests/test_dir/grid/0355:\n\ntests/test_dir/grid/0356:\n\ntests/test_dir/grid/0357:\n\ntests/test_dir/grid/0358:\n\ntests/test_dir/grid/0359:\n\ntests/test_dir/grid/0360:\n\ntests/test_dir/grid/0361:\n\ntests/test_dir/grid/0362:\n\ntests/test_dir/grid/0363:\n\ntests/test_dir/grid/0364:\n\ntests/test_dir/grid/0365:\n\ntests/test_dir/grid/0366:\n\ntests/test_dir/grid/0367:\n\ntests/test_dir/grid/0368:\n\ntests/test_dir/grid/0369:\n\ntests/test_dir/grid/0370:\n\ntests/test_dir/grid/0371:\n\ntests/test_dir/grid/0372:\n\ntests/test_dir/grid/0373:\n\ntests/test_dir/grid/0374:\n\ntests/test_dir/grid/0375:\n\ntests/test_dir/grid/0376:\n\ntests/test_dir/grid/0377:\n\ntests/test_dir/grid/0378:\n\ntests/test_dir/grid/0379:\n\ntests/test_dir/grid/0380:\n\ntests/test_dir/grid/0381:\n\ntests/test_dir/grid/0382:\n\ntests/test_dir/grid/0383:\n\ntests/test_dir/grid/0384:\n\ntests/test_dir/grid/0385:\n\ntests/test_dir/grid/0386:\n\ntests/test_dir/grid/0387:\n\ntests/test_dir/grid/0388:\n\ntests/test_dir/grid/0389:\n\ntests/test_dir/grid/0390:\n\ntests/test_dir/grid/0391:\n\ntests/test_dir/grid/0392:\n\ntests/test_dir/grid/0393:\n\ntests/test_dir/grid/0394:\n\ntests/test_dir/grid/0395:\n\ntests/test_dir/grid/0396:\n\ntests/test_dir/grid/0397:\n\ntests/test_dir/grid/0398:\n\ntests/test_dir/grid/0399:\n\ntests/test_dir/grid/0400:\n\ntests/test_dir/grid/0401:\n\ntests/test_dir/grid/0402:\n\ntests/test_dir/grid/0403:\n\ntests/test_dir/grid/0404:\n\ntests/test_dir/grid/0405:\n\ntests/test_dir/grid/0406:\n\ntests/test_dir/grid/0407:\n\ntests/test_dir/grid/0408:\n\ntests/test_dir/grid/0409:\n\ntests/test_dir/grid/0410:\n\ntests/test_dir/grid/0411:\n\ntests/test_dir/grid/0412:\n\ntests/test_dir/grid/0413:\n\ntests/test_dir/grid/0414:\n\ntests/test_dir/grid/0415:\n\ntests/test_dir/grid/0416:\n\ntests/test_dir/grid/0417:\n\ntests/test_dir/grid/0418:\n\ntests/test_dir/grid/0419:\n\ntests/test_dir/grid/0420:\n\ntests/test_dir/grid/0421:\n\ntests/test_dir/grid/0422:\n\ntests/test_dir/grid/0423:\n\ntests/test_dir/grid/0424:\n\ntests/test_dir/grid/0425:\n\ntests/test_dir/grid/0426:\n\ntests/test_dir/grid/0427:\n\ntests/test_dir/grid/0428:\n\ntests/test_dir/grid/0429:\n\ntests/test_dir/grid/0430:\n\ntests/test_dir/grid/0431:\n\ntests/test_dir/grid/0432:\n\ntests/test_dir/grid/0433:\n\ntests/test_dir/grid/0434:\n\ntests/test_dir/grid/0435:\n\ntests/test_dir/grid/0436:\n\ntests/test_dir/grid/0437:\n\ntests/test_dir/grid/0438:\n\ntests/test_dir/grid/0439:\n\ntests/test_dir/grid/0440:\n\ntests/test_dir/grid/0441:\n\ntests/test_dir/grid/0442:\n\ntests/test_dir/grid/0443:\n\ntests/test_dir/grid/0444:\n\ntests/test_dir/grid/0445:\n\ntests/test_dir/grid/0446:\n\ntests/test_dir/grid/0447:\n\ntests/test_dir/grid/0448:\n\ntests/test_dir/grid/0449:\n\ntests/test_dir/grid/0450:\n\ntests/test_dir/grid/0451:\n\ntests/test_dir/grid/0452:\n\ntests/test_dir/grid/0453:\n\ntests/test_dir/grid/0454:\n\ntests/test_dir/grid/0455:\n\ntests/test_dir/grid/0456:\n\ntests/test_dir/grid/0457:\n\ntests/test_dir/grid/0458:\n\ntests/test_dir/grid/0459:\n\ntests/test_dir/grid/0460:\n\ntests/test_dir/grid/0461:\n\ntests/test_dir/grid/0462:\n\ntests/test_dir/grid/0463:\n\ntests/test_dir/grid/0464:\n\ntests/test_dir/grid/0465:\n\ntests/test_dir/grid/0466:\n\ntests/test_dir/grid/0467:\n\ntests/test_dir/grid/0468:\n\ntests/test_dir/grid/0469:\n\ntests/test_dir/grid/0470:\n\ntests/test_dir/grid/0471:\n\ntests/test_dir/grid/0472:\n\ntests/test_dir/grid/0473:\n\ntests/test_dir/grid/0474:\n\ntests/test_dir/grid/0475:\n\ntests/test_dir/grid/0476:\n\ntests/test_dir/grid/0477:\n\ntests/test_dir/grid/0478:\n\ntests/test_dir/grid/0479:\n\ntests/test_dir/grid/0480:\n\ntests/test_dir/grid/0481:\n\ntests/test_dir/grid/0482:\n\ntests/test_dir/grid/0483:\n\ntests/test_dir/grid/0484:\n\ntests/test_dir/grid/0485:\n\ntests/test_dir/grid/0486:\n\ntests/test_dir/grid/0487:\n\ntests/test_dir/grid/0488:\n\ntests/test_dir/grid/0489:\n\ntests/test_dir/grid/0490:\n\ntests/test_dir/grid/0491:\n\ntests/test_dir/grid/0492:\n\ntests/test_dir/grid/0493:\n\ntests/test_dir/grid/0494:\n\ntests/test_dir/grid/0495:\n\ntests/test_dir/grid/0496:\n\ntests/test_dir/grid/0497:\n\ntests/test_dir/grid/0498:\n\ntests/test_dir/grid/0499:\n\ntests/test_dir/grid/0500:\n\ntests/test_dir/grid/0501:\n\ntests/test_dir/grid/0502:\n\ntests/test_dir/grid/0503:\n\ntests/test_dir/grid/0504:\n\ntests/test_dir/grid/0505:\n\ntests/test_dir/grid/0506:\n\ntests/test_dir/grid/0507:\n\ntests/test_dir/grid/0508:\n\ntests/test_dir/grid/0509:\n\ntests/test_dir/grid/0510:\n\ntests/test_dir/grid/0511:\n\ntests/test_dir/grid/0512:\n\ntests/test_dir/grid/0513:\n\ntests/test_dir/grid/0514:\n\ntests/test_dir/grid/0515:\n\ntests/test_dir/grid/0516:\n\ntests/test_dir/grid/0517:\n\ntests/test_dir/grid/0518:\n\ntests/test_dir/grid/0519:\n\ntests/test_dir/grid/0520:\n\ntests/test_dir/grid/0521:\n\ntests/test_dir/grid/0522:\n\ntests/test_dir/grid/0523:\n\ntests/test_dir/grid/0524:\n\ntests/test_dir/grid/0525:\n\ntests/test_dir/grid/0526:\n\ntests/test_dir/grid/0527:\n\ntests/test_dir/grid/0528:\n\ntests/test_dir/grid/0529:\n\ntests/test_dir/grid/0530:\n\ntests/test_dir/grid/0531:\n\ntests/test_dir/grid/0532:\n\ntests/test_dir/grid/0533:\n\ntests/test_dir/grid/0534:\n\ntests/test_dir/grid/0535:\n\ntests/test_dir/grid/0536:\n\ntests/test_dir/grid/0537:\n\ntests/test_dir/grid/0538:\n\ntests/test_dir/grid/0539:\n\ntests/test_dir/grid/0540:\n\ntests/test_dir/grid/0541:\n\ntests/test_dir/grid/0542:\n\ntests/test_dir/grid/0543:\n\ntests/test_dir/grid/0544:\n\ntests/test_dir/grid/0545:\n\ntests/test_dir/grid/0546:\n\ntests/test_dir/grid/0547:\n\ntests/test_dir/grid/0548:\n\ntests/test_dir/grid/0549:\n\ntests/test_dir/grid/0550:\n\ntests/test_dir/grid/0551:\n\ntests/test_dir/grid/0552:\n\ntests/test_dir/grid/0553:\n\ntests/test_dir/grid/0554:\n\ntests/test_dir/grid/0555:\n\ntests/test_dir/grid/0556:\n\ntests/test_dir/grid/0557:\n\ntests/test_dir/grid/0558:\n\ntests/test_dir/grid/0559:\n\ntests/test_dir/grid/0560:\n\ntests/test_dir/grid/0561:\n\ntests/test_dir/grid/0562:\n\ntests/test_dir/grid/0563:\n\ntests/test_dir/grid/0564:\n\ntests/test_dir/grid/0565:\n\ntests/test_dir/grid/0566:\n\ntests/test_dir/grid/0567:\n\ntests/test_dir/grid/0568:\n\ntests/test_dir/grid/0569:\n\ntests/test_dir/grid/0570:\n\ntests/test_dir/grid/0571:\n\ntests/test_dir/grid/0572:\n\ntests/test_dir/grid/0573:\n\ntests/test_dir/grid/0574:\n\ntests/test_dir/grid/0575:\n\ntests/test_dir/grid/0576:\n\ntests/test_dir/grid/0577:\n\ntests/test_dir/grid/0578:\n\ntests/test_dir/grid/0579:\n\ntests/test_dir/grid/0580:\n\ntests/test_dir/grid/0581:\n\ntests/test_dir/grid/0582:\n\ntests/test_dir/grid/0583:\n\ntests/test_dir/grid/0584:\n\ntests/test_dir/grid/0585:\n\ntests/test_dir/grid/0586:\n\ntests/test_dir/grid/0587:\n\ntests/test_dir/grid/0588:\n\ntests/test_dir/grid/0589:\n\ntests/test_dir/grid/0590:\n\ntests/test_dir/grid/0591:\n\ntests/test_dir/grid/0592:\n\ntests/test_dir/grid/0593:\n\ntests/test_dir/grid/0594:\n\ntests/test_dir/grid/0595:\n\ntests/test_dir/grid/0596:\n\ntests/test_dir/grid/0597:\n\ntests/test_dir/grid/0598:\n\ntests/test_dir/grid/0599:\n\ntests/test_dir/grid/0600:\n\ntests/test_dir/grid/0601:\n\ntests/test_dir/grid/0602:\n\ntests/test_dir/grid/0603:\n\ntests/test_dir/grid/0604:\n\ntests/test_dir/grid/0605:\n\ntests/test_dir/grid/0606:\n\ntests/test_dir/grid/0607:\n\ntests/test_dir/grid/0608:\n\ntests/test_dir/grid/0609:\n\ntests/test_dir/grid/0610:\n\ntests/test_dir/grid/0611:\n\ntests/test_dir/grid/0612:\n\ntests/test_dir/grid/0613:\n\ntests/test_dir/grid/0614:\n\ntests/test_dir/grid/0615:\n\ntests/test_dir/grid/0616:\n\ntests/test_dir/grid/0617:\n\ntests/test_dir/grid/0618:\n\ntests/test_dir/grid/0619:\n\ntests/test_dir/grid/0620:\n\ntests/test_dir/grid/0621:\n\ntests/test_dir/grid/0622:\n\ntests/test_dir/grid/0623:\n\ntests/test_dir/grid/0624:\n\ntests/test_dir/grid/0625:\n\ntests/test_dir/grid/0626:\n\ntests/test_dir/grid/0627:\n\ntests/test_dir/grid/0628:\n\ntests/test_dir/grid/0629:\n\ntests/test_dir/grid/0630:\n\ntests/test_dir/grid/0631:\n\ntests/test_dir/grid/0632:\n\ntests/test_dir/grid/0633:\n\ntests/test_dir/grid/0634:\n\ntests/test_dir/grid/0635:\n\ntests/test_dir/grid/0636:\n\ntests/test_dir/grid/0637:\n\ntests/test_dir/grid/0638:\n\ntests/test_dir/grid/0639:\n\ntests/test_dir/grid/0640:\n\ntests/test_dir/grid/0641:\n\ntests/test_dir/grid/0642:\n\ntests/test_dir/grid/0643:\n\ntests/test_dir/grid/0644:\n\ntests/test_dir/grid/0645:\n\ntests/test_dir/grid/0646:\n\ntests/test_dir/grid/0647:\n\ntests/test_dir/grid/0648:\n\ntests/test_dir/grid/0649:\n\ntests/test_dir/grid/0650:\n\ntests/test_dir/grid/0651:\n\ntests/test_dir/grid/0652:\n\ntests/test_dir/grid/0653:\n\ntests/test_dir/grid/0654:\n\ntests/test_dir/grid/0655:\n\ntests/test_dir/grid/0656:\n\ntests/test_dir/grid/0657:\n\ntests/test_dir/grid/0658:\n\ntests/test_dir/grid/0659:\n\ntests/test_dir/grid/0660:\n\ntests/test_dir/grid/0661:\n\ntests/test_dir/grid/0662:\n\ntests/test_dir/grid/0663:\n\ntests/test_dir/grid/0664:\n\ntests/test_dir/grid/0665:\n\ntests/test_dir/grid/0666:\n\ntests/test_dir/grid/0667:\n\ntests/test_dir/grid/0668:\n\ntests/test_dir/grid/0669:\n\ntests/test_dir/grid/0670:\n\ntests/test_dir/grid/0671:\n\ntests/test_dir/grid/0672:\n\ntests/test_dir/grid/0673:\n\ntests/test_dir/grid/0674:\n\ntests/test_dir/grid/0675:\n\ntests/test_dir/grid/0676:\n\ntests/test_dir/grid/0677:\n\ntests/test_dir/grid/0678:\n\ntests/test_dir/grid/0679:\n\ntests/test_dir/grid/0680:\n\ntests/test_dir/grid/0681:\n\ntests/test_dir/grid/0682:\n\ntests/test_dir/grid/0683:\n\ntests/test_dir/grid/0684:\n\ntests/test_dir/grid/0685:\n\ntests/test_dir/grid/0686:\n\ntests/test_dir/grid/0687:\n\ntests/test_dir/grid/0688:\n\ntests/test_dir/grid/0689:\n\ntests/test_dir/grid/0690:\n\ntests/test_dir/grid/0691:\n\ntests/test_dir/grid/0692:\n\ntests/test_dir/grid/0693:\n\ntests/test_dir/grid/0694:\n\ntests/test_dir/grid/0695:\n\ntests/test_dir/grid/0696:\n\ntests/test_dir/grid/0697:\n\ntests/test_dir/grid/0698:\n\ntests/test_dir/grid/0699:\n\ntests/test_dir/grid/0700:\n\ntests/test_dir/grid/0701:\n\ntests/test_dir/grid/0702:\n\ntests/test_dir/grid/0703:\n\ntests/test_dir/grid/0704:\n\ntests/test_dir/grid/0705:\n\ntests/test_dir/grid/0706:\n\ntests/test_dir/grid/0707:\n\ntests/test_dir/grid/0708:\n\ntests/test_dir/grid/0709:\n\ntests/test_dir/grid/0710:\n\ntests/test_dir/grid/0711:\n\ntests/test_dir/grid/0712:\n\ntests/test_dir/grid/0713:\n\ntests/test_dir/grid/0714:\n\ntests/test_dir/grid/0715:\n\ntests/test_dir/grid/0716:\n\ntests/test_dir/grid/0717:\n\ntests/test_dir/grid/0718:\n\ntests/test_dir/grid/0719:\n\ntests/test_dir/grid/0720:\n\ntests/test_dir/grid/0721:\n\ntests/test_dir/grid/0722:\n\ntests/test_dir/grid/0723:\n\ntests/test_dir/grid/0724:\n\ntests/test_dir/grid/0725:\n\ntests/test_dir/grid/0726:\n\ntests/test_dir/grid/0727:\n\ntests/test_dir/grid/0728:\n\ntests/test_dir/grid/0729:\n\ntests/test_dir/grid/0730:\n\ntests/test_dir/grid/0731:\n\ntests/test_dir/grid/0732:\n\ntests/test_dir/grid/0733:\n\ntests/test_dir/grid/0734:\n\ntests/test_dir/grid/0735:\n\ntests/test_dir/grid/0736:\n\ntests/test_dir/grid/0737:\n\ntests/test_dir/grid/0738:\n\ntests/test_dir/grid/0739:\n\ntests/test_dir/grid/0740:\n\ntests/test_dir/grid/0741:\n\ntests/test_dir/grid/0742:\n\ntests/test_dir/grid/0743:\n\ntests/test_dir/grid/0744:\n\ntests/test_dir/grid/0745:\n\ntests/test_dir/grid/0746:\n\ntests/test_dir/grid/0747:\n\ntests/test_dir/grid/0748:\n\ntests/test_dir/grid/0749:\n\ntests/test_dir/grid/0750:\n\ntests/test_dir/grid/0751:\n\ntests/test_dir/grid/0752:\n\ntests/test_dir/grid/0753:\n\ntests/test_dir/grid/0754:\n\ntests/test_dir/grid/0755:\n\ntests/test_dir/grid/0756:\n\ntests/test_dir/grid/0757:\n\ntests/test_dir/grid/0758:\n\ntests/test_dir/grid/0759:\n\ntests/test_dir/grid/0760:\n\ntests/test_dir/grid/0761:\n\ntests/test_dir/grid/0762:\n\ntests/test_dir/grid/0763:\n\ntests/test_dir/grid/0764:\n\ntests/test_dir/grid/0765:\n\ntests/test_dir/grid/0766:\n\ntests/test_dir/grid/0767:\n\ntests/test_dir/grid/0768:\n\ntests/test_dir/grid/0769:\n\ntests/test_dir/grid/0770:\n\ntests/test_dir/grid/0771:\n\ntests/test_dir/grid/0772:\n\ntests/test_dir/grid/0773:\n\ntests/test_dir/grid/0774:\n\ntests/test_dir/grid/0775:\n\ntests/test_dir/grid/0776:\n\ntests/test_dir/grid/0777:\n\ntests/test_dir/grid/0778:\n\ntests/test_dir/grid/0779:\n\ntests/test_dir/grid/0780:\n\ntests/test_dir/grid/0781:\n\ntests/test_dir/grid/0782:\n\ntests/test_dir/grid/0783:\n\ntests/test_dir/grid/0784:\n\ntests/test_dir/grid/0785:\n\ntests/test_dir/grid/0786:\n\ntests/test_dir/grid/0787:\n\ntests/test_dir/grid/0788:\n\ntests/test_dir/grid/0789:\n\ntests/test_dir/grid/0790:\n\ntests/test_dir/grid/0791:\n\ntests/test_dir/grid/0792:\n\ntests/test_dir/grid/0793:\n\ntests/test_dir/grid/0794:\n\ntests/test_dir/grid/0795:\n\ntests/test_dir/grid/0796:\n\ntests/test_dir/grid/0797:\n\ntests/test_dir/grid/0798:\n\ntests/test_dir/grid/0799:\n\ntests/test_dir/grid/0800:\n\ntests/test_dir/grid/0801:\n\ntests/test_dir/grid/0802:\n\ntests/test_dir/grid/0803:\n\ntests/test_dir/grid/0804:\n\ntests/test_dir/grid/0805:\n\ntests/test_dir/grid/0806:\n\ntests/test_dir/grid/0807:\n\ntests/test_dir/grid/0808:\n\ntests/test_dir/grid/0809:\n\ntests/test_dir/grid/0810:\n\ntests/test_dir/grid/0811:\n\ntests/test_dir/grid/0812:\n\ntests/test_dir/grid/0813:\n\ntests/test_dir/grid/0814:\n\ntests/test_dir/grid/0815:\n\ntests/test_dir/grid/0816:\n\ntests/test_dir/grid/0817:\n\ntests/test_dir/grid/0818:\n\ntests/test_dir/grid/0819:\n\ntests/test_dir/grid/0820:\n\ntests/test_dir/grid/0821:\n\ntests/test_dir/grid/0822:\n\ntests/test_dir/grid/0823:\n\ntests/test_dir/grid/0824:\n\ntests/test_dir/grid/0825:\n\ntests/test_dir/grid/0826:\n\ntests/test_dir/grid/0827:\n\ntests/test_dir/grid/0828:\n\ntests/test_dir/grid/0829:\n\ntests/test_dir/grid/0830:\n\ntests/test_dir/grid/0831:\n\ntests/test_dir/grid/0832:\n\ntests/test_dir/grid/0833:\n\ntests/test_dir/grid/0834:\n\ntests/test_dir/grid/0835:\n\ntests/test_dir/grid/0836:\n\ntests/test_dir/grid/0837:\n\ntests/test_dir/grid/0838:\n\ntests/test_dir/grid/0839:\n\ntests/test_dir/grid/0840:\n\ntests/test_dir/grid/0841:\n\ntests/test_dir/grid/0842:\n\ntests/test_dir/grid/0843:\n\ntests/test_dir/grid/0844:\n\ntests/test_dir/grid/0845:\n\ntests/test_dir/grid/0846:\n\ntests/test_dir/grid/0847:\n\ntests/test_dir/grid/0848:\n\ntests/test_dir/grid/0849:\n\ntests/test_dir/grid/0850:\n\ntests/test_dir/grid/0851:\n\ntests/test_dir/grid/0852:\n\ntests/test_dir/grid/0853:\n\ntests/test_dir/grid/0854:\n\ntests/test_dir/grid/0855:\n\ntests/test_dir/grid/0856:\n\ntests/test_dir/grid/0857:\n\ntests/test_dir/grid/0858:\n\ntests/test_dir/grid/0859:\n\ntests/test_dir/grid/0860:\n\ntests/test_dir/grid/0861:\n\ntests/test_dir/grid/0862:\n\ntests/test_dir/grid/0863:\n\ntests/test_dir/grid/0864:\n\ntests/test_dir/grid/0865:\n\ntests/test_dir/grid/0866:\n\ntests/test_dir/grid/0867:\n\ntests/test_dir/grid/0868:\n\ntests/test_dir/grid/0869:\n\ntests/test_dir/grid/0870:\n\ntests/test_dir/grid/0871:\n\ntests/test_dir/grid/0872:\n\ntests/test_dir/grid/0873:\n\ntests/test_dir/grid/0874:\n\ntests/test_dir/grid/0875:\n\ntests/test_dir/grid/0876:\n\ntests/test_dir/grid/0877:\n\ntests/test_dir/grid/0878:\n\ntests/test_dir/grid/0879:\n\ntests/test_dir/grid/0880:\n\ntests/test_dir/grid/0881:\n\ntests/test_dir/grid/0882:\n\ntests/test_dir/grid/0883:\n\ntests/test_dir/grid/0884:\n\ntests/test_dir/grid/0885:\n\ntests/test_dir/grid/0886:\n\ntests/test_dir/grid/0887:\n\ntests/test_dir/grid/0888:\n\ntests/test_dir/grid/0889:\n\ntests/test_dir/grid/0890:\n\ntests/test_dir/grid/0891:\n\ntests/test_dir/grid/0892:\n\ntests/test_dir/grid/0893:\n\ntests/test_dir/grid/0894:\n\ntests/test_dir/grid/0895:\n\ntests/test_dir/grid/0896:\n\ntests/test_dir/grid/0897:\n\ntests/test_dir/grid/0898:\n\ntests/test_dir/grid/0899:\n\ntests/test_dir/grid/0900:\n\ntests/test_dir/grid/0901:\n\ntests/test_dir/grid/0902:\n\ntests/test_dir/grid/0903:\n\ntests/test_dir/grid/0904:\n\ntests/test_dir/grid/0905:\n\ntests/test_dir/grid/0906:\n\ntests/test_dir/grid/0907:\n\ntests/test_dir/grid/0908:\n\ntests/test_dir/grid/0909:\n\ntests/test_dir/grid/0910:\n\ntests/test_dir/grid/0911:\n\ntests/test_dir/grid/0912:\n\ntests/test_dir/grid/0913:\n\ntests/test_dir/grid/0914:\n\ntests/test_dir/grid/0915:\n\ntests/test_dir/grid/0916:\n\ntests/test_dir/grid/0917:\n\ntests/test_dir/grid/0918:\n\ntests/test_dir/grid/0919:\n\ntests/test_dir/grid/0920:\n\ntests/test_dir/grid/0921:\n\ntests/test_dir/grid/0922:\n\ntests/test_dir/grid/0923:\n\ntests/test_dir/grid/0924:\n\ntests/test_dir/grid/0925:\n\ntests/test_dir/grid/0926:\n\ntests/test_dir/grid/0927:\n\ntests/test_dir/grid/0928:\n\ntests/test_dir/grid/0929:\n\ntests/test_dir/grid/0930:\n\ntests/test_dir/grid/0931:\n\ntests/test_dir/grid/0932:\n\ntests/test_dir/grid/0933:\n\ntests/test_dir/grid/0934:\n\ntests/test_dir/grid/0935:\n\ntests/test_dir/grid/0936:\n\ntests/test_dir/grid/0937:\n\ntests/test_dir/grid/0938:\n\ntests/test_dir/grid/0939:\n\ntests/test_dir/grid/0940:\n\ntests/test_dir/grid/0941:\n\ntests/test_dir/grid/0942:\n\ntests/test_dir/grid/0943:\n\ntests/test_dir/grid/0944:\n\ntests/test_dir/grid/0945:\n\ntests/test_dir/grid/0946:\n\ntests/test_dir/grid/0947:\n\ntests/test_dir/grid/0948:\n\ntests/test_dir/grid/0949:\n\ntests/test_dir/grid/0950:\n\ntests/test_dir/grid/0951:\n\ntests/test_dir/grid/0952:\n\ntests/test_dir/grid/0953:\n\ntests/test_dir/grid/0954:\n\ntests/test_dir/grid/0955:\n\ntests/test_dir/grid/0956:\n\ntests/test_dir/grid/0957:\n\ntests/test_dir/grid/0958:\n\ntests/test_dir/grid/0959:\n\ntests/test_dir/grid/0960:\n\ntests/test_dir/grid/0961:\n\ntests/test_dir/grid/0962:\n\ntests/test_dir/grid/0963:\n\ntests/test_dir/grid/0964:\n\ntests/test_dir/grid/0965:\n\ntests/test_dir/grid/0966:\n\ntests/test_dir/grid/0967:\n\ntests/test_dir/grid/0968:\n\ntests/test_dir/grid/0969:\n\ntests/test_dir/grid/0970:\n\ntests/test_dir/grid/0971:\n\ntests/test_dir/grid/0972:\n\ntests/test_dir/grid/0973:\n\ntests/test_dir/grid/0974:\n\ntests/test_dir/grid/0975:\n\ntests/test_dir/grid/0976:\n\ntests/test_dir/grid/0977:\n\ntests/test_dir/grid/0978:\n\ntests/test_dir/grid/0979:\n\ntests/test_dir/grid/0980:\n\ntests/test_dir/grid/0981:\n\ntests/test_dir/grid/0982:\n\ntests/test_dir/grid/0983:\n\ntests/test_dir/grid/0984:\n\ntests/test_dir/grid/0985:\n\ntests/test_dir/grid/0986:\n\ntests/test_dir/grid/0987:\n\ntests/test_dir/grid/0988:\n\ntests/test_dir/grid/0989:\n\ntests/test_dir/grid/0990:\n\ntests/test_dir/grid/0991:\n\ntests/test_dir/grid/0992:\n\ntests/test_dir/grid/0993:\n\ntests/test_dir/grid/0994:\n\ntests/test_dir/grid/0995:\n\ntests/test_dir/grid/0996:\n\ntests/test_dir/grid/0997:\n\ntests/test_dir/grid/0998:\n\ntests/test_dir/grid/0999:\n\ntests/test_dir/grid/1000:\n\ntests/test_dir/group:\nfile\n\ntests/test_dir/icons:\nc++.cpp\nc.c\ncss.css\nfile\ngo.go\nhtml.html\njava.java\njavascript.js\nman.1\nmarked.md\nphp.php\npython.py\nruby.rb\nrust.rs\nshell.sh\nunknown.unknown\n\ntests/test_dir/perms:\nfile\nfile2\n\ntests/test_dir/size:\n1B\n1K\n1M\n1337\n\ntests/test_dir/specials:\n\ntests/test_dir/symlinks:\ndir\nfile\n' lorem ipsum'\nsymlink -> file\nsymlink2 -> symlink\nsymlink3 -> dir\nsymlink4 -> pipitek\n\ntests/test_dir/symlinks/dir:\n\ntests/test_dir/time:\n1d\n1h\n1m\n1s\n1y\nepoch\n"
  },
  {
    "path": "tests/gen/recursive_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --recurse\"\n"
  },
  {
    "path": "tests/gen/tree_long_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/tree_long_unix.stdout",
    "content": "tests/test_dir\n├── git\n│   ├── 001\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 002\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 003\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 004\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 005\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 006\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 007\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 008\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 009\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   └── 010\n│       ├── file_000\n│       ├── file_001\n│       ├── file_002\n│       ├── file_003\n│       ├── file_004\n│       ├── file_005\n│       ├── file_006\n│       ├── file_007\n│       ├── file_008\n│       └── file_009\n├── grid\n│   ├── 0001\n│   ├── 0002\n│   ├── 0003\n│   ├── 0004\n│   ├── 0005\n│   ├── 0006\n│   ├── 0007\n│   ├── 0008\n│   ├── 0009\n│   ├── 0010\n│   ├── 0011\n│   ├── 0012\n│   ├── 0013\n│   ├── 0014\n│   ├── 0015\n│   ├── 0016\n│   ├── 0017\n│   ├── 0018\n│   ├── 0019\n│   ├── 0020\n│   ├── 0021\n│   ├── 0022\n│   ├── 0023\n│   ├── 0024\n│   ├── 0025\n│   ├── 0026\n│   ├── 0027\n│   ├── 0028\n│   ├── 0029\n│   ├── 0030\n│   ├── 0031\n│   ├── 0032\n│   ├── 0033\n│   ├── 0034\n│   ├── 0035\n│   ├── 0036\n│   ├── 0037\n│   ├── 0038\n│   ├── 0039\n│   ├── 0040\n│   ├── 0041\n│   ├── 0042\n│   ├── 0043\n│   ├── 0044\n│   ├── 0045\n│   ├── 0046\n│   ├── 0047\n│   ├── 0048\n│   ├── 0049\n│   ├── 0050\n│   ├── 0051\n│   ├── 0052\n│   ├── 0053\n│   ├── 0054\n│   ├── 0055\n│   ├── 0056\n│   ├── 0057\n│   ├── 0058\n│   ├── 0059\n│   ├── 0060\n│   ├── 0061\n│   ├── 0062\n│   ├── 0063\n│   ├── 0064\n│   ├── 0065\n│   ├── 0066\n│   ├── 0067\n│   ├── 0068\n│   ├── 0069\n│   ├── 0070\n│   ├── 0071\n│   ├── 0072\n│   ├── 0073\n│   ├── 0074\n│   ├── 0075\n│   ├── 0076\n│   ├── 0077\n│   ├── 0078\n│   ├── 0079\n│   ├── 0080\n│   ├── 0081\n│   ├── 0082\n│   ├── 0083\n│   ├── 0084\n│   ├── 0085\n│   ├── 0086\n│   ├── 0087\n│   ├── 0088\n│   ├── 0089\n│   ├── 0090\n│   ├── 0091\n│   ├── 0092\n│   ├── 0093\n│   ├── 0094\n│   ├── 0095\n│   ├── 0096\n│   ├── 0097\n│   ├── 0098\n│   ├── 0099\n│   ├── 0100\n│   ├── 0101\n│   ├── 0102\n│   ├── 0103\n│   ├── 0104\n│   ├── 0105\n│   ├── 0106\n│   ├── 0107\n│   ├── 0108\n│   ├── 0109\n│   ├── 0110\n│   ├── 0111\n│   ├── 0112\n│   ├── 0113\n│   ├── 0114\n│   ├── 0115\n│   ├── 0116\n│   ├── 0117\n│   ├── 0118\n│   ├── 0119\n│   ├── 0120\n│   ├── 0121\n│   ├── 0122\n│   ├── 0123\n│   ├── 0124\n│   ├── 0125\n│   ├── 0126\n│   ├── 0127\n│   ├── 0128\n│   ├── 0129\n│   ├── 0130\n│   ├── 0131\n│   ├── 0132\n│   ├── 0133\n│   ├── 0134\n│   ├── 0135\n│   ├── 0136\n│   ├── 0137\n│   ├── 0138\n│   ├── 0139\n│   ├── 0140\n│   ├── 0141\n│   ├── 0142\n│   ├── 0143\n│   ├── 0144\n│   ├── 0145\n│   ├── 0146\n│   ├── 0147\n│   ├── 0148\n│   ├── 0149\n│   ├── 0150\n│   ├── 0151\n│   ├── 0152\n│   ├── 0153\n│   ├── 0154\n│   ├── 0155\n│   ├── 0156\n│   ├── 0157\n│   ├── 0158\n│   ├── 0159\n│   ├── 0160\n│   ├── 0161\n│   ├── 0162\n│   ├── 0163\n│   ├── 0164\n│   ├── 0165\n│   ├── 0166\n│   ├── 0167\n│   ├── 0168\n│   ├── 0169\n│   ├── 0170\n│   ├── 0171\n│   ├── 0172\n│   ├── 0173\n│   ├── 0174\n│   ├── 0175\n│   ├── 0176\n│   ├── 0177\n│   ├── 0178\n│   ├── 0179\n│   ├── 0180\n│   ├── 0181\n│   ├── 0182\n│   ├── 0183\n│   ├── 0184\n│   ├── 0185\n│   ├── 0186\n│   ├── 0187\n│   ├── 0188\n│   ├── 0189\n│   ├── 0190\n│   ├── 0191\n│   ├── 0192\n│   ├── 0193\n│   ├── 0194\n│   ├── 0195\n│   ├── 0196\n│   ├── 0197\n│   ├── 0198\n│   ├── 0199\n│   ├── 0200\n│   ├── 0201\n│   ├── 0202\n│   ├── 0203\n│   ├── 0204\n│   ├── 0205\n│   ├── 0206\n│   ├── 0207\n│   ├── 0208\n│   ├── 0209\n│   ├── 0210\n│   ├── 0211\n│   ├── 0212\n│   ├── 0213\n│   ├── 0214\n│   ├── 0215\n│   ├── 0216\n│   ├── 0217\n│   ├── 0218\n│   ├── 0219\n│   ├── 0220\n│   ├── 0221\n│   ├── 0222\n│   ├── 0223\n│   ├── 0224\n│   ├── 0225\n│   ├── 0226\n│   ├── 0227\n│   ├── 0228\n│   ├── 0229\n│   ├── 0230\n│   ├── 0231\n│   ├── 0232\n│   ├── 0233\n│   ├── 0234\n│   ├── 0235\n│   ├── 0236\n│   ├── 0237\n│   ├── 0238\n│   ├── 0239\n│   ├── 0240\n│   ├── 0241\n│   ├── 0242\n│   ├── 0243\n│   ├── 0244\n│   ├── 0245\n│   ├── 0246\n│   ├── 0247\n│   ├── 0248\n│   ├── 0249\n│   ├── 0250\n│   ├── 0251\n│   ├── 0252\n│   ├── 0253\n│   ├── 0254\n│   ├── 0255\n│   ├── 0256\n│   ├── 0257\n│   ├── 0258\n│   ├── 0259\n│   ├── 0260\n│   ├── 0261\n│   ├── 0262\n│   ├── 0263\n│   ├── 0264\n│   ├── 0265\n│   ├── 0266\n│   ├── 0267\n│   ├── 0268\n│   ├── 0269\n│   ├── 0270\n│   ├── 0271\n│   ├── 0272\n│   ├── 0273\n│   ├── 0274\n│   ├── 0275\n│   ├── 0276\n│   ├── 0277\n│   ├── 0278\n│   ├── 0279\n│   ├── 0280\n│   ├── 0281\n│   ├── 0282\n│   ├── 0283\n│   ├── 0284\n│   ├── 0285\n│   ├── 0286\n│   ├── 0287\n│   ├── 0288\n│   ├── 0289\n│   ├── 0290\n│   ├── 0291\n│   ├── 0292\n│   ├── 0293\n│   ├── 0294\n│   ├── 0295\n│   ├── 0296\n│   ├── 0297\n│   ├── 0298\n│   ├── 0299\n│   ├── 0300\n│   ├── 0301\n│   ├── 0302\n│   ├── 0303\n│   ├── 0304\n│   ├── 0305\n│   ├── 0306\n│   ├── 0307\n│   ├── 0308\n│   ├── 0309\n│   ├── 0310\n│   ├── 0311\n│   ├── 0312\n│   ├── 0313\n│   ├── 0314\n│   ├── 0315\n│   ├── 0316\n│   ├── 0317\n│   ├── 0318\n│   ├── 0319\n│   ├── 0320\n│   ├── 0321\n│   ├── 0322\n│   ├── 0323\n│   ├── 0324\n│   ├── 0325\n│   ├── 0326\n│   ├── 0327\n│   ├── 0328\n│   ├── 0329\n│   ├── 0330\n│   ├── 0331\n│   ├── 0332\n│   ├── 0333\n│   ├── 0334\n│   ├── 0335\n│   ├── 0336\n│   ├── 0337\n│   ├── 0338\n│   ├── 0339\n│   ├── 0340\n│   ├── 0341\n│   ├── 0342\n│   ├── 0343\n│   ├── 0344\n│   ├── 0345\n│   ├── 0346\n│   ├── 0347\n│   ├── 0348\n│   ├── 0349\n│   ├── 0350\n│   ├── 0351\n│   ├── 0352\n│   ├── 0353\n│   ├── 0354\n│   ├── 0355\n│   ├── 0356\n│   ├── 0357\n│   ├── 0358\n│   ├── 0359\n│   ├── 0360\n│   ├── 0361\n│   ├── 0362\n│   ├── 0363\n│   ├── 0364\n│   ├── 0365\n│   ├── 0366\n│   ├── 0367\n│   ├── 0368\n│   ├── 0369\n│   ├── 0370\n│   ├── 0371\n│   ├── 0372\n│   ├── 0373\n│   ├── 0374\n│   ├── 0375\n│   ├── 0376\n│   ├── 0377\n│   ├── 0378\n│   ├── 0379\n│   ├── 0380\n│   ├── 0381\n│   ├── 0382\n│   ├── 0383\n│   ├── 0384\n│   ├── 0385\n│   ├── 0386\n│   ├── 0387\n│   ├── 0388\n│   ├── 0389\n│   ├── 0390\n│   ├── 0391\n│   ├── 0392\n│   ├── 0393\n│   ├── 0394\n│   ├── 0395\n│   ├── 0396\n│   ├── 0397\n│   ├── 0398\n│   ├── 0399\n│   ├── 0400\n│   ├── 0401\n│   ├── 0402\n│   ├── 0403\n│   ├── 0404\n│   ├── 0405\n│   ├── 0406\n│   ├── 0407\n│   ├── 0408\n│   ├── 0409\n│   ├── 0410\n│   ├── 0411\n│   ├── 0412\n│   ├── 0413\n│   ├── 0414\n│   ├── 0415\n│   ├── 0416\n│   ├── 0417\n│   ├── 0418\n│   ├── 0419\n│   ├── 0420\n│   ├── 0421\n│   ├── 0422\n│   ├── 0423\n│   ├── 0424\n│   ├── 0425\n│   ├── 0426\n│   ├── 0427\n│   ├── 0428\n│   ├── 0429\n│   ├── 0430\n│   ├── 0431\n│   ├── 0432\n│   ├── 0433\n│   ├── 0434\n│   ├── 0435\n│   ├── 0436\n│   ├── 0437\n│   ├── 0438\n│   ├── 0439\n│   ├── 0440\n│   ├── 0441\n│   ├── 0442\n│   ├── 0443\n│   ├── 0444\n│   ├── 0445\n│   ├── 0446\n│   ├── 0447\n│   ├── 0448\n│   ├── 0449\n│   ├── 0450\n│   ├── 0451\n│   ├── 0452\n│   ├── 0453\n│   ├── 0454\n│   ├── 0455\n│   ├── 0456\n│   ├── 0457\n│   ├── 0458\n│   ├── 0459\n│   ├── 0460\n│   ├── 0461\n│   ├── 0462\n│   ├── 0463\n│   ├── 0464\n│   ├── 0465\n│   ├── 0466\n│   ├── 0467\n│   ├── 0468\n│   ├── 0469\n│   ├── 0470\n│   ├── 0471\n│   ├── 0472\n│   ├── 0473\n│   ├── 0474\n│   ├── 0475\n│   ├── 0476\n│   ├── 0477\n│   ├── 0478\n│   ├── 0479\n│   ├── 0480\n│   ├── 0481\n│   ├── 0482\n│   ├── 0483\n│   ├── 0484\n│   ├── 0485\n│   ├── 0486\n│   ├── 0487\n│   ├── 0488\n│   ├── 0489\n│   ├── 0490\n│   ├── 0491\n│   ├── 0492\n│   ├── 0493\n│   ├── 0494\n│   ├── 0495\n│   ├── 0496\n│   ├── 0497\n│   ├── 0498\n│   ├── 0499\n│   ├── 0500\n│   ├── 0501\n│   ├── 0502\n│   ├── 0503\n│   ├── 0504\n│   ├── 0505\n│   ├── 0506\n│   ├── 0507\n│   ├── 0508\n│   ├── 0509\n│   ├── 0510\n│   ├── 0511\n│   ├── 0512\n│   ├── 0513\n│   ├── 0514\n│   ├── 0515\n│   ├── 0516\n│   ├── 0517\n│   ├── 0518\n│   ├── 0519\n│   ├── 0520\n│   ├── 0521\n│   ├── 0522\n│   ├── 0523\n│   ├── 0524\n│   ├── 0525\n│   ├── 0526\n│   ├── 0527\n│   ├── 0528\n│   ├── 0529\n│   ├── 0530\n│   ├── 0531\n│   ├── 0532\n│   ├── 0533\n│   ├── 0534\n│   ├── 0535\n│   ├── 0536\n│   ├── 0537\n│   ├── 0538\n│   ├── 0539\n│   ├── 0540\n│   ├── 0541\n│   ├── 0542\n│   ├── 0543\n│   ├── 0544\n│   ├── 0545\n│   ├── 0546\n│   ├── 0547\n│   ├── 0548\n│   ├── 0549\n│   ├── 0550\n│   ├── 0551\n│   ├── 0552\n│   ├── 0553\n│   ├── 0554\n│   ├── 0555\n│   ├── 0556\n│   ├── 0557\n│   ├── 0558\n│   ├── 0559\n│   ├── 0560\n│   ├── 0561\n│   ├── 0562\n│   ├── 0563\n│   ├── 0564\n│   ├── 0565\n│   ├── 0566\n│   ├── 0567\n│   ├── 0568\n│   ├── 0569\n│   ├── 0570\n│   ├── 0571\n│   ├── 0572\n│   ├── 0573\n│   ├── 0574\n│   ├── 0575\n│   ├── 0576\n│   ├── 0577\n│   ├── 0578\n│   ├── 0579\n│   ├── 0580\n│   ├── 0581\n│   ├── 0582\n│   ├── 0583\n│   ├── 0584\n│   ├── 0585\n│   ├── 0586\n│   ├── 0587\n│   ├── 0588\n│   ├── 0589\n│   ├── 0590\n│   ├── 0591\n│   ├── 0592\n│   ├── 0593\n│   ├── 0594\n│   ├── 0595\n│   ├── 0596\n│   ├── 0597\n│   ├── 0598\n│   ├── 0599\n│   ├── 0600\n│   ├── 0601\n│   ├── 0602\n│   ├── 0603\n│   ├── 0604\n│   ├── 0605\n│   ├── 0606\n│   ├── 0607\n│   ├── 0608\n│   ├── 0609\n│   ├── 0610\n│   ├── 0611\n│   ├── 0612\n│   ├── 0613\n│   ├── 0614\n│   ├── 0615\n│   ├── 0616\n│   ├── 0617\n│   ├── 0618\n│   ├── 0619\n│   ├── 0620\n│   ├── 0621\n│   ├── 0622\n│   ├── 0623\n│   ├── 0624\n│   ├── 0625\n│   ├── 0626\n│   ├── 0627\n│   ├── 0628\n│   ├── 0629\n│   ├── 0630\n│   ├── 0631\n│   ├── 0632\n│   ├── 0633\n│   ├── 0634\n│   ├── 0635\n│   ├── 0636\n│   ├── 0637\n│   ├── 0638\n│   ├── 0639\n│   ├── 0640\n│   ├── 0641\n│   ├── 0642\n│   ├── 0643\n│   ├── 0644\n│   ├── 0645\n│   ├── 0646\n│   ├── 0647\n│   ├── 0648\n│   ├── 0649\n│   ├── 0650\n│   ├── 0651\n│   ├── 0652\n│   ├── 0653\n│   ├── 0654\n│   ├── 0655\n│   ├── 0656\n│   ├── 0657\n│   ├── 0658\n│   ├── 0659\n│   ├── 0660\n│   ├── 0661\n│   ├── 0662\n│   ├── 0663\n│   ├── 0664\n│   ├── 0665\n│   ├── 0666\n│   ├── 0667\n│   ├── 0668\n│   ├── 0669\n│   ├── 0670\n│   ├── 0671\n│   ├── 0672\n│   ├── 0673\n│   ├── 0674\n│   ├── 0675\n│   ├── 0676\n│   ├── 0677\n│   ├── 0678\n│   ├── 0679\n│   ├── 0680\n│   ├── 0681\n│   ├── 0682\n│   ├── 0683\n│   ├── 0684\n│   ├── 0685\n│   ├── 0686\n│   ├── 0687\n│   ├── 0688\n│   ├── 0689\n│   ├── 0690\n│   ├── 0691\n│   ├── 0692\n│   ├── 0693\n│   ├── 0694\n│   ├── 0695\n│   ├── 0696\n│   ├── 0697\n│   ├── 0698\n│   ├── 0699\n│   ├── 0700\n│   ├── 0701\n│   ├── 0702\n│   ├── 0703\n│   ├── 0704\n│   ├── 0705\n│   ├── 0706\n│   ├── 0707\n│   ├── 0708\n│   ├── 0709\n│   ├── 0710\n│   ├── 0711\n│   ├── 0712\n│   ├── 0713\n│   ├── 0714\n│   ├── 0715\n│   ├── 0716\n│   ├── 0717\n│   ├── 0718\n│   ├── 0719\n│   ├── 0720\n│   ├── 0721\n│   ├── 0722\n│   ├── 0723\n│   ├── 0724\n│   ├── 0725\n│   ├── 0726\n│   ├── 0727\n│   ├── 0728\n│   ├── 0729\n│   ├── 0730\n│   ├── 0731\n│   ├── 0732\n│   ├── 0733\n│   ├── 0734\n│   ├── 0735\n│   ├── 0736\n│   ├── 0737\n│   ├── 0738\n│   ├── 0739\n│   ├── 0740\n│   ├── 0741\n│   ├── 0742\n│   ├── 0743\n│   ├── 0744\n│   ├── 0745\n│   ├── 0746\n│   ├── 0747\n│   ├── 0748\n│   ├── 0749\n│   ├── 0750\n│   ├── 0751\n│   ├── 0752\n│   ├── 0753\n│   ├── 0754\n│   ├── 0755\n│   ├── 0756\n│   ├── 0757\n│   ├── 0758\n│   ├── 0759\n│   ├── 0760\n│   ├── 0761\n│   ├── 0762\n│   ├── 0763\n│   ├── 0764\n│   ├── 0765\n│   ├── 0766\n│   ├── 0767\n│   ├── 0768\n│   ├── 0769\n│   ├── 0770\n│   ├── 0771\n│   ├── 0772\n│   ├── 0773\n│   ├── 0774\n│   ├── 0775\n│   ├── 0776\n│   ├── 0777\n│   ├── 0778\n│   ├── 0779\n│   ├── 0780\n│   ├── 0781\n│   ├── 0782\n│   ├── 0783\n│   ├── 0784\n│   ├── 0785\n│   ├── 0786\n│   ├── 0787\n│   ├── 0788\n│   ├── 0789\n│   ├── 0790\n│   ├── 0791\n│   ├── 0792\n│   ├── 0793\n│   ├── 0794\n│   ├── 0795\n│   ├── 0796\n│   ├── 0797\n│   ├── 0798\n│   ├── 0799\n│   ├── 0800\n│   ├── 0801\n│   ├── 0802\n│   ├── 0803\n│   ├── 0804\n│   ├── 0805\n│   ├── 0806\n│   ├── 0807\n│   ├── 0808\n│   ├── 0809\n│   ├── 0810\n│   ├── 0811\n│   ├── 0812\n│   ├── 0813\n│   ├── 0814\n│   ├── 0815\n│   ├── 0816\n│   ├── 0817\n│   ├── 0818\n│   ├── 0819\n│   ├── 0820\n│   ├── 0821\n│   ├── 0822\n│   ├── 0823\n│   ├── 0824\n│   ├── 0825\n│   ├── 0826\n│   ├── 0827\n│   ├── 0828\n│   ├── 0829\n│   ├── 0830\n│   ├── 0831\n│   ├── 0832\n│   ├── 0833\n│   ├── 0834\n│   ├── 0835\n│   ├── 0836\n│   ├── 0837\n│   ├── 0838\n│   ├── 0839\n│   ├── 0840\n│   ├── 0841\n│   ├── 0842\n│   ├── 0843\n│   ├── 0844\n│   ├── 0845\n│   ├── 0846\n│   ├── 0847\n│   ├── 0848\n│   ├── 0849\n│   ├── 0850\n│   ├── 0851\n│   ├── 0852\n│   ├── 0853\n│   ├── 0854\n│   ├── 0855\n│   ├── 0856\n│   ├── 0857\n│   ├── 0858\n│   ├── 0859\n│   ├── 0860\n│   ├── 0861\n│   ├── 0862\n│   ├── 0863\n│   ├── 0864\n│   ├── 0865\n│   ├── 0866\n│   ├── 0867\n│   ├── 0868\n│   ├── 0869\n│   ├── 0870\n│   ├── 0871\n│   ├── 0872\n│   ├── 0873\n│   ├── 0874\n│   ├── 0875\n│   ├── 0876\n│   ├── 0877\n│   ├── 0878\n│   ├── 0879\n│   ├── 0880\n│   ├── 0881\n│   ├── 0882\n│   ├── 0883\n│   ├── 0884\n│   ├── 0885\n│   ├── 0886\n│   ├── 0887\n│   ├── 0888\n│   ├── 0889\n│   ├── 0890\n│   ├── 0891\n│   ├── 0892\n│   ├── 0893\n│   ├── 0894\n│   ├── 0895\n│   ├── 0896\n│   ├── 0897\n│   ├── 0898\n│   ├── 0899\n│   ├── 0900\n│   ├── 0901\n│   ├── 0902\n│   ├── 0903\n│   ├── 0904\n│   ├── 0905\n│   ├── 0906\n│   ├── 0907\n│   ├── 0908\n│   ├── 0909\n│   ├── 0910\n│   ├── 0911\n│   ├── 0912\n│   ├── 0913\n│   ├── 0914\n│   ├── 0915\n│   ├── 0916\n│   ├── 0917\n│   ├── 0918\n│   ├── 0919\n│   ├── 0920\n│   ├── 0921\n│   ├── 0922\n│   ├── 0923\n│   ├── 0924\n│   ├── 0925\n│   ├── 0926\n│   ├── 0927\n│   ├── 0928\n│   ├── 0929\n│   ├── 0930\n│   ├── 0931\n│   ├── 0932\n│   ├── 0933\n│   ├── 0934\n│   ├── 0935\n│   ├── 0936\n│   ├── 0937\n│   ├── 0938\n│   ├── 0939\n│   ├── 0940\n│   ├── 0941\n│   ├── 0942\n│   ├── 0943\n│   ├── 0944\n│   ├── 0945\n│   ├── 0946\n│   ├── 0947\n│   ├── 0948\n│   ├── 0949\n│   ├── 0950\n│   ├── 0951\n│   ├── 0952\n│   ├── 0953\n│   ├── 0954\n│   ├── 0955\n│   ├── 0956\n│   ├── 0957\n│   ├── 0958\n│   ├── 0959\n│   ├── 0960\n│   ├── 0961\n│   ├── 0962\n│   ├── 0963\n│   ├── 0964\n│   ├── 0965\n│   ├── 0966\n│   ├── 0967\n│   ├── 0968\n│   ├── 0969\n│   ├── 0970\n│   ├── 0971\n│   ├── 0972\n│   ├── 0973\n│   ├── 0974\n│   ├── 0975\n│   ├── 0976\n│   ├── 0977\n│   ├── 0978\n│   ├── 0979\n│   ├── 0980\n│   ├── 0981\n│   ├── 0982\n│   ├── 0983\n│   ├── 0984\n│   ├── 0985\n│   ├── 0986\n│   ├── 0987\n│   ├── 0988\n│   ├── 0989\n│   ├── 0990\n│   ├── 0991\n│   ├── 0992\n│   ├── 0993\n│   ├── 0994\n│   ├── 0995\n│   ├── 0996\n│   ├── 0997\n│   ├── 0998\n│   ├── 0999\n│   ├── 1000\n│   ├── file_000\n│   ├── file_001\n│   ├── file_002\n│   ├── file_003\n│   ├── file_004\n│   ├── file_005\n│   ├── file_006\n│   ├── file_007\n│   ├── file_008\n│   ├── file_009\n│   ├── file_010\n│   ├── file_011\n│   ├── file_012\n│   ├── file_013\n│   ├── file_014\n│   ├── file_015\n│   ├── file_016\n│   ├── file_017\n│   ├── file_018\n│   ├── file_019\n│   ├── file_020\n│   ├── file_021\n│   ├── file_022\n│   ├── file_023\n│   ├── file_024\n│   ├── file_025\n│   ├── file_026\n│   ├── file_027\n│   ├── file_028\n│   ├── file_029\n│   ├── file_030\n│   ├── file_031\n│   ├── file_032\n│   ├── file_033\n│   ├── file_034\n│   ├── file_035\n│   ├── file_036\n│   ├── file_037\n│   ├── file_038\n│   ├── file_039\n│   ├── file_040\n│   ├── file_041\n│   ├── file_042\n│   ├── file_043\n│   ├── file_044\n│   ├── file_045\n│   ├── file_046\n│   ├── file_047\n│   ├── file_048\n│   ├── file_049\n│   ├── file_050\n│   ├── file_051\n│   ├── file_052\n│   ├── file_053\n│   ├── file_054\n│   ├── file_055\n│   ├── file_056\n│   ├── file_057\n│   ├── file_058\n│   ├── file_059\n│   ├── file_060\n│   ├── file_061\n│   ├── file_062\n│   ├── file_063\n│   ├── file_064\n│   ├── file_065\n│   ├── file_066\n│   ├── file_067\n│   ├── file_068\n│   ├── file_069\n│   ├── file_070\n│   ├── file_071\n│   ├── file_072\n│   ├── file_073\n│   ├── file_074\n│   ├── file_075\n│   ├── file_076\n│   ├── file_077\n│   ├── file_078\n│   ├── file_079\n│   ├── file_080\n│   ├── file_081\n│   ├── file_082\n│   ├── file_083\n│   ├── file_084\n│   ├── file_085\n│   ├── file_086\n│   ├── file_087\n│   ├── file_088\n│   ├── file_089\n│   ├── file_090\n│   ├── file_091\n│   ├── file_092\n│   ├── file_093\n│   ├── file_094\n│   ├── file_095\n│   ├── file_096\n│   ├── file_097\n│   ├── file_098\n│   ├── file_099\n│   ├── file_100\n│   ├── file_101\n│   ├── file_102\n│   ├── file_103\n│   ├── file_104\n│   ├── file_105\n│   ├── file_106\n│   ├── file_107\n│   ├── file_108\n│   ├── file_109\n│   ├── file_110\n│   ├── file_111\n│   ├── file_112\n│   ├── file_113\n│   ├── file_114\n│   ├── file_115\n│   ├── file_116\n│   ├── file_117\n│   ├── file_118\n│   ├── file_119\n│   ├── file_120\n│   ├── file_121\n│   ├── file_122\n│   ├── file_123\n│   ├── file_124\n│   ├── file_125\n│   ├── file_126\n│   ├── file_127\n│   ├── file_128\n│   ├── file_129\n│   ├── file_130\n│   ├── file_131\n│   ├── file_132\n│   ├── file_133\n│   ├── file_134\n│   ├── file_135\n│   ├── file_136\n│   ├── file_137\n│   ├── file_138\n│   ├── file_139\n│   ├── file_140\n│   ├── file_141\n│   ├── file_142\n│   ├── file_143\n│   ├── file_144\n│   ├── file_145\n│   ├── file_146\n│   ├── file_147\n│   ├── file_148\n│   ├── file_149\n│   ├── file_150\n│   ├── file_151\n│   ├── file_152\n│   ├── file_153\n│   ├── file_154\n│   ├── file_155\n│   ├── file_156\n│   ├── file_157\n│   ├── file_158\n│   ├── file_159\n│   ├── file_160\n│   ├── file_161\n│   ├── file_162\n│   ├── file_163\n│   ├── file_164\n│   ├── file_165\n│   ├── file_166\n│   ├── file_167\n│   ├── file_168\n│   ├── file_169\n│   ├── file_170\n│   ├── file_171\n│   ├── file_172\n│   ├── file_173\n│   ├── file_174\n│   ├── file_175\n│   ├── file_176\n│   ├── file_177\n│   ├── file_178\n│   ├── file_179\n│   ├── file_180\n│   ├── file_181\n│   ├── file_182\n│   ├── file_183\n│   ├── file_184\n│   ├── file_185\n│   ├── file_186\n│   ├── file_187\n│   ├── file_188\n│   ├── file_189\n│   ├── file_190\n│   ├── file_191\n│   ├── file_192\n│   ├── file_193\n│   ├── file_194\n│   ├── file_195\n│   ├── file_196\n│   ├── file_197\n│   ├── file_198\n│   ├── file_199\n│   ├── file_200\n│   ├── file_201\n│   ├── file_202\n│   ├── file_203\n│   ├── file_204\n│   ├── file_205\n│   ├── file_206\n│   ├── file_207\n│   ├── file_208\n│   ├── file_209\n│   ├── file_210\n│   ├── file_211\n│   ├── file_212\n│   ├── file_213\n│   ├── file_214\n│   ├── file_215\n│   ├── file_216\n│   ├── file_217\n│   ├── file_218\n│   ├── file_219\n│   ├── file_220\n│   ├── file_221\n│   ├── file_222\n│   ├── file_223\n│   ├── file_224\n│   ├── file_225\n│   ├── file_226\n│   ├── file_227\n│   ├── file_228\n│   ├── file_229\n│   ├── file_230\n│   ├── file_231\n│   ├── file_232\n│   ├── file_233\n│   ├── file_234\n│   ├── file_235\n│   ├── file_236\n│   ├── file_237\n│   ├── file_238\n│   ├── file_239\n│   ├── file_240\n│   ├── file_241\n│   ├── file_242\n│   ├── file_243\n│   ├── file_244\n│   ├── file_245\n│   ├── file_246\n│   ├── file_247\n│   ├── file_248\n│   ├── file_249\n│   ├── file_250\n│   ├── file_251\n│   ├── file_252\n│   ├── file_253\n│   ├── file_254\n│   ├── file_255\n│   ├── file_256\n│   ├── file_257\n│   ├── file_258\n│   ├── file_259\n│   ├── file_260\n│   ├── file_261\n│   ├── file_262\n│   ├── file_263\n│   ├── file_264\n│   ├── file_265\n│   ├── file_266\n│   ├── file_267\n│   ├── file_268\n│   ├── file_269\n│   ├── file_270\n│   ├── file_271\n│   ├── file_272\n│   ├── file_273\n│   ├── file_274\n│   ├── file_275\n│   ├── file_276\n│   ├── file_277\n│   ├── file_278\n│   ├── file_279\n│   ├── file_280\n│   ├── file_281\n│   ├── file_282\n│   ├── file_283\n│   ├── file_284\n│   ├── file_285\n│   ├── file_286\n│   ├── file_287\n│   ├── file_288\n│   ├── file_289\n│   ├── file_290\n│   ├── file_291\n│   ├── file_292\n│   ├── file_293\n│   ├── file_294\n│   ├── file_295\n│   ├── file_296\n│   ├── file_297\n│   ├── file_298\n│   ├── file_299\n│   ├── file_300\n│   ├── file_301\n│   ├── file_302\n│   ├── file_303\n│   ├── file_304\n│   ├── file_305\n│   ├── file_306\n│   ├── file_307\n│   ├── file_308\n│   ├── file_309\n│   ├── file_310\n│   ├── file_311\n│   ├── file_312\n│   ├── file_313\n│   ├── file_314\n│   ├── file_315\n│   ├── file_316\n│   ├── file_317\n│   ├── file_318\n│   ├── file_319\n│   ├── file_320\n│   ├── file_321\n│   ├── file_322\n│   ├── file_323\n│   ├── file_324\n│   ├── file_325\n│   ├── file_326\n│   ├── file_327\n│   ├── file_328\n│   ├── file_329\n│   ├── file_330\n│   ├── file_331\n│   ├── file_332\n│   ├── file_333\n│   ├── file_334\n│   ├── file_335\n│   ├── file_336\n│   ├── file_337\n│   ├── file_338\n│   ├── file_339\n│   ├── file_340\n│   ├── file_341\n│   ├── file_342\n│   ├── file_343\n│   ├── file_344\n│   ├── file_345\n│   ├── file_346\n│   ├── file_347\n│   ├── file_348\n│   ├── file_349\n│   ├── file_350\n│   ├── file_351\n│   ├── file_352\n│   ├── file_353\n│   ├── file_354\n│   ├── file_355\n│   ├── file_356\n│   ├── file_357\n│   ├── file_358\n│   ├── file_359\n│   ├── file_360\n│   ├── file_361\n│   ├── file_362\n│   ├── file_363\n│   ├── file_364\n│   ├── file_365\n│   ├── file_366\n│   ├── file_367\n│   ├── file_368\n│   ├── file_369\n│   ├── file_370\n│   ├── file_371\n│   ├── file_372\n│   ├── file_373\n│   ├── file_374\n│   ├── file_375\n│   ├── file_376\n│   ├── file_377\n│   ├── file_378\n│   ├── file_379\n│   ├── file_380\n│   ├── file_381\n│   ├── file_382\n│   ├── file_383\n│   ├── file_384\n│   ├── file_385\n│   ├── file_386\n│   ├── file_387\n│   ├── file_388\n│   ├── file_389\n│   ├── file_390\n│   ├── file_391\n│   ├── file_392\n│   ├── file_393\n│   ├── file_394\n│   ├── file_395\n│   ├── file_396\n│   ├── file_397\n│   ├── file_398\n│   ├── file_399\n│   ├── file_400\n│   ├── file_401\n│   ├── file_402\n│   ├── file_403\n│   ├── file_404\n│   ├── file_405\n│   ├── file_406\n│   ├── file_407\n│   ├── file_408\n│   ├── file_409\n│   ├── file_410\n│   ├── file_411\n│   ├── file_412\n│   ├── file_413\n│   ├── file_414\n│   ├── file_415\n│   ├── file_416\n│   ├── file_417\n│   ├── file_418\n│   ├── file_419\n│   ├── file_420\n│   ├── file_421\n│   ├── file_422\n│   ├── file_423\n│   ├── file_424\n│   ├── file_425\n│   ├── file_426\n│   ├── file_427\n│   ├── file_428\n│   ├── file_429\n│   ├── file_430\n│   ├── file_431\n│   ├── file_432\n│   ├── file_433\n│   ├── file_434\n│   ├── file_435\n│   ├── file_436\n│   ├── file_437\n│   ├── file_438\n│   ├── file_439\n│   ├── file_440\n│   ├── file_441\n│   ├── file_442\n│   ├── file_443\n│   ├── file_444\n│   ├── file_445\n│   ├── file_446\n│   ├── file_447\n│   ├── file_448\n│   ├── file_449\n│   ├── file_450\n│   ├── file_451\n│   ├── file_452\n│   ├── file_453\n│   ├── file_454\n│   ├── file_455\n│   ├── file_456\n│   ├── file_457\n│   ├── file_458\n│   ├── file_459\n│   ├── file_460\n│   ├── file_461\n│   ├── file_462\n│   ├── file_463\n│   ├── file_464\n│   ├── file_465\n│   ├── file_466\n│   ├── file_467\n│   ├── file_468\n│   ├── file_469\n│   ├── file_470\n│   ├── file_471\n│   ├── file_472\n│   ├── file_473\n│   ├── file_474\n│   ├── file_475\n│   ├── file_476\n│   ├── file_477\n│   ├── file_478\n│   ├── file_479\n│   ├── file_480\n│   ├── file_481\n│   ├── file_482\n│   ├── file_483\n│   ├── file_484\n│   ├── file_485\n│   ├── file_486\n│   ├── file_487\n│   ├── file_488\n│   ├── file_489\n│   ├── file_490\n│   ├── file_491\n│   ├── file_492\n│   ├── file_493\n│   ├── file_494\n│   ├── file_495\n│   ├── file_496\n│   ├── file_497\n│   ├── file_498\n│   ├── file_499\n│   ├── file_500\n│   ├── file_501\n│   ├── file_502\n│   ├── file_503\n│   ├── file_504\n│   ├── file_505\n│   ├── file_506\n│   ├── file_507\n│   ├── file_508\n│   ├── file_509\n│   ├── file_510\n│   ├── file_511\n│   ├── file_512\n│   ├── file_513\n│   ├── file_514\n│   ├── file_515\n│   ├── file_516\n│   ├── file_517\n│   ├── file_518\n│   ├── file_519\n│   ├── file_520\n│   ├── file_521\n│   ├── file_522\n│   ├── file_523\n│   ├── file_524\n│   ├── file_525\n│   ├── file_526\n│   ├── file_527\n│   ├── file_528\n│   ├── file_529\n│   ├── file_530\n│   ├── file_531\n│   ├── file_532\n│   ├── file_533\n│   ├── file_534\n│   ├── file_535\n│   ├── file_536\n│   ├── file_537\n│   ├── file_538\n│   ├── file_539\n│   ├── file_540\n│   ├── file_541\n│   ├── file_542\n│   ├── file_543\n│   ├── file_544\n│   ├── file_545\n│   ├── file_546\n│   ├── file_547\n│   ├── file_548\n│   ├── file_549\n│   ├── file_550\n│   ├── file_551\n│   ├── file_552\n│   ├── file_553\n│   ├── file_554\n│   ├── file_555\n│   ├── file_556\n│   ├── file_557\n│   ├── file_558\n│   ├── file_559\n│   ├── file_560\n│   ├── file_561\n│   ├── file_562\n│   ├── file_563\n│   ├── file_564\n│   ├── file_565\n│   ├── file_566\n│   ├── file_567\n│   ├── file_568\n│   ├── file_569\n│   ├── file_570\n│   ├── file_571\n│   ├── file_572\n│   ├── file_573\n│   ├── file_574\n│   ├── file_575\n│   ├── file_576\n│   ├── file_577\n│   ├── file_578\n│   ├── file_579\n│   ├── file_580\n│   ├── file_581\n│   ├── file_582\n│   ├── file_583\n│   ├── file_584\n│   ├── file_585\n│   ├── file_586\n│   ├── file_587\n│   ├── file_588\n│   ├── file_589\n│   ├── file_590\n│   ├── file_591\n│   ├── file_592\n│   ├── file_593\n│   ├── file_594\n│   ├── file_595\n│   ├── file_596\n│   ├── file_597\n│   ├── file_598\n│   ├── file_599\n│   ├── file_600\n│   ├── file_601\n│   ├── file_602\n│   ├── file_603\n│   ├── file_604\n│   ├── file_605\n│   ├── file_606\n│   ├── file_607\n│   ├── file_608\n│   ├── file_609\n│   ├── file_610\n│   ├── file_611\n│   ├── file_612\n│   ├── file_613\n│   ├── file_614\n│   ├── file_615\n│   ├── file_616\n│   ├── file_617\n│   ├── file_618\n│   ├── file_619\n│   ├── file_620\n│   ├── file_621\n│   ├── file_622\n│   ├── file_623\n│   ├── file_624\n│   ├── file_625\n│   ├── file_626\n│   ├── file_627\n│   ├── file_628\n│   ├── file_629\n│   ├── file_630\n│   ├── file_631\n│   ├── file_632\n│   ├── file_633\n│   ├── file_634\n│   ├── file_635\n│   ├── file_636\n│   ├── file_637\n│   ├── file_638\n│   ├── file_639\n│   ├── file_640\n│   ├── file_641\n│   ├── file_642\n│   ├── file_643\n│   ├── file_644\n│   ├── file_645\n│   ├── file_646\n│   ├── file_647\n│   ├── file_648\n│   ├── file_649\n│   ├── file_650\n│   ├── file_651\n│   ├── file_652\n│   ├── file_653\n│   ├── file_654\n│   ├── file_655\n│   ├── file_656\n│   ├── file_657\n│   ├── file_658\n│   ├── file_659\n│   ├── file_660\n│   ├── file_661\n│   ├── file_662\n│   ├── file_663\n│   ├── file_664\n│   ├── file_665\n│   ├── file_666\n│   ├── file_667\n│   ├── file_668\n│   ├── file_669\n│   ├── file_670\n│   ├── file_671\n│   ├── file_672\n│   ├── file_673\n│   ├── file_674\n│   ├── file_675\n│   ├── file_676\n│   ├── file_677\n│   ├── file_678\n│   ├── file_679\n│   ├── file_680\n│   ├── file_681\n│   ├── file_682\n│   ├── file_683\n│   ├── file_684\n│   ├── file_685\n│   ├── file_686\n│   ├── file_687\n│   ├── file_688\n│   ├── file_689\n│   ├── file_690\n│   ├── file_691\n│   ├── file_692\n│   ├── file_693\n│   ├── file_694\n│   ├── file_695\n│   ├── file_696\n│   ├── file_697\n│   ├── file_698\n│   ├── file_699\n│   ├── file_700\n│   ├── file_701\n│   ├── file_702\n│   ├── file_703\n│   ├── file_704\n│   ├── file_705\n│   ├── file_706\n│   ├── file_707\n│   ├── file_708\n│   ├── file_709\n│   ├── file_710\n│   ├── file_711\n│   ├── file_712\n│   ├── file_713\n│   ├── file_714\n│   ├── file_715\n│   ├── file_716\n│   ├── file_717\n│   ├── file_718\n│   ├── file_719\n│   ├── file_720\n│   ├── file_721\n│   ├── file_722\n│   ├── file_723\n│   ├── file_724\n│   ├── file_725\n│   ├── file_726\n│   ├── file_727\n│   ├── file_728\n│   ├── file_729\n│   ├── file_730\n│   ├── file_731\n│   ├── file_732\n│   ├── file_733\n│   ├── file_734\n│   ├── file_735\n│   ├── file_736\n│   ├── file_737\n│   ├── file_738\n│   ├── file_739\n│   ├── file_740\n│   ├── file_741\n│   ├── file_742\n│   ├── file_743\n│   ├── file_744\n│   ├── file_745\n│   ├── file_746\n│   ├── file_747\n│   ├── file_748\n│   ├── file_749\n│   ├── file_750\n│   ├── file_751\n│   ├── file_752\n│   ├── file_753\n│   ├── file_754\n│   ├── file_755\n│   ├── file_756\n│   ├── file_757\n│   ├── file_758\n│   ├── file_759\n│   ├── file_760\n│   ├── file_761\n│   ├── file_762\n│   ├── file_763\n│   ├── file_764\n│   ├── file_765\n│   ├── file_766\n│   ├── file_767\n│   ├── file_768\n│   ├── file_769\n│   ├── file_770\n│   ├── file_771\n│   ├── file_772\n│   ├── file_773\n│   ├── file_774\n│   ├── file_775\n│   ├── file_776\n│   ├── file_777\n│   ├── file_778\n│   ├── file_779\n│   ├── file_780\n│   ├── file_781\n│   ├── file_782\n│   ├── file_783\n│   ├── file_784\n│   ├── file_785\n│   ├── file_786\n│   ├── file_787\n│   ├── file_788\n│   ├── file_789\n│   ├── file_790\n│   ├── file_791\n│   ├── file_792\n│   ├── file_793\n│   ├── file_794\n│   ├── file_795\n│   ├── file_796\n│   ├── file_797\n│   ├── file_798\n│   ├── file_799\n│   ├── file_800\n│   ├── file_801\n│   ├── file_802\n│   ├── file_803\n│   ├── file_804\n│   ├── file_805\n│   ├── file_806\n│   ├── file_807\n│   ├── file_808\n│   ├── file_809\n│   ├── file_810\n│   ├── file_811\n│   ├── file_812\n│   ├── file_813\n│   ├── file_814\n│   ├── file_815\n│   ├── file_816\n│   ├── file_817\n│   ├── file_818\n│   ├── file_819\n│   ├── file_820\n│   ├── file_821\n│   ├── file_822\n│   ├── file_823\n│   ├── file_824\n│   ├── file_825\n│   ├── file_826\n│   ├── file_827\n│   ├── file_828\n│   ├── file_829\n│   ├── file_830\n│   ├── file_831\n│   ├── file_832\n│   ├── file_833\n│   ├── file_834\n│   ├── file_835\n│   ├── file_836\n│   ├── file_837\n│   ├── file_838\n│   ├── file_839\n│   ├── file_840\n│   ├── file_841\n│   ├── file_842\n│   ├── file_843\n│   ├── file_844\n│   ├── file_845\n│   ├── file_846\n│   ├── file_847\n│   ├── file_848\n│   ├── file_849\n│   ├── file_850\n│   ├── file_851\n│   ├── file_852\n│   ├── file_853\n│   ├── file_854\n│   ├── file_855\n│   ├── file_856\n│   ├── file_857\n│   ├── file_858\n│   ├── file_859\n│   ├── file_860\n│   ├── file_861\n│   ├── file_862\n│   ├── file_863\n│   ├── file_864\n│   ├── file_865\n│   ├── file_866\n│   ├── file_867\n│   ├── file_868\n│   ├── file_869\n│   ├── file_870\n│   ├── file_871\n│   ├── file_872\n│   ├── file_873\n│   ├── file_874\n│   ├── file_875\n│   ├── file_876\n│   ├── file_877\n│   ├── file_878\n│   ├── file_879\n│   ├── file_880\n│   ├── file_881\n│   ├── file_882\n│   ├── file_883\n│   ├── file_884\n│   ├── file_885\n│   ├── file_886\n│   ├── file_887\n│   ├── file_888\n│   ├── file_889\n│   ├── file_890\n│   ├── file_891\n│   ├── file_892\n│   ├── file_893\n│   ├── file_894\n│   ├── file_895\n│   ├── file_896\n│   ├── file_897\n│   ├── file_898\n│   ├── file_899\n│   ├── file_900\n│   ├── file_901\n│   ├── file_902\n│   ├── file_903\n│   ├── file_904\n│   ├── file_905\n│   ├── file_906\n│   ├── file_907\n│   ├── file_908\n│   ├── file_909\n│   ├── file_910\n│   ├── file_911\n│   ├── file_912\n│   ├── file_913\n│   ├── file_914\n│   ├── file_915\n│   ├── file_916\n│   ├── file_917\n│   ├── file_918\n│   ├── file_919\n│   ├── file_920\n│   ├── file_921\n│   ├── file_922\n│   ├── file_923\n│   ├── file_924\n│   ├── file_925\n│   ├── file_926\n│   ├── file_927\n│   ├── file_928\n│   ├── file_929\n│   ├── file_930\n│   ├── file_931\n│   ├── file_932\n│   ├── file_933\n│   ├── file_934\n│   ├── file_935\n│   ├── file_936\n│   ├── file_937\n│   ├── file_938\n│   ├── file_939\n│   ├── file_940\n│   ├── file_941\n│   ├── file_942\n│   ├── file_943\n│   ├── file_944\n│   ├── file_945\n│   ├── file_946\n│   ├── file_947\n│   ├── file_948\n│   ├── file_949\n│   ├── file_950\n│   ├── file_951\n│   ├── file_952\n│   ├── file_953\n│   ├── file_954\n│   ├── file_955\n│   ├── file_956\n│   ├── file_957\n│   ├── file_958\n│   ├── file_959\n│   ├── file_960\n│   ├── file_961\n│   ├── file_962\n│   ├── file_963\n│   ├── file_964\n│   ├── file_965\n│   ├── file_966\n│   ├── file_967\n│   ├── file_968\n│   ├── file_969\n│   ├── file_970\n│   ├── file_971\n│   ├── file_972\n│   ├── file_973\n│   ├── file_974\n│   ├── file_975\n│   ├── file_976\n│   ├── file_977\n│   ├── file_978\n│   ├── file_979\n│   ├── file_980\n│   ├── file_981\n│   ├── file_982\n│   ├── file_983\n│   ├── file_984\n│   ├── file_985\n│   ├── file_986\n│   ├── file_987\n│   ├── file_988\n│   ├── file_989\n│   ├── file_990\n│   ├── file_991\n│   ├── file_992\n│   ├── file_993\n│   ├── file_994\n│   ├── file_995\n│   ├── file_996\n│   ├── file_997\n│   ├── file_998\n│   └── file_999\n├── group\n│   └── file\n├── icons\n│   ├── c++.cpp\n│   ├── c.c\n│   ├── css.css\n│   ├── file\n│   ├── go.go\n│   ├── html.html\n│   ├── java.java\n│   ├── javascript.js\n│   ├── man.1\n│   ├── marked.md\n│   ├── php.php\n│   ├── python.py\n│   ├── ruby.rb\n│   ├── rust.rs\n│   ├── shell.sh\n│   └── unknown.unknown\n├── perms\n│   ├── file\n│   └── file2\n├── size\n│   ├── 1B\n│   ├── 1K\n│   ├── 1M\n│   └── 1337\n├── specials\n├── symlinks\n│   ├── dir\n│   ├── file\n│   ├── ' lorem ipsum'\n│   ├── symlink -> file\n│   ├── symlink2 -> symlink\n│   ├── symlink3 -> dir\n│   └── symlink4 -> pipitek\n└── time\n    ├── 1d\n    ├── 1h\n    ├── 1m\n    ├── 1s\n    ├── 1y\n    └── epoch\n"
  },
  {
    "path": "tests/gen/tree_long_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --tree --long --no-user --no-time --no-filesize --no-permissions\"\n"
  },
  {
    "path": "tests/gen/tree_unix.stderr",
    "content": ""
  },
  {
    "path": "tests/gen/tree_unix.stdout",
    "content": "tests/test_dir\n├── git\n│   ├── 001\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 002\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 003\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 004\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 005\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 006\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 007\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 008\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 009\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   └── 010\n│       ├── file_000\n│       ├── file_001\n│       ├── file_002\n│       ├── file_003\n│       ├── file_004\n│       ├── file_005\n│       ├── file_006\n│       ├── file_007\n│       ├── file_008\n│       └── file_009\n├── grid\n│   ├── 0001\n│   ├── 0002\n│   ├── 0003\n│   ├── 0004\n│   ├── 0005\n│   ├── 0006\n│   ├── 0007\n│   ├── 0008\n│   ├── 0009\n│   ├── 0010\n│   ├── 0011\n│   ├── 0012\n│   ├── 0013\n│   ├── 0014\n│   ├── 0015\n│   ├── 0016\n│   ├── 0017\n│   ├── 0018\n│   ├── 0019\n│   ├── 0020\n│   ├── 0021\n│   ├── 0022\n│   ├── 0023\n│   ├── 0024\n│   ├── 0025\n│   ├── 0026\n│   ├── 0027\n│   ├── 0028\n│   ├── 0029\n│   ├── 0030\n│   ├── 0031\n│   ├── 0032\n│   ├── 0033\n│   ├── 0034\n│   ├── 0035\n│   ├── 0036\n│   ├── 0037\n│   ├── 0038\n│   ├── 0039\n│   ├── 0040\n│   ├── 0041\n│   ├── 0042\n│   ├── 0043\n│   ├── 0044\n│   ├── 0045\n│   ├── 0046\n│   ├── 0047\n│   ├── 0048\n│   ├── 0049\n│   ├── 0050\n│   ├── 0051\n│   ├── 0052\n│   ├── 0053\n│   ├── 0054\n│   ├── 0055\n│   ├── 0056\n│   ├── 0057\n│   ├── 0058\n│   ├── 0059\n│   ├── 0060\n│   ├── 0061\n│   ├── 0062\n│   ├── 0063\n│   ├── 0064\n│   ├── 0065\n│   ├── 0066\n│   ├── 0067\n│   ├── 0068\n│   ├── 0069\n│   ├── 0070\n│   ├── 0071\n│   ├── 0072\n│   ├── 0073\n│   ├── 0074\n│   ├── 0075\n│   ├── 0076\n│   ├── 0077\n│   ├── 0078\n│   ├── 0079\n│   ├── 0080\n│   ├── 0081\n│   ├── 0082\n│   ├── 0083\n│   ├── 0084\n│   ├── 0085\n│   ├── 0086\n│   ├── 0087\n│   ├── 0088\n│   ├── 0089\n│   ├── 0090\n│   ├── 0091\n│   ├── 0092\n│   ├── 0093\n│   ├── 0094\n│   ├── 0095\n│   ├── 0096\n│   ├── 0097\n│   ├── 0098\n│   ├── 0099\n│   ├── 0100\n│   ├── 0101\n│   ├── 0102\n│   ├── 0103\n│   ├── 0104\n│   ├── 0105\n│   ├── 0106\n│   ├── 0107\n│   ├── 0108\n│   ├── 0109\n│   ├── 0110\n│   ├── 0111\n│   ├── 0112\n│   ├── 0113\n│   ├── 0114\n│   ├── 0115\n│   ├── 0116\n│   ├── 0117\n│   ├── 0118\n│   ├── 0119\n│   ├── 0120\n│   ├── 0121\n│   ├── 0122\n│   ├── 0123\n│   ├── 0124\n│   ├── 0125\n│   ├── 0126\n│   ├── 0127\n│   ├── 0128\n│   ├── 0129\n│   ├── 0130\n│   ├── 0131\n│   ├── 0132\n│   ├── 0133\n│   ├── 0134\n│   ├── 0135\n│   ├── 0136\n│   ├── 0137\n│   ├── 0138\n│   ├── 0139\n│   ├── 0140\n│   ├── 0141\n│   ├── 0142\n│   ├── 0143\n│   ├── 0144\n│   ├── 0145\n│   ├── 0146\n│   ├── 0147\n│   ├── 0148\n│   ├── 0149\n│   ├── 0150\n│   ├── 0151\n│   ├── 0152\n│   ├── 0153\n│   ├── 0154\n│   ├── 0155\n│   ├── 0156\n│   ├── 0157\n│   ├── 0158\n│   ├── 0159\n│   ├── 0160\n│   ├── 0161\n│   ├── 0162\n│   ├── 0163\n│   ├── 0164\n│   ├── 0165\n│   ├── 0166\n│   ├── 0167\n│   ├── 0168\n│   ├── 0169\n│   ├── 0170\n│   ├── 0171\n│   ├── 0172\n│   ├── 0173\n│   ├── 0174\n│   ├── 0175\n│   ├── 0176\n│   ├── 0177\n│   ├── 0178\n│   ├── 0179\n│   ├── 0180\n│   ├── 0181\n│   ├── 0182\n│   ├── 0183\n│   ├── 0184\n│   ├── 0185\n│   ├── 0186\n│   ├── 0187\n│   ├── 0188\n│   ├── 0189\n│   ├── 0190\n│   ├── 0191\n│   ├── 0192\n│   ├── 0193\n│   ├── 0194\n│   ├── 0195\n│   ├── 0196\n│   ├── 0197\n│   ├── 0198\n│   ├── 0199\n│   ├── 0200\n│   ├── 0201\n│   ├── 0202\n│   ├── 0203\n│   ├── 0204\n│   ├── 0205\n│   ├── 0206\n│   ├── 0207\n│   ├── 0208\n│   ├── 0209\n│   ├── 0210\n│   ├── 0211\n│   ├── 0212\n│   ├── 0213\n│   ├── 0214\n│   ├── 0215\n│   ├── 0216\n│   ├── 0217\n│   ├── 0218\n│   ├── 0219\n│   ├── 0220\n│   ├── 0221\n│   ├── 0222\n│   ├── 0223\n│   ├── 0224\n│   ├── 0225\n│   ├── 0226\n│   ├── 0227\n│   ├── 0228\n│   ├── 0229\n│   ├── 0230\n│   ├── 0231\n│   ├── 0232\n│   ├── 0233\n│   ├── 0234\n│   ├── 0235\n│   ├── 0236\n│   ├── 0237\n│   ├── 0238\n│   ├── 0239\n│   ├── 0240\n│   ├── 0241\n│   ├── 0242\n│   ├── 0243\n│   ├── 0244\n│   ├── 0245\n│   ├── 0246\n│   ├── 0247\n│   ├── 0248\n│   ├── 0249\n│   ├── 0250\n│   ├── 0251\n│   ├── 0252\n│   ├── 0253\n│   ├── 0254\n│   ├── 0255\n│   ├── 0256\n│   ├── 0257\n│   ├── 0258\n│   ├── 0259\n│   ├── 0260\n│   ├── 0261\n│   ├── 0262\n│   ├── 0263\n│   ├── 0264\n│   ├── 0265\n│   ├── 0266\n│   ├── 0267\n│   ├── 0268\n│   ├── 0269\n│   ├── 0270\n│   ├── 0271\n│   ├── 0272\n│   ├── 0273\n│   ├── 0274\n│   ├── 0275\n│   ├── 0276\n│   ├── 0277\n│   ├── 0278\n│   ├── 0279\n│   ├── 0280\n│   ├── 0281\n│   ├── 0282\n│   ├── 0283\n│   ├── 0284\n│   ├── 0285\n│   ├── 0286\n│   ├── 0287\n│   ├── 0288\n│   ├── 0289\n│   ├── 0290\n│   ├── 0291\n│   ├── 0292\n│   ├── 0293\n│   ├── 0294\n│   ├── 0295\n│   ├── 0296\n│   ├── 0297\n│   ├── 0298\n│   ├── 0299\n│   ├── 0300\n│   ├── 0301\n│   ├── 0302\n│   ├── 0303\n│   ├── 0304\n│   ├── 0305\n│   ├── 0306\n│   ├── 0307\n│   ├── 0308\n│   ├── 0309\n│   ├── 0310\n│   ├── 0311\n│   ├── 0312\n│   ├── 0313\n│   ├── 0314\n│   ├── 0315\n│   ├── 0316\n│   ├── 0317\n│   ├── 0318\n│   ├── 0319\n│   ├── 0320\n│   ├── 0321\n│   ├── 0322\n│   ├── 0323\n│   ├── 0324\n│   ├── 0325\n│   ├── 0326\n│   ├── 0327\n│   ├── 0328\n│   ├── 0329\n│   ├── 0330\n│   ├── 0331\n│   ├── 0332\n│   ├── 0333\n│   ├── 0334\n│   ├── 0335\n│   ├── 0336\n│   ├── 0337\n│   ├── 0338\n│   ├── 0339\n│   ├── 0340\n│   ├── 0341\n│   ├── 0342\n│   ├── 0343\n│   ├── 0344\n│   ├── 0345\n│   ├── 0346\n│   ├── 0347\n│   ├── 0348\n│   ├── 0349\n│   ├── 0350\n│   ├── 0351\n│   ├── 0352\n│   ├── 0353\n│   ├── 0354\n│   ├── 0355\n│   ├── 0356\n│   ├── 0357\n│   ├── 0358\n│   ├── 0359\n│   ├── 0360\n│   ├── 0361\n│   ├── 0362\n│   ├── 0363\n│   ├── 0364\n│   ├── 0365\n│   ├── 0366\n│   ├── 0367\n│   ├── 0368\n│   ├── 0369\n│   ├── 0370\n│   ├── 0371\n│   ├── 0372\n│   ├── 0373\n│   ├── 0374\n│   ├── 0375\n│   ├── 0376\n│   ├── 0377\n│   ├── 0378\n│   ├── 0379\n│   ├── 0380\n│   ├── 0381\n│   ├── 0382\n│   ├── 0383\n│   ├── 0384\n│   ├── 0385\n│   ├── 0386\n│   ├── 0387\n│   ├── 0388\n│   ├── 0389\n│   ├── 0390\n│   ├── 0391\n│   ├── 0392\n│   ├── 0393\n│   ├── 0394\n│   ├── 0395\n│   ├── 0396\n│   ├── 0397\n│   ├── 0398\n│   ├── 0399\n│   ├── 0400\n│   ├── 0401\n│   ├── 0402\n│   ├── 0403\n│   ├── 0404\n│   ├── 0405\n│   ├── 0406\n│   ├── 0407\n│   ├── 0408\n│   ├── 0409\n│   ├── 0410\n│   ├── 0411\n│   ├── 0412\n│   ├── 0413\n│   ├── 0414\n│   ├── 0415\n│   ├── 0416\n│   ├── 0417\n│   ├── 0418\n│   ├── 0419\n│   ├── 0420\n│   ├── 0421\n│   ├── 0422\n│   ├── 0423\n│   ├── 0424\n│   ├── 0425\n│   ├── 0426\n│   ├── 0427\n│   ├── 0428\n│   ├── 0429\n│   ├── 0430\n│   ├── 0431\n│   ├── 0432\n│   ├── 0433\n│   ├── 0434\n│   ├── 0435\n│   ├── 0436\n│   ├── 0437\n│   ├── 0438\n│   ├── 0439\n│   ├── 0440\n│   ├── 0441\n│   ├── 0442\n│   ├── 0443\n│   ├── 0444\n│   ├── 0445\n│   ├── 0446\n│   ├── 0447\n│   ├── 0448\n│   ├── 0449\n│   ├── 0450\n│   ├── 0451\n│   ├── 0452\n│   ├── 0453\n│   ├── 0454\n│   ├── 0455\n│   ├── 0456\n│   ├── 0457\n│   ├── 0458\n│   ├── 0459\n│   ├── 0460\n│   ├── 0461\n│   ├── 0462\n│   ├── 0463\n│   ├── 0464\n│   ├── 0465\n│   ├── 0466\n│   ├── 0467\n│   ├── 0468\n│   ├── 0469\n│   ├── 0470\n│   ├── 0471\n│   ├── 0472\n│   ├── 0473\n│   ├── 0474\n│   ├── 0475\n│   ├── 0476\n│   ├── 0477\n│   ├── 0478\n│   ├── 0479\n│   ├── 0480\n│   ├── 0481\n│   ├── 0482\n│   ├── 0483\n│   ├── 0484\n│   ├── 0485\n│   ├── 0486\n│   ├── 0487\n│   ├── 0488\n│   ├── 0489\n│   ├── 0490\n│   ├── 0491\n│   ├── 0492\n│   ├── 0493\n│   ├── 0494\n│   ├── 0495\n│   ├── 0496\n│   ├── 0497\n│   ├── 0498\n│   ├── 0499\n│   ├── 0500\n│   ├── 0501\n│   ├── 0502\n│   ├── 0503\n│   ├── 0504\n│   ├── 0505\n│   ├── 0506\n│   ├── 0507\n│   ├── 0508\n│   ├── 0509\n│   ├── 0510\n│   ├── 0511\n│   ├── 0512\n│   ├── 0513\n│   ├── 0514\n│   ├── 0515\n│   ├── 0516\n│   ├── 0517\n│   ├── 0518\n│   ├── 0519\n│   ├── 0520\n│   ├── 0521\n│   ├── 0522\n│   ├── 0523\n│   ├── 0524\n│   ├── 0525\n│   ├── 0526\n│   ├── 0527\n│   ├── 0528\n│   ├── 0529\n│   ├── 0530\n│   ├── 0531\n│   ├── 0532\n│   ├── 0533\n│   ├── 0534\n│   ├── 0535\n│   ├── 0536\n│   ├── 0537\n│   ├── 0538\n│   ├── 0539\n│   ├── 0540\n│   ├── 0541\n│   ├── 0542\n│   ├── 0543\n│   ├── 0544\n│   ├── 0545\n│   ├── 0546\n│   ├── 0547\n│   ├── 0548\n│   ├── 0549\n│   ├── 0550\n│   ├── 0551\n│   ├── 0552\n│   ├── 0553\n│   ├── 0554\n│   ├── 0555\n│   ├── 0556\n│   ├── 0557\n│   ├── 0558\n│   ├── 0559\n│   ├── 0560\n│   ├── 0561\n│   ├── 0562\n│   ├── 0563\n│   ├── 0564\n│   ├── 0565\n│   ├── 0566\n│   ├── 0567\n│   ├── 0568\n│   ├── 0569\n│   ├── 0570\n│   ├── 0571\n│   ├── 0572\n│   ├── 0573\n│   ├── 0574\n│   ├── 0575\n│   ├── 0576\n│   ├── 0577\n│   ├── 0578\n│   ├── 0579\n│   ├── 0580\n│   ├── 0581\n│   ├── 0582\n│   ├── 0583\n│   ├── 0584\n│   ├── 0585\n│   ├── 0586\n│   ├── 0587\n│   ├── 0588\n│   ├── 0589\n│   ├── 0590\n│   ├── 0591\n│   ├── 0592\n│   ├── 0593\n│   ├── 0594\n│   ├── 0595\n│   ├── 0596\n│   ├── 0597\n│   ├── 0598\n│   ├── 0599\n│   ├── 0600\n│   ├── 0601\n│   ├── 0602\n│   ├── 0603\n│   ├── 0604\n│   ├── 0605\n│   ├── 0606\n│   ├── 0607\n│   ├── 0608\n│   ├── 0609\n│   ├── 0610\n│   ├── 0611\n│   ├── 0612\n│   ├── 0613\n│   ├── 0614\n│   ├── 0615\n│   ├── 0616\n│   ├── 0617\n│   ├── 0618\n│   ├── 0619\n│   ├── 0620\n│   ├── 0621\n│   ├── 0622\n│   ├── 0623\n│   ├── 0624\n│   ├── 0625\n│   ├── 0626\n│   ├── 0627\n│   ├── 0628\n│   ├── 0629\n│   ├── 0630\n│   ├── 0631\n│   ├── 0632\n│   ├── 0633\n│   ├── 0634\n│   ├── 0635\n│   ├── 0636\n│   ├── 0637\n│   ├── 0638\n│   ├── 0639\n│   ├── 0640\n│   ├── 0641\n│   ├── 0642\n│   ├── 0643\n│   ├── 0644\n│   ├── 0645\n│   ├── 0646\n│   ├── 0647\n│   ├── 0648\n│   ├── 0649\n│   ├── 0650\n│   ├── 0651\n│   ├── 0652\n│   ├── 0653\n│   ├── 0654\n│   ├── 0655\n│   ├── 0656\n│   ├── 0657\n│   ├── 0658\n│   ├── 0659\n│   ├── 0660\n│   ├── 0661\n│   ├── 0662\n│   ├── 0663\n│   ├── 0664\n│   ├── 0665\n│   ├── 0666\n│   ├── 0667\n│   ├── 0668\n│   ├── 0669\n│   ├── 0670\n│   ├── 0671\n│   ├── 0672\n│   ├── 0673\n│   ├── 0674\n│   ├── 0675\n│   ├── 0676\n│   ├── 0677\n│   ├── 0678\n│   ├── 0679\n│   ├── 0680\n│   ├── 0681\n│   ├── 0682\n│   ├── 0683\n│   ├── 0684\n│   ├── 0685\n│   ├── 0686\n│   ├── 0687\n│   ├── 0688\n│   ├── 0689\n│   ├── 0690\n│   ├── 0691\n│   ├── 0692\n│   ├── 0693\n│   ├── 0694\n│   ├── 0695\n│   ├── 0696\n│   ├── 0697\n│   ├── 0698\n│   ├── 0699\n│   ├── 0700\n│   ├── 0701\n│   ├── 0702\n│   ├── 0703\n│   ├── 0704\n│   ├── 0705\n│   ├── 0706\n│   ├── 0707\n│   ├── 0708\n│   ├── 0709\n│   ├── 0710\n│   ├── 0711\n│   ├── 0712\n│   ├── 0713\n│   ├── 0714\n│   ├── 0715\n│   ├── 0716\n│   ├── 0717\n│   ├── 0718\n│   ├── 0719\n│   ├── 0720\n│   ├── 0721\n│   ├── 0722\n│   ├── 0723\n│   ├── 0724\n│   ├── 0725\n│   ├── 0726\n│   ├── 0727\n│   ├── 0728\n│   ├── 0729\n│   ├── 0730\n│   ├── 0731\n│   ├── 0732\n│   ├── 0733\n│   ├── 0734\n│   ├── 0735\n│   ├── 0736\n│   ├── 0737\n│   ├── 0738\n│   ├── 0739\n│   ├── 0740\n│   ├── 0741\n│   ├── 0742\n│   ├── 0743\n│   ├── 0744\n│   ├── 0745\n│   ├── 0746\n│   ├── 0747\n│   ├── 0748\n│   ├── 0749\n│   ├── 0750\n│   ├── 0751\n│   ├── 0752\n│   ├── 0753\n│   ├── 0754\n│   ├── 0755\n│   ├── 0756\n│   ├── 0757\n│   ├── 0758\n│   ├── 0759\n│   ├── 0760\n│   ├── 0761\n│   ├── 0762\n│   ├── 0763\n│   ├── 0764\n│   ├── 0765\n│   ├── 0766\n│   ├── 0767\n│   ├── 0768\n│   ├── 0769\n│   ├── 0770\n│   ├── 0771\n│   ├── 0772\n│   ├── 0773\n│   ├── 0774\n│   ├── 0775\n│   ├── 0776\n│   ├── 0777\n│   ├── 0778\n│   ├── 0779\n│   ├── 0780\n│   ├── 0781\n│   ├── 0782\n│   ├── 0783\n│   ├── 0784\n│   ├── 0785\n│   ├── 0786\n│   ├── 0787\n│   ├── 0788\n│   ├── 0789\n│   ├── 0790\n│   ├── 0791\n│   ├── 0792\n│   ├── 0793\n│   ├── 0794\n│   ├── 0795\n│   ├── 0796\n│   ├── 0797\n│   ├── 0798\n│   ├── 0799\n│   ├── 0800\n│   ├── 0801\n│   ├── 0802\n│   ├── 0803\n│   ├── 0804\n│   ├── 0805\n│   ├── 0806\n│   ├── 0807\n│   ├── 0808\n│   ├── 0809\n│   ├── 0810\n│   ├── 0811\n│   ├── 0812\n│   ├── 0813\n│   ├── 0814\n│   ├── 0815\n│   ├── 0816\n│   ├── 0817\n│   ├── 0818\n│   ├── 0819\n│   ├── 0820\n│   ├── 0821\n│   ├── 0822\n│   ├── 0823\n│   ├── 0824\n│   ├── 0825\n│   ├── 0826\n│   ├── 0827\n│   ├── 0828\n│   ├── 0829\n│   ├── 0830\n│   ├── 0831\n│   ├── 0832\n│   ├── 0833\n│   ├── 0834\n│   ├── 0835\n│   ├── 0836\n│   ├── 0837\n│   ├── 0838\n│   ├── 0839\n│   ├── 0840\n│   ├── 0841\n│   ├── 0842\n│   ├── 0843\n│   ├── 0844\n│   ├── 0845\n│   ├── 0846\n│   ├── 0847\n│   ├── 0848\n│   ├── 0849\n│   ├── 0850\n│   ├── 0851\n│   ├── 0852\n│   ├── 0853\n│   ├── 0854\n│   ├── 0855\n│   ├── 0856\n│   ├── 0857\n│   ├── 0858\n│   ├── 0859\n│   ├── 0860\n│   ├── 0861\n│   ├── 0862\n│   ├── 0863\n│   ├── 0864\n│   ├── 0865\n│   ├── 0866\n│   ├── 0867\n│   ├── 0868\n│   ├── 0869\n│   ├── 0870\n│   ├── 0871\n│   ├── 0872\n│   ├── 0873\n│   ├── 0874\n│   ├── 0875\n│   ├── 0876\n│   ├── 0877\n│   ├── 0878\n│   ├── 0879\n│   ├── 0880\n│   ├── 0881\n│   ├── 0882\n│   ├── 0883\n│   ├── 0884\n│   ├── 0885\n│   ├── 0886\n│   ├── 0887\n│   ├── 0888\n│   ├── 0889\n│   ├── 0890\n│   ├── 0891\n│   ├── 0892\n│   ├── 0893\n│   ├── 0894\n│   ├── 0895\n│   ├── 0896\n│   ├── 0897\n│   ├── 0898\n│   ├── 0899\n│   ├── 0900\n│   ├── 0901\n│   ├── 0902\n│   ├── 0903\n│   ├── 0904\n│   ├── 0905\n│   ├── 0906\n│   ├── 0907\n│   ├── 0908\n│   ├── 0909\n│   ├── 0910\n│   ├── 0911\n│   ├── 0912\n│   ├── 0913\n│   ├── 0914\n│   ├── 0915\n│   ├── 0916\n│   ├── 0917\n│   ├── 0918\n│   ├── 0919\n│   ├── 0920\n│   ├── 0921\n│   ├── 0922\n│   ├── 0923\n│   ├── 0924\n│   ├── 0925\n│   ├── 0926\n│   ├── 0927\n│   ├── 0928\n│   ├── 0929\n│   ├── 0930\n│   ├── 0931\n│   ├── 0932\n│   ├── 0933\n│   ├── 0934\n│   ├── 0935\n│   ├── 0936\n│   ├── 0937\n│   ├── 0938\n│   ├── 0939\n│   ├── 0940\n│   ├── 0941\n│   ├── 0942\n│   ├── 0943\n│   ├── 0944\n│   ├── 0945\n│   ├── 0946\n│   ├── 0947\n│   ├── 0948\n│   ├── 0949\n│   ├── 0950\n│   ├── 0951\n│   ├── 0952\n│   ├── 0953\n│   ├── 0954\n│   ├── 0955\n│   ├── 0956\n│   ├── 0957\n│   ├── 0958\n│   ├── 0959\n│   ├── 0960\n│   ├── 0961\n│   ├── 0962\n│   ├── 0963\n│   ├── 0964\n│   ├── 0965\n│   ├── 0966\n│   ├── 0967\n│   ├── 0968\n│   ├── 0969\n│   ├── 0970\n│   ├── 0971\n│   ├── 0972\n│   ├── 0973\n│   ├── 0974\n│   ├── 0975\n│   ├── 0976\n│   ├── 0977\n│   ├── 0978\n│   ├── 0979\n│   ├── 0980\n│   ├── 0981\n│   ├── 0982\n│   ├── 0983\n│   ├── 0984\n│   ├── 0985\n│   ├── 0986\n│   ├── 0987\n│   ├── 0988\n│   ├── 0989\n│   ├── 0990\n│   ├── 0991\n│   ├── 0992\n│   ├── 0993\n│   ├── 0994\n│   ├── 0995\n│   ├── 0996\n│   ├── 0997\n│   ├── 0998\n│   ├── 0999\n│   ├── 1000\n│   ├── file_000\n│   ├── file_001\n│   ├── file_002\n│   ├── file_003\n│   ├── file_004\n│   ├── file_005\n│   ├── file_006\n│   ├── file_007\n│   ├── file_008\n│   ├── file_009\n│   ├── file_010\n│   ├── file_011\n│   ├── file_012\n│   ├── file_013\n│   ├── file_014\n│   ├── file_015\n│   ├── file_016\n│   ├── file_017\n│   ├── file_018\n│   ├── file_019\n│   ├── file_020\n│   ├── file_021\n│   ├── file_022\n│   ├── file_023\n│   ├── file_024\n│   ├── file_025\n│   ├── file_026\n│   ├── file_027\n│   ├── file_028\n│   ├── file_029\n│   ├── file_030\n│   ├── file_031\n│   ├── file_032\n│   ├── file_033\n│   ├── file_034\n│   ├── file_035\n│   ├── file_036\n│   ├── file_037\n│   ├── file_038\n│   ├── file_039\n│   ├── file_040\n│   ├── file_041\n│   ├── file_042\n│   ├── file_043\n│   ├── file_044\n│   ├── file_045\n│   ├── file_046\n│   ├── file_047\n│   ├── file_048\n│   ├── file_049\n│   ├── file_050\n│   ├── file_051\n│   ├── file_052\n│   ├── file_053\n│   ├── file_054\n│   ├── file_055\n│   ├── file_056\n│   ├── file_057\n│   ├── file_058\n│   ├── file_059\n│   ├── file_060\n│   ├── file_061\n│   ├── file_062\n│   ├── file_063\n│   ├── file_064\n│   ├── file_065\n│   ├── file_066\n│   ├── file_067\n│   ├── file_068\n│   ├── file_069\n│   ├── file_070\n│   ├── file_071\n│   ├── file_072\n│   ├── file_073\n│   ├── file_074\n│   ├── file_075\n│   ├── file_076\n│   ├── file_077\n│   ├── file_078\n│   ├── file_079\n│   ├── file_080\n│   ├── file_081\n│   ├── file_082\n│   ├── file_083\n│   ├── file_084\n│   ├── file_085\n│   ├── file_086\n│   ├── file_087\n│   ├── file_088\n│   ├── file_089\n│   ├── file_090\n│   ├── file_091\n│   ├── file_092\n│   ├── file_093\n│   ├── file_094\n│   ├── file_095\n│   ├── file_096\n│   ├── file_097\n│   ├── file_098\n│   ├── file_099\n│   ├── file_100\n│   ├── file_101\n│   ├── file_102\n│   ├── file_103\n│   ├── file_104\n│   ├── file_105\n│   ├── file_106\n│   ├── file_107\n│   ├── file_108\n│   ├── file_109\n│   ├── file_110\n│   ├── file_111\n│   ├── file_112\n│   ├── file_113\n│   ├── file_114\n│   ├── file_115\n│   ├── file_116\n│   ├── file_117\n│   ├── file_118\n│   ├── file_119\n│   ├── file_120\n│   ├── file_121\n│   ├── file_122\n│   ├── file_123\n│   ├── file_124\n│   ├── file_125\n│   ├── file_126\n│   ├── file_127\n│   ├── file_128\n│   ├── file_129\n│   ├── file_130\n│   ├── file_131\n│   ├── file_132\n│   ├── file_133\n│   ├── file_134\n│   ├── file_135\n│   ├── file_136\n│   ├── file_137\n│   ├── file_138\n│   ├── file_139\n│   ├── file_140\n│   ├── file_141\n│   ├── file_142\n│   ├── file_143\n│   ├── file_144\n│   ├── file_145\n│   ├── file_146\n│   ├── file_147\n│   ├── file_148\n│   ├── file_149\n│   ├── file_150\n│   ├── file_151\n│   ├── file_152\n│   ├── file_153\n│   ├── file_154\n│   ├── file_155\n│   ├── file_156\n│   ├── file_157\n│   ├── file_158\n│   ├── file_159\n│   ├── file_160\n│   ├── file_161\n│   ├── file_162\n│   ├── file_163\n│   ├── file_164\n│   ├── file_165\n│   ├── file_166\n│   ├── file_167\n│   ├── file_168\n│   ├── file_169\n│   ├── file_170\n│   ├── file_171\n│   ├── file_172\n│   ├── file_173\n│   ├── file_174\n│   ├── file_175\n│   ├── file_176\n│   ├── file_177\n│   ├── file_178\n│   ├── file_179\n│   ├── file_180\n│   ├── file_181\n│   ├── file_182\n│   ├── file_183\n│   ├── file_184\n│   ├── file_185\n│   ├── file_186\n│   ├── file_187\n│   ├── file_188\n│   ├── file_189\n│   ├── file_190\n│   ├── file_191\n│   ├── file_192\n│   ├── file_193\n│   ├── file_194\n│   ├── file_195\n│   ├── file_196\n│   ├── file_197\n│   ├── file_198\n│   ├── file_199\n│   ├── file_200\n│   ├── file_201\n│   ├── file_202\n│   ├── file_203\n│   ├── file_204\n│   ├── file_205\n│   ├── file_206\n│   ├── file_207\n│   ├── file_208\n│   ├── file_209\n│   ├── file_210\n│   ├── file_211\n│   ├── file_212\n│   ├── file_213\n│   ├── file_214\n│   ├── file_215\n│   ├── file_216\n│   ├── file_217\n│   ├── file_218\n│   ├── file_219\n│   ├── file_220\n│   ├── file_221\n│   ├── file_222\n│   ├── file_223\n│   ├── file_224\n│   ├── file_225\n│   ├── file_226\n│   ├── file_227\n│   ├── file_228\n│   ├── file_229\n│   ├── file_230\n│   ├── file_231\n│   ├── file_232\n│   ├── file_233\n│   ├── file_234\n│   ├── file_235\n│   ├── file_236\n│   ├── file_237\n│   ├── file_238\n│   ├── file_239\n│   ├── file_240\n│   ├── file_241\n│   ├── file_242\n│   ├── file_243\n│   ├── file_244\n│   ├── file_245\n│   ├── file_246\n│   ├── file_247\n│   ├── file_248\n│   ├── file_249\n│   ├── file_250\n│   ├── file_251\n│   ├── file_252\n│   ├── file_253\n│   ├── file_254\n│   ├── file_255\n│   ├── file_256\n│   ├── file_257\n│   ├── file_258\n│   ├── file_259\n│   ├── file_260\n│   ├── file_261\n│   ├── file_262\n│   ├── file_263\n│   ├── file_264\n│   ├── file_265\n│   ├── file_266\n│   ├── file_267\n│   ├── file_268\n│   ├── file_269\n│   ├── file_270\n│   ├── file_271\n│   ├── file_272\n│   ├── file_273\n│   ├── file_274\n│   ├── file_275\n│   ├── file_276\n│   ├── file_277\n│   ├── file_278\n│   ├── file_279\n│   ├── file_280\n│   ├── file_281\n│   ├── file_282\n│   ├── file_283\n│   ├── file_284\n│   ├── file_285\n│   ├── file_286\n│   ├── file_287\n│   ├── file_288\n│   ├── file_289\n│   ├── file_290\n│   ├── file_291\n│   ├── file_292\n│   ├── file_293\n│   ├── file_294\n│   ├── file_295\n│   ├── file_296\n│   ├── file_297\n│   ├── file_298\n│   ├── file_299\n│   ├── file_300\n│   ├── file_301\n│   ├── file_302\n│   ├── file_303\n│   ├── file_304\n│   ├── file_305\n│   ├── file_306\n│   ├── file_307\n│   ├── file_308\n│   ├── file_309\n│   ├── file_310\n│   ├── file_311\n│   ├── file_312\n│   ├── file_313\n│   ├── file_314\n│   ├── file_315\n│   ├── file_316\n│   ├── file_317\n│   ├── file_318\n│   ├── file_319\n│   ├── file_320\n│   ├── file_321\n│   ├── file_322\n│   ├── file_323\n│   ├── file_324\n│   ├── file_325\n│   ├── file_326\n│   ├── file_327\n│   ├── file_328\n│   ├── file_329\n│   ├── file_330\n│   ├── file_331\n│   ├── file_332\n│   ├── file_333\n│   ├── file_334\n│   ├── file_335\n│   ├── file_336\n│   ├── file_337\n│   ├── file_338\n│   ├── file_339\n│   ├── file_340\n│   ├── file_341\n│   ├── file_342\n│   ├── file_343\n│   ├── file_344\n│   ├── file_345\n│   ├── file_346\n│   ├── file_347\n│   ├── file_348\n│   ├── file_349\n│   ├── file_350\n│   ├── file_351\n│   ├── file_352\n│   ├── file_353\n│   ├── file_354\n│   ├── file_355\n│   ├── file_356\n│   ├── file_357\n│   ├── file_358\n│   ├── file_359\n│   ├── file_360\n│   ├── file_361\n│   ├── file_362\n│   ├── file_363\n│   ├── file_364\n│   ├── file_365\n│   ├── file_366\n│   ├── file_367\n│   ├── file_368\n│   ├── file_369\n│   ├── file_370\n│   ├── file_371\n│   ├── file_372\n│   ├── file_373\n│   ├── file_374\n│   ├── file_375\n│   ├── file_376\n│   ├── file_377\n│   ├── file_378\n│   ├── file_379\n│   ├── file_380\n│   ├── file_381\n│   ├── file_382\n│   ├── file_383\n│   ├── file_384\n│   ├── file_385\n│   ├── file_386\n│   ├── file_387\n│   ├── file_388\n│   ├── file_389\n│   ├── file_390\n│   ├── file_391\n│   ├── file_392\n│   ├── file_393\n│   ├── file_394\n│   ├── file_395\n│   ├── file_396\n│   ├── file_397\n│   ├── file_398\n│   ├── file_399\n│   ├── file_400\n│   ├── file_401\n│   ├── file_402\n│   ├── file_403\n│   ├── file_404\n│   ├── file_405\n│   ├── file_406\n│   ├── file_407\n│   ├── file_408\n│   ├── file_409\n│   ├── file_410\n│   ├── file_411\n│   ├── file_412\n│   ├── file_413\n│   ├── file_414\n│   ├── file_415\n│   ├── file_416\n│   ├── file_417\n│   ├── file_418\n│   ├── file_419\n│   ├── file_420\n│   ├── file_421\n│   ├── file_422\n│   ├── file_423\n│   ├── file_424\n│   ├── file_425\n│   ├── file_426\n│   ├── file_427\n│   ├── file_428\n│   ├── file_429\n│   ├── file_430\n│   ├── file_431\n│   ├── file_432\n│   ├── file_433\n│   ├── file_434\n│   ├── file_435\n│   ├── file_436\n│   ├── file_437\n│   ├── file_438\n│   ├── file_439\n│   ├── file_440\n│   ├── file_441\n│   ├── file_442\n│   ├── file_443\n│   ├── file_444\n│   ├── file_445\n│   ├── file_446\n│   ├── file_447\n│   ├── file_448\n│   ├── file_449\n│   ├── file_450\n│   ├── file_451\n│   ├── file_452\n│   ├── file_453\n│   ├── file_454\n│   ├── file_455\n│   ├── file_456\n│   ├── file_457\n│   ├── file_458\n│   ├── file_459\n│   ├── file_460\n│   ├── file_461\n│   ├── file_462\n│   ├── file_463\n│   ├── file_464\n│   ├── file_465\n│   ├── file_466\n│   ├── file_467\n│   ├── file_468\n│   ├── file_469\n│   ├── file_470\n│   ├── file_471\n│   ├── file_472\n│   ├── file_473\n│   ├── file_474\n│   ├── file_475\n│   ├── file_476\n│   ├── file_477\n│   ├── file_478\n│   ├── file_479\n│   ├── file_480\n│   ├── file_481\n│   ├── file_482\n│   ├── file_483\n│   ├── file_484\n│   ├── file_485\n│   ├── file_486\n│   ├── file_487\n│   ├── file_488\n│   ├── file_489\n│   ├── file_490\n│   ├── file_491\n│   ├── file_492\n│   ├── file_493\n│   ├── file_494\n│   ├── file_495\n│   ├── file_496\n│   ├── file_497\n│   ├── file_498\n│   ├── file_499\n│   ├── file_500\n│   ├── file_501\n│   ├── file_502\n│   ├── file_503\n│   ├── file_504\n│   ├── file_505\n│   ├── file_506\n│   ├── file_507\n│   ├── file_508\n│   ├── file_509\n│   ├── file_510\n│   ├── file_511\n│   ├── file_512\n│   ├── file_513\n│   ├── file_514\n│   ├── file_515\n│   ├── file_516\n│   ├── file_517\n│   ├── file_518\n│   ├── file_519\n│   ├── file_520\n│   ├── file_521\n│   ├── file_522\n│   ├── file_523\n│   ├── file_524\n│   ├── file_525\n│   ├── file_526\n│   ├── file_527\n│   ├── file_528\n│   ├── file_529\n│   ├── file_530\n│   ├── file_531\n│   ├── file_532\n│   ├── file_533\n│   ├── file_534\n│   ├── file_535\n│   ├── file_536\n│   ├── file_537\n│   ├── file_538\n│   ├── file_539\n│   ├── file_540\n│   ├── file_541\n│   ├── file_542\n│   ├── file_543\n│   ├── file_544\n│   ├── file_545\n│   ├── file_546\n│   ├── file_547\n│   ├── file_548\n│   ├── file_549\n│   ├── file_550\n│   ├── file_551\n│   ├── file_552\n│   ├── file_553\n│   ├── file_554\n│   ├── file_555\n│   ├── file_556\n│   ├── file_557\n│   ├── file_558\n│   ├── file_559\n│   ├── file_560\n│   ├── file_561\n│   ├── file_562\n│   ├── file_563\n│   ├── file_564\n│   ├── file_565\n│   ├── file_566\n│   ├── file_567\n│   ├── file_568\n│   ├── file_569\n│   ├── file_570\n│   ├── file_571\n│   ├── file_572\n│   ├── file_573\n│   ├── file_574\n│   ├── file_575\n│   ├── file_576\n│   ├── file_577\n│   ├── file_578\n│   ├── file_579\n│   ├── file_580\n│   ├── file_581\n│   ├── file_582\n│   ├── file_583\n│   ├── file_584\n│   ├── file_585\n│   ├── file_586\n│   ├── file_587\n│   ├── file_588\n│   ├── file_589\n│   ├── file_590\n│   ├── file_591\n│   ├── file_592\n│   ├── file_593\n│   ├── file_594\n│   ├── file_595\n│   ├── file_596\n│   ├── file_597\n│   ├── file_598\n│   ├── file_599\n│   ├── file_600\n│   ├── file_601\n│   ├── file_602\n│   ├── file_603\n│   ├── file_604\n│   ├── file_605\n│   ├── file_606\n│   ├── file_607\n│   ├── file_608\n│   ├── file_609\n│   ├── file_610\n│   ├── file_611\n│   ├── file_612\n│   ├── file_613\n│   ├── file_614\n│   ├── file_615\n│   ├── file_616\n│   ├── file_617\n│   ├── file_618\n│   ├── file_619\n│   ├── file_620\n│   ├── file_621\n│   ├── file_622\n│   ├── file_623\n│   ├── file_624\n│   ├── file_625\n│   ├── file_626\n│   ├── file_627\n│   ├── file_628\n│   ├── file_629\n│   ├── file_630\n│   ├── file_631\n│   ├── file_632\n│   ├── file_633\n│   ├── file_634\n│   ├── file_635\n│   ├── file_636\n│   ├── file_637\n│   ├── file_638\n│   ├── file_639\n│   ├── file_640\n│   ├── file_641\n│   ├── file_642\n│   ├── file_643\n│   ├── file_644\n│   ├── file_645\n│   ├── file_646\n│   ├── file_647\n│   ├── file_648\n│   ├── file_649\n│   ├── file_650\n│   ├── file_651\n│   ├── file_652\n│   ├── file_653\n│   ├── file_654\n│   ├── file_655\n│   ├── file_656\n│   ├── file_657\n│   ├── file_658\n│   ├── file_659\n│   ├── file_660\n│   ├── file_661\n│   ├── file_662\n│   ├── file_663\n│   ├── file_664\n│   ├── file_665\n│   ├── file_666\n│   ├── file_667\n│   ├── file_668\n│   ├── file_669\n│   ├── file_670\n│   ├── file_671\n│   ├── file_672\n│   ├── file_673\n│   ├── file_674\n│   ├── file_675\n│   ├── file_676\n│   ├── file_677\n│   ├── file_678\n│   ├── file_679\n│   ├── file_680\n│   ├── file_681\n│   ├── file_682\n│   ├── file_683\n│   ├── file_684\n│   ├── file_685\n│   ├── file_686\n│   ├── file_687\n│   ├── file_688\n│   ├── file_689\n│   ├── file_690\n│   ├── file_691\n│   ├── file_692\n│   ├── file_693\n│   ├── file_694\n│   ├── file_695\n│   ├── file_696\n│   ├── file_697\n│   ├── file_698\n│   ├── file_699\n│   ├── file_700\n│   ├── file_701\n│   ├── file_702\n│   ├── file_703\n│   ├── file_704\n│   ├── file_705\n│   ├── file_706\n│   ├── file_707\n│   ├── file_708\n│   ├── file_709\n│   ├── file_710\n│   ├── file_711\n│   ├── file_712\n│   ├── file_713\n│   ├── file_714\n│   ├── file_715\n│   ├── file_716\n│   ├── file_717\n│   ├── file_718\n│   ├── file_719\n│   ├── file_720\n│   ├── file_721\n│   ├── file_722\n│   ├── file_723\n│   ├── file_724\n│   ├── file_725\n│   ├── file_726\n│   ├── file_727\n│   ├── file_728\n│   ├── file_729\n│   ├── file_730\n│   ├── file_731\n│   ├── file_732\n│   ├── file_733\n│   ├── file_734\n│   ├── file_735\n│   ├── file_736\n│   ├── file_737\n│   ├── file_738\n│   ├── file_739\n│   ├── file_740\n│   ├── file_741\n│   ├── file_742\n│   ├── file_743\n│   ├── file_744\n│   ├── file_745\n│   ├── file_746\n│   ├── file_747\n│   ├── file_748\n│   ├── file_749\n│   ├── file_750\n│   ├── file_751\n│   ├── file_752\n│   ├── file_753\n│   ├── file_754\n│   ├── file_755\n│   ├── file_756\n│   ├── file_757\n│   ├── file_758\n│   ├── file_759\n│   ├── file_760\n│   ├── file_761\n│   ├── file_762\n│   ├── file_763\n│   ├── file_764\n│   ├── file_765\n│   ├── file_766\n│   ├── file_767\n│   ├── file_768\n│   ├── file_769\n│   ├── file_770\n│   ├── file_771\n│   ├── file_772\n│   ├── file_773\n│   ├── file_774\n│   ├── file_775\n│   ├── file_776\n│   ├── file_777\n│   ├── file_778\n│   ├── file_779\n│   ├── file_780\n│   ├── file_781\n│   ├── file_782\n│   ├── file_783\n│   ├── file_784\n│   ├── file_785\n│   ├── file_786\n│   ├── file_787\n│   ├── file_788\n│   ├── file_789\n│   ├── file_790\n│   ├── file_791\n│   ├── file_792\n│   ├── file_793\n│   ├── file_794\n│   ├── file_795\n│   ├── file_796\n│   ├── file_797\n│   ├── file_798\n│   ├── file_799\n│   ├── file_800\n│   ├── file_801\n│   ├── file_802\n│   ├── file_803\n│   ├── file_804\n│   ├── file_805\n│   ├── file_806\n│   ├── file_807\n│   ├── file_808\n│   ├── file_809\n│   ├── file_810\n│   ├── file_811\n│   ├── file_812\n│   ├── file_813\n│   ├── file_814\n│   ├── file_815\n│   ├── file_816\n│   ├── file_817\n│   ├── file_818\n│   ├── file_819\n│   ├── file_820\n│   ├── file_821\n│   ├── file_822\n│   ├── file_823\n│   ├── file_824\n│   ├── file_825\n│   ├── file_826\n│   ├── file_827\n│   ├── file_828\n│   ├── file_829\n│   ├── file_830\n│   ├── file_831\n│   ├── file_832\n│   ├── file_833\n│   ├── file_834\n│   ├── file_835\n│   ├── file_836\n│   ├── file_837\n│   ├── file_838\n│   ├── file_839\n│   ├── file_840\n│   ├── file_841\n│   ├── file_842\n│   ├── file_843\n│   ├── file_844\n│   ├── file_845\n│   ├── file_846\n│   ├── file_847\n│   ├── file_848\n│   ├── file_849\n│   ├── file_850\n│   ├── file_851\n│   ├── file_852\n│   ├── file_853\n│   ├── file_854\n│   ├── file_855\n│   ├── file_856\n│   ├── file_857\n│   ├── file_858\n│   ├── file_859\n│   ├── file_860\n│   ├── file_861\n│   ├── file_862\n│   ├── file_863\n│   ├── file_864\n│   ├── file_865\n│   ├── file_866\n│   ├── file_867\n│   ├── file_868\n│   ├── file_869\n│   ├── file_870\n│   ├── file_871\n│   ├── file_872\n│   ├── file_873\n│   ├── file_874\n│   ├── file_875\n│   ├── file_876\n│   ├── file_877\n│   ├── file_878\n│   ├── file_879\n│   ├── file_880\n│   ├── file_881\n│   ├── file_882\n│   ├── file_883\n│   ├── file_884\n│   ├── file_885\n│   ├── file_886\n│   ├── file_887\n│   ├── file_888\n│   ├── file_889\n│   ├── file_890\n│   ├── file_891\n│   ├── file_892\n│   ├── file_893\n│   ├── file_894\n│   ├── file_895\n│   ├── file_896\n│   ├── file_897\n│   ├── file_898\n│   ├── file_899\n│   ├── file_900\n│   ├── file_901\n│   ├── file_902\n│   ├── file_903\n│   ├── file_904\n│   ├── file_905\n│   ├── file_906\n│   ├── file_907\n│   ├── file_908\n│   ├── file_909\n│   ├── file_910\n│   ├── file_911\n│   ├── file_912\n│   ├── file_913\n│   ├── file_914\n│   ├── file_915\n│   ├── file_916\n│   ├── file_917\n│   ├── file_918\n│   ├── file_919\n│   ├── file_920\n│   ├── file_921\n│   ├── file_922\n│   ├── file_923\n│   ├── file_924\n│   ├── file_925\n│   ├── file_926\n│   ├── file_927\n│   ├── file_928\n│   ├── file_929\n│   ├── file_930\n│   ├── file_931\n│   ├── file_932\n│   ├── file_933\n│   ├── file_934\n│   ├── file_935\n│   ├── file_936\n│   ├── file_937\n│   ├── file_938\n│   ├── file_939\n│   ├── file_940\n│   ├── file_941\n│   ├── file_942\n│   ├── file_943\n│   ├── file_944\n│   ├── file_945\n│   ├── file_946\n│   ├── file_947\n│   ├── file_948\n│   ├── file_949\n│   ├── file_950\n│   ├── file_951\n│   ├── file_952\n│   ├── file_953\n│   ├── file_954\n│   ├── file_955\n│   ├── file_956\n│   ├── file_957\n│   ├── file_958\n│   ├── file_959\n│   ├── file_960\n│   ├── file_961\n│   ├── file_962\n│   ├── file_963\n│   ├── file_964\n│   ├── file_965\n│   ├── file_966\n│   ├── file_967\n│   ├── file_968\n│   ├── file_969\n│   ├── file_970\n│   ├── file_971\n│   ├── file_972\n│   ├── file_973\n│   ├── file_974\n│   ├── file_975\n│   ├── file_976\n│   ├── file_977\n│   ├── file_978\n│   ├── file_979\n│   ├── file_980\n│   ├── file_981\n│   ├── file_982\n│   ├── file_983\n│   ├── file_984\n│   ├── file_985\n│   ├── file_986\n│   ├── file_987\n│   ├── file_988\n│   ├── file_989\n│   ├── file_990\n│   ├── file_991\n│   ├── file_992\n│   ├── file_993\n│   ├── file_994\n│   ├── file_995\n│   ├── file_996\n│   ├── file_997\n│   ├── file_998\n│   └── file_999\n├── group\n│   └── file\n├── icons\n│   ├── c++.cpp\n│   ├── c.c\n│   ├── css.css\n│   ├── file\n│   ├── go.go\n│   ├── html.html\n│   ├── java.java\n│   ├── javascript.js\n│   ├── man.1\n│   ├── marked.md\n│   ├── php.php\n│   ├── python.py\n│   ├── ruby.rb\n│   ├── rust.rs\n│   ├── shell.sh\n│   └── unknown.unknown\n├── perms\n│   ├── file\n│   └── file2\n├── size\n│   ├── 1B\n│   ├── 1K\n│   ├── 1M\n│   └── 1337\n├── specials\n├── symlinks\n│   ├── dir\n│   ├── file\n│   ├── ' lorem ipsum'\n│   ├── symlink -> file\n│   ├── symlink2 -> symlink\n│   ├── symlink3 -> dir\n│   └── symlink4 -> pipitek\n└── time\n    ├── 1d\n    ├── 1h\n    ├── 1m\n    ├── 1s\n    ├── 1y\n    └── epoch\n"
  },
  {
    "path": "tests/gen/tree_unix.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --tree\"\n"
  },
  {
    "path": "tests/itest/a",
    "content": ""
  },
  {
    "path": "tests/itest/b",
    "content": ""
  },
  {
    "path": "tests/itest/c",
    "content": ""
  },
  {
    "path": "tests/itest/d",
    "content": ""
  },
  {
    "path": "tests/itest/e",
    "content": ""
  },
  {
    "path": "tests/itest/exa/sssssssssssssssssssssssssggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss/Makefile",
    "content": ""
  },
  {
    "path": "tests/itest/f",
    "content": ""
  },
  {
    "path": "tests/itest/g",
    "content": ""
  },
  {
    "path": "tests/itest/h",
    "content": ""
  },
  {
    "path": "tests/itest/i",
    "content": ""
  },
  {
    "path": "tests/itest/j",
    "content": ""
  },
  {
    "path": "tests/itest/k",
    "content": ""
  },
  {
    "path": "tests/itest/l",
    "content": ""
  },
  {
    "path": "tests/itest/m",
    "content": ""
  },
  {
    "path": "tests/itest/n",
    "content": ""
  },
  {
    "path": "tests/itest/o",
    "content": ""
  },
  {
    "path": "tests/itest/p",
    "content": ""
  },
  {
    "path": "tests/itest/q",
    "content": ""
  },
  {
    "path": "tests/itest/vagrant/debug/.gitignore",
    "content": ""
  },
  {
    "path": "tests/itest/vagrant/debug/a",
    "content": ""
  },
  {
    "path": "tests/itest/vagrant/dev/main.bf",
    "content": ">++++++++[<+++++++++>-]<.\n>++++[<+++++++>-]<+.\n+++++++..\n+++.\n>>++++++[<+++++++>-]<++.\n------------.\n>++++++[<+++++++++>-]<+.\n<.\n+++.\n------.\n--------.\n>>>++++[<++++++++>-]<+.\n"
  },
  {
    "path": "tests/itest/vagrant/log/run/run.log.text",
    "content": "Enjoyed minutes related as at on on. Is fanny dried as often me. Goodness as reserved raptures to mistaken steepest oh screened he. Gravity he mr sixteen esteems. Mile home its new way with high told said. Finished no horrible blessing landlord dwelling dissuade if. Rent fond am he in on read. Anxious cordial demands settled entered in do to colonel.\n\nIts sometimes her behaviour are contented. Do listening am eagerness oh objection collected. Together gay feelings continue juvenile had off one. Unknown may service subject her letters one bed. Child years noise ye in forty. Loud in this in both hold. My entrance me is disposal bachelor remember relation.\n\nIn to am attended desirous raptures declared diverted confined at. Collected instantly remaining up certainly to necessary as. Over walk dull into son boy door went new. At or happiness commanded daughters as. Is handsome an declared at received in extended vicinity subjects. Into miss on he over been late pain an. Only week bore boy what fat case left use. Match round scale now sex style far times. Your me past an much.\n\nParish so enable innate in formed missed. Hand two was eat busy fail. Stand smart grave would in so. Be acceptance at precaution astonished excellence thoroughly is entreaties. Who decisively attachment has dispatched. Fruit defer in party me built under first. Forbade him but savings sending ham general. So play do in near park that pain.\n\nOn no twenty spring of in esteem spirit likely estate. Continue new you declared differed learning bringing honoured. At mean mind so upon they rent am walk. Shortly am waiting inhabit smiling he chiefly of in. Lain tore time gone him his dear sure. Fat decisively estimating affronting assistance not. Resolve pursuit regular so calling me. West he plan girl been my then up no.\n\nBy spite about do of do allow blush. Additions in conveying or collected objection in. Suffer few desire wonder her object hardly nearer. Abroad no chatty others my silent an. Fat way appear denote who wholly narrow gay settle. Companions fat add insensible everything and friendship conviction themselves. Theirs months ten had add narrow own.\n\nAt distant inhabit amongst by. Appetite welcomed interest the goodness boy not. Estimable education for disposing pronounce her. John size good gay plan sent old roof own. Inquietude saw understood his friendship frequently yet. Nature his marked ham wished.\n\nConcerns greatest margaret him absolute entrance nay. Door neat week do find past he. Be no surprise he honoured indulged. Unpacked endeavor six steepest had husbands her. Painted no or affixed it so civilly. Exposed neither pressed so cottage as proceed at offices. Nay they gone sir game four. Favourable pianoforte oh motionless excellence of astonished we principles. Warrant present garrets limited cordial in inquiry to. Supported me sweetness behaviour shameless excellent so arranging.\n\nHe my polite be object oh change. Consider no mr am overcame yourself throwing sociable children. Hastily her totally conduct may. My solid by stuff first smile fanny. Humoured how advanced mrs elegance sir who. Home sons when them dine do want to. Estimating themselves unsatiable imprudence an he at an. Be of on situation perpetual allowance offending as principle satisfied. Improved carriage securing are desirous too.\n\nAttended no do thoughts me on dissuade scarcely. Own are pretty spring suffer old denote his. By proposal speedily mr striking am. But attention sex questions applauded how happiness. To travelling occasional at oh sympathize prosperous. His merit end means widow songs linen known. Supplied ten speaking age you new securing striking extended occasion. Sang put paid away joy into six her."
  },
  {
    "path": "tests/itest/vagrant/log/run/sps.log.text",
    "content": "Paid was hill sir high. For him precaution any advantages dissimilar comparison few terminated projecting. Prevailed discovery immediate objection of ye at. Repair summer one winter living feebly pretty his. In so sense am known these since. Shortly respect ask cousins brought add tedious nay. Expect relied do we genius is. On as around spirit of hearts genius. Is raptures daughter branched laughter peculiar in settling.\n\nWhole wound wrote at whose to style in. Figure ye innate former do so we. Shutters but sir yourself provided you required his. So neither related he am do believe. Nothing but you hundred had use regular. Fat sportsmen arranging preferred can. Busy paid like is oh. Dinner our ask talent her age hardly. Neglected collected an attention listening do abilities.\n\nAgreed joy vanity regret met may ladies oppose who. Mile fail as left as hard eyes. Meet made call in mean four year it to. Prospect so branched wondered sensible of up. For gay consisted resolving pronounce sportsman saw discovery not. Northward or household as conveying we earnestly believing. No in up contrasted discretion inhabiting excellence. Entreaties we collecting unpleasant at everything conviction.\n\nHad denoting properly jointure you occasion directly raillery. In said to of poor full be post face snug. Introduced imprudence see say unpleasing devonshire acceptance son. Exeter longer wisdom gay nor design age. Am weather to entered norland no in showing service. Nor repeated speaking shy appetite. Excited it hastily an pasture it observe. Snug hand how dare here too.\n\nSupplied directly pleasant we ignorant ecstatic of jointure so if. These spoke house of we. Ask put yet excuse person see change. Do inhabiting no stimulated unpleasing of admiration he. Enquire explain another he in brandon enjoyed be service. Given mrs she first china. Table party no or trees an while it since. On oh celebrated at be announcing dissimilar insipidity. Ham marked engage oppose cousin ask add yet.\n\nTalent she for lively eat led sister. Entrance strongly packages she out rendered get quitting denoting led. Dwelling confined improved it he no doubtful raptures. Several carried through an of up attempt gravity. Situation to be at offending elsewhere distrusts if. Particular use for considered projection cultivated. Worth of do doubt shall it their. Extensive existence up me contained he pronounce do. Excellence inquietude assistance precaution any impression man sufficient.\n\nFull age sex set feel her told. Tastes giving in passed direct me valley as supply. End great stood boy noisy often way taken short. Rent the size our more door. Years no place abode in ﻿no child my. Man pianoforte too solicitude friendship devonshire ten ask. Course sooner its silent but formal she led. Extensive he assurance extremity at breakfast. Dear sure ye sold fine sell on. Projection at up connection literature insensible motionless projecting.\n\nExamine she brother prudent add day ham. Far stairs now coming bed oppose hunted become his. You zealously departure had procuring suspicion. Books whose front would purse if be do decay. Quitting you way formerly disposed perceive ladyship are. Common turned boy direct and yet.\n\nBut why smiling man her imagine married. Chiefly can man her out believe manners cottage colonel unknown. Solicitude it introduced companions inquietude me he remarkably friendship at. My almost or horses period. Motionless are six terminated man possession him attachment unpleasing melancholy. Sir smile arose one share. No abroad in easily relied an whence lovers temper by. Looked wisdom common he an be giving length mr.\n\nInquietude simplicity terminated she compliment remarkably few her nay. The weeks are ham asked jokes. Neglected perceived shy nay concluded. Not mile draw plan snug next all. Houses latter an valley be indeed wished merely in my. Money doubt oh drawn every or an china. Visited out friends for expense message set eat."
  },
  {
    "path": "tests/ptests/ptest_109771b99ff4bc2c.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_109771b99ff4bc2c.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_109771b99ff4bc2c.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -F never\""
  },
  {
    "path": "tests/ptests/ptest_10c50228fc1c6107.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_10c50228fc1c6107.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\n"
  },
  {
    "path": "tests/ptests/ptest_10c50228fc1c6107.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s newest\""
  },
  {
    "path": "tests/ptests/ptest_1128756497bbcbce.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_1128756497bbcbce.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_1128756497bbcbce.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --modified \""
  },
  {
    "path": "tests/ptests/ptest_13234446d830648.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_13234446d830648.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_13234446d830648.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --time-style default\""
  },
  {
    "path": "tests/ptests/ptest_132ac9f159c3473e.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_132ac9f159c3473e.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\n"
  },
  {
    "path": "tests/ptests/ptest_132ac9f159c3473e.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort newest\""
  },
  {
    "path": "tests/ptests/ptest_13c76530584f9804.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_13c76530584f9804.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_13c76530584f9804.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --time-style full-iso\""
  },
  {
    "path": "tests/ptests/ptest_14c5df14f800bc28.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_14c5df14f800bc28.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_14c5df14f800bc28.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort Ext\""
  },
  {
    "path": "tests/ptests/ptest_182085f8602ed2aa.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_182085f8602ed2aa.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_182085f8602ed2aa.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -t modified\""
  },
  {
    "path": "tests/ptests/ptest_1889daad10054484.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_1889daad10054484.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_1889daad10054484.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --extended \""
  },
  {
    "path": "tests/ptests/ptest_19cf21a43f373b6.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_19cf21a43f373b6.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_19cf21a43f373b6.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --links \""
  },
  {
    "path": "tests/ptests/ptest_1ab8279d631495b0.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_1ab8279d631495b0.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\n"
  },
  {
    "path": "tests/ptests/ptest_1ab8279d631495b0.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort oldest\""
  },
  {
    "path": "tests/ptests/ptest_1c1df011089efa5f.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_1c1df011089efa5f.stdout",
    "content": "tests/test_dir\n├── git\n│   ├── 001\n│   ├── 002\n│   ├── 003\n│   ├── 004\n│   ├── 005\n│   ├── 006\n│   ├── 007\n│   ├── 008\n│   ├── 009\n│   └── 010\n├── grid\n│   ├── 0001\n│   ├── 0002\n│   ├── 0003\n│   ├── 0004\n│   ├── 0005\n│   ├── 0006\n│   ├── 0007\n│   ├── 0008\n│   ├── 0009\n│   ├── 0010\n│   ├── 0011\n│   ├── 0012\n│   ├── 0013\n│   ├── 0014\n│   ├── 0015\n│   ├── 0016\n│   ├── 0017\n│   ├── 0018\n│   ├── 0019\n│   ├── 0020\n│   ├── 0021\n│   ├── 0022\n│   ├── 0023\n│   ├── 0024\n│   ├── 0025\n│   ├── 0026\n│   ├── 0027\n│   ├── 0028\n│   ├── 0029\n│   ├── 0030\n│   ├── 0031\n│   ├── 0032\n│   ├── 0033\n│   ├── 0034\n│   ├── 0035\n│   ├── 0036\n│   ├── 0037\n│   ├── 0038\n│   ├── 0039\n│   ├── 0040\n│   ├── 0041\n│   ├── 0042\n│   ├── 0043\n│   ├── 0044\n│   ├── 0045\n│   ├── 0046\n│   ├── 0047\n│   ├── 0048\n│   ├── 0049\n│   ├── 0050\n│   ├── 0051\n│   ├── 0052\n│   ├── 0053\n│   ├── 0054\n│   ├── 0055\n│   ├── 0056\n│   ├── 0057\n│   ├── 0058\n│   ├── 0059\n│   ├── 0060\n│   ├── 0061\n│   ├── 0062\n│   ├── 0063\n│   ├── 0064\n│   ├── 0065\n│   ├── 0066\n│   ├── 0067\n│   ├── 0068\n│   ├── 0069\n│   ├── 0070\n│   ├── 0071\n│   ├── 0072\n│   ├── 0073\n│   ├── 0074\n│   ├── 0075\n│   ├── 0076\n│   ├── 0077\n│   ├── 0078\n│   ├── 0079\n│   ├── 0080\n│   ├── 0081\n│   ├── 0082\n│   ├── 0083\n│   ├── 0084\n│   ├── 0085\n│   ├── 0086\n│   ├── 0087\n│   ├── 0088\n│   ├── 0089\n│   ├── 0090\n│   ├── 0091\n│   ├── 0092\n│   ├── 0093\n│   ├── 0094\n│   ├── 0095\n│   ├── 0096\n│   ├── 0097\n│   ├── 0098\n│   ├── 0099\n│   ├── 0100\n│   ├── 0101\n│   ├── 0102\n│   ├── 0103\n│   ├── 0104\n│   ├── 0105\n│   ├── 0106\n│   ├── 0107\n│   ├── 0108\n│   ├── 0109\n│   ├── 0110\n│   ├── 0111\n│   ├── 0112\n│   ├── 0113\n│   ├── 0114\n│   ├── 0115\n│   ├── 0116\n│   ├── 0117\n│   ├── 0118\n│   ├── 0119\n│   ├── 0120\n│   ├── 0121\n│   ├── 0122\n│   ├── 0123\n│   ├── 0124\n│   ├── 0125\n│   ├── 0126\n│   ├── 0127\n│   ├── 0128\n│   ├── 0129\n│   ├── 0130\n│   ├── 0131\n│   ├── 0132\n│   ├── 0133\n│   ├── 0134\n│   ├── 0135\n│   ├── 0136\n│   ├── 0137\n│   ├── 0138\n│   ├── 0139\n│   ├── 0140\n│   ├── 0141\n│   ├── 0142\n│   ├── 0143\n│   ├── 0144\n│   ├── 0145\n│   ├── 0146\n│   ├── 0147\n│   ├── 0148\n│   ├── 0149\n│   ├── 0150\n│   ├── 0151\n│   ├── 0152\n│   ├── 0153\n│   ├── 0154\n│   ├── 0155\n│   ├── 0156\n│   ├── 0157\n│   ├── 0158\n│   ├── 0159\n│   ├── 0160\n│   ├── 0161\n│   ├── 0162\n│   ├── 0163\n│   ├── 0164\n│   ├── 0165\n│   ├── 0166\n│   ├── 0167\n│   ├── 0168\n│   ├── 0169\n│   ├── 0170\n│   ├── 0171\n│   ├── 0172\n│   ├── 0173\n│   ├── 0174\n│   ├── 0175\n│   ├── 0176\n│   ├── 0177\n│   ├── 0178\n│   ├── 0179\n│   ├── 0180\n│   ├── 0181\n│   ├── 0182\n│   ├── 0183\n│   ├── 0184\n│   ├── 0185\n│   ├── 0186\n│   ├── 0187\n│   ├── 0188\n│   ├── 0189\n│   ├── 0190\n│   ├── 0191\n│   ├── 0192\n│   ├── 0193\n│   ├── 0194\n│   ├── 0195\n│   ├── 0196\n│   ├── 0197\n│   ├── 0198\n│   ├── 0199\n│   ├── 0200\n│   ├── 0201\n│   ├── 0202\n│   ├── 0203\n│   ├── 0204\n│   ├── 0205\n│   ├── 0206\n│   ├── 0207\n│   ├── 0208\n│   ├── 0209\n│   ├── 0210\n│   ├── 0211\n│   ├── 0212\n│   ├── 0213\n│   ├── 0214\n│   ├── 0215\n│   ├── 0216\n│   ├── 0217\n│   ├── 0218\n│   ├── 0219\n│   ├── 0220\n│   ├── 0221\n│   ├── 0222\n│   ├── 0223\n│   ├── 0224\n│   ├── 0225\n│   ├── 0226\n│   ├── 0227\n│   ├── 0228\n│   ├── 0229\n│   ├── 0230\n│   ├── 0231\n│   ├── 0232\n│   ├── 0233\n│   ├── 0234\n│   ├── 0235\n│   ├── 0236\n│   ├── 0237\n│   ├── 0238\n│   ├── 0239\n│   ├── 0240\n│   ├── 0241\n│   ├── 0242\n│   ├── 0243\n│   ├── 0244\n│   ├── 0245\n│   ├── 0246\n│   ├── 0247\n│   ├── 0248\n│   ├── 0249\n│   ├── 0250\n│   ├── 0251\n│   ├── 0252\n│   ├── 0253\n│   ├── 0254\n│   ├── 0255\n│   ├── 0256\n│   ├── 0257\n│   ├── 0258\n│   ├── 0259\n│   ├── 0260\n│   ├── 0261\n│   ├── 0262\n│   ├── 0263\n│   ├── 0264\n│   ├── 0265\n│   ├── 0266\n│   ├── 0267\n│   ├── 0268\n│   ├── 0269\n│   ├── 0270\n│   ├── 0271\n│   ├── 0272\n│   ├── 0273\n│   ├── 0274\n│   ├── 0275\n│   ├── 0276\n│   ├── 0277\n│   ├── 0278\n│   ├── 0279\n│   ├── 0280\n│   ├── 0281\n│   ├── 0282\n│   ├── 0283\n│   ├── 0284\n│   ├── 0285\n│   ├── 0286\n│   ├── 0287\n│   ├── 0288\n│   ├── 0289\n│   ├── 0290\n│   ├── 0291\n│   ├── 0292\n│   ├── 0293\n│   ├── 0294\n│   ├── 0295\n│   ├── 0296\n│   ├── 0297\n│   ├── 0298\n│   ├── 0299\n│   ├── 0300\n│   ├── 0301\n│   ├── 0302\n│   ├── 0303\n│   ├── 0304\n│   ├── 0305\n│   ├── 0306\n│   ├── 0307\n│   ├── 0308\n│   ├── 0309\n│   ├── 0310\n│   ├── 0311\n│   ├── 0312\n│   ├── 0313\n│   ├── 0314\n│   ├── 0315\n│   ├── 0316\n│   ├── 0317\n│   ├── 0318\n│   ├── 0319\n│   ├── 0320\n│   ├── 0321\n│   ├── 0322\n│   ├── 0323\n│   ├── 0324\n│   ├── 0325\n│   ├── 0326\n│   ├── 0327\n│   ├── 0328\n│   ├── 0329\n│   ├── 0330\n│   ├── 0331\n│   ├── 0332\n│   ├── 0333\n│   ├── 0334\n│   ├── 0335\n│   ├── 0336\n│   ├── 0337\n│   ├── 0338\n│   ├── 0339\n│   ├── 0340\n│   ├── 0341\n│   ├── 0342\n│   ├── 0343\n│   ├── 0344\n│   ├── 0345\n│   ├── 0346\n│   ├── 0347\n│   ├── 0348\n│   ├── 0349\n│   ├── 0350\n│   ├── 0351\n│   ├── 0352\n│   ├── 0353\n│   ├── 0354\n│   ├── 0355\n│   ├── 0356\n│   ├── 0357\n│   ├── 0358\n│   ├── 0359\n│   ├── 0360\n│   ├── 0361\n│   ├── 0362\n│   ├── 0363\n│   ├── 0364\n│   ├── 0365\n│   ├── 0366\n│   ├── 0367\n│   ├── 0368\n│   ├── 0369\n│   ├── 0370\n│   ├── 0371\n│   ├── 0372\n│   ├── 0373\n│   ├── 0374\n│   ├── 0375\n│   ├── 0376\n│   ├── 0377\n│   ├── 0378\n│   ├── 0379\n│   ├── 0380\n│   ├── 0381\n│   ├── 0382\n│   ├── 0383\n│   ├── 0384\n│   ├── 0385\n│   ├── 0386\n│   ├── 0387\n│   ├── 0388\n│   ├── 0389\n│   ├── 0390\n│   ├── 0391\n│   ├── 0392\n│   ├── 0393\n│   ├── 0394\n│   ├── 0395\n│   ├── 0396\n│   ├── 0397\n│   ├── 0398\n│   ├── 0399\n│   ├── 0400\n│   ├── 0401\n│   ├── 0402\n│   ├── 0403\n│   ├── 0404\n│   ├── 0405\n│   ├── 0406\n│   ├── 0407\n│   ├── 0408\n│   ├── 0409\n│   ├── 0410\n│   ├── 0411\n│   ├── 0412\n│   ├── 0413\n│   ├── 0414\n│   ├── 0415\n│   ├── 0416\n│   ├── 0417\n│   ├── 0418\n│   ├── 0419\n│   ├── 0420\n│   ├── 0421\n│   ├── 0422\n│   ├── 0423\n│   ├── 0424\n│   ├── 0425\n│   ├── 0426\n│   ├── 0427\n│   ├── 0428\n│   ├── 0429\n│   ├── 0430\n│   ├── 0431\n│   ├── 0432\n│   ├── 0433\n│   ├── 0434\n│   ├── 0435\n│   ├── 0436\n│   ├── 0437\n│   ├── 0438\n│   ├── 0439\n│   ├── 0440\n│   ├── 0441\n│   ├── 0442\n│   ├── 0443\n│   ├── 0444\n│   ├── 0445\n│   ├── 0446\n│   ├── 0447\n│   ├── 0448\n│   ├── 0449\n│   ├── 0450\n│   ├── 0451\n│   ├── 0452\n│   ├── 0453\n│   ├── 0454\n│   ├── 0455\n│   ├── 0456\n│   ├── 0457\n│   ├── 0458\n│   ├── 0459\n│   ├── 0460\n│   ├── 0461\n│   ├── 0462\n│   ├── 0463\n│   ├── 0464\n│   ├── 0465\n│   ├── 0466\n│   ├── 0467\n│   ├── 0468\n│   ├── 0469\n│   ├── 0470\n│   ├── 0471\n│   ├── 0472\n│   ├── 0473\n│   ├── 0474\n│   ├── 0475\n│   ├── 0476\n│   ├── 0477\n│   ├── 0478\n│   ├── 0479\n│   ├── 0480\n│   ├── 0481\n│   ├── 0482\n│   ├── 0483\n│   ├── 0484\n│   ├── 0485\n│   ├── 0486\n│   ├── 0487\n│   ├── 0488\n│   ├── 0489\n│   ├── 0490\n│   ├── 0491\n│   ├── 0492\n│   ├── 0493\n│   ├── 0494\n│   ├── 0495\n│   ├── 0496\n│   ├── 0497\n│   ├── 0498\n│   ├── 0499\n│   ├── 0500\n│   ├── 0501\n│   ├── 0502\n│   ├── 0503\n│   ├── 0504\n│   ├── 0505\n│   ├── 0506\n│   ├── 0507\n│   ├── 0508\n│   ├── 0509\n│   ├── 0510\n│   ├── 0511\n│   ├── 0512\n│   ├── 0513\n│   ├── 0514\n│   ├── 0515\n│   ├── 0516\n│   ├── 0517\n│   ├── 0518\n│   ├── 0519\n│   ├── 0520\n│   ├── 0521\n│   ├── 0522\n│   ├── 0523\n│   ├── 0524\n│   ├── 0525\n│   ├── 0526\n│   ├── 0527\n│   ├── 0528\n│   ├── 0529\n│   ├── 0530\n│   ├── 0531\n│   ├── 0532\n│   ├── 0533\n│   ├── 0534\n│   ├── 0535\n│   ├── 0536\n│   ├── 0537\n│   ├── 0538\n│   ├── 0539\n│   ├── 0540\n│   ├── 0541\n│   ├── 0542\n│   ├── 0543\n│   ├── 0544\n│   ├── 0545\n│   ├── 0546\n│   ├── 0547\n│   ├── 0548\n│   ├── 0549\n│   ├── 0550\n│   ├── 0551\n│   ├── 0552\n│   ├── 0553\n│   ├── 0554\n│   ├── 0555\n│   ├── 0556\n│   ├── 0557\n│   ├── 0558\n│   ├── 0559\n│   ├── 0560\n│   ├── 0561\n│   ├── 0562\n│   ├── 0563\n│   ├── 0564\n│   ├── 0565\n│   ├── 0566\n│   ├── 0567\n│   ├── 0568\n│   ├── 0569\n│   ├── 0570\n│   ├── 0571\n│   ├── 0572\n│   ├── 0573\n│   ├── 0574\n│   ├── 0575\n│   ├── 0576\n│   ├── 0577\n│   ├── 0578\n│   ├── 0579\n│   ├── 0580\n│   ├── 0581\n│   ├── 0582\n│   ├── 0583\n│   ├── 0584\n│   ├── 0585\n│   ├── 0586\n│   ├── 0587\n│   ├── 0588\n│   ├── 0589\n│   ├── 0590\n│   ├── 0591\n│   ├── 0592\n│   ├── 0593\n│   ├── 0594\n│   ├── 0595\n│   ├── 0596\n│   ├── 0597\n│   ├── 0598\n│   ├── 0599\n│   ├── 0600\n│   ├── 0601\n│   ├── 0602\n│   ├── 0603\n│   ├── 0604\n│   ├── 0605\n│   ├── 0606\n│   ├── 0607\n│   ├── 0608\n│   ├── 0609\n│   ├── 0610\n│   ├── 0611\n│   ├── 0612\n│   ├── 0613\n│   ├── 0614\n│   ├── 0615\n│   ├── 0616\n│   ├── 0617\n│   ├── 0618\n│   ├── 0619\n│   ├── 0620\n│   ├── 0621\n│   ├── 0622\n│   ├── 0623\n│   ├── 0624\n│   ├── 0625\n│   ├── 0626\n│   ├── 0627\n│   ├── 0628\n│   ├── 0629\n│   ├── 0630\n│   ├── 0631\n│   ├── 0632\n│   ├── 0633\n│   ├── 0634\n│   ├── 0635\n│   ├── 0636\n│   ├── 0637\n│   ├── 0638\n│   ├── 0639\n│   ├── 0640\n│   ├── 0641\n│   ├── 0642\n│   ├── 0643\n│   ├── 0644\n│   ├── 0645\n│   ├── 0646\n│   ├── 0647\n│   ├── 0648\n│   ├── 0649\n│   ├── 0650\n│   ├── 0651\n│   ├── 0652\n│   ├── 0653\n│   ├── 0654\n│   ├── 0655\n│   ├── 0656\n│   ├── 0657\n│   ├── 0658\n│   ├── 0659\n│   ├── 0660\n│   ├── 0661\n│   ├── 0662\n│   ├── 0663\n│   ├── 0664\n│   ├── 0665\n│   ├── 0666\n│   ├── 0667\n│   ├── 0668\n│   ├── 0669\n│   ├── 0670\n│   ├── 0671\n│   ├── 0672\n│   ├── 0673\n│   ├── 0674\n│   ├── 0675\n│   ├── 0676\n│   ├── 0677\n│   ├── 0678\n│   ├── 0679\n│   ├── 0680\n│   ├── 0681\n│   ├── 0682\n│   ├── 0683\n│   ├── 0684\n│   ├── 0685\n│   ├── 0686\n│   ├── 0687\n│   ├── 0688\n│   ├── 0689\n│   ├── 0690\n│   ├── 0691\n│   ├── 0692\n│   ├── 0693\n│   ├── 0694\n│   ├── 0695\n│   ├── 0696\n│   ├── 0697\n│   ├── 0698\n│   ├── 0699\n│   ├── 0700\n│   ├── 0701\n│   ├── 0702\n│   ├── 0703\n│   ├── 0704\n│   ├── 0705\n│   ├── 0706\n│   ├── 0707\n│   ├── 0708\n│   ├── 0709\n│   ├── 0710\n│   ├── 0711\n│   ├── 0712\n│   ├── 0713\n│   ├── 0714\n│   ├── 0715\n│   ├── 0716\n│   ├── 0717\n│   ├── 0718\n│   ├── 0719\n│   ├── 0720\n│   ├── 0721\n│   ├── 0722\n│   ├── 0723\n│   ├── 0724\n│   ├── 0725\n│   ├── 0726\n│   ├── 0727\n│   ├── 0728\n│   ├── 0729\n│   ├── 0730\n│   ├── 0731\n│   ├── 0732\n│   ├── 0733\n│   ├── 0734\n│   ├── 0735\n│   ├── 0736\n│   ├── 0737\n│   ├── 0738\n│   ├── 0739\n│   ├── 0740\n│   ├── 0741\n│   ├── 0742\n│   ├── 0743\n│   ├── 0744\n│   ├── 0745\n│   ├── 0746\n│   ├── 0747\n│   ├── 0748\n│   ├── 0749\n│   ├── 0750\n│   ├── 0751\n│   ├── 0752\n│   ├── 0753\n│   ├── 0754\n│   ├── 0755\n│   ├── 0756\n│   ├── 0757\n│   ├── 0758\n│   ├── 0759\n│   ├── 0760\n│   ├── 0761\n│   ├── 0762\n│   ├── 0763\n│   ├── 0764\n│   ├── 0765\n│   ├── 0766\n│   ├── 0767\n│   ├── 0768\n│   ├── 0769\n│   ├── 0770\n│   ├── 0771\n│   ├── 0772\n│   ├── 0773\n│   ├── 0774\n│   ├── 0775\n│   ├── 0776\n│   ├── 0777\n│   ├── 0778\n│   ├── 0779\n│   ├── 0780\n│   ├── 0781\n│   ├── 0782\n│   ├── 0783\n│   ├── 0784\n│   ├── 0785\n│   ├── 0786\n│   ├── 0787\n│   ├── 0788\n│   ├── 0789\n│   ├── 0790\n│   ├── 0791\n│   ├── 0792\n│   ├── 0793\n│   ├── 0794\n│   ├── 0795\n│   ├── 0796\n│   ├── 0797\n│   ├── 0798\n│   ├── 0799\n│   ├── 0800\n│   ├── 0801\n│   ├── 0802\n│   ├── 0803\n│   ├── 0804\n│   ├── 0805\n│   ├── 0806\n│   ├── 0807\n│   ├── 0808\n│   ├── 0809\n│   ├── 0810\n│   ├── 0811\n│   ├── 0812\n│   ├── 0813\n│   ├── 0814\n│   ├── 0815\n│   ├── 0816\n│   ├── 0817\n│   ├── 0818\n│   ├── 0819\n│   ├── 0820\n│   ├── 0821\n│   ├── 0822\n│   ├── 0823\n│   ├── 0824\n│   ├── 0825\n│   ├── 0826\n│   ├── 0827\n│   ├── 0828\n│   ├── 0829\n│   ├── 0830\n│   ├── 0831\n│   ├── 0832\n│   ├── 0833\n│   ├── 0834\n│   ├── 0835\n│   ├── 0836\n│   ├── 0837\n│   ├── 0838\n│   ├── 0839\n│   ├── 0840\n│   ├── 0841\n│   ├── 0842\n│   ├── 0843\n│   ├── 0844\n│   ├── 0845\n│   ├── 0846\n│   ├── 0847\n│   ├── 0848\n│   ├── 0849\n│   ├── 0850\n│   ├── 0851\n│   ├── 0852\n│   ├── 0853\n│   ├── 0854\n│   ├── 0855\n│   ├── 0856\n│   ├── 0857\n│   ├── 0858\n│   ├── 0859\n│   ├── 0860\n│   ├── 0861\n│   ├── 0862\n│   ├── 0863\n│   ├── 0864\n│   ├── 0865\n│   ├── 0866\n│   ├── 0867\n│   ├── 0868\n│   ├── 0869\n│   ├── 0870\n│   ├── 0871\n│   ├── 0872\n│   ├── 0873\n│   ├── 0874\n│   ├── 0875\n│   ├── 0876\n│   ├── 0877\n│   ├── 0878\n│   ├── 0879\n│   ├── 0880\n│   ├── 0881\n│   ├── 0882\n│   ├── 0883\n│   ├── 0884\n│   ├── 0885\n│   ├── 0886\n│   ├── 0887\n│   ├── 0888\n│   ├── 0889\n│   ├── 0890\n│   ├── 0891\n│   ├── 0892\n│   ├── 0893\n│   ├── 0894\n│   ├── 0895\n│   ├── 0896\n│   ├── 0897\n│   ├── 0898\n│   ├── 0899\n│   ├── 0900\n│   ├── 0901\n│   ├── 0902\n│   ├── 0903\n│   ├── 0904\n│   ├── 0905\n│   ├── 0906\n│   ├── 0907\n│   ├── 0908\n│   ├── 0909\n│   ├── 0910\n│   ├── 0911\n│   ├── 0912\n│   ├── 0913\n│   ├── 0914\n│   ├── 0915\n│   ├── 0916\n│   ├── 0917\n│   ├── 0918\n│   ├── 0919\n│   ├── 0920\n│   ├── 0921\n│   ├── 0922\n│   ├── 0923\n│   ├── 0924\n│   ├── 0925\n│   ├── 0926\n│   ├── 0927\n│   ├── 0928\n│   ├── 0929\n│   ├── 0930\n│   ├── 0931\n│   ├── 0932\n│   ├── 0933\n│   ├── 0934\n│   ├── 0935\n│   ├── 0936\n│   ├── 0937\n│   ├── 0938\n│   ├── 0939\n│   ├── 0940\n│   ├── 0941\n│   ├── 0942\n│   ├── 0943\n│   ├── 0944\n│   ├── 0945\n│   ├── 0946\n│   ├── 0947\n│   ├── 0948\n│   ├── 0949\n│   ├── 0950\n│   ├── 0951\n│   ├── 0952\n│   ├── 0953\n│   ├── 0954\n│   ├── 0955\n│   ├── 0956\n│   ├── 0957\n│   ├── 0958\n│   ├── 0959\n│   ├── 0960\n│   ├── 0961\n│   ├── 0962\n│   ├── 0963\n│   ├── 0964\n│   ├── 0965\n│   ├── 0966\n│   ├── 0967\n│   ├── 0968\n│   ├── 0969\n│   ├── 0970\n│   ├── 0971\n│   ├── 0972\n│   ├── 0973\n│   ├── 0974\n│   ├── 0975\n│   ├── 0976\n│   ├── 0977\n│   ├── 0978\n│   ├── 0979\n│   ├── 0980\n│   ├── 0981\n│   ├── 0982\n│   ├── 0983\n│   ├── 0984\n│   ├── 0985\n│   ├── 0986\n│   ├── 0987\n│   ├── 0988\n│   ├── 0989\n│   ├── 0990\n│   ├── 0991\n│   ├── 0992\n│   ├── 0993\n│   ├── 0994\n│   ├── 0995\n│   ├── 0996\n│   ├── 0997\n│   ├── 0998\n│   ├── 0999\n│   ├── 1000\n│   ├── file_000\n│   ├── file_001\n│   ├── file_002\n│   ├── file_003\n│   ├── file_004\n│   ├── file_005\n│   ├── file_006\n│   ├── file_007\n│   ├── file_008\n│   ├── file_009\n│   ├── file_010\n│   ├── file_011\n│   ├── file_012\n│   ├── file_013\n│   ├── file_014\n│   ├── file_015\n│   ├── file_016\n│   ├── file_017\n│   ├── file_018\n│   ├── file_019\n│   ├── file_020\n│   ├── file_021\n│   ├── file_022\n│   ├── file_023\n│   ├── file_024\n│   ├── file_025\n│   ├── file_026\n│   ├── file_027\n│   ├── file_028\n│   ├── file_029\n│   ├── file_030\n│   ├── file_031\n│   ├── file_032\n│   ├── file_033\n│   ├── file_034\n│   ├── file_035\n│   ├── file_036\n│   ├── file_037\n│   ├── file_038\n│   ├── file_039\n│   ├── file_040\n│   ├── file_041\n│   ├── file_042\n│   ├── file_043\n│   ├── file_044\n│   ├── file_045\n│   ├── file_046\n│   ├── file_047\n│   ├── file_048\n│   ├── file_049\n│   ├── file_050\n│   ├── file_051\n│   ├── file_052\n│   ├── file_053\n│   ├── file_054\n│   ├── file_055\n│   ├── file_056\n│   ├── file_057\n│   ├── file_058\n│   ├── file_059\n│   ├── file_060\n│   ├── file_061\n│   ├── file_062\n│   ├── file_063\n│   ├── file_064\n│   ├── file_065\n│   ├── file_066\n│   ├── file_067\n│   ├── file_068\n│   ├── file_069\n│   ├── file_070\n│   ├── file_071\n│   ├── file_072\n│   ├── file_073\n│   ├── file_074\n│   ├── file_075\n│   ├── file_076\n│   ├── file_077\n│   ├── file_078\n│   ├── file_079\n│   ├── file_080\n│   ├── file_081\n│   ├── file_082\n│   ├── file_083\n│   ├── file_084\n│   ├── file_085\n│   ├── file_086\n│   ├── file_087\n│   ├── file_088\n│   ├── file_089\n│   ├── file_090\n│   ├── file_091\n│   ├── file_092\n│   ├── file_093\n│   ├── file_094\n│   ├── file_095\n│   ├── file_096\n│   ├── file_097\n│   ├── file_098\n│   ├── file_099\n│   ├── file_100\n│   ├── file_101\n│   ├── file_102\n│   ├── file_103\n│   ├── file_104\n│   ├── file_105\n│   ├── file_106\n│   ├── file_107\n│   ├── file_108\n│   ├── file_109\n│   ├── file_110\n│   ├── file_111\n│   ├── file_112\n│   ├── file_113\n│   ├── file_114\n│   ├── file_115\n│   ├── file_116\n│   ├── file_117\n│   ├── file_118\n│   ├── file_119\n│   ├── file_120\n│   ├── file_121\n│   ├── file_122\n│   ├── file_123\n│   ├── file_124\n│   ├── file_125\n│   ├── file_126\n│   ├── file_127\n│   ├── file_128\n│   ├── file_129\n│   ├── file_130\n│   ├── file_131\n│   ├── file_132\n│   ├── file_133\n│   ├── file_134\n│   ├── file_135\n│   ├── file_136\n│   ├── file_137\n│   ├── file_138\n│   ├── file_139\n│   ├── file_140\n│   ├── file_141\n│   ├── file_142\n│   ├── file_143\n│   ├── file_144\n│   ├── file_145\n│   ├── file_146\n│   ├── file_147\n│   ├── file_148\n│   ├── file_149\n│   ├── file_150\n│   ├── file_151\n│   ├── file_152\n│   ├── file_153\n│   ├── file_154\n│   ├── file_155\n│   ├── file_156\n│   ├── file_157\n│   ├── file_158\n│   ├── file_159\n│   ├── file_160\n│   ├── file_161\n│   ├── file_162\n│   ├── file_163\n│   ├── file_164\n│   ├── file_165\n│   ├── file_166\n│   ├── file_167\n│   ├── file_168\n│   ├── file_169\n│   ├── file_170\n│   ├── file_171\n│   ├── file_172\n│   ├── file_173\n│   ├── file_174\n│   ├── file_175\n│   ├── file_176\n│   ├── file_177\n│   ├── file_178\n│   ├── file_179\n│   ├── file_180\n│   ├── file_181\n│   ├── file_182\n│   ├── file_183\n│   ├── file_184\n│   ├── file_185\n│   ├── file_186\n│   ├── file_187\n│   ├── file_188\n│   ├── file_189\n│   ├── file_190\n│   ├── file_191\n│   ├── file_192\n│   ├── file_193\n│   ├── file_194\n│   ├── file_195\n│   ├── file_196\n│   ├── file_197\n│   ├── file_198\n│   ├── file_199\n│   ├── file_200\n│   ├── file_201\n│   ├── file_202\n│   ├── file_203\n│   ├── file_204\n│   ├── file_205\n│   ├── file_206\n│   ├── file_207\n│   ├── file_208\n│   ├── file_209\n│   ├── file_210\n│   ├── file_211\n│   ├── file_212\n│   ├── file_213\n│   ├── file_214\n│   ├── file_215\n│   ├── file_216\n│   ├── file_217\n│   ├── file_218\n│   ├── file_219\n│   ├── file_220\n│   ├── file_221\n│   ├── file_222\n│   ├── file_223\n│   ├── file_224\n│   ├── file_225\n│   ├── file_226\n│   ├── file_227\n│   ├── file_228\n│   ├── file_229\n│   ├── file_230\n│   ├── file_231\n│   ├── file_232\n│   ├── file_233\n│   ├── file_234\n│   ├── file_235\n│   ├── file_236\n│   ├── file_237\n│   ├── file_238\n│   ├── file_239\n│   ├── file_240\n│   ├── file_241\n│   ├── file_242\n│   ├── file_243\n│   ├── file_244\n│   ├── file_245\n│   ├── file_246\n│   ├── file_247\n│   ├── file_248\n│   ├── file_249\n│   ├── file_250\n│   ├── file_251\n│   ├── file_252\n│   ├── file_253\n│   ├── file_254\n│   ├── file_255\n│   ├── file_256\n│   ├── file_257\n│   ├── file_258\n│   ├── file_259\n│   ├── file_260\n│   ├── file_261\n│   ├── file_262\n│   ├── file_263\n│   ├── file_264\n│   ├── file_265\n│   ├── file_266\n│   ├── file_267\n│   ├── file_268\n│   ├── file_269\n│   ├── file_270\n│   ├── file_271\n│   ├── file_272\n│   ├── file_273\n│   ├── file_274\n│   ├── file_275\n│   ├── file_276\n│   ├── file_277\n│   ├── file_278\n│   ├── file_279\n│   ├── file_280\n│   ├── file_281\n│   ├── file_282\n│   ├── file_283\n│   ├── file_284\n│   ├── file_285\n│   ├── file_286\n│   ├── file_287\n│   ├── file_288\n│   ├── file_289\n│   ├── file_290\n│   ├── file_291\n│   ├── file_292\n│   ├── file_293\n│   ├── file_294\n│   ├── file_295\n│   ├── file_296\n│   ├── file_297\n│   ├── file_298\n│   ├── file_299\n│   ├── file_300\n│   ├── file_301\n│   ├── file_302\n│   ├── file_303\n│   ├── file_304\n│   ├── file_305\n│   ├── file_306\n│   ├── file_307\n│   ├── file_308\n│   ├── file_309\n│   ├── file_310\n│   ├── file_311\n│   ├── file_312\n│   ├── file_313\n│   ├── file_314\n│   ├── file_315\n│   ├── file_316\n│   ├── file_317\n│   ├── file_318\n│   ├── file_319\n│   ├── file_320\n│   ├── file_321\n│   ├── file_322\n│   ├── file_323\n│   ├── file_324\n│   ├── file_325\n│   ├── file_326\n│   ├── file_327\n│   ├── file_328\n│   ├── file_329\n│   ├── file_330\n│   ├── file_331\n│   ├── file_332\n│   ├── file_333\n│   ├── file_334\n│   ├── file_335\n│   ├── file_336\n│   ├── file_337\n│   ├── file_338\n│   ├── file_339\n│   ├── file_340\n│   ├── file_341\n│   ├── file_342\n│   ├── file_343\n│   ├── file_344\n│   ├── file_345\n│   ├── file_346\n│   ├── file_347\n│   ├── file_348\n│   ├── file_349\n│   ├── file_350\n│   ├── file_351\n│   ├── file_352\n│   ├── file_353\n│   ├── file_354\n│   ├── file_355\n│   ├── file_356\n│   ├── file_357\n│   ├── file_358\n│   ├── file_359\n│   ├── file_360\n│   ├── file_361\n│   ├── file_362\n│   ├── file_363\n│   ├── file_364\n│   ├── file_365\n│   ├── file_366\n│   ├── file_367\n│   ├── file_368\n│   ├── file_369\n│   ├── file_370\n│   ├── file_371\n│   ├── file_372\n│   ├── file_373\n│   ├── file_374\n│   ├── file_375\n│   ├── file_376\n│   ├── file_377\n│   ├── file_378\n│   ├── file_379\n│   ├── file_380\n│   ├── file_381\n│   ├── file_382\n│   ├── file_383\n│   ├── file_384\n│   ├── file_385\n│   ├── file_386\n│   ├── file_387\n│   ├── file_388\n│   ├── file_389\n│   ├── file_390\n│   ├── file_391\n│   ├── file_392\n│   ├── file_393\n│   ├── file_394\n│   ├── file_395\n│   ├── file_396\n│   ├── file_397\n│   ├── file_398\n│   ├── file_399\n│   ├── file_400\n│   ├── file_401\n│   ├── file_402\n│   ├── file_403\n│   ├── file_404\n│   ├── file_405\n│   ├── file_406\n│   ├── file_407\n│   ├── file_408\n│   ├── file_409\n│   ├── file_410\n│   ├── file_411\n│   ├── file_412\n│   ├── file_413\n│   ├── file_414\n│   ├── file_415\n│   ├── file_416\n│   ├── file_417\n│   ├── file_418\n│   ├── file_419\n│   ├── file_420\n│   ├── file_421\n│   ├── file_422\n│   ├── file_423\n│   ├── file_424\n│   ├── file_425\n│   ├── file_426\n│   ├── file_427\n│   ├── file_428\n│   ├── file_429\n│   ├── file_430\n│   ├── file_431\n│   ├── file_432\n│   ├── file_433\n│   ├── file_434\n│   ├── file_435\n│   ├── file_436\n│   ├── file_437\n│   ├── file_438\n│   ├── file_439\n│   ├── file_440\n│   ├── file_441\n│   ├── file_442\n│   ├── file_443\n│   ├── file_444\n│   ├── file_445\n│   ├── file_446\n│   ├── file_447\n│   ├── file_448\n│   ├── file_449\n│   ├── file_450\n│   ├── file_451\n│   ├── file_452\n│   ├── file_453\n│   ├── file_454\n│   ├── file_455\n│   ├── file_456\n│   ├── file_457\n│   ├── file_458\n│   ├── file_459\n│   ├── file_460\n│   ├── file_461\n│   ├── file_462\n│   ├── file_463\n│   ├── file_464\n│   ├── file_465\n│   ├── file_466\n│   ├── file_467\n│   ├── file_468\n│   ├── file_469\n│   ├── file_470\n│   ├── file_471\n│   ├── file_472\n│   ├── file_473\n│   ├── file_474\n│   ├── file_475\n│   ├── file_476\n│   ├── file_477\n│   ├── file_478\n│   ├── file_479\n│   ├── file_480\n│   ├── file_481\n│   ├── file_482\n│   ├── file_483\n│   ├── file_484\n│   ├── file_485\n│   ├── file_486\n│   ├── file_487\n│   ├── file_488\n│   ├── file_489\n│   ├── file_490\n│   ├── file_491\n│   ├── file_492\n│   ├── file_493\n│   ├── file_494\n│   ├── file_495\n│   ├── file_496\n│   ├── file_497\n│   ├── file_498\n│   ├── file_499\n│   ├── file_500\n│   ├── file_501\n│   ├── file_502\n│   ├── file_503\n│   ├── file_504\n│   ├── file_505\n│   ├── file_506\n│   ├── file_507\n│   ├── file_508\n│   ├── file_509\n│   ├── file_510\n│   ├── file_511\n│   ├── file_512\n│   ├── file_513\n│   ├── file_514\n│   ├── file_515\n│   ├── file_516\n│   ├── file_517\n│   ├── file_518\n│   ├── file_519\n│   ├── file_520\n│   ├── file_521\n│   ├── file_522\n│   ├── file_523\n│   ├── file_524\n│   ├── file_525\n│   ├── file_526\n│   ├── file_527\n│   ├── file_528\n│   ├── file_529\n│   ├── file_530\n│   ├── file_531\n│   ├── file_532\n│   ├── file_533\n│   ├── file_534\n│   ├── file_535\n│   ├── file_536\n│   ├── file_537\n│   ├── file_538\n│   ├── file_539\n│   ├── file_540\n│   ├── file_541\n│   ├── file_542\n│   ├── file_543\n│   ├── file_544\n│   ├── file_545\n│   ├── file_546\n│   ├── file_547\n│   ├── file_548\n│   ├── file_549\n│   ├── file_550\n│   ├── file_551\n│   ├── file_552\n│   ├── file_553\n│   ├── file_554\n│   ├── file_555\n│   ├── file_556\n│   ├── file_557\n│   ├── file_558\n│   ├── file_559\n│   ├── file_560\n│   ├── file_561\n│   ├── file_562\n│   ├── file_563\n│   ├── file_564\n│   ├── file_565\n│   ├── file_566\n│   ├── file_567\n│   ├── file_568\n│   ├── file_569\n│   ├── file_570\n│   ├── file_571\n│   ├── file_572\n│   ├── file_573\n│   ├── file_574\n│   ├── file_575\n│   ├── file_576\n│   ├── file_577\n│   ├── file_578\n│   ├── file_579\n│   ├── file_580\n│   ├── file_581\n│   ├── file_582\n│   ├── file_583\n│   ├── file_584\n│   ├── file_585\n│   ├── file_586\n│   ├── file_587\n│   ├── file_588\n│   ├── file_589\n│   ├── file_590\n│   ├── file_591\n│   ├── file_592\n│   ├── file_593\n│   ├── file_594\n│   ├── file_595\n│   ├── file_596\n│   ├── file_597\n│   ├── file_598\n│   ├── file_599\n│   ├── file_600\n│   ├── file_601\n│   ├── file_602\n│   ├── file_603\n│   ├── file_604\n│   ├── file_605\n│   ├── file_606\n│   ├── file_607\n│   ├── file_608\n│   ├── file_609\n│   ├── file_610\n│   ├── file_611\n│   ├── file_612\n│   ├── file_613\n│   ├── file_614\n│   ├── file_615\n│   ├── file_616\n│   ├── file_617\n│   ├── file_618\n│   ├── file_619\n│   ├── file_620\n│   ├── file_621\n│   ├── file_622\n│   ├── file_623\n│   ├── file_624\n│   ├── file_625\n│   ├── file_626\n│   ├── file_627\n│   ├── file_628\n│   ├── file_629\n│   ├── file_630\n│   ├── file_631\n│   ├── file_632\n│   ├── file_633\n│   ├── file_634\n│   ├── file_635\n│   ├── file_636\n│   ├── file_637\n│   ├── file_638\n│   ├── file_639\n│   ├── file_640\n│   ├── file_641\n│   ├── file_642\n│   ├── file_643\n│   ├── file_644\n│   ├── file_645\n│   ├── file_646\n│   ├── file_647\n│   ├── file_648\n│   ├── file_649\n│   ├── file_650\n│   ├── file_651\n│   ├── file_652\n│   ├── file_653\n│   ├── file_654\n│   ├── file_655\n│   ├── file_656\n│   ├── file_657\n│   ├── file_658\n│   ├── file_659\n│   ├── file_660\n│   ├── file_661\n│   ├── file_662\n│   ├── file_663\n│   ├── file_664\n│   ├── file_665\n│   ├── file_666\n│   ├── file_667\n│   ├── file_668\n│   ├── file_669\n│   ├── file_670\n│   ├── file_671\n│   ├── file_672\n│   ├── file_673\n│   ├── file_674\n│   ├── file_675\n│   ├── file_676\n│   ├── file_677\n│   ├── file_678\n│   ├── file_679\n│   ├── file_680\n│   ├── file_681\n│   ├── file_682\n│   ├── file_683\n│   ├── file_684\n│   ├── file_685\n│   ├── file_686\n│   ├── file_687\n│   ├── file_688\n│   ├── file_689\n│   ├── file_690\n│   ├── file_691\n│   ├── file_692\n│   ├── file_693\n│   ├── file_694\n│   ├── file_695\n│   ├── file_696\n│   ├── file_697\n│   ├── file_698\n│   ├── file_699\n│   ├── file_700\n│   ├── file_701\n│   ├── file_702\n│   ├── file_703\n│   ├── file_704\n│   ├── file_705\n│   ├── file_706\n│   ├── file_707\n│   ├── file_708\n│   ├── file_709\n│   ├── file_710\n│   ├── file_711\n│   ├── file_712\n│   ├── file_713\n│   ├── file_714\n│   ├── file_715\n│   ├── file_716\n│   ├── file_717\n│   ├── file_718\n│   ├── file_719\n│   ├── file_720\n│   ├── file_721\n│   ├── file_722\n│   ├── file_723\n│   ├── file_724\n│   ├── file_725\n│   ├── file_726\n│   ├── file_727\n│   ├── file_728\n│   ├── file_729\n│   ├── file_730\n│   ├── file_731\n│   ├── file_732\n│   ├── file_733\n│   ├── file_734\n│   ├── file_735\n│   ├── file_736\n│   ├── file_737\n│   ├── file_738\n│   ├── file_739\n│   ├── file_740\n│   ├── file_741\n│   ├── file_742\n│   ├── file_743\n│   ├── file_744\n│   ├── file_745\n│   ├── file_746\n│   ├── file_747\n│   ├── file_748\n│   ├── file_749\n│   ├── file_750\n│   ├── file_751\n│   ├── file_752\n│   ├── file_753\n│   ├── file_754\n│   ├── file_755\n│   ├── file_756\n│   ├── file_757\n│   ├── file_758\n│   ├── file_759\n│   ├── file_760\n│   ├── file_761\n│   ├── file_762\n│   ├── file_763\n│   ├── file_764\n│   ├── file_765\n│   ├── file_766\n│   ├── file_767\n│   ├── file_768\n│   ├── file_769\n│   ├── file_770\n│   ├── file_771\n│   ├── file_772\n│   ├── file_773\n│   ├── file_774\n│   ├── file_775\n│   ├── file_776\n│   ├── file_777\n│   ├── file_778\n│   ├── file_779\n│   ├── file_780\n│   ├── file_781\n│   ├── file_782\n│   ├── file_783\n│   ├── file_784\n│   ├── file_785\n│   ├── file_786\n│   ├── file_787\n│   ├── file_788\n│   ├── file_789\n│   ├── file_790\n│   ├── file_791\n│   ├── file_792\n│   ├── file_793\n│   ├── file_794\n│   ├── file_795\n│   ├── file_796\n│   ├── file_797\n│   ├── file_798\n│   ├── file_799\n│   ├── file_800\n│   ├── file_801\n│   ├── file_802\n│   ├── file_803\n│   ├── file_804\n│   ├── file_805\n│   ├── file_806\n│   ├── file_807\n│   ├── file_808\n│   ├── file_809\n│   ├── file_810\n│   ├── file_811\n│   ├── file_812\n│   ├── file_813\n│   ├── file_814\n│   ├── file_815\n│   ├── file_816\n│   ├── file_817\n│   ├── file_818\n│   ├── file_819\n│   ├── file_820\n│   ├── file_821\n│   ├── file_822\n│   ├── file_823\n│   ├── file_824\n│   ├── file_825\n│   ├── file_826\n│   ├── file_827\n│   ├── file_828\n│   ├── file_829\n│   ├── file_830\n│   ├── file_831\n│   ├── file_832\n│   ├── file_833\n│   ├── file_834\n│   ├── file_835\n│   ├── file_836\n│   ├── file_837\n│   ├── file_838\n│   ├── file_839\n│   ├── file_840\n│   ├── file_841\n│   ├── file_842\n│   ├── file_843\n│   ├── file_844\n│   ├── file_845\n│   ├── file_846\n│   ├── file_847\n│   ├── file_848\n│   ├── file_849\n│   ├── file_850\n│   ├── file_851\n│   ├── file_852\n│   ├── file_853\n│   ├── file_854\n│   ├── file_855\n│   ├── file_856\n│   ├── file_857\n│   ├── file_858\n│   ├── file_859\n│   ├── file_860\n│   ├── file_861\n│   ├── file_862\n│   ├── file_863\n│   ├── file_864\n│   ├── file_865\n│   ├── file_866\n│   ├── file_867\n│   ├── file_868\n│   ├── file_869\n│   ├── file_870\n│   ├── file_871\n│   ├── file_872\n│   ├── file_873\n│   ├── file_874\n│   ├── file_875\n│   ├── file_876\n│   ├── file_877\n│   ├── file_878\n│   ├── file_879\n│   ├── file_880\n│   ├── file_881\n│   ├── file_882\n│   ├── file_883\n│   ├── file_884\n│   ├── file_885\n│   ├── file_886\n│   ├── file_887\n│   ├── file_888\n│   ├── file_889\n│   ├── file_890\n│   ├── file_891\n│   ├── file_892\n│   ├── file_893\n│   ├── file_894\n│   ├── file_895\n│   ├── file_896\n│   ├── file_897\n│   ├── file_898\n│   ├── file_899\n│   ├── file_900\n│   ├── file_901\n│   ├── file_902\n│   ├── file_903\n│   ├── file_904\n│   ├── file_905\n│   ├── file_906\n│   ├── file_907\n│   ├── file_908\n│   ├── file_909\n│   ├── file_910\n│   ├── file_911\n│   ├── file_912\n│   ├── file_913\n│   ├── file_914\n│   ├── file_915\n│   ├── file_916\n│   ├── file_917\n│   ├── file_918\n│   ├── file_919\n│   ├── file_920\n│   ├── file_921\n│   ├── file_922\n│   ├── file_923\n│   ├── file_924\n│   ├── file_925\n│   ├── file_926\n│   ├── file_927\n│   ├── file_928\n│   ├── file_929\n│   ├── file_930\n│   ├── file_931\n│   ├── file_932\n│   ├── file_933\n│   ├── file_934\n│   ├── file_935\n│   ├── file_936\n│   ├── file_937\n│   ├── file_938\n│   ├── file_939\n│   ├── file_940\n│   ├── file_941\n│   ├── file_942\n│   ├── file_943\n│   ├── file_944\n│   ├── file_945\n│   ├── file_946\n│   ├── file_947\n│   ├── file_948\n│   ├── file_949\n│   ├── file_950\n│   ├── file_951\n│   ├── file_952\n│   ├── file_953\n│   ├── file_954\n│   ├── file_955\n│   ├── file_956\n│   ├── file_957\n│   ├── file_958\n│   ├── file_959\n│   ├── file_960\n│   ├── file_961\n│   ├── file_962\n│   ├── file_963\n│   ├── file_964\n│   ├── file_965\n│   ├── file_966\n│   ├── file_967\n│   ├── file_968\n│   ├── file_969\n│   ├── file_970\n│   ├── file_971\n│   ├── file_972\n│   ├── file_973\n│   ├── file_974\n│   ├── file_975\n│   ├── file_976\n│   ├── file_977\n│   ├── file_978\n│   ├── file_979\n│   ├── file_980\n│   ├── file_981\n│   ├── file_982\n│   ├── file_983\n│   ├── file_984\n│   ├── file_985\n│   ├── file_986\n│   ├── file_987\n│   ├── file_988\n│   ├── file_989\n│   ├── file_990\n│   ├── file_991\n│   ├── file_992\n│   ├── file_993\n│   ├── file_994\n│   ├── file_995\n│   ├── file_996\n│   ├── file_997\n│   ├── file_998\n│   └── file_999\n├── group\n│   └── file\n├── icons\n│   ├── c++.cpp\n│   ├── c.c\n│   ├── css.css\n│   ├── file\n│   ├── go.go\n│   ├── html.html\n│   ├── java.java\n│   ├── javascript.js\n│   ├── man.1\n│   ├── marked.md\n│   ├── php.php\n│   ├── python.py\n│   ├── ruby.rb\n│   ├── rust.rs\n│   ├── shell.sh\n│   └── unknown.unknown\n├── perms\n│   ├── file\n│   └── file2\n├── size\n│   ├── 1B\n│   ├── 1K\n│   ├── 1M\n│   └── 1337\n├── specials\n├── symlinks\n│   ├── dir\n│   ├── file\n│   ├── ' lorem ipsum'\n│   ├── symlink -> file\n│   ├── symlink2 -> symlink\n│   ├── symlink3 -> dir\n│   └── symlink4 -> pipitek\n└── time\n    ├── 1d\n    ├── 1h\n    ├── 1m\n    ├── 1s\n    ├── 1y\n    └── epoch\n"
  },
  {
    "path": "tests/ptests/ptest_1c1df011089efa5f.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T -L 2\""
  },
  {
    "path": "tests/ptests/ptest_1c990fbac951fdaf.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_1c990fbac951fdaf.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_1c990fbac951fdaf.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --color auto\""
  },
  {
    "path": "tests/ptests/ptest_1e61d8c305ff6c48.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_1e61d8c305ff6c48.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\n"
  },
  {
    "path": "tests/ptests/ptest_1e61d8c305ff6c48.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort age\""
  },
  {
    "path": "tests/ptests/ptest_1ec7257c14635d03.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_1ec7257c14635d03.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_1ec7257c14635d03.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -S \""
  },
  {
    "path": "tests/ptests/ptest_2092f19a0d4ea1a2.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_2092f19a0d4ea1a2.stdout",
    "content": "git  grid  group  icons  perms  size  specials  symlinks  time\n"
  },
  {
    "path": "tests/ptests/ptest_2092f19a0d4ea1a2.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --width 200\""
  },
  {
    "path": "tests/ptests/ptest_2176b1b061cb7da2.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_2176b1b061cb7da2.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\n"
  },
  {
    "path": "tests/ptests/ptest_2176b1b061cb7da2.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort size\""
  },
  {
    "path": "tests/ptests/ptest_219303a91ed6056a.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_219303a91ed6056a.stdout",
    "content": "tests/test_dir\n"
  },
  {
    "path": "tests/ptests/ptest_219303a91ed6056a.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --treat-dirs-as-files \""
  },
  {
    "path": "tests/ptests/ptest_219f7c8dfa0d0323.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_219f7c8dfa0d0323.stdout",
    "content": "git/\ngrid/\ngroup/\nicons/\nperms/\nsize/\nspecials/\nsymlinks/\ntime/\n"
  },
  {
    "path": "tests/ptests/ptest_219f7c8dfa0d0323.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -F always\""
  },
  {
    "path": "tests/ptests/ptest_2439b7d68089135b.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_2439b7d68089135b.stdout",
    "content": "Usage:\n  eza [options] [files...]\n\nMETA OPTIONS\n  -?, --help                 show list of command-line options\n  -v, --version              show version of eza\n\nDISPLAY OPTIONS\n  -1, --oneline              display one entry per line\n  -l, --long                 display extended file metadata as a table\n  -G, --grid                 display entries as a grid (default)\n  -x, --across               sort the grid across, rather than downwards\n  -R, --recurse              recurse into directories\n  -T, --tree                 recurse into directories as a tree\n  -X, --dereference          dereference symbolic links when displaying information\n  -F, --classify=WHEN        display type indicator by file names (always, auto, never)\n  --colo[u]r=WHEN            when to use terminal colours (always, auto, never)\n  --colo[u]r-scale           highlight levels of 'field' distinctly(all, age, size)\n  --colo[u]r-scale-mode      use gradient or fixed colors in --color-scale (fixed, gradient)\n  --icons=WHEN               when to display icons (always, auto, never)\n  --no-quotes                don't quote file names with spaces\n  --hyperlink                display entries as hyperlinks\n  --absolute                 display entries with their absolute path (on, follow, off)\n  --follow-symlinks          drill down into symbolic links that point to directories\n  -w, --width COLS           set screen width in columns\n\n\nFILTERING AND SORTING OPTIONS\n  -a, --all                  show hidden and 'dot' files. Use this twice to also\n                             show the '.' and '..' directories\n  -A, --almost-all           equivalent to --all; included for compatibility with `ls -A`\n  -d, --treat-dirs-as-files  list directories as files; don't list their contents\n  -D, --only-dirs            list only directories\n  -f, --only-files           list only files\n  --show-symlinks            explicitly show symbolic links (for use with --only-dirs | --only-files)\n  --no-symlinks              do not show symbolic links\n  -L, --level DEPTH          limit the depth of recursion\n  -r, --reverse              reverse the sort order\n  -s, --sort SORT_FIELD      which field to sort by\n  --group-directories-first  list directories before other files\n  --group-directories-last   list directories after other files\n  -I, --ignore-glob GLOBS    glob patterns (pipe-separated) of files to ignore\n  --git-ignore               ignore files mentioned in '.gitignore'\n  Valid sort fields:         name, Name, extension, Extension, size, type,\n                             created, modified, accessed, changed, inode, and none.\n                             date, time, old, and new all refer to modified.\n\nLONG VIEW OPTIONS\n  -b, --binary               list file sizes with binary prefixes\n  -B, --bytes                list file sizes in bytes, without any prefixes\n  -g, --group                list each file's group\n  --smart-group              only show group if it has a different name from owner\n  -h, --header               add a header row to each column\n  -H, --links                list each file's number of hard links\n  -i, --inode                list each file's inode number\n  -M, --mounts               show mount details (Linux and Mac only)\n  -n, --numeric              list numeric user and group IDs\n  -O, --flags                list file flags (Mac, BSD, and Windows only)\n  -S, --blocksize            show size of allocated file system blocks\n  -t, --time FIELD           which timestamp field to list (modified, accessed, created)\n  -m, --modified             use the modified timestamp field\n  -u, --accessed             use the accessed timestamp field\n  -U, --created              use the created timestamp field\n  --changed                  use the changed timestamp field\n  --time-style               how to format timestamps (default, iso, long-iso,\n                             full-iso, relative, or a custom style '+<FORMAT>'\n                             like '+%Y-%m-%d %H:%M')\n  --total-size               show the size of a directory as the size of all\n                             files and directories inside (unix only)\n  -o, --octal-permissions    list each file's permission in octal format\n  --no-permissions           suppress the permissions field\n  --no-filesize              suppress the filesize field\n  --no-user                  suppress the user field\n  --no-time                  suppress the time field\n  --stdin                    read file names from stdin, one per line or other separator \n                             specified in environment\n  --git                      list each file's Git status, if tracked or ignored\n  --no-git                   suppress Git status (always overrides --git,\n                             --git-repos, --git-repos-no-status)\n  --git-repos                list root of git-tree status\n  --git-repos-no-status      list each git-repos branch name (much faster)\n    \n  -@, --extended             list each file's extended attributes and sizes\n  -Z, --context              list each file's security context\n"
  },
  {
    "path": "tests/ptests/ptest_2439b7d68089135b.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --help \""
  },
  {
    "path": "tests/ptests/ptest_247e5acfcf9ba3a8.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_247e5acfcf9ba3a8.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_247e5acfcf9ba3a8.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --no-user \""
  },
  {
    "path": "tests/ptests/ptest_283667fe5d9c3015.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_283667fe5d9c3015.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_283667fe5d9c3015.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --no-quotes \""
  },
  {
    "path": "tests/ptests/ptest_2ba3ba45a3b3cc94.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_2ba3ba45a3b3cc94.stdout",
    "content": "tests/test_dir\n"
  },
  {
    "path": "tests/ptests/ptest_2ba3ba45a3b3cc94.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T -L 0\""
  },
  {
    "path": "tests/ptests/ptest_2cccf6c2af490359.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_2cccf6c2af490359.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_2cccf6c2af490359.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --time-style iso\""
  },
  {
    "path": "tests/ptests/ptest_2dcffc4f000d924e.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_2dcffc4f000d924e.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_2dcffc4f000d924e.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --group-directories-first \""
  },
  {
    "path": "tests/ptests/ptest_32870705e39ad648.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_32870705e39ad648.stdout",
    "content": "git    icons  specials\ngrid   perms  symlinks\ngroup  size   time\n"
  },
  {
    "path": "tests/ptests/ptest_32870705e39ad648.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --width 30\""
  },
  {
    "path": "tests/ptests/ptest_32e159e8f043025.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_32e159e8f043025.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_32e159e8f043025.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --git \""
  },
  {
    "path": "tests/ptests/ptest_33a4632005ea6e7f.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_33a4632005ea6e7f.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_33a4632005ea6e7f.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort name\""
  },
  {
    "path": "tests/ptests/ptest_3528aa3d0794ba5b.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_3528aa3d0794ba5b.stdout",
    "content": "tests/test_dir\n├── git\n├── grid\n├── group\n├── icons\n├── perms\n├── size\n├── specials\n├── symlinks\n└── time\n"
  },
  {
    "path": "tests/ptests/ptest_3528aa3d0794ba5b.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T -L 1\""
  },
  {
    "path": "tests/ptests/ptest_36127172d1c48ad1.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_36127172d1c48ad1.stdout",
    "content": "git    size\ngrid   specials\ngroup  symlinks\nicons  time\nperms\n"
  },
  {
    "path": "tests/ptests/ptest_36127172d1c48ad1.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --width 15\""
  },
  {
    "path": "tests/ptests/ptest_365b1525fed70635.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_365b1525fed70635.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_365b1525fed70635.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --classify never\""
  },
  {
    "path": "tests/ptests/ptest_36ff749946aa7b76.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_36ff749946aa7b76.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_36ff749946aa7b76.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --grid \""
  },
  {
    "path": "tests/ptests/ptest_38c83409ee57e2af.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_38c83409ee57e2af.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_38c83409ee57e2af.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir \""
  },
  {
    "path": "tests/ptests/ptest_391fb71023fbe78f.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_391fb71023fbe78f.stdout",
    "content": "tests/test_dir\n├── git\n│   ├── 001\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 002\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 003\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 004\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 005\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 006\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 007\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 008\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 009\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   └── 010\n│       ├── file_000\n│       ├── file_001\n│       ├── file_002\n│       ├── file_003\n│       ├── file_004\n│       ├── file_005\n│       ├── file_006\n│       ├── file_007\n│       ├── file_008\n│       └── file_009\n├── grid\n│   ├── 0001\n│   ├── 0002\n│   ├── 0003\n│   ├── 0004\n│   ├── 0005\n│   ├── 0006\n│   ├── 0007\n│   ├── 0008\n│   ├── 0009\n│   ├── 0010\n│   ├── 0011\n│   ├── 0012\n│   ├── 0013\n│   ├── 0014\n│   ├── 0015\n│   ├── 0016\n│   ├── 0017\n│   ├── 0018\n│   ├── 0019\n│   ├── 0020\n│   ├── 0021\n│   ├── 0022\n│   ├── 0023\n│   ├── 0024\n│   ├── 0025\n│   ├── 0026\n│   ├── 0027\n│   ├── 0028\n│   ├── 0029\n│   ├── 0030\n│   ├── 0031\n│   ├── 0032\n│   ├── 0033\n│   ├── 0034\n│   ├── 0035\n│   ├── 0036\n│   ├── 0037\n│   ├── 0038\n│   ├── 0039\n│   ├── 0040\n│   ├── 0041\n│   ├── 0042\n│   ├── 0043\n│   ├── 0044\n│   ├── 0045\n│   ├── 0046\n│   ├── 0047\n│   ├── 0048\n│   ├── 0049\n│   ├── 0050\n│   ├── 0051\n│   ├── 0052\n│   ├── 0053\n│   ├── 0054\n│   ├── 0055\n│   ├── 0056\n│   ├── 0057\n│   ├── 0058\n│   ├── 0059\n│   ├── 0060\n│   ├── 0061\n│   ├── 0062\n│   ├── 0063\n│   ├── 0064\n│   ├── 0065\n│   ├── 0066\n│   ├── 0067\n│   ├── 0068\n│   ├── 0069\n│   ├── 0070\n│   ├── 0071\n│   ├── 0072\n│   ├── 0073\n│   ├── 0074\n│   ├── 0075\n│   ├── 0076\n│   ├── 0077\n│   ├── 0078\n│   ├── 0079\n│   ├── 0080\n│   ├── 0081\n│   ├── 0082\n│   ├── 0083\n│   ├── 0084\n│   ├── 0085\n│   ├── 0086\n│   ├── 0087\n│   ├── 0088\n│   ├── 0089\n│   ├── 0090\n│   ├── 0091\n│   ├── 0092\n│   ├── 0093\n│   ├── 0094\n│   ├── 0095\n│   ├── 0096\n│   ├── 0097\n│   ├── 0098\n│   ├── 0099\n│   ├── 0100\n│   ├── 0101\n│   ├── 0102\n│   ├── 0103\n│   ├── 0104\n│   ├── 0105\n│   ├── 0106\n│   ├── 0107\n│   ├── 0108\n│   ├── 0109\n│   ├── 0110\n│   ├── 0111\n│   ├── 0112\n│   ├── 0113\n│   ├── 0114\n│   ├── 0115\n│   ├── 0116\n│   ├── 0117\n│   ├── 0118\n│   ├── 0119\n│   ├── 0120\n│   ├── 0121\n│   ├── 0122\n│   ├── 0123\n│   ├── 0124\n│   ├── 0125\n│   ├── 0126\n│   ├── 0127\n│   ├── 0128\n│   ├── 0129\n│   ├── 0130\n│   ├── 0131\n│   ├── 0132\n│   ├── 0133\n│   ├── 0134\n│   ├── 0135\n│   ├── 0136\n│   ├── 0137\n│   ├── 0138\n│   ├── 0139\n│   ├── 0140\n│   ├── 0141\n│   ├── 0142\n│   ├── 0143\n│   ├── 0144\n│   ├── 0145\n│   ├── 0146\n│   ├── 0147\n│   ├── 0148\n│   ├── 0149\n│   ├── 0150\n│   ├── 0151\n│   ├── 0152\n│   ├── 0153\n│   ├── 0154\n│   ├── 0155\n│   ├── 0156\n│   ├── 0157\n│   ├── 0158\n│   ├── 0159\n│   ├── 0160\n│   ├── 0161\n│   ├── 0162\n│   ├── 0163\n│   ├── 0164\n│   ├── 0165\n│   ├── 0166\n│   ├── 0167\n│   ├── 0168\n│   ├── 0169\n│   ├── 0170\n│   ├── 0171\n│   ├── 0172\n│   ├── 0173\n│   ├── 0174\n│   ├── 0175\n│   ├── 0176\n│   ├── 0177\n│   ├── 0178\n│   ├── 0179\n│   ├── 0180\n│   ├── 0181\n│   ├── 0182\n│   ├── 0183\n│   ├── 0184\n│   ├── 0185\n│   ├── 0186\n│   ├── 0187\n│   ├── 0188\n│   ├── 0189\n│   ├── 0190\n│   ├── 0191\n│   ├── 0192\n│   ├── 0193\n│   ├── 0194\n│   ├── 0195\n│   ├── 0196\n│   ├── 0197\n│   ├── 0198\n│   ├── 0199\n│   ├── 0200\n│   ├── 0201\n│   ├── 0202\n│   ├── 0203\n│   ├── 0204\n│   ├── 0205\n│   ├── 0206\n│   ├── 0207\n│   ├── 0208\n│   ├── 0209\n│   ├── 0210\n│   ├── 0211\n│   ├── 0212\n│   ├── 0213\n│   ├── 0214\n│   ├── 0215\n│   ├── 0216\n│   ├── 0217\n│   ├── 0218\n│   ├── 0219\n│   ├── 0220\n│   ├── 0221\n│   ├── 0222\n│   ├── 0223\n│   ├── 0224\n│   ├── 0225\n│   ├── 0226\n│   ├── 0227\n│   ├── 0228\n│   ├── 0229\n│   ├── 0230\n│   ├── 0231\n│   ├── 0232\n│   ├── 0233\n│   ├── 0234\n│   ├── 0235\n│   ├── 0236\n│   ├── 0237\n│   ├── 0238\n│   ├── 0239\n│   ├── 0240\n│   ├── 0241\n│   ├── 0242\n│   ├── 0243\n│   ├── 0244\n│   ├── 0245\n│   ├── 0246\n│   ├── 0247\n│   ├── 0248\n│   ├── 0249\n│   ├── 0250\n│   ├── 0251\n│   ├── 0252\n│   ├── 0253\n│   ├── 0254\n│   ├── 0255\n│   ├── 0256\n│   ├── 0257\n│   ├── 0258\n│   ├── 0259\n│   ├── 0260\n│   ├── 0261\n│   ├── 0262\n│   ├── 0263\n│   ├── 0264\n│   ├── 0265\n│   ├── 0266\n│   ├── 0267\n│   ├── 0268\n│   ├── 0269\n│   ├── 0270\n│   ├── 0271\n│   ├── 0272\n│   ├── 0273\n│   ├── 0274\n│   ├── 0275\n│   ├── 0276\n│   ├── 0277\n│   ├── 0278\n│   ├── 0279\n│   ├── 0280\n│   ├── 0281\n│   ├── 0282\n│   ├── 0283\n│   ├── 0284\n│   ├── 0285\n│   ├── 0286\n│   ├── 0287\n│   ├── 0288\n│   ├── 0289\n│   ├── 0290\n│   ├── 0291\n│   ├── 0292\n│   ├── 0293\n│   ├── 0294\n│   ├── 0295\n│   ├── 0296\n│   ├── 0297\n│   ├── 0298\n│   ├── 0299\n│   ├── 0300\n│   ├── 0301\n│   ├── 0302\n│   ├── 0303\n│   ├── 0304\n│   ├── 0305\n│   ├── 0306\n│   ├── 0307\n│   ├── 0308\n│   ├── 0309\n│   ├── 0310\n│   ├── 0311\n│   ├── 0312\n│   ├── 0313\n│   ├── 0314\n│   ├── 0315\n│   ├── 0316\n│   ├── 0317\n│   ├── 0318\n│   ├── 0319\n│   ├── 0320\n│   ├── 0321\n│   ├── 0322\n│   ├── 0323\n│   ├── 0324\n│   ├── 0325\n│   ├── 0326\n│   ├── 0327\n│   ├── 0328\n│   ├── 0329\n│   ├── 0330\n│   ├── 0331\n│   ├── 0332\n│   ├── 0333\n│   ├── 0334\n│   ├── 0335\n│   ├── 0336\n│   ├── 0337\n│   ├── 0338\n│   ├── 0339\n│   ├── 0340\n│   ├── 0341\n│   ├── 0342\n│   ├── 0343\n│   ├── 0344\n│   ├── 0345\n│   ├── 0346\n│   ├── 0347\n│   ├── 0348\n│   ├── 0349\n│   ├── 0350\n│   ├── 0351\n│   ├── 0352\n│   ├── 0353\n│   ├── 0354\n│   ├── 0355\n│   ├── 0356\n│   ├── 0357\n│   ├── 0358\n│   ├── 0359\n│   ├── 0360\n│   ├── 0361\n│   ├── 0362\n│   ├── 0363\n│   ├── 0364\n│   ├── 0365\n│   ├── 0366\n│   ├── 0367\n│   ├── 0368\n│   ├── 0369\n│   ├── 0370\n│   ├── 0371\n│   ├── 0372\n│   ├── 0373\n│   ├── 0374\n│   ├── 0375\n│   ├── 0376\n│   ├── 0377\n│   ├── 0378\n│   ├── 0379\n│   ├── 0380\n│   ├── 0381\n│   ├── 0382\n│   ├── 0383\n│   ├── 0384\n│   ├── 0385\n│   ├── 0386\n│   ├── 0387\n│   ├── 0388\n│   ├── 0389\n│   ├── 0390\n│   ├── 0391\n│   ├── 0392\n│   ├── 0393\n│   ├── 0394\n│   ├── 0395\n│   ├── 0396\n│   ├── 0397\n│   ├── 0398\n│   ├── 0399\n│   ├── 0400\n│   ├── 0401\n│   ├── 0402\n│   ├── 0403\n│   ├── 0404\n│   ├── 0405\n│   ├── 0406\n│   ├── 0407\n│   ├── 0408\n│   ├── 0409\n│   ├── 0410\n│   ├── 0411\n│   ├── 0412\n│   ├── 0413\n│   ├── 0414\n│   ├── 0415\n│   ├── 0416\n│   ├── 0417\n│   ├── 0418\n│   ├── 0419\n│   ├── 0420\n│   ├── 0421\n│   ├── 0422\n│   ├── 0423\n│   ├── 0424\n│   ├── 0425\n│   ├── 0426\n│   ├── 0427\n│   ├── 0428\n│   ├── 0429\n│   ├── 0430\n│   ├── 0431\n│   ├── 0432\n│   ├── 0433\n│   ├── 0434\n│   ├── 0435\n│   ├── 0436\n│   ├── 0437\n│   ├── 0438\n│   ├── 0439\n│   ├── 0440\n│   ├── 0441\n│   ├── 0442\n│   ├── 0443\n│   ├── 0444\n│   ├── 0445\n│   ├── 0446\n│   ├── 0447\n│   ├── 0448\n│   ├── 0449\n│   ├── 0450\n│   ├── 0451\n│   ├── 0452\n│   ├── 0453\n│   ├── 0454\n│   ├── 0455\n│   ├── 0456\n│   ├── 0457\n│   ├── 0458\n│   ├── 0459\n│   ├── 0460\n│   ├── 0461\n│   ├── 0462\n│   ├── 0463\n│   ├── 0464\n│   ├── 0465\n│   ├── 0466\n│   ├── 0467\n│   ├── 0468\n│   ├── 0469\n│   ├── 0470\n│   ├── 0471\n│   ├── 0472\n│   ├── 0473\n│   ├── 0474\n│   ├── 0475\n│   ├── 0476\n│   ├── 0477\n│   ├── 0478\n│   ├── 0479\n│   ├── 0480\n│   ├── 0481\n│   ├── 0482\n│   ├── 0483\n│   ├── 0484\n│   ├── 0485\n│   ├── 0486\n│   ├── 0487\n│   ├── 0488\n│   ├── 0489\n│   ├── 0490\n│   ├── 0491\n│   ├── 0492\n│   ├── 0493\n│   ├── 0494\n│   ├── 0495\n│   ├── 0496\n│   ├── 0497\n│   ├── 0498\n│   ├── 0499\n│   ├── 0500\n│   ├── 0501\n│   ├── 0502\n│   ├── 0503\n│   ├── 0504\n│   ├── 0505\n│   ├── 0506\n│   ├── 0507\n│   ├── 0508\n│   ├── 0509\n│   ├── 0510\n│   ├── 0511\n│   ├── 0512\n│   ├── 0513\n│   ├── 0514\n│   ├── 0515\n│   ├── 0516\n│   ├── 0517\n│   ├── 0518\n│   ├── 0519\n│   ├── 0520\n│   ├── 0521\n│   ├── 0522\n│   ├── 0523\n│   ├── 0524\n│   ├── 0525\n│   ├── 0526\n│   ├── 0527\n│   ├── 0528\n│   ├── 0529\n│   ├── 0530\n│   ├── 0531\n│   ├── 0532\n│   ├── 0533\n│   ├── 0534\n│   ├── 0535\n│   ├── 0536\n│   ├── 0537\n│   ├── 0538\n│   ├── 0539\n│   ├── 0540\n│   ├── 0541\n│   ├── 0542\n│   ├── 0543\n│   ├── 0544\n│   ├── 0545\n│   ├── 0546\n│   ├── 0547\n│   ├── 0548\n│   ├── 0549\n│   ├── 0550\n│   ├── 0551\n│   ├── 0552\n│   ├── 0553\n│   ├── 0554\n│   ├── 0555\n│   ├── 0556\n│   ├── 0557\n│   ├── 0558\n│   ├── 0559\n│   ├── 0560\n│   ├── 0561\n│   ├── 0562\n│   ├── 0563\n│   ├── 0564\n│   ├── 0565\n│   ├── 0566\n│   ├── 0567\n│   ├── 0568\n│   ├── 0569\n│   ├── 0570\n│   ├── 0571\n│   ├── 0572\n│   ├── 0573\n│   ├── 0574\n│   ├── 0575\n│   ├── 0576\n│   ├── 0577\n│   ├── 0578\n│   ├── 0579\n│   ├── 0580\n│   ├── 0581\n│   ├── 0582\n│   ├── 0583\n│   ├── 0584\n│   ├── 0585\n│   ├── 0586\n│   ├── 0587\n│   ├── 0588\n│   ├── 0589\n│   ├── 0590\n│   ├── 0591\n│   ├── 0592\n│   ├── 0593\n│   ├── 0594\n│   ├── 0595\n│   ├── 0596\n│   ├── 0597\n│   ├── 0598\n│   ├── 0599\n│   ├── 0600\n│   ├── 0601\n│   ├── 0602\n│   ├── 0603\n│   ├── 0604\n│   ├── 0605\n│   ├── 0606\n│   ├── 0607\n│   ├── 0608\n│   ├── 0609\n│   ├── 0610\n│   ├── 0611\n│   ├── 0612\n│   ├── 0613\n│   ├── 0614\n│   ├── 0615\n│   ├── 0616\n│   ├── 0617\n│   ├── 0618\n│   ├── 0619\n│   ├── 0620\n│   ├── 0621\n│   ├── 0622\n│   ├── 0623\n│   ├── 0624\n│   ├── 0625\n│   ├── 0626\n│   ├── 0627\n│   ├── 0628\n│   ├── 0629\n│   ├── 0630\n│   ├── 0631\n│   ├── 0632\n│   ├── 0633\n│   ├── 0634\n│   ├── 0635\n│   ├── 0636\n│   ├── 0637\n│   ├── 0638\n│   ├── 0639\n│   ├── 0640\n│   ├── 0641\n│   ├── 0642\n│   ├── 0643\n│   ├── 0644\n│   ├── 0645\n│   ├── 0646\n│   ├── 0647\n│   ├── 0648\n│   ├── 0649\n│   ├── 0650\n│   ├── 0651\n│   ├── 0652\n│   ├── 0653\n│   ├── 0654\n│   ├── 0655\n│   ├── 0656\n│   ├── 0657\n│   ├── 0658\n│   ├── 0659\n│   ├── 0660\n│   ├── 0661\n│   ├── 0662\n│   ├── 0663\n│   ├── 0664\n│   ├── 0665\n│   ├── 0666\n│   ├── 0667\n│   ├── 0668\n│   ├── 0669\n│   ├── 0670\n│   ├── 0671\n│   ├── 0672\n│   ├── 0673\n│   ├── 0674\n│   ├── 0675\n│   ├── 0676\n│   ├── 0677\n│   ├── 0678\n│   ├── 0679\n│   ├── 0680\n│   ├── 0681\n│   ├── 0682\n│   ├── 0683\n│   ├── 0684\n│   ├── 0685\n│   ├── 0686\n│   ├── 0687\n│   ├── 0688\n│   ├── 0689\n│   ├── 0690\n│   ├── 0691\n│   ├── 0692\n│   ├── 0693\n│   ├── 0694\n│   ├── 0695\n│   ├── 0696\n│   ├── 0697\n│   ├── 0698\n│   ├── 0699\n│   ├── 0700\n│   ├── 0701\n│   ├── 0702\n│   ├── 0703\n│   ├── 0704\n│   ├── 0705\n│   ├── 0706\n│   ├── 0707\n│   ├── 0708\n│   ├── 0709\n│   ├── 0710\n│   ├── 0711\n│   ├── 0712\n│   ├── 0713\n│   ├── 0714\n│   ├── 0715\n│   ├── 0716\n│   ├── 0717\n│   ├── 0718\n│   ├── 0719\n│   ├── 0720\n│   ├── 0721\n│   ├── 0722\n│   ├── 0723\n│   ├── 0724\n│   ├── 0725\n│   ├── 0726\n│   ├── 0727\n│   ├── 0728\n│   ├── 0729\n│   ├── 0730\n│   ├── 0731\n│   ├── 0732\n│   ├── 0733\n│   ├── 0734\n│   ├── 0735\n│   ├── 0736\n│   ├── 0737\n│   ├── 0738\n│   ├── 0739\n│   ├── 0740\n│   ├── 0741\n│   ├── 0742\n│   ├── 0743\n│   ├── 0744\n│   ├── 0745\n│   ├── 0746\n│   ├── 0747\n│   ├── 0748\n│   ├── 0749\n│   ├── 0750\n│   ├── 0751\n│   ├── 0752\n│   ├── 0753\n│   ├── 0754\n│   ├── 0755\n│   ├── 0756\n│   ├── 0757\n│   ├── 0758\n│   ├── 0759\n│   ├── 0760\n│   ├── 0761\n│   ├── 0762\n│   ├── 0763\n│   ├── 0764\n│   ├── 0765\n│   ├── 0766\n│   ├── 0767\n│   ├── 0768\n│   ├── 0769\n│   ├── 0770\n│   ├── 0771\n│   ├── 0772\n│   ├── 0773\n│   ├── 0774\n│   ├── 0775\n│   ├── 0776\n│   ├── 0777\n│   ├── 0778\n│   ├── 0779\n│   ├── 0780\n│   ├── 0781\n│   ├── 0782\n│   ├── 0783\n│   ├── 0784\n│   ├── 0785\n│   ├── 0786\n│   ├── 0787\n│   ├── 0788\n│   ├── 0789\n│   ├── 0790\n│   ├── 0791\n│   ├── 0792\n│   ├── 0793\n│   ├── 0794\n│   ├── 0795\n│   ├── 0796\n│   ├── 0797\n│   ├── 0798\n│   ├── 0799\n│   ├── 0800\n│   ├── 0801\n│   ├── 0802\n│   ├── 0803\n│   ├── 0804\n│   ├── 0805\n│   ├── 0806\n│   ├── 0807\n│   ├── 0808\n│   ├── 0809\n│   ├── 0810\n│   ├── 0811\n│   ├── 0812\n│   ├── 0813\n│   ├── 0814\n│   ├── 0815\n│   ├── 0816\n│   ├── 0817\n│   ├── 0818\n│   ├── 0819\n│   ├── 0820\n│   ├── 0821\n│   ├── 0822\n│   ├── 0823\n│   ├── 0824\n│   ├── 0825\n│   ├── 0826\n│   ├── 0827\n│   ├── 0828\n│   ├── 0829\n│   ├── 0830\n│   ├── 0831\n│   ├── 0832\n│   ├── 0833\n│   ├── 0834\n│   ├── 0835\n│   ├── 0836\n│   ├── 0837\n│   ├── 0838\n│   ├── 0839\n│   ├── 0840\n│   ├── 0841\n│   ├── 0842\n│   ├── 0843\n│   ├── 0844\n│   ├── 0845\n│   ├── 0846\n│   ├── 0847\n│   ├── 0848\n│   ├── 0849\n│   ├── 0850\n│   ├── 0851\n│   ├── 0852\n│   ├── 0853\n│   ├── 0854\n│   ├── 0855\n│   ├── 0856\n│   ├── 0857\n│   ├── 0858\n│   ├── 0859\n│   ├── 0860\n│   ├── 0861\n│   ├── 0862\n│   ├── 0863\n│   ├── 0864\n│   ├── 0865\n│   ├── 0866\n│   ├── 0867\n│   ├── 0868\n│   ├── 0869\n│   ├── 0870\n│   ├── 0871\n│   ├── 0872\n│   ├── 0873\n│   ├── 0874\n│   ├── 0875\n│   ├── 0876\n│   ├── 0877\n│   ├── 0878\n│   ├── 0879\n│   ├── 0880\n│   ├── 0881\n│   ├── 0882\n│   ├── 0883\n│   ├── 0884\n│   ├── 0885\n│   ├── 0886\n│   ├── 0887\n│   ├── 0888\n│   ├── 0889\n│   ├── 0890\n│   ├── 0891\n│   ├── 0892\n│   ├── 0893\n│   ├── 0894\n│   ├── 0895\n│   ├── 0896\n│   ├── 0897\n│   ├── 0898\n│   ├── 0899\n│   ├── 0900\n│   ├── 0901\n│   ├── 0902\n│   ├── 0903\n│   ├── 0904\n│   ├── 0905\n│   ├── 0906\n│   ├── 0907\n│   ├── 0908\n│   ├── 0909\n│   ├── 0910\n│   ├── 0911\n│   ├── 0912\n│   ├── 0913\n│   ├── 0914\n│   ├── 0915\n│   ├── 0916\n│   ├── 0917\n│   ├── 0918\n│   ├── 0919\n│   ├── 0920\n│   ├── 0921\n│   ├── 0922\n│   ├── 0923\n│   ├── 0924\n│   ├── 0925\n│   ├── 0926\n│   ├── 0927\n│   ├── 0928\n│   ├── 0929\n│   ├── 0930\n│   ├── 0931\n│   ├── 0932\n│   ├── 0933\n│   ├── 0934\n│   ├── 0935\n│   ├── 0936\n│   ├── 0937\n│   ├── 0938\n│   ├── 0939\n│   ├── 0940\n│   ├── 0941\n│   ├── 0942\n│   ├── 0943\n│   ├── 0944\n│   ├── 0945\n│   ├── 0946\n│   ├── 0947\n│   ├── 0948\n│   ├── 0949\n│   ├── 0950\n│   ├── 0951\n│   ├── 0952\n│   ├── 0953\n│   ├── 0954\n│   ├── 0955\n│   ├── 0956\n│   ├── 0957\n│   ├── 0958\n│   ├── 0959\n│   ├── 0960\n│   ├── 0961\n│   ├── 0962\n│   ├── 0963\n│   ├── 0964\n│   ├── 0965\n│   ├── 0966\n│   ├── 0967\n│   ├── 0968\n│   ├── 0969\n│   ├── 0970\n│   ├── 0971\n│   ├── 0972\n│   ├── 0973\n│   ├── 0974\n│   ├── 0975\n│   ├── 0976\n│   ├── 0977\n│   ├── 0978\n│   ├── 0979\n│   ├── 0980\n│   ├── 0981\n│   ├── 0982\n│   ├── 0983\n│   ├── 0984\n│   ├── 0985\n│   ├── 0986\n│   ├── 0987\n│   ├── 0988\n│   ├── 0989\n│   ├── 0990\n│   ├── 0991\n│   ├── 0992\n│   ├── 0993\n│   ├── 0994\n│   ├── 0995\n│   ├── 0996\n│   ├── 0997\n│   ├── 0998\n│   ├── 0999\n│   ├── 1000\n│   ├── file_000\n│   ├── file_001\n│   ├── file_002\n│   ├── file_003\n│   ├── file_004\n│   ├── file_005\n│   ├── file_006\n│   ├── file_007\n│   ├── file_008\n│   ├── file_009\n│   ├── file_010\n│   ├── file_011\n│   ├── file_012\n│   ├── file_013\n│   ├── file_014\n│   ├── file_015\n│   ├── file_016\n│   ├── file_017\n│   ├── file_018\n│   ├── file_019\n│   ├── file_020\n│   ├── file_021\n│   ├── file_022\n│   ├── file_023\n│   ├── file_024\n│   ├── file_025\n│   ├── file_026\n│   ├── file_027\n│   ├── file_028\n│   ├── file_029\n│   ├── file_030\n│   ├── file_031\n│   ├── file_032\n│   ├── file_033\n│   ├── file_034\n│   ├── file_035\n│   ├── file_036\n│   ├── file_037\n│   ├── file_038\n│   ├── file_039\n│   ├── file_040\n│   ├── file_041\n│   ├── file_042\n│   ├── file_043\n│   ├── file_044\n│   ├── file_045\n│   ├── file_046\n│   ├── file_047\n│   ├── file_048\n│   ├── file_049\n│   ├── file_050\n│   ├── file_051\n│   ├── file_052\n│   ├── file_053\n│   ├── file_054\n│   ├── file_055\n│   ├── file_056\n│   ├── file_057\n│   ├── file_058\n│   ├── file_059\n│   ├── file_060\n│   ├── file_061\n│   ├── file_062\n│   ├── file_063\n│   ├── file_064\n│   ├── file_065\n│   ├── file_066\n│   ├── file_067\n│   ├── file_068\n│   ├── file_069\n│   ├── file_070\n│   ├── file_071\n│   ├── file_072\n│   ├── file_073\n│   ├── file_074\n│   ├── file_075\n│   ├── file_076\n│   ├── file_077\n│   ├── file_078\n│   ├── file_079\n│   ├── file_080\n│   ├── file_081\n│   ├── file_082\n│   ├── file_083\n│   ├── file_084\n│   ├── file_085\n│   ├── file_086\n│   ├── file_087\n│   ├── file_088\n│   ├── file_089\n│   ├── file_090\n│   ├── file_091\n│   ├── file_092\n│   ├── file_093\n│   ├── file_094\n│   ├── file_095\n│   ├── file_096\n│   ├── file_097\n│   ├── file_098\n│   ├── file_099\n│   ├── file_100\n│   ├── file_101\n│   ├── file_102\n│   ├── file_103\n│   ├── file_104\n│   ├── file_105\n│   ├── file_106\n│   ├── file_107\n│   ├── file_108\n│   ├── file_109\n│   ├── file_110\n│   ├── file_111\n│   ├── file_112\n│   ├── file_113\n│   ├── file_114\n│   ├── file_115\n│   ├── file_116\n│   ├── file_117\n│   ├── file_118\n│   ├── file_119\n│   ├── file_120\n│   ├── file_121\n│   ├── file_122\n│   ├── file_123\n│   ├── file_124\n│   ├── file_125\n│   ├── file_126\n│   ├── file_127\n│   ├── file_128\n│   ├── file_129\n│   ├── file_130\n│   ├── file_131\n│   ├── file_132\n│   ├── file_133\n│   ├── file_134\n│   ├── file_135\n│   ├── file_136\n│   ├── file_137\n│   ├── file_138\n│   ├── file_139\n│   ├── file_140\n│   ├── file_141\n│   ├── file_142\n│   ├── file_143\n│   ├── file_144\n│   ├── file_145\n│   ├── file_146\n│   ├── file_147\n│   ├── file_148\n│   ├── file_149\n│   ├── file_150\n│   ├── file_151\n│   ├── file_152\n│   ├── file_153\n│   ├── file_154\n│   ├── file_155\n│   ├── file_156\n│   ├── file_157\n│   ├── file_158\n│   ├── file_159\n│   ├── file_160\n│   ├── file_161\n│   ├── file_162\n│   ├── file_163\n│   ├── file_164\n│   ├── file_165\n│   ├── file_166\n│   ├── file_167\n│   ├── file_168\n│   ├── file_169\n│   ├── file_170\n│   ├── file_171\n│   ├── file_172\n│   ├── file_173\n│   ├── file_174\n│   ├── file_175\n│   ├── file_176\n│   ├── file_177\n│   ├── file_178\n│   ├── file_179\n│   ├── file_180\n│   ├── file_181\n│   ├── file_182\n│   ├── file_183\n│   ├── file_184\n│   ├── file_185\n│   ├── file_186\n│   ├── file_187\n│   ├── file_188\n│   ├── file_189\n│   ├── file_190\n│   ├── file_191\n│   ├── file_192\n│   ├── file_193\n│   ├── file_194\n│   ├── file_195\n│   ├── file_196\n│   ├── file_197\n│   ├── file_198\n│   ├── file_199\n│   ├── file_200\n│   ├── file_201\n│   ├── file_202\n│   ├── file_203\n│   ├── file_204\n│   ├── file_205\n│   ├── file_206\n│   ├── file_207\n│   ├── file_208\n│   ├── file_209\n│   ├── file_210\n│   ├── file_211\n│   ├── file_212\n│   ├── file_213\n│   ├── file_214\n│   ├── file_215\n│   ├── file_216\n│   ├── file_217\n│   ├── file_218\n│   ├── file_219\n│   ├── file_220\n│   ├── file_221\n│   ├── file_222\n│   ├── file_223\n│   ├── file_224\n│   ├── file_225\n│   ├── file_226\n│   ├── file_227\n│   ├── file_228\n│   ├── file_229\n│   ├── file_230\n│   ├── file_231\n│   ├── file_232\n│   ├── file_233\n│   ├── file_234\n│   ├── file_235\n│   ├── file_236\n│   ├── file_237\n│   ├── file_238\n│   ├── file_239\n│   ├── file_240\n│   ├── file_241\n│   ├── file_242\n│   ├── file_243\n│   ├── file_244\n│   ├── file_245\n│   ├── file_246\n│   ├── file_247\n│   ├── file_248\n│   ├── file_249\n│   ├── file_250\n│   ├── file_251\n│   ├── file_252\n│   ├── file_253\n│   ├── file_254\n│   ├── file_255\n│   ├── file_256\n│   ├── file_257\n│   ├── file_258\n│   ├── file_259\n│   ├── file_260\n│   ├── file_261\n│   ├── file_262\n│   ├── file_263\n│   ├── file_264\n│   ├── file_265\n│   ├── file_266\n│   ├── file_267\n│   ├── file_268\n│   ├── file_269\n│   ├── file_270\n│   ├── file_271\n│   ├── file_272\n│   ├── file_273\n│   ├── file_274\n│   ├── file_275\n│   ├── file_276\n│   ├── file_277\n│   ├── file_278\n│   ├── file_279\n│   ├── file_280\n│   ├── file_281\n│   ├── file_282\n│   ├── file_283\n│   ├── file_284\n│   ├── file_285\n│   ├── file_286\n│   ├── file_287\n│   ├── file_288\n│   ├── file_289\n│   ├── file_290\n│   ├── file_291\n│   ├── file_292\n│   ├── file_293\n│   ├── file_294\n│   ├── file_295\n│   ├── file_296\n│   ├── file_297\n│   ├── file_298\n│   ├── file_299\n│   ├── file_300\n│   ├── file_301\n│   ├── file_302\n│   ├── file_303\n│   ├── file_304\n│   ├── file_305\n│   ├── file_306\n│   ├── file_307\n│   ├── file_308\n│   ├── file_309\n│   ├── file_310\n│   ├── file_311\n│   ├── file_312\n│   ├── file_313\n│   ├── file_314\n│   ├── file_315\n│   ├── file_316\n│   ├── file_317\n│   ├── file_318\n│   ├── file_319\n│   ├── file_320\n│   ├── file_321\n│   ├── file_322\n│   ├── file_323\n│   ├── file_324\n│   ├── file_325\n│   ├── file_326\n│   ├── file_327\n│   ├── file_328\n│   ├── file_329\n│   ├── file_330\n│   ├── file_331\n│   ├── file_332\n│   ├── file_333\n│   ├── file_334\n│   ├── file_335\n│   ├── file_336\n│   ├── file_337\n│   ├── file_338\n│   ├── file_339\n│   ├── file_340\n│   ├── file_341\n│   ├── file_342\n│   ├── file_343\n│   ├── file_344\n│   ├── file_345\n│   ├── file_346\n│   ├── file_347\n│   ├── file_348\n│   ├── file_349\n│   ├── file_350\n│   ├── file_351\n│   ├── file_352\n│   ├── file_353\n│   ├── file_354\n│   ├── file_355\n│   ├── file_356\n│   ├── file_357\n│   ├── file_358\n│   ├── file_359\n│   ├── file_360\n│   ├── file_361\n│   ├── file_362\n│   ├── file_363\n│   ├── file_364\n│   ├── file_365\n│   ├── file_366\n│   ├── file_367\n│   ├── file_368\n│   ├── file_369\n│   ├── file_370\n│   ├── file_371\n│   ├── file_372\n│   ├── file_373\n│   ├── file_374\n│   ├── file_375\n│   ├── file_376\n│   ├── file_377\n│   ├── file_378\n│   ├── file_379\n│   ├── file_380\n│   ├── file_381\n│   ├── file_382\n│   ├── file_383\n│   ├── file_384\n│   ├── file_385\n│   ├── file_386\n│   ├── file_387\n│   ├── file_388\n│   ├── file_389\n│   ├── file_390\n│   ├── file_391\n│   ├── file_392\n│   ├── file_393\n│   ├── file_394\n│   ├── file_395\n│   ├── file_396\n│   ├── file_397\n│   ├── file_398\n│   ├── file_399\n│   ├── file_400\n│   ├── file_401\n│   ├── file_402\n│   ├── file_403\n│   ├── file_404\n│   ├── file_405\n│   ├── file_406\n│   ├── file_407\n│   ├── file_408\n│   ├── file_409\n│   ├── file_410\n│   ├── file_411\n│   ├── file_412\n│   ├── file_413\n│   ├── file_414\n│   ├── file_415\n│   ├── file_416\n│   ├── file_417\n│   ├── file_418\n│   ├── file_419\n│   ├── file_420\n│   ├── file_421\n│   ├── file_422\n│   ├── file_423\n│   ├── file_424\n│   ├── file_425\n│   ├── file_426\n│   ├── file_427\n│   ├── file_428\n│   ├── file_429\n│   ├── file_430\n│   ├── file_431\n│   ├── file_432\n│   ├── file_433\n│   ├── file_434\n│   ├── file_435\n│   ├── file_436\n│   ├── file_437\n│   ├── file_438\n│   ├── file_439\n│   ├── file_440\n│   ├── file_441\n│   ├── file_442\n│   ├── file_443\n│   ├── file_444\n│   ├── file_445\n│   ├── file_446\n│   ├── file_447\n│   ├── file_448\n│   ├── file_449\n│   ├── file_450\n│   ├── file_451\n│   ├── file_452\n│   ├── file_453\n│   ├── file_454\n│   ├── file_455\n│   ├── file_456\n│   ├── file_457\n│   ├── file_458\n│   ├── file_459\n│   ├── file_460\n│   ├── file_461\n│   ├── file_462\n│   ├── file_463\n│   ├── file_464\n│   ├── file_465\n│   ├── file_466\n│   ├── file_467\n│   ├── file_468\n│   ├── file_469\n│   ├── file_470\n│   ├── file_471\n│   ├── file_472\n│   ├── file_473\n│   ├── file_474\n│   ├── file_475\n│   ├── file_476\n│   ├── file_477\n│   ├── file_478\n│   ├── file_479\n│   ├── file_480\n│   ├── file_481\n│   ├── file_482\n│   ├── file_483\n│   ├── file_484\n│   ├── file_485\n│   ├── file_486\n│   ├── file_487\n│   ├── file_488\n│   ├── file_489\n│   ├── file_490\n│   ├── file_491\n│   ├── file_492\n│   ├── file_493\n│   ├── file_494\n│   ├── file_495\n│   ├── file_496\n│   ├── file_497\n│   ├── file_498\n│   ├── file_499\n│   ├── file_500\n│   ├── file_501\n│   ├── file_502\n│   ├── file_503\n│   ├── file_504\n│   ├── file_505\n│   ├── file_506\n│   ├── file_507\n│   ├── file_508\n│   ├── file_509\n│   ├── file_510\n│   ├── file_511\n│   ├── file_512\n│   ├── file_513\n│   ├── file_514\n│   ├── file_515\n│   ├── file_516\n│   ├── file_517\n│   ├── file_518\n│   ├── file_519\n│   ├── file_520\n│   ├── file_521\n│   ├── file_522\n│   ├── file_523\n│   ├── file_524\n│   ├── file_525\n│   ├── file_526\n│   ├── file_527\n│   ├── file_528\n│   ├── file_529\n│   ├── file_530\n│   ├── file_531\n│   ├── file_532\n│   ├── file_533\n│   ├── file_534\n│   ├── file_535\n│   ├── file_536\n│   ├── file_537\n│   ├── file_538\n│   ├── file_539\n│   ├── file_540\n│   ├── file_541\n│   ├── file_542\n│   ├── file_543\n│   ├── file_544\n│   ├── file_545\n│   ├── file_546\n│   ├── file_547\n│   ├── file_548\n│   ├── file_549\n│   ├── file_550\n│   ├── file_551\n│   ├── file_552\n│   ├── file_553\n│   ├── file_554\n│   ├── file_555\n│   ├── file_556\n│   ├── file_557\n│   ├── file_558\n│   ├── file_559\n│   ├── file_560\n│   ├── file_561\n│   ├── file_562\n│   ├── file_563\n│   ├── file_564\n│   ├── file_565\n│   ├── file_566\n│   ├── file_567\n│   ├── file_568\n│   ├── file_569\n│   ├── file_570\n│   ├── file_571\n│   ├── file_572\n│   ├── file_573\n│   ├── file_574\n│   ├── file_575\n│   ├── file_576\n│   ├── file_577\n│   ├── file_578\n│   ├── file_579\n│   ├── file_580\n│   ├── file_581\n│   ├── file_582\n│   ├── file_583\n│   ├── file_584\n│   ├── file_585\n│   ├── file_586\n│   ├── file_587\n│   ├── file_588\n│   ├── file_589\n│   ├── file_590\n│   ├── file_591\n│   ├── file_592\n│   ├── file_593\n│   ├── file_594\n│   ├── file_595\n│   ├── file_596\n│   ├── file_597\n│   ├── file_598\n│   ├── file_599\n│   ├── file_600\n│   ├── file_601\n│   ├── file_602\n│   ├── file_603\n│   ├── file_604\n│   ├── file_605\n│   ├── file_606\n│   ├── file_607\n│   ├── file_608\n│   ├── file_609\n│   ├── file_610\n│   ├── file_611\n│   ├── file_612\n│   ├── file_613\n│   ├── file_614\n│   ├── file_615\n│   ├── file_616\n│   ├── file_617\n│   ├── file_618\n│   ├── file_619\n│   ├── file_620\n│   ├── file_621\n│   ├── file_622\n│   ├── file_623\n│   ├── file_624\n│   ├── file_625\n│   ├── file_626\n│   ├── file_627\n│   ├── file_628\n│   ├── file_629\n│   ├── file_630\n│   ├── file_631\n│   ├── file_632\n│   ├── file_633\n│   ├── file_634\n│   ├── file_635\n│   ├── file_636\n│   ├── file_637\n│   ├── file_638\n│   ├── file_639\n│   ├── file_640\n│   ├── file_641\n│   ├── file_642\n│   ├── file_643\n│   ├── file_644\n│   ├── file_645\n│   ├── file_646\n│   ├── file_647\n│   ├── file_648\n│   ├── file_649\n│   ├── file_650\n│   ├── file_651\n│   ├── file_652\n│   ├── file_653\n│   ├── file_654\n│   ├── file_655\n│   ├── file_656\n│   ├── file_657\n│   ├── file_658\n│   ├── file_659\n│   ├── file_660\n│   ├── file_661\n│   ├── file_662\n│   ├── file_663\n│   ├── file_664\n│   ├── file_665\n│   ├── file_666\n│   ├── file_667\n│   ├── file_668\n│   ├── file_669\n│   ├── file_670\n│   ├── file_671\n│   ├── file_672\n│   ├── file_673\n│   ├── file_674\n│   ├── file_675\n│   ├── file_676\n│   ├── file_677\n│   ├── file_678\n│   ├── file_679\n│   ├── file_680\n│   ├── file_681\n│   ├── file_682\n│   ├── file_683\n│   ├── file_684\n│   ├── file_685\n│   ├── file_686\n│   ├── file_687\n│   ├── file_688\n│   ├── file_689\n│   ├── file_690\n│   ├── file_691\n│   ├── file_692\n│   ├── file_693\n│   ├── file_694\n│   ├── file_695\n│   ├── file_696\n│   ├── file_697\n│   ├── file_698\n│   ├── file_699\n│   ├── file_700\n│   ├── file_701\n│   ├── file_702\n│   ├── file_703\n│   ├── file_704\n│   ├── file_705\n│   ├── file_706\n│   ├── file_707\n│   ├── file_708\n│   ├── file_709\n│   ├── file_710\n│   ├── file_711\n│   ├── file_712\n│   ├── file_713\n│   ├── file_714\n│   ├── file_715\n│   ├── file_716\n│   ├── file_717\n│   ├── file_718\n│   ├── file_719\n│   ├── file_720\n│   ├── file_721\n│   ├── file_722\n│   ├── file_723\n│   ├── file_724\n│   ├── file_725\n│   ├── file_726\n│   ├── file_727\n│   ├── file_728\n│   ├── file_729\n│   ├── file_730\n│   ├── file_731\n│   ├── file_732\n│   ├── file_733\n│   ├── file_734\n│   ├── file_735\n│   ├── file_736\n│   ├── file_737\n│   ├── file_738\n│   ├── file_739\n│   ├── file_740\n│   ├── file_741\n│   ├── file_742\n│   ├── file_743\n│   ├── file_744\n│   ├── file_745\n│   ├── file_746\n│   ├── file_747\n│   ├── file_748\n│   ├── file_749\n│   ├── file_750\n│   ├── file_751\n│   ├── file_752\n│   ├── file_753\n│   ├── file_754\n│   ├── file_755\n│   ├── file_756\n│   ├── file_757\n│   ├── file_758\n│   ├── file_759\n│   ├── file_760\n│   ├── file_761\n│   ├── file_762\n│   ├── file_763\n│   ├── file_764\n│   ├── file_765\n│   ├── file_766\n│   ├── file_767\n│   ├── file_768\n│   ├── file_769\n│   ├── file_770\n│   ├── file_771\n│   ├── file_772\n│   ├── file_773\n│   ├── file_774\n│   ├── file_775\n│   ├── file_776\n│   ├── file_777\n│   ├── file_778\n│   ├── file_779\n│   ├── file_780\n│   ├── file_781\n│   ├── file_782\n│   ├── file_783\n│   ├── file_784\n│   ├── file_785\n│   ├── file_786\n│   ├── file_787\n│   ├── file_788\n│   ├── file_789\n│   ├── file_790\n│   ├── file_791\n│   ├── file_792\n│   ├── file_793\n│   ├── file_794\n│   ├── file_795\n│   ├── file_796\n│   ├── file_797\n│   ├── file_798\n│   ├── file_799\n│   ├── file_800\n│   ├── file_801\n│   ├── file_802\n│   ├── file_803\n│   ├── file_804\n│   ├── file_805\n│   ├── file_806\n│   ├── file_807\n│   ├── file_808\n│   ├── file_809\n│   ├── file_810\n│   ├── file_811\n│   ├── file_812\n│   ├── file_813\n│   ├── file_814\n│   ├── file_815\n│   ├── file_816\n│   ├── file_817\n│   ├── file_818\n│   ├── file_819\n│   ├── file_820\n│   ├── file_821\n│   ├── file_822\n│   ├── file_823\n│   ├── file_824\n│   ├── file_825\n│   ├── file_826\n│   ├── file_827\n│   ├── file_828\n│   ├── file_829\n│   ├── file_830\n│   ├── file_831\n│   ├── file_832\n│   ├── file_833\n│   ├── file_834\n│   ├── file_835\n│   ├── file_836\n│   ├── file_837\n│   ├── file_838\n│   ├── file_839\n│   ├── file_840\n│   ├── file_841\n│   ├── file_842\n│   ├── file_843\n│   ├── file_844\n│   ├── file_845\n│   ├── file_846\n│   ├── file_847\n│   ├── file_848\n│   ├── file_849\n│   ├── file_850\n│   ├── file_851\n│   ├── file_852\n│   ├── file_853\n│   ├── file_854\n│   ├── file_855\n│   ├── file_856\n│   ├── file_857\n│   ├── file_858\n│   ├── file_859\n│   ├── file_860\n│   ├── file_861\n│   ├── file_862\n│   ├── file_863\n│   ├── file_864\n│   ├── file_865\n│   ├── file_866\n│   ├── file_867\n│   ├── file_868\n│   ├── file_869\n│   ├── file_870\n│   ├── file_871\n│   ├── file_872\n│   ├── file_873\n│   ├── file_874\n│   ├── file_875\n│   ├── file_876\n│   ├── file_877\n│   ├── file_878\n│   ├── file_879\n│   ├── file_880\n│   ├── file_881\n│   ├── file_882\n│   ├── file_883\n│   ├── file_884\n│   ├── file_885\n│   ├── file_886\n│   ├── file_887\n│   ├── file_888\n│   ├── file_889\n│   ├── file_890\n│   ├── file_891\n│   ├── file_892\n│   ├── file_893\n│   ├── file_894\n│   ├── file_895\n│   ├── file_896\n│   ├── file_897\n│   ├── file_898\n│   ├── file_899\n│   ├── file_900\n│   ├── file_901\n│   ├── file_902\n│   ├── file_903\n│   ├── file_904\n│   ├── file_905\n│   ├── file_906\n│   ├── file_907\n│   ├── file_908\n│   ├── file_909\n│   ├── file_910\n│   ├── file_911\n│   ├── file_912\n│   ├── file_913\n│   ├── file_914\n│   ├── file_915\n│   ├── file_916\n│   ├── file_917\n│   ├── file_918\n│   ├── file_919\n│   ├── file_920\n│   ├── file_921\n│   ├── file_922\n│   ├── file_923\n│   ├── file_924\n│   ├── file_925\n│   ├── file_926\n│   ├── file_927\n│   ├── file_928\n│   ├── file_929\n│   ├── file_930\n│   ├── file_931\n│   ├── file_932\n│   ├── file_933\n│   ├── file_934\n│   ├── file_935\n│   ├── file_936\n│   ├── file_937\n│   ├── file_938\n│   ├── file_939\n│   ├── file_940\n│   ├── file_941\n│   ├── file_942\n│   ├── file_943\n│   ├── file_944\n│   ├── file_945\n│   ├── file_946\n│   ├── file_947\n│   ├── file_948\n│   ├── file_949\n│   ├── file_950\n│   ├── file_951\n│   ├── file_952\n│   ├── file_953\n│   ├── file_954\n│   ├── file_955\n│   ├── file_956\n│   ├── file_957\n│   ├── file_958\n│   ├── file_959\n│   ├── file_960\n│   ├── file_961\n│   ├── file_962\n│   ├── file_963\n│   ├── file_964\n│   ├── file_965\n│   ├── file_966\n│   ├── file_967\n│   ├── file_968\n│   ├── file_969\n│   ├── file_970\n│   ├── file_971\n│   ├── file_972\n│   ├── file_973\n│   ├── file_974\n│   ├── file_975\n│   ├── file_976\n│   ├── file_977\n│   ├── file_978\n│   ├── file_979\n│   ├── file_980\n│   ├── file_981\n│   ├── file_982\n│   ├── file_983\n│   ├── file_984\n│   ├── file_985\n│   ├── file_986\n│   ├── file_987\n│   ├── file_988\n│   ├── file_989\n│   ├── file_990\n│   ├── file_991\n│   ├── file_992\n│   ├── file_993\n│   ├── file_994\n│   ├── file_995\n│   ├── file_996\n│   ├── file_997\n│   ├── file_998\n│   └── file_999\n├── group\n│   └── file\n├── icons\n│   ├── c++.cpp\n│   ├── c.c\n│   ├── css.css\n│   ├── file\n│   ├── go.go\n│   ├── html.html\n│   ├── java.java\n│   ├── javascript.js\n│   ├── man.1\n│   ├── marked.md\n│   ├── php.php\n│   ├── python.py\n│   ├── ruby.rb\n│   ├── rust.rs\n│   ├── shell.sh\n│   └── unknown.unknown\n├── perms\n│   ├── file\n│   └── file2\n├── size\n│   ├── 1B\n│   ├── 1K\n│   ├── 1M\n│   └── 1337\n├── specials\n├── symlinks\n│   ├── dir\n│   ├── file\n│   ├── ' lorem ipsum'\n│   ├── symlink -> file\n│   ├── symlink2 -> symlink\n│   ├── symlink3 -> dir\n│   └── symlink4 -> pipitek\n└── time\n    ├── 1d\n    ├── 1h\n    ├── 1m\n    ├── 1s\n    ├── 1y\n    └── epoch\n"
  },
  {
    "path": "tests/ptests/ptest_391fb71023fbe78f.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T -L 3\""
  },
  {
    "path": "tests/ptests/ptest_39a4ecaff3909961.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_39a4ecaff3909961.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_39a4ecaff3909961.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --no-git \""
  },
  {
    "path": "tests/ptests/ptest_39b4326562c3f75f.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_39b4326562c3f75f.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_39b4326562c3f75f.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --all \""
  },
  {
    "path": "tests/ptests/ptest_3a8ed471ff49be49.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_3a8ed471ff49be49.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_3a8ed471ff49be49.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort filename\""
  },
  {
    "path": "tests/ptests/ptest_3b5b6fd2802ba8f9.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_3b5b6fd2802ba8f9.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_3b5b6fd2802ba8f9.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s filename\""
  },
  {
    "path": "tests/ptests/ptest_3bed5866e590e62a.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_3bed5866e590e62a.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_3bed5866e590e62a.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --ignore-glob *.toml\""
  },
  {
    "path": "tests/ptests/ptest_3f0c3a89d3fcf7d3.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_3f0c3a89d3fcf7d3.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_3f0c3a89d3fcf7d3.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --group \""
  },
  {
    "path": "tests/ptests/ptest_3fe14fdeb5bf19de.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_3fe14fdeb5bf19de.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_3fe14fdeb5bf19de.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --classify auto\""
  },
  {
    "path": "tests/ptests/ptest_404fbc2fe3e5c85.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_404fbc2fe3e5c85.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_404fbc2fe3e5c85.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -i \""
  },
  {
    "path": "tests/ptests/ptest_458d0cef9ea1a5b9.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_458d0cef9ea1a5b9.stdout",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_458d0cef9ea1a5b9.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --only-files \""
  },
  {
    "path": "tests/ptests/ptest_469e79a86c2c874f.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_469e79a86c2c874f.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\n"
  },
  {
    "path": "tests/ptests/ptest_469e79a86c2c874f.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort modified\""
  },
  {
    "path": "tests/ptests/ptest_4728f2d14d31f2ff.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_4728f2d14d31f2ff.stdout",
    "content": "tests/test_dir\n├── git\n│   ├── 001\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 002\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 003\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 004\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 005\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 006\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 007\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 008\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 009\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   └── 010\n│       ├── file_000\n│       ├── file_001\n│       ├── file_002\n│       ├── file_003\n│       ├── file_004\n│       ├── file_005\n│       ├── file_006\n│       ├── file_007\n│       ├── file_008\n│       └── file_009\n├── grid\n│   ├── 0001\n│   ├── 0002\n│   ├── 0003\n│   ├── 0004\n│   ├── 0005\n│   ├── 0006\n│   ├── 0007\n│   ├── 0008\n│   ├── 0009\n│   ├── 0010\n│   ├── 0011\n│   ├── 0012\n│   ├── 0013\n│   ├── 0014\n│   ├── 0015\n│   ├── 0016\n│   ├── 0017\n│   ├── 0018\n│   ├── 0019\n│   ├── 0020\n│   ├── 0021\n│   ├── 0022\n│   ├── 0023\n│   ├── 0024\n│   ├── 0025\n│   ├── 0026\n│   ├── 0027\n│   ├── 0028\n│   ├── 0029\n│   ├── 0030\n│   ├── 0031\n│   ├── 0032\n│   ├── 0033\n│   ├── 0034\n│   ├── 0035\n│   ├── 0036\n│   ├── 0037\n│   ├── 0038\n│   ├── 0039\n│   ├── 0040\n│   ├── 0041\n│   ├── 0042\n│   ├── 0043\n│   ├── 0044\n│   ├── 0045\n│   ├── 0046\n│   ├── 0047\n│   ├── 0048\n│   ├── 0049\n│   ├── 0050\n│   ├── 0051\n│   ├── 0052\n│   ├── 0053\n│   ├── 0054\n│   ├── 0055\n│   ├── 0056\n│   ├── 0057\n│   ├── 0058\n│   ├── 0059\n│   ├── 0060\n│   ├── 0061\n│   ├── 0062\n│   ├── 0063\n│   ├── 0064\n│   ├── 0065\n│   ├── 0066\n│   ├── 0067\n│   ├── 0068\n│   ├── 0069\n│   ├── 0070\n│   ├── 0071\n│   ├── 0072\n│   ├── 0073\n│   ├── 0074\n│   ├── 0075\n│   ├── 0076\n│   ├── 0077\n│   ├── 0078\n│   ├── 0079\n│   ├── 0080\n│   ├── 0081\n│   ├── 0082\n│   ├── 0083\n│   ├── 0084\n│   ├── 0085\n│   ├── 0086\n│   ├── 0087\n│   ├── 0088\n│   ├── 0089\n│   ├── 0090\n│   ├── 0091\n│   ├── 0092\n│   ├── 0093\n│   ├── 0094\n│   ├── 0095\n│   ├── 0096\n│   ├── 0097\n│   ├── 0098\n│   ├── 0099\n│   ├── 0100\n│   ├── 0101\n│   ├── 0102\n│   ├── 0103\n│   ├── 0104\n│   ├── 0105\n│   ├── 0106\n│   ├── 0107\n│   ├── 0108\n│   ├── 0109\n│   ├── 0110\n│   ├── 0111\n│   ├── 0112\n│   ├── 0113\n│   ├── 0114\n│   ├── 0115\n│   ├── 0116\n│   ├── 0117\n│   ├── 0118\n│   ├── 0119\n│   ├── 0120\n│   ├── 0121\n│   ├── 0122\n│   ├── 0123\n│   ├── 0124\n│   ├── 0125\n│   ├── 0126\n│   ├── 0127\n│   ├── 0128\n│   ├── 0129\n│   ├── 0130\n│   ├── 0131\n│   ├── 0132\n│   ├── 0133\n│   ├── 0134\n│   ├── 0135\n│   ├── 0136\n│   ├── 0137\n│   ├── 0138\n│   ├── 0139\n│   ├── 0140\n│   ├── 0141\n│   ├── 0142\n│   ├── 0143\n│   ├── 0144\n│   ├── 0145\n│   ├── 0146\n│   ├── 0147\n│   ├── 0148\n│   ├── 0149\n│   ├── 0150\n│   ├── 0151\n│   ├── 0152\n│   ├── 0153\n│   ├── 0154\n│   ├── 0155\n│   ├── 0156\n│   ├── 0157\n│   ├── 0158\n│   ├── 0159\n│   ├── 0160\n│   ├── 0161\n│   ├── 0162\n│   ├── 0163\n│   ├── 0164\n│   ├── 0165\n│   ├── 0166\n│   ├── 0167\n│   ├── 0168\n│   ├── 0169\n│   ├── 0170\n│   ├── 0171\n│   ├── 0172\n│   ├── 0173\n│   ├── 0174\n│   ├── 0175\n│   ├── 0176\n│   ├── 0177\n│   ├── 0178\n│   ├── 0179\n│   ├── 0180\n│   ├── 0181\n│   ├── 0182\n│   ├── 0183\n│   ├── 0184\n│   ├── 0185\n│   ├── 0186\n│   ├── 0187\n│   ├── 0188\n│   ├── 0189\n│   ├── 0190\n│   ├── 0191\n│   ├── 0192\n│   ├── 0193\n│   ├── 0194\n│   ├── 0195\n│   ├── 0196\n│   ├── 0197\n│   ├── 0198\n│   ├── 0199\n│   ├── 0200\n│   ├── 0201\n│   ├── 0202\n│   ├── 0203\n│   ├── 0204\n│   ├── 0205\n│   ├── 0206\n│   ├── 0207\n│   ├── 0208\n│   ├── 0209\n│   ├── 0210\n│   ├── 0211\n│   ├── 0212\n│   ├── 0213\n│   ├── 0214\n│   ├── 0215\n│   ├── 0216\n│   ├── 0217\n│   ├── 0218\n│   ├── 0219\n│   ├── 0220\n│   ├── 0221\n│   ├── 0222\n│   ├── 0223\n│   ├── 0224\n│   ├── 0225\n│   ├── 0226\n│   ├── 0227\n│   ├── 0228\n│   ├── 0229\n│   ├── 0230\n│   ├── 0231\n│   ├── 0232\n│   ├── 0233\n│   ├── 0234\n│   ├── 0235\n│   ├── 0236\n│   ├── 0237\n│   ├── 0238\n│   ├── 0239\n│   ├── 0240\n│   ├── 0241\n│   ├── 0242\n│   ├── 0243\n│   ├── 0244\n│   ├── 0245\n│   ├── 0246\n│   ├── 0247\n│   ├── 0248\n│   ├── 0249\n│   ├── 0250\n│   ├── 0251\n│   ├── 0252\n│   ├── 0253\n│   ├── 0254\n│   ├── 0255\n│   ├── 0256\n│   ├── 0257\n│   ├── 0258\n│   ├── 0259\n│   ├── 0260\n│   ├── 0261\n│   ├── 0262\n│   ├── 0263\n│   ├── 0264\n│   ├── 0265\n│   ├── 0266\n│   ├── 0267\n│   ├── 0268\n│   ├── 0269\n│   ├── 0270\n│   ├── 0271\n│   ├── 0272\n│   ├── 0273\n│   ├── 0274\n│   ├── 0275\n│   ├── 0276\n│   ├── 0277\n│   ├── 0278\n│   ├── 0279\n│   ├── 0280\n│   ├── 0281\n│   ├── 0282\n│   ├── 0283\n│   ├── 0284\n│   ├── 0285\n│   ├── 0286\n│   ├── 0287\n│   ├── 0288\n│   ├── 0289\n│   ├── 0290\n│   ├── 0291\n│   ├── 0292\n│   ├── 0293\n│   ├── 0294\n│   ├── 0295\n│   ├── 0296\n│   ├── 0297\n│   ├── 0298\n│   ├── 0299\n│   ├── 0300\n│   ├── 0301\n│   ├── 0302\n│   ├── 0303\n│   ├── 0304\n│   ├── 0305\n│   ├── 0306\n│   ├── 0307\n│   ├── 0308\n│   ├── 0309\n│   ├── 0310\n│   ├── 0311\n│   ├── 0312\n│   ├── 0313\n│   ├── 0314\n│   ├── 0315\n│   ├── 0316\n│   ├── 0317\n│   ├── 0318\n│   ├── 0319\n│   ├── 0320\n│   ├── 0321\n│   ├── 0322\n│   ├── 0323\n│   ├── 0324\n│   ├── 0325\n│   ├── 0326\n│   ├── 0327\n│   ├── 0328\n│   ├── 0329\n│   ├── 0330\n│   ├── 0331\n│   ├── 0332\n│   ├── 0333\n│   ├── 0334\n│   ├── 0335\n│   ├── 0336\n│   ├── 0337\n│   ├── 0338\n│   ├── 0339\n│   ├── 0340\n│   ├── 0341\n│   ├── 0342\n│   ├── 0343\n│   ├── 0344\n│   ├── 0345\n│   ├── 0346\n│   ├── 0347\n│   ├── 0348\n│   ├── 0349\n│   ├── 0350\n│   ├── 0351\n│   ├── 0352\n│   ├── 0353\n│   ├── 0354\n│   ├── 0355\n│   ├── 0356\n│   ├── 0357\n│   ├── 0358\n│   ├── 0359\n│   ├── 0360\n│   ├── 0361\n│   ├── 0362\n│   ├── 0363\n│   ├── 0364\n│   ├── 0365\n│   ├── 0366\n│   ├── 0367\n│   ├── 0368\n│   ├── 0369\n│   ├── 0370\n│   ├── 0371\n│   ├── 0372\n│   ├── 0373\n│   ├── 0374\n│   ├── 0375\n│   ├── 0376\n│   ├── 0377\n│   ├── 0378\n│   ├── 0379\n│   ├── 0380\n│   ├── 0381\n│   ├── 0382\n│   ├── 0383\n│   ├── 0384\n│   ├── 0385\n│   ├── 0386\n│   ├── 0387\n│   ├── 0388\n│   ├── 0389\n│   ├── 0390\n│   ├── 0391\n│   ├── 0392\n│   ├── 0393\n│   ├── 0394\n│   ├── 0395\n│   ├── 0396\n│   ├── 0397\n│   ├── 0398\n│   ├── 0399\n│   ├── 0400\n│   ├── 0401\n│   ├── 0402\n│   ├── 0403\n│   ├── 0404\n│   ├── 0405\n│   ├── 0406\n│   ├── 0407\n│   ├── 0408\n│   ├── 0409\n│   ├── 0410\n│   ├── 0411\n│   ├── 0412\n│   ├── 0413\n│   ├── 0414\n│   ├── 0415\n│   ├── 0416\n│   ├── 0417\n│   ├── 0418\n│   ├── 0419\n│   ├── 0420\n│   ├── 0421\n│   ├── 0422\n│   ├── 0423\n│   ├── 0424\n│   ├── 0425\n│   ├── 0426\n│   ├── 0427\n│   ├── 0428\n│   ├── 0429\n│   ├── 0430\n│   ├── 0431\n│   ├── 0432\n│   ├── 0433\n│   ├── 0434\n│   ├── 0435\n│   ├── 0436\n│   ├── 0437\n│   ├── 0438\n│   ├── 0439\n│   ├── 0440\n│   ├── 0441\n│   ├── 0442\n│   ├── 0443\n│   ├── 0444\n│   ├── 0445\n│   ├── 0446\n│   ├── 0447\n│   ├── 0448\n│   ├── 0449\n│   ├── 0450\n│   ├── 0451\n│   ├── 0452\n│   ├── 0453\n│   ├── 0454\n│   ├── 0455\n│   ├── 0456\n│   ├── 0457\n│   ├── 0458\n│   ├── 0459\n│   ├── 0460\n│   ├── 0461\n│   ├── 0462\n│   ├── 0463\n│   ├── 0464\n│   ├── 0465\n│   ├── 0466\n│   ├── 0467\n│   ├── 0468\n│   ├── 0469\n│   ├── 0470\n│   ├── 0471\n│   ├── 0472\n│   ├── 0473\n│   ├── 0474\n│   ├── 0475\n│   ├── 0476\n│   ├── 0477\n│   ├── 0478\n│   ├── 0479\n│   ├── 0480\n│   ├── 0481\n│   ├── 0482\n│   ├── 0483\n│   ├── 0484\n│   ├── 0485\n│   ├── 0486\n│   ├── 0487\n│   ├── 0488\n│   ├── 0489\n│   ├── 0490\n│   ├── 0491\n│   ├── 0492\n│   ├── 0493\n│   ├── 0494\n│   ├── 0495\n│   ├── 0496\n│   ├── 0497\n│   ├── 0498\n│   ├── 0499\n│   ├── 0500\n│   ├── 0501\n│   ├── 0502\n│   ├── 0503\n│   ├── 0504\n│   ├── 0505\n│   ├── 0506\n│   ├── 0507\n│   ├── 0508\n│   ├── 0509\n│   ├── 0510\n│   ├── 0511\n│   ├── 0512\n│   ├── 0513\n│   ├── 0514\n│   ├── 0515\n│   ├── 0516\n│   ├── 0517\n│   ├── 0518\n│   ├── 0519\n│   ├── 0520\n│   ├── 0521\n│   ├── 0522\n│   ├── 0523\n│   ├── 0524\n│   ├── 0525\n│   ├── 0526\n│   ├── 0527\n│   ├── 0528\n│   ├── 0529\n│   ├── 0530\n│   ├── 0531\n│   ├── 0532\n│   ├── 0533\n│   ├── 0534\n│   ├── 0535\n│   ├── 0536\n│   ├── 0537\n│   ├── 0538\n│   ├── 0539\n│   ├── 0540\n│   ├── 0541\n│   ├── 0542\n│   ├── 0543\n│   ├── 0544\n│   ├── 0545\n│   ├── 0546\n│   ├── 0547\n│   ├── 0548\n│   ├── 0549\n│   ├── 0550\n│   ├── 0551\n│   ├── 0552\n│   ├── 0553\n│   ├── 0554\n│   ├── 0555\n│   ├── 0556\n│   ├── 0557\n│   ├── 0558\n│   ├── 0559\n│   ├── 0560\n│   ├── 0561\n│   ├── 0562\n│   ├── 0563\n│   ├── 0564\n│   ├── 0565\n│   ├── 0566\n│   ├── 0567\n│   ├── 0568\n│   ├── 0569\n│   ├── 0570\n│   ├── 0571\n│   ├── 0572\n│   ├── 0573\n│   ├── 0574\n│   ├── 0575\n│   ├── 0576\n│   ├── 0577\n│   ├── 0578\n│   ├── 0579\n│   ├── 0580\n│   ├── 0581\n│   ├── 0582\n│   ├── 0583\n│   ├── 0584\n│   ├── 0585\n│   ├── 0586\n│   ├── 0587\n│   ├── 0588\n│   ├── 0589\n│   ├── 0590\n│   ├── 0591\n│   ├── 0592\n│   ├── 0593\n│   ├── 0594\n│   ├── 0595\n│   ├── 0596\n│   ├── 0597\n│   ├── 0598\n│   ├── 0599\n│   ├── 0600\n│   ├── 0601\n│   ├── 0602\n│   ├── 0603\n│   ├── 0604\n│   ├── 0605\n│   ├── 0606\n│   ├── 0607\n│   ├── 0608\n│   ├── 0609\n│   ├── 0610\n│   ├── 0611\n│   ├── 0612\n│   ├── 0613\n│   ├── 0614\n│   ├── 0615\n│   ├── 0616\n│   ├── 0617\n│   ├── 0618\n│   ├── 0619\n│   ├── 0620\n│   ├── 0621\n│   ├── 0622\n│   ├── 0623\n│   ├── 0624\n│   ├── 0625\n│   ├── 0626\n│   ├── 0627\n│   ├── 0628\n│   ├── 0629\n│   ├── 0630\n│   ├── 0631\n│   ├── 0632\n│   ├── 0633\n│   ├── 0634\n│   ├── 0635\n│   ├── 0636\n│   ├── 0637\n│   ├── 0638\n│   ├── 0639\n│   ├── 0640\n│   ├── 0641\n│   ├── 0642\n│   ├── 0643\n│   ├── 0644\n│   ├── 0645\n│   ├── 0646\n│   ├── 0647\n│   ├── 0648\n│   ├── 0649\n│   ├── 0650\n│   ├── 0651\n│   ├── 0652\n│   ├── 0653\n│   ├── 0654\n│   ├── 0655\n│   ├── 0656\n│   ├── 0657\n│   ├── 0658\n│   ├── 0659\n│   ├── 0660\n│   ├── 0661\n│   ├── 0662\n│   ├── 0663\n│   ├── 0664\n│   ├── 0665\n│   ├── 0666\n│   ├── 0667\n│   ├── 0668\n│   ├── 0669\n│   ├── 0670\n│   ├── 0671\n│   ├── 0672\n│   ├── 0673\n│   ├── 0674\n│   ├── 0675\n│   ├── 0676\n│   ├── 0677\n│   ├── 0678\n│   ├── 0679\n│   ├── 0680\n│   ├── 0681\n│   ├── 0682\n│   ├── 0683\n│   ├── 0684\n│   ├── 0685\n│   ├── 0686\n│   ├── 0687\n│   ├── 0688\n│   ├── 0689\n│   ├── 0690\n│   ├── 0691\n│   ├── 0692\n│   ├── 0693\n│   ├── 0694\n│   ├── 0695\n│   ├── 0696\n│   ├── 0697\n│   ├── 0698\n│   ├── 0699\n│   ├── 0700\n│   ├── 0701\n│   ├── 0702\n│   ├── 0703\n│   ├── 0704\n│   ├── 0705\n│   ├── 0706\n│   ├── 0707\n│   ├── 0708\n│   ├── 0709\n│   ├── 0710\n│   ├── 0711\n│   ├── 0712\n│   ├── 0713\n│   ├── 0714\n│   ├── 0715\n│   ├── 0716\n│   ├── 0717\n│   ├── 0718\n│   ├── 0719\n│   ├── 0720\n│   ├── 0721\n│   ├── 0722\n│   ├── 0723\n│   ├── 0724\n│   ├── 0725\n│   ├── 0726\n│   ├── 0727\n│   ├── 0728\n│   ├── 0729\n│   ├── 0730\n│   ├── 0731\n│   ├── 0732\n│   ├── 0733\n│   ├── 0734\n│   ├── 0735\n│   ├── 0736\n│   ├── 0737\n│   ├── 0738\n│   ├── 0739\n│   ├── 0740\n│   ├── 0741\n│   ├── 0742\n│   ├── 0743\n│   ├── 0744\n│   ├── 0745\n│   ├── 0746\n│   ├── 0747\n│   ├── 0748\n│   ├── 0749\n│   ├── 0750\n│   ├── 0751\n│   ├── 0752\n│   ├── 0753\n│   ├── 0754\n│   ├── 0755\n│   ├── 0756\n│   ├── 0757\n│   ├── 0758\n│   ├── 0759\n│   ├── 0760\n│   ├── 0761\n│   ├── 0762\n│   ├── 0763\n│   ├── 0764\n│   ├── 0765\n│   ├── 0766\n│   ├── 0767\n│   ├── 0768\n│   ├── 0769\n│   ├── 0770\n│   ├── 0771\n│   ├── 0772\n│   ├── 0773\n│   ├── 0774\n│   ├── 0775\n│   ├── 0776\n│   ├── 0777\n│   ├── 0778\n│   ├── 0779\n│   ├── 0780\n│   ├── 0781\n│   ├── 0782\n│   ├── 0783\n│   ├── 0784\n│   ├── 0785\n│   ├── 0786\n│   ├── 0787\n│   ├── 0788\n│   ├── 0789\n│   ├── 0790\n│   ├── 0791\n│   ├── 0792\n│   ├── 0793\n│   ├── 0794\n│   ├── 0795\n│   ├── 0796\n│   ├── 0797\n│   ├── 0798\n│   ├── 0799\n│   ├── 0800\n│   ├── 0801\n│   ├── 0802\n│   ├── 0803\n│   ├── 0804\n│   ├── 0805\n│   ├── 0806\n│   ├── 0807\n│   ├── 0808\n│   ├── 0809\n│   ├── 0810\n│   ├── 0811\n│   ├── 0812\n│   ├── 0813\n│   ├── 0814\n│   ├── 0815\n│   ├── 0816\n│   ├── 0817\n│   ├── 0818\n│   ├── 0819\n│   ├── 0820\n│   ├── 0821\n│   ├── 0822\n│   ├── 0823\n│   ├── 0824\n│   ├── 0825\n│   ├── 0826\n│   ├── 0827\n│   ├── 0828\n│   ├── 0829\n│   ├── 0830\n│   ├── 0831\n│   ├── 0832\n│   ├── 0833\n│   ├── 0834\n│   ├── 0835\n│   ├── 0836\n│   ├── 0837\n│   ├── 0838\n│   ├── 0839\n│   ├── 0840\n│   ├── 0841\n│   ├── 0842\n│   ├── 0843\n│   ├── 0844\n│   ├── 0845\n│   ├── 0846\n│   ├── 0847\n│   ├── 0848\n│   ├── 0849\n│   ├── 0850\n│   ├── 0851\n│   ├── 0852\n│   ├── 0853\n│   ├── 0854\n│   ├── 0855\n│   ├── 0856\n│   ├── 0857\n│   ├── 0858\n│   ├── 0859\n│   ├── 0860\n│   ├── 0861\n│   ├── 0862\n│   ├── 0863\n│   ├── 0864\n│   ├── 0865\n│   ├── 0866\n│   ├── 0867\n│   ├── 0868\n│   ├── 0869\n│   ├── 0870\n│   ├── 0871\n│   ├── 0872\n│   ├── 0873\n│   ├── 0874\n│   ├── 0875\n│   ├── 0876\n│   ├── 0877\n│   ├── 0878\n│   ├── 0879\n│   ├── 0880\n│   ├── 0881\n│   ├── 0882\n│   ├── 0883\n│   ├── 0884\n│   ├── 0885\n│   ├── 0886\n│   ├── 0887\n│   ├── 0888\n│   ├── 0889\n│   ├── 0890\n│   ├── 0891\n│   ├── 0892\n│   ├── 0893\n│   ├── 0894\n│   ├── 0895\n│   ├── 0896\n│   ├── 0897\n│   ├── 0898\n│   ├── 0899\n│   ├── 0900\n│   ├── 0901\n│   ├── 0902\n│   ├── 0903\n│   ├── 0904\n│   ├── 0905\n│   ├── 0906\n│   ├── 0907\n│   ├── 0908\n│   ├── 0909\n│   ├── 0910\n│   ├── 0911\n│   ├── 0912\n│   ├── 0913\n│   ├── 0914\n│   ├── 0915\n│   ├── 0916\n│   ├── 0917\n│   ├── 0918\n│   ├── 0919\n│   ├── 0920\n│   ├── 0921\n│   ├── 0922\n│   ├── 0923\n│   ├── 0924\n│   ├── 0925\n│   ├── 0926\n│   ├── 0927\n│   ├── 0928\n│   ├── 0929\n│   ├── 0930\n│   ├── 0931\n│   ├── 0932\n│   ├── 0933\n│   ├── 0934\n│   ├── 0935\n│   ├── 0936\n│   ├── 0937\n│   ├── 0938\n│   ├── 0939\n│   ├── 0940\n│   ├── 0941\n│   ├── 0942\n│   ├── 0943\n│   ├── 0944\n│   ├── 0945\n│   ├── 0946\n│   ├── 0947\n│   ├── 0948\n│   ├── 0949\n│   ├── 0950\n│   ├── 0951\n│   ├── 0952\n│   ├── 0953\n│   ├── 0954\n│   ├── 0955\n│   ├── 0956\n│   ├── 0957\n│   ├── 0958\n│   ├── 0959\n│   ├── 0960\n│   ├── 0961\n│   ├── 0962\n│   ├── 0963\n│   ├── 0964\n│   ├── 0965\n│   ├── 0966\n│   ├── 0967\n│   ├── 0968\n│   ├── 0969\n│   ├── 0970\n│   ├── 0971\n│   ├── 0972\n│   ├── 0973\n│   ├── 0974\n│   ├── 0975\n│   ├── 0976\n│   ├── 0977\n│   ├── 0978\n│   ├── 0979\n│   ├── 0980\n│   ├── 0981\n│   ├── 0982\n│   ├── 0983\n│   ├── 0984\n│   ├── 0985\n│   ├── 0986\n│   ├── 0987\n│   ├── 0988\n│   ├── 0989\n│   ├── 0990\n│   ├── 0991\n│   ├── 0992\n│   ├── 0993\n│   ├── 0994\n│   ├── 0995\n│   ├── 0996\n│   ├── 0997\n│   ├── 0998\n│   ├── 0999\n│   ├── 1000\n│   ├── file_000\n│   ├── file_001\n│   ├── file_002\n│   ├── file_003\n│   ├── file_004\n│   ├── file_005\n│   ├── file_006\n│   ├── file_007\n│   ├── file_008\n│   ├── file_009\n│   ├── file_010\n│   ├── file_011\n│   ├── file_012\n│   ├── file_013\n│   ├── file_014\n│   ├── file_015\n│   ├── file_016\n│   ├── file_017\n│   ├── file_018\n│   ├── file_019\n│   ├── file_020\n│   ├── file_021\n│   ├── file_022\n│   ├── file_023\n│   ├── file_024\n│   ├── file_025\n│   ├── file_026\n│   ├── file_027\n│   ├── file_028\n│   ├── file_029\n│   ├── file_030\n│   ├── file_031\n│   ├── file_032\n│   ├── file_033\n│   ├── file_034\n│   ├── file_035\n│   ├── file_036\n│   ├── file_037\n│   ├── file_038\n│   ├── file_039\n│   ├── file_040\n│   ├── file_041\n│   ├── file_042\n│   ├── file_043\n│   ├── file_044\n│   ├── file_045\n│   ├── file_046\n│   ├── file_047\n│   ├── file_048\n│   ├── file_049\n│   ├── file_050\n│   ├── file_051\n│   ├── file_052\n│   ├── file_053\n│   ├── file_054\n│   ├── file_055\n│   ├── file_056\n│   ├── file_057\n│   ├── file_058\n│   ├── file_059\n│   ├── file_060\n│   ├── file_061\n│   ├── file_062\n│   ├── file_063\n│   ├── file_064\n│   ├── file_065\n│   ├── file_066\n│   ├── file_067\n│   ├── file_068\n│   ├── file_069\n│   ├── file_070\n│   ├── file_071\n│   ├── file_072\n│   ├── file_073\n│   ├── file_074\n│   ├── file_075\n│   ├── file_076\n│   ├── file_077\n│   ├── file_078\n│   ├── file_079\n│   ├── file_080\n│   ├── file_081\n│   ├── file_082\n│   ├── file_083\n│   ├── file_084\n│   ├── file_085\n│   ├── file_086\n│   ├── file_087\n│   ├── file_088\n│   ├── file_089\n│   ├── file_090\n│   ├── file_091\n│   ├── file_092\n│   ├── file_093\n│   ├── file_094\n│   ├── file_095\n│   ├── file_096\n│   ├── file_097\n│   ├── file_098\n│   ├── file_099\n│   ├── file_100\n│   ├── file_101\n│   ├── file_102\n│   ├── file_103\n│   ├── file_104\n│   ├── file_105\n│   ├── file_106\n│   ├── file_107\n│   ├── file_108\n│   ├── file_109\n│   ├── file_110\n│   ├── file_111\n│   ├── file_112\n│   ├── file_113\n│   ├── file_114\n│   ├── file_115\n│   ├── file_116\n│   ├── file_117\n│   ├── file_118\n│   ├── file_119\n│   ├── file_120\n│   ├── file_121\n│   ├── file_122\n│   ├── file_123\n│   ├── file_124\n│   ├── file_125\n│   ├── file_126\n│   ├── file_127\n│   ├── file_128\n│   ├── file_129\n│   ├── file_130\n│   ├── file_131\n│   ├── file_132\n│   ├── file_133\n│   ├── file_134\n│   ├── file_135\n│   ├── file_136\n│   ├── file_137\n│   ├── file_138\n│   ├── file_139\n│   ├── file_140\n│   ├── file_141\n│   ├── file_142\n│   ├── file_143\n│   ├── file_144\n│   ├── file_145\n│   ├── file_146\n│   ├── file_147\n│   ├── file_148\n│   ├── file_149\n│   ├── file_150\n│   ├── file_151\n│   ├── file_152\n│   ├── file_153\n│   ├── file_154\n│   ├── file_155\n│   ├── file_156\n│   ├── file_157\n│   ├── file_158\n│   ├── file_159\n│   ├── file_160\n│   ├── file_161\n│   ├── file_162\n│   ├── file_163\n│   ├── file_164\n│   ├── file_165\n│   ├── file_166\n│   ├── file_167\n│   ├── file_168\n│   ├── file_169\n│   ├── file_170\n│   ├── file_171\n│   ├── file_172\n│   ├── file_173\n│   ├── file_174\n│   ├── file_175\n│   ├── file_176\n│   ├── file_177\n│   ├── file_178\n│   ├── file_179\n│   ├── file_180\n│   ├── file_181\n│   ├── file_182\n│   ├── file_183\n│   ├── file_184\n│   ├── file_185\n│   ├── file_186\n│   ├── file_187\n│   ├── file_188\n│   ├── file_189\n│   ├── file_190\n│   ├── file_191\n│   ├── file_192\n│   ├── file_193\n│   ├── file_194\n│   ├── file_195\n│   ├── file_196\n│   ├── file_197\n│   ├── file_198\n│   ├── file_199\n│   ├── file_200\n│   ├── file_201\n│   ├── file_202\n│   ├── file_203\n│   ├── file_204\n│   ├── file_205\n│   ├── file_206\n│   ├── file_207\n│   ├── file_208\n│   ├── file_209\n│   ├── file_210\n│   ├── file_211\n│   ├── file_212\n│   ├── file_213\n│   ├── file_214\n│   ├── file_215\n│   ├── file_216\n│   ├── file_217\n│   ├── file_218\n│   ├── file_219\n│   ├── file_220\n│   ├── file_221\n│   ├── file_222\n│   ├── file_223\n│   ├── file_224\n│   ├── file_225\n│   ├── file_226\n│   ├── file_227\n│   ├── file_228\n│   ├── file_229\n│   ├── file_230\n│   ├── file_231\n│   ├── file_232\n│   ├── file_233\n│   ├── file_234\n│   ├── file_235\n│   ├── file_236\n│   ├── file_237\n│   ├── file_238\n│   ├── file_239\n│   ├── file_240\n│   ├── file_241\n│   ├── file_242\n│   ├── file_243\n│   ├── file_244\n│   ├── file_245\n│   ├── file_246\n│   ├── file_247\n│   ├── file_248\n│   ├── file_249\n│   ├── file_250\n│   ├── file_251\n│   ├── file_252\n│   ├── file_253\n│   ├── file_254\n│   ├── file_255\n│   ├── file_256\n│   ├── file_257\n│   ├── file_258\n│   ├── file_259\n│   ├── file_260\n│   ├── file_261\n│   ├── file_262\n│   ├── file_263\n│   ├── file_264\n│   ├── file_265\n│   ├── file_266\n│   ├── file_267\n│   ├── file_268\n│   ├── file_269\n│   ├── file_270\n│   ├── file_271\n│   ├── file_272\n│   ├── file_273\n│   ├── file_274\n│   ├── file_275\n│   ├── file_276\n│   ├── file_277\n│   ├── file_278\n│   ├── file_279\n│   ├── file_280\n│   ├── file_281\n│   ├── file_282\n│   ├── file_283\n│   ├── file_284\n│   ├── file_285\n│   ├── file_286\n│   ├── file_287\n│   ├── file_288\n│   ├── file_289\n│   ├── file_290\n│   ├── file_291\n│   ├── file_292\n│   ├── file_293\n│   ├── file_294\n│   ├── file_295\n│   ├── file_296\n│   ├── file_297\n│   ├── file_298\n│   ├── file_299\n│   ├── file_300\n│   ├── file_301\n│   ├── file_302\n│   ├── file_303\n│   ├── file_304\n│   ├── file_305\n│   ├── file_306\n│   ├── file_307\n│   ├── file_308\n│   ├── file_309\n│   ├── file_310\n│   ├── file_311\n│   ├── file_312\n│   ├── file_313\n│   ├── file_314\n│   ├── file_315\n│   ├── file_316\n│   ├── file_317\n│   ├── file_318\n│   ├── file_319\n│   ├── file_320\n│   ├── file_321\n│   ├── file_322\n│   ├── file_323\n│   ├── file_324\n│   ├── file_325\n│   ├── file_326\n│   ├── file_327\n│   ├── file_328\n│   ├── file_329\n│   ├── file_330\n│   ├── file_331\n│   ├── file_332\n│   ├── file_333\n│   ├── file_334\n│   ├── file_335\n│   ├── file_336\n│   ├── file_337\n│   ├── file_338\n│   ├── file_339\n│   ├── file_340\n│   ├── file_341\n│   ├── file_342\n│   ├── file_343\n│   ├── file_344\n│   ├── file_345\n│   ├── file_346\n│   ├── file_347\n│   ├── file_348\n│   ├── file_349\n│   ├── file_350\n│   ├── file_351\n│   ├── file_352\n│   ├── file_353\n│   ├── file_354\n│   ├── file_355\n│   ├── file_356\n│   ├── file_357\n│   ├── file_358\n│   ├── file_359\n│   ├── file_360\n│   ├── file_361\n│   ├── file_362\n│   ├── file_363\n│   ├── file_364\n│   ├── file_365\n│   ├── file_366\n│   ├── file_367\n│   ├── file_368\n│   ├── file_369\n│   ├── file_370\n│   ├── file_371\n│   ├── file_372\n│   ├── file_373\n│   ├── file_374\n│   ├── file_375\n│   ├── file_376\n│   ├── file_377\n│   ├── file_378\n│   ├── file_379\n│   ├── file_380\n│   ├── file_381\n│   ├── file_382\n│   ├── file_383\n│   ├── file_384\n│   ├── file_385\n│   ├── file_386\n│   ├── file_387\n│   ├── file_388\n│   ├── file_389\n│   ├── file_390\n│   ├── file_391\n│   ├── file_392\n│   ├── file_393\n│   ├── file_394\n│   ├── file_395\n│   ├── file_396\n│   ├── file_397\n│   ├── file_398\n│   ├── file_399\n│   ├── file_400\n│   ├── file_401\n│   ├── file_402\n│   ├── file_403\n│   ├── file_404\n│   ├── file_405\n│   ├── file_406\n│   ├── file_407\n│   ├── file_408\n│   ├── file_409\n│   ├── file_410\n│   ├── file_411\n│   ├── file_412\n│   ├── file_413\n│   ├── file_414\n│   ├── file_415\n│   ├── file_416\n│   ├── file_417\n│   ├── file_418\n│   ├── file_419\n│   ├── file_420\n│   ├── file_421\n│   ├── file_422\n│   ├── file_423\n│   ├── file_424\n│   ├── file_425\n│   ├── file_426\n│   ├── file_427\n│   ├── file_428\n│   ├── file_429\n│   ├── file_430\n│   ├── file_431\n│   ├── file_432\n│   ├── file_433\n│   ├── file_434\n│   ├── file_435\n│   ├── file_436\n│   ├── file_437\n│   ├── file_438\n│   ├── file_439\n│   ├── file_440\n│   ├── file_441\n│   ├── file_442\n│   ├── file_443\n│   ├── file_444\n│   ├── file_445\n│   ├── file_446\n│   ├── file_447\n│   ├── file_448\n│   ├── file_449\n│   ├── file_450\n│   ├── file_451\n│   ├── file_452\n│   ├── file_453\n│   ├── file_454\n│   ├── file_455\n│   ├── file_456\n│   ├── file_457\n│   ├── file_458\n│   ├── file_459\n│   ├── file_460\n│   ├── file_461\n│   ├── file_462\n│   ├── file_463\n│   ├── file_464\n│   ├── file_465\n│   ├── file_466\n│   ├── file_467\n│   ├── file_468\n│   ├── file_469\n│   ├── file_470\n│   ├── file_471\n│   ├── file_472\n│   ├── file_473\n│   ├── file_474\n│   ├── file_475\n│   ├── file_476\n│   ├── file_477\n│   ├── file_478\n│   ├── file_479\n│   ├── file_480\n│   ├── file_481\n│   ├── file_482\n│   ├── file_483\n│   ├── file_484\n│   ├── file_485\n│   ├── file_486\n│   ├── file_487\n│   ├── file_488\n│   ├── file_489\n│   ├── file_490\n│   ├── file_491\n│   ├── file_492\n│   ├── file_493\n│   ├── file_494\n│   ├── file_495\n│   ├── file_496\n│   ├── file_497\n│   ├── file_498\n│   ├── file_499\n│   ├── file_500\n│   ├── file_501\n│   ├── file_502\n│   ├── file_503\n│   ├── file_504\n│   ├── file_505\n│   ├── file_506\n│   ├── file_507\n│   ├── file_508\n│   ├── file_509\n│   ├── file_510\n│   ├── file_511\n│   ├── file_512\n│   ├── file_513\n│   ├── file_514\n│   ├── file_515\n│   ├── file_516\n│   ├── file_517\n│   ├── file_518\n│   ├── file_519\n│   ├── file_520\n│   ├── file_521\n│   ├── file_522\n│   ├── file_523\n│   ├── file_524\n│   ├── file_525\n│   ├── file_526\n│   ├── file_527\n│   ├── file_528\n│   ├── file_529\n│   ├── file_530\n│   ├── file_531\n│   ├── file_532\n│   ├── file_533\n│   ├── file_534\n│   ├── file_535\n│   ├── file_536\n│   ├── file_537\n│   ├── file_538\n│   ├── file_539\n│   ├── file_540\n│   ├── file_541\n│   ├── file_542\n│   ├── file_543\n│   ├── file_544\n│   ├── file_545\n│   ├── file_546\n│   ├── file_547\n│   ├── file_548\n│   ├── file_549\n│   ├── file_550\n│   ├── file_551\n│   ├── file_552\n│   ├── file_553\n│   ├── file_554\n│   ├── file_555\n│   ├── file_556\n│   ├── file_557\n│   ├── file_558\n│   ├── file_559\n│   ├── file_560\n│   ├── file_561\n│   ├── file_562\n│   ├── file_563\n│   ├── file_564\n│   ├── file_565\n│   ├── file_566\n│   ├── file_567\n│   ├── file_568\n│   ├── file_569\n│   ├── file_570\n│   ├── file_571\n│   ├── file_572\n│   ├── file_573\n│   ├── file_574\n│   ├── file_575\n│   ├── file_576\n│   ├── file_577\n│   ├── file_578\n│   ├── file_579\n│   ├── file_580\n│   ├── file_581\n│   ├── file_582\n│   ├── file_583\n│   ├── file_584\n│   ├── file_585\n│   ├── file_586\n│   ├── file_587\n│   ├── file_588\n│   ├── file_589\n│   ├── file_590\n│   ├── file_591\n│   ├── file_592\n│   ├── file_593\n│   ├── file_594\n│   ├── file_595\n│   ├── file_596\n│   ├── file_597\n│   ├── file_598\n│   ├── file_599\n│   ├── file_600\n│   ├── file_601\n│   ├── file_602\n│   ├── file_603\n│   ├── file_604\n│   ├── file_605\n│   ├── file_606\n│   ├── file_607\n│   ├── file_608\n│   ├── file_609\n│   ├── file_610\n│   ├── file_611\n│   ├── file_612\n│   ├── file_613\n│   ├── file_614\n│   ├── file_615\n│   ├── file_616\n│   ├── file_617\n│   ├── file_618\n│   ├── file_619\n│   ├── file_620\n│   ├── file_621\n│   ├── file_622\n│   ├── file_623\n│   ├── file_624\n│   ├── file_625\n│   ├── file_626\n│   ├── file_627\n│   ├── file_628\n│   ├── file_629\n│   ├── file_630\n│   ├── file_631\n│   ├── file_632\n│   ├── file_633\n│   ├── file_634\n│   ├── file_635\n│   ├── file_636\n│   ├── file_637\n│   ├── file_638\n│   ├── file_639\n│   ├── file_640\n│   ├── file_641\n│   ├── file_642\n│   ├── file_643\n│   ├── file_644\n│   ├── file_645\n│   ├── file_646\n│   ├── file_647\n│   ├── file_648\n│   ├── file_649\n│   ├── file_650\n│   ├── file_651\n│   ├── file_652\n│   ├── file_653\n│   ├── file_654\n│   ├── file_655\n│   ├── file_656\n│   ├── file_657\n│   ├── file_658\n│   ├── file_659\n│   ├── file_660\n│   ├── file_661\n│   ├── file_662\n│   ├── file_663\n│   ├── file_664\n│   ├── file_665\n│   ├── file_666\n│   ├── file_667\n│   ├── file_668\n│   ├── file_669\n│   ├── file_670\n│   ├── file_671\n│   ├── file_672\n│   ├── file_673\n│   ├── file_674\n│   ├── file_675\n│   ├── file_676\n│   ├── file_677\n│   ├── file_678\n│   ├── file_679\n│   ├── file_680\n│   ├── file_681\n│   ├── file_682\n│   ├── file_683\n│   ├── file_684\n│   ├── file_685\n│   ├── file_686\n│   ├── file_687\n│   ├── file_688\n│   ├── file_689\n│   ├── file_690\n│   ├── file_691\n│   ├── file_692\n│   ├── file_693\n│   ├── file_694\n│   ├── file_695\n│   ├── file_696\n│   ├── file_697\n│   ├── file_698\n│   ├── file_699\n│   ├── file_700\n│   ├── file_701\n│   ├── file_702\n│   ├── file_703\n│   ├── file_704\n│   ├── file_705\n│   ├── file_706\n│   ├── file_707\n│   ├── file_708\n│   ├── file_709\n│   ├── file_710\n│   ├── file_711\n│   ├── file_712\n│   ├── file_713\n│   ├── file_714\n│   ├── file_715\n│   ├── file_716\n│   ├── file_717\n│   ├── file_718\n│   ├── file_719\n│   ├── file_720\n│   ├── file_721\n│   ├── file_722\n│   ├── file_723\n│   ├── file_724\n│   ├── file_725\n│   ├── file_726\n│   ├── file_727\n│   ├── file_728\n│   ├── file_729\n│   ├── file_730\n│   ├── file_731\n│   ├── file_732\n│   ├── file_733\n│   ├── file_734\n│   ├── file_735\n│   ├── file_736\n│   ├── file_737\n│   ├── file_738\n│   ├── file_739\n│   ├── file_740\n│   ├── file_741\n│   ├── file_742\n│   ├── file_743\n│   ├── file_744\n│   ├── file_745\n│   ├── file_746\n│   ├── file_747\n│   ├── file_748\n│   ├── file_749\n│   ├── file_750\n│   ├── file_751\n│   ├── file_752\n│   ├── file_753\n│   ├── file_754\n│   ├── file_755\n│   ├── file_756\n│   ├── file_757\n│   ├── file_758\n│   ├── file_759\n│   ├── file_760\n│   ├── file_761\n│   ├── file_762\n│   ├── file_763\n│   ├── file_764\n│   ├── file_765\n│   ├── file_766\n│   ├── file_767\n│   ├── file_768\n│   ├── file_769\n│   ├── file_770\n│   ├── file_771\n│   ├── file_772\n│   ├── file_773\n│   ├── file_774\n│   ├── file_775\n│   ├── file_776\n│   ├── file_777\n│   ├── file_778\n│   ├── file_779\n│   ├── file_780\n│   ├── file_781\n│   ├── file_782\n│   ├── file_783\n│   ├── file_784\n│   ├── file_785\n│   ├── file_786\n│   ├── file_787\n│   ├── file_788\n│   ├── file_789\n│   ├── file_790\n│   ├── file_791\n│   ├── file_792\n│   ├── file_793\n│   ├── file_794\n│   ├── file_795\n│   ├── file_796\n│   ├── file_797\n│   ├── file_798\n│   ├── file_799\n│   ├── file_800\n│   ├── file_801\n│   ├── file_802\n│   ├── file_803\n│   ├── file_804\n│   ├── file_805\n│   ├── file_806\n│   ├── file_807\n│   ├── file_808\n│   ├── file_809\n│   ├── file_810\n│   ├── file_811\n│   ├── file_812\n│   ├── file_813\n│   ├── file_814\n│   ├── file_815\n│   ├── file_816\n│   ├── file_817\n│   ├── file_818\n│   ├── file_819\n│   ├── file_820\n│   ├── file_821\n│   ├── file_822\n│   ├── file_823\n│   ├── file_824\n│   ├── file_825\n│   ├── file_826\n│   ├── file_827\n│   ├── file_828\n│   ├── file_829\n│   ├── file_830\n│   ├── file_831\n│   ├── file_832\n│   ├── file_833\n│   ├── file_834\n│   ├── file_835\n│   ├── file_836\n│   ├── file_837\n│   ├── file_838\n│   ├── file_839\n│   ├── file_840\n│   ├── file_841\n│   ├── file_842\n│   ├── file_843\n│   ├── file_844\n│   ├── file_845\n│   ├── file_846\n│   ├── file_847\n│   ├── file_848\n│   ├── file_849\n│   ├── file_850\n│   ├── file_851\n│   ├── file_852\n│   ├── file_853\n│   ├── file_854\n│   ├── file_855\n│   ├── file_856\n│   ├── file_857\n│   ├── file_858\n│   ├── file_859\n│   ├── file_860\n│   ├── file_861\n│   ├── file_862\n│   ├── file_863\n│   ├── file_864\n│   ├── file_865\n│   ├── file_866\n│   ├── file_867\n│   ├── file_868\n│   ├── file_869\n│   ├── file_870\n│   ├── file_871\n│   ├── file_872\n│   ├── file_873\n│   ├── file_874\n│   ├── file_875\n│   ├── file_876\n│   ├── file_877\n│   ├── file_878\n│   ├── file_879\n│   ├── file_880\n│   ├── file_881\n│   ├── file_882\n│   ├── file_883\n│   ├── file_884\n│   ├── file_885\n│   ├── file_886\n│   ├── file_887\n│   ├── file_888\n│   ├── file_889\n│   ├── file_890\n│   ├── file_891\n│   ├── file_892\n│   ├── file_893\n│   ├── file_894\n│   ├── file_895\n│   ├── file_896\n│   ├── file_897\n│   ├── file_898\n│   ├── file_899\n│   ├── file_900\n│   ├── file_901\n│   ├── file_902\n│   ├── file_903\n│   ├── file_904\n│   ├── file_905\n│   ├── file_906\n│   ├── file_907\n│   ├── file_908\n│   ├── file_909\n│   ├── file_910\n│   ├── file_911\n│   ├── file_912\n│   ├── file_913\n│   ├── file_914\n│   ├── file_915\n│   ├── file_916\n│   ├── file_917\n│   ├── file_918\n│   ├── file_919\n│   ├── file_920\n│   ├── file_921\n│   ├── file_922\n│   ├── file_923\n│   ├── file_924\n│   ├── file_925\n│   ├── file_926\n│   ├── file_927\n│   ├── file_928\n│   ├── file_929\n│   ├── file_930\n│   ├── file_931\n│   ├── file_932\n│   ├── file_933\n│   ├── file_934\n│   ├── file_935\n│   ├── file_936\n│   ├── file_937\n│   ├── file_938\n│   ├── file_939\n│   ├── file_940\n│   ├── file_941\n│   ├── file_942\n│   ├── file_943\n│   ├── file_944\n│   ├── file_945\n│   ├── file_946\n│   ├── file_947\n│   ├── file_948\n│   ├── file_949\n│   ├── file_950\n│   ├── file_951\n│   ├── file_952\n│   ├── file_953\n│   ├── file_954\n│   ├── file_955\n│   ├── file_956\n│   ├── file_957\n│   ├── file_958\n│   ├── file_959\n│   ├── file_960\n│   ├── file_961\n│   ├── file_962\n│   ├── file_963\n│   ├── file_964\n│   ├── file_965\n│   ├── file_966\n│   ├── file_967\n│   ├── file_968\n│   ├── file_969\n│   ├── file_970\n│   ├── file_971\n│   ├── file_972\n│   ├── file_973\n│   ├── file_974\n│   ├── file_975\n│   ├── file_976\n│   ├── file_977\n│   ├── file_978\n│   ├── file_979\n│   ├── file_980\n│   ├── file_981\n│   ├── file_982\n│   ├── file_983\n│   ├── file_984\n│   ├── file_985\n│   ├── file_986\n│   ├── file_987\n│   ├── file_988\n│   ├── file_989\n│   ├── file_990\n│   ├── file_991\n│   ├── file_992\n│   ├── file_993\n│   ├── file_994\n│   ├── file_995\n│   ├── file_996\n│   ├── file_997\n│   ├── file_998\n│   └── file_999\n├── group\n│   └── file\n├── icons\n│   ├── c++.cpp\n│   ├── c.c\n│   ├── css.css\n│   ├── file\n│   ├── go.go\n│   ├── html.html\n│   ├── java.java\n│   ├── javascript.js\n│   ├── man.1\n│   ├── marked.md\n│   ├── php.php\n│   ├── python.py\n│   ├── ruby.rb\n│   ├── rust.rs\n│   ├── shell.sh\n│   └── unknown.unknown\n├── perms\n│   ├── file\n│   └── file2\n├── size\n│   ├── 1B\n│   ├── 1K\n│   ├── 1M\n│   └── 1337\n├── specials\n├── symlinks\n│   ├── dir\n│   ├── file\n│   ├── ' lorem ipsum'\n│   ├── symlink -> file\n│   ├── symlink2 -> symlink\n│   ├── symlink3 -> dir\n│   └── symlink4 -> pipitek\n└── time\n    ├── 1d\n    ├── 1h\n    ├── 1m\n    ├── 1s\n    ├── 1y\n    └── epoch\n"
  },
  {
    "path": "tests/ptests/ptest_4728f2d14d31f2ff.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T -L 4\""
  },
  {
    "path": "tests/ptests/ptest_4805a91da5df26.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_4805a91da5df26.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_4805a91da5df26.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -x \""
  },
  {
    "path": "tests/ptests/ptest_4974d70325cb7550.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_4974d70325cb7550.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_4974d70325cb7550.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --mounts \""
  },
  {
    "path": "tests/ptests/ptest_4b0ed60c44c669f.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_4b0ed60c44c669f.stdout",
    "content": "tests/test_dir\n├── git\n│   ├── 001\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 002\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 003\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 004\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 005\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 006\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 007\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 008\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 009\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   └── 010\n│       ├── file_000\n│       ├── file_001\n│       ├── file_002\n│       ├── file_003\n│       ├── file_004\n│       ├── file_005\n│       ├── file_006\n│       ├── file_007\n│       ├── file_008\n│       └── file_009\n├── grid\n│   ├── 0001\n│   ├── 0002\n│   ├── 0003\n│   ├── 0004\n│   ├── 0005\n│   ├── 0006\n│   ├── 0007\n│   ├── 0008\n│   ├── 0009\n│   ├── 0010\n│   ├── 0011\n│   ├── 0012\n│   ├── 0013\n│   ├── 0014\n│   ├── 0015\n│   ├── 0016\n│   ├── 0017\n│   ├── 0018\n│   ├── 0019\n│   ├── 0020\n│   ├── 0021\n│   ├── 0022\n│   ├── 0023\n│   ├── 0024\n│   ├── 0025\n│   ├── 0026\n│   ├── 0027\n│   ├── 0028\n│   ├── 0029\n│   ├── 0030\n│   ├── 0031\n│   ├── 0032\n│   ├── 0033\n│   ├── 0034\n│   ├── 0035\n│   ├── 0036\n│   ├── 0037\n│   ├── 0038\n│   ├── 0039\n│   ├── 0040\n│   ├── 0041\n│   ├── 0042\n│   ├── 0043\n│   ├── 0044\n│   ├── 0045\n│   ├── 0046\n│   ├── 0047\n│   ├── 0048\n│   ├── 0049\n│   ├── 0050\n│   ├── 0051\n│   ├── 0052\n│   ├── 0053\n│   ├── 0054\n│   ├── 0055\n│   ├── 0056\n│   ├── 0057\n│   ├── 0058\n│   ├── 0059\n│   ├── 0060\n│   ├── 0061\n│   ├── 0062\n│   ├── 0063\n│   ├── 0064\n│   ├── 0065\n│   ├── 0066\n│   ├── 0067\n│   ├── 0068\n│   ├── 0069\n│   ├── 0070\n│   ├── 0071\n│   ├── 0072\n│   ├── 0073\n│   ├── 0074\n│   ├── 0075\n│   ├── 0076\n│   ├── 0077\n│   ├── 0078\n│   ├── 0079\n│   ├── 0080\n│   ├── 0081\n│   ├── 0082\n│   ├── 0083\n│   ├── 0084\n│   ├── 0085\n│   ├── 0086\n│   ├── 0087\n│   ├── 0088\n│   ├── 0089\n│   ├── 0090\n│   ├── 0091\n│   ├── 0092\n│   ├── 0093\n│   ├── 0094\n│   ├── 0095\n│   ├── 0096\n│   ├── 0097\n│   ├── 0098\n│   ├── 0099\n│   ├── 0100\n│   ├── 0101\n│   ├── 0102\n│   ├── 0103\n│   ├── 0104\n│   ├── 0105\n│   ├── 0106\n│   ├── 0107\n│   ├── 0108\n│   ├── 0109\n│   ├── 0110\n│   ├── 0111\n│   ├── 0112\n│   ├── 0113\n│   ├── 0114\n│   ├── 0115\n│   ├── 0116\n│   ├── 0117\n│   ├── 0118\n│   ├── 0119\n│   ├── 0120\n│   ├── 0121\n│   ├── 0122\n│   ├── 0123\n│   ├── 0124\n│   ├── 0125\n│   ├── 0126\n│   ├── 0127\n│   ├── 0128\n│   ├── 0129\n│   ├── 0130\n│   ├── 0131\n│   ├── 0132\n│   ├── 0133\n│   ├── 0134\n│   ├── 0135\n│   ├── 0136\n│   ├── 0137\n│   ├── 0138\n│   ├── 0139\n│   ├── 0140\n│   ├── 0141\n│   ├── 0142\n│   ├── 0143\n│   ├── 0144\n│   ├── 0145\n│   ├── 0146\n│   ├── 0147\n│   ├── 0148\n│   ├── 0149\n│   ├── 0150\n│   ├── 0151\n│   ├── 0152\n│   ├── 0153\n│   ├── 0154\n│   ├── 0155\n│   ├── 0156\n│   ├── 0157\n│   ├── 0158\n│   ├── 0159\n│   ├── 0160\n│   ├── 0161\n│   ├── 0162\n│   ├── 0163\n│   ├── 0164\n│   ├── 0165\n│   ├── 0166\n│   ├── 0167\n│   ├── 0168\n│   ├── 0169\n│   ├── 0170\n│   ├── 0171\n│   ├── 0172\n│   ├── 0173\n│   ├── 0174\n│   ├── 0175\n│   ├── 0176\n│   ├── 0177\n│   ├── 0178\n│   ├── 0179\n│   ├── 0180\n│   ├── 0181\n│   ├── 0182\n│   ├── 0183\n│   ├── 0184\n│   ├── 0185\n│   ├── 0186\n│   ├── 0187\n│   ├── 0188\n│   ├── 0189\n│   ├── 0190\n│   ├── 0191\n│   ├── 0192\n│   ├── 0193\n│   ├── 0194\n│   ├── 0195\n│   ├── 0196\n│   ├── 0197\n│   ├── 0198\n│   ├── 0199\n│   ├── 0200\n│   ├── 0201\n│   ├── 0202\n│   ├── 0203\n│   ├── 0204\n│   ├── 0205\n│   ├── 0206\n│   ├── 0207\n│   ├── 0208\n│   ├── 0209\n│   ├── 0210\n│   ├── 0211\n│   ├── 0212\n│   ├── 0213\n│   ├── 0214\n│   ├── 0215\n│   ├── 0216\n│   ├── 0217\n│   ├── 0218\n│   ├── 0219\n│   ├── 0220\n│   ├── 0221\n│   ├── 0222\n│   ├── 0223\n│   ├── 0224\n│   ├── 0225\n│   ├── 0226\n│   ├── 0227\n│   ├── 0228\n│   ├── 0229\n│   ├── 0230\n│   ├── 0231\n│   ├── 0232\n│   ├── 0233\n│   ├── 0234\n│   ├── 0235\n│   ├── 0236\n│   ├── 0237\n│   ├── 0238\n│   ├── 0239\n│   ├── 0240\n│   ├── 0241\n│   ├── 0242\n│   ├── 0243\n│   ├── 0244\n│   ├── 0245\n│   ├── 0246\n│   ├── 0247\n│   ├── 0248\n│   ├── 0249\n│   ├── 0250\n│   ├── 0251\n│   ├── 0252\n│   ├── 0253\n│   ├── 0254\n│   ├── 0255\n│   ├── 0256\n│   ├── 0257\n│   ├── 0258\n│   ├── 0259\n│   ├── 0260\n│   ├── 0261\n│   ├── 0262\n│   ├── 0263\n│   ├── 0264\n│   ├── 0265\n│   ├── 0266\n│   ├── 0267\n│   ├── 0268\n│   ├── 0269\n│   ├── 0270\n│   ├── 0271\n│   ├── 0272\n│   ├── 0273\n│   ├── 0274\n│   ├── 0275\n│   ├── 0276\n│   ├── 0277\n│   ├── 0278\n│   ├── 0279\n│   ├── 0280\n│   ├── 0281\n│   ├── 0282\n│   ├── 0283\n│   ├── 0284\n│   ├── 0285\n│   ├── 0286\n│   ├── 0287\n│   ├── 0288\n│   ├── 0289\n│   ├── 0290\n│   ├── 0291\n│   ├── 0292\n│   ├── 0293\n│   ├── 0294\n│   ├── 0295\n│   ├── 0296\n│   ├── 0297\n│   ├── 0298\n│   ├── 0299\n│   ├── 0300\n│   ├── 0301\n│   ├── 0302\n│   ├── 0303\n│   ├── 0304\n│   ├── 0305\n│   ├── 0306\n│   ├── 0307\n│   ├── 0308\n│   ├── 0309\n│   ├── 0310\n│   ├── 0311\n│   ├── 0312\n│   ├── 0313\n│   ├── 0314\n│   ├── 0315\n│   ├── 0316\n│   ├── 0317\n│   ├── 0318\n│   ├── 0319\n│   ├── 0320\n│   ├── 0321\n│   ├── 0322\n│   ├── 0323\n│   ├── 0324\n│   ├── 0325\n│   ├── 0326\n│   ├── 0327\n│   ├── 0328\n│   ├── 0329\n│   ├── 0330\n│   ├── 0331\n│   ├── 0332\n│   ├── 0333\n│   ├── 0334\n│   ├── 0335\n│   ├── 0336\n│   ├── 0337\n│   ├── 0338\n│   ├── 0339\n│   ├── 0340\n│   ├── 0341\n│   ├── 0342\n│   ├── 0343\n│   ├── 0344\n│   ├── 0345\n│   ├── 0346\n│   ├── 0347\n│   ├── 0348\n│   ├── 0349\n│   ├── 0350\n│   ├── 0351\n│   ├── 0352\n│   ├── 0353\n│   ├── 0354\n│   ├── 0355\n│   ├── 0356\n│   ├── 0357\n│   ├── 0358\n│   ├── 0359\n│   ├── 0360\n│   ├── 0361\n│   ├── 0362\n│   ├── 0363\n│   ├── 0364\n│   ├── 0365\n│   ├── 0366\n│   ├── 0367\n│   ├── 0368\n│   ├── 0369\n│   ├── 0370\n│   ├── 0371\n│   ├── 0372\n│   ├── 0373\n│   ├── 0374\n│   ├── 0375\n│   ├── 0376\n│   ├── 0377\n│   ├── 0378\n│   ├── 0379\n│   ├── 0380\n│   ├── 0381\n│   ├── 0382\n│   ├── 0383\n│   ├── 0384\n│   ├── 0385\n│   ├── 0386\n│   ├── 0387\n│   ├── 0388\n│   ├── 0389\n│   ├── 0390\n│   ├── 0391\n│   ├── 0392\n│   ├── 0393\n│   ├── 0394\n│   ├── 0395\n│   ├── 0396\n│   ├── 0397\n│   ├── 0398\n│   ├── 0399\n│   ├── 0400\n│   ├── 0401\n│   ├── 0402\n│   ├── 0403\n│   ├── 0404\n│   ├── 0405\n│   ├── 0406\n│   ├── 0407\n│   ├── 0408\n│   ├── 0409\n│   ├── 0410\n│   ├── 0411\n│   ├── 0412\n│   ├── 0413\n│   ├── 0414\n│   ├── 0415\n│   ├── 0416\n│   ├── 0417\n│   ├── 0418\n│   ├── 0419\n│   ├── 0420\n│   ├── 0421\n│   ├── 0422\n│   ├── 0423\n│   ├── 0424\n│   ├── 0425\n│   ├── 0426\n│   ├── 0427\n│   ├── 0428\n│   ├── 0429\n│   ├── 0430\n│   ├── 0431\n│   ├── 0432\n│   ├── 0433\n│   ├── 0434\n│   ├── 0435\n│   ├── 0436\n│   ├── 0437\n│   ├── 0438\n│   ├── 0439\n│   ├── 0440\n│   ├── 0441\n│   ├── 0442\n│   ├── 0443\n│   ├── 0444\n│   ├── 0445\n│   ├── 0446\n│   ├── 0447\n│   ├── 0448\n│   ├── 0449\n│   ├── 0450\n│   ├── 0451\n│   ├── 0452\n│   ├── 0453\n│   ├── 0454\n│   ├── 0455\n│   ├── 0456\n│   ├── 0457\n│   ├── 0458\n│   ├── 0459\n│   ├── 0460\n│   ├── 0461\n│   ├── 0462\n│   ├── 0463\n│   ├── 0464\n│   ├── 0465\n│   ├── 0466\n│   ├── 0467\n│   ├── 0468\n│   ├── 0469\n│   ├── 0470\n│   ├── 0471\n│   ├── 0472\n│   ├── 0473\n│   ├── 0474\n│   ├── 0475\n│   ├── 0476\n│   ├── 0477\n│   ├── 0478\n│   ├── 0479\n│   ├── 0480\n│   ├── 0481\n│   ├── 0482\n│   ├── 0483\n│   ├── 0484\n│   ├── 0485\n│   ├── 0486\n│   ├── 0487\n│   ├── 0488\n│   ├── 0489\n│   ├── 0490\n│   ├── 0491\n│   ├── 0492\n│   ├── 0493\n│   ├── 0494\n│   ├── 0495\n│   ├── 0496\n│   ├── 0497\n│   ├── 0498\n│   ├── 0499\n│   ├── 0500\n│   ├── 0501\n│   ├── 0502\n│   ├── 0503\n│   ├── 0504\n│   ├── 0505\n│   ├── 0506\n│   ├── 0507\n│   ├── 0508\n│   ├── 0509\n│   ├── 0510\n│   ├── 0511\n│   ├── 0512\n│   ├── 0513\n│   ├── 0514\n│   ├── 0515\n│   ├── 0516\n│   ├── 0517\n│   ├── 0518\n│   ├── 0519\n│   ├── 0520\n│   ├── 0521\n│   ├── 0522\n│   ├── 0523\n│   ├── 0524\n│   ├── 0525\n│   ├── 0526\n│   ├── 0527\n│   ├── 0528\n│   ├── 0529\n│   ├── 0530\n│   ├── 0531\n│   ├── 0532\n│   ├── 0533\n│   ├── 0534\n│   ├── 0535\n│   ├── 0536\n│   ├── 0537\n│   ├── 0538\n│   ├── 0539\n│   ├── 0540\n│   ├── 0541\n│   ├── 0542\n│   ├── 0543\n│   ├── 0544\n│   ├── 0545\n│   ├── 0546\n│   ├── 0547\n│   ├── 0548\n│   ├── 0549\n│   ├── 0550\n│   ├── 0551\n│   ├── 0552\n│   ├── 0553\n│   ├── 0554\n│   ├── 0555\n│   ├── 0556\n│   ├── 0557\n│   ├── 0558\n│   ├── 0559\n│   ├── 0560\n│   ├── 0561\n│   ├── 0562\n│   ├── 0563\n│   ├── 0564\n│   ├── 0565\n│   ├── 0566\n│   ├── 0567\n│   ├── 0568\n│   ├── 0569\n│   ├── 0570\n│   ├── 0571\n│   ├── 0572\n│   ├── 0573\n│   ├── 0574\n│   ├── 0575\n│   ├── 0576\n│   ├── 0577\n│   ├── 0578\n│   ├── 0579\n│   ├── 0580\n│   ├── 0581\n│   ├── 0582\n│   ├── 0583\n│   ├── 0584\n│   ├── 0585\n│   ├── 0586\n│   ├── 0587\n│   ├── 0588\n│   ├── 0589\n│   ├── 0590\n│   ├── 0591\n│   ├── 0592\n│   ├── 0593\n│   ├── 0594\n│   ├── 0595\n│   ├── 0596\n│   ├── 0597\n│   ├── 0598\n│   ├── 0599\n│   ├── 0600\n│   ├── 0601\n│   ├── 0602\n│   ├── 0603\n│   ├── 0604\n│   ├── 0605\n│   ├── 0606\n│   ├── 0607\n│   ├── 0608\n│   ├── 0609\n│   ├── 0610\n│   ├── 0611\n│   ├── 0612\n│   ├── 0613\n│   ├── 0614\n│   ├── 0615\n│   ├── 0616\n│   ├── 0617\n│   ├── 0618\n│   ├── 0619\n│   ├── 0620\n│   ├── 0621\n│   ├── 0622\n│   ├── 0623\n│   ├── 0624\n│   ├── 0625\n│   ├── 0626\n│   ├── 0627\n│   ├── 0628\n│   ├── 0629\n│   ├── 0630\n│   ├── 0631\n│   ├── 0632\n│   ├── 0633\n│   ├── 0634\n│   ├── 0635\n│   ├── 0636\n│   ├── 0637\n│   ├── 0638\n│   ├── 0639\n│   ├── 0640\n│   ├── 0641\n│   ├── 0642\n│   ├── 0643\n│   ├── 0644\n│   ├── 0645\n│   ├── 0646\n│   ├── 0647\n│   ├── 0648\n│   ├── 0649\n│   ├── 0650\n│   ├── 0651\n│   ├── 0652\n│   ├── 0653\n│   ├── 0654\n│   ├── 0655\n│   ├── 0656\n│   ├── 0657\n│   ├── 0658\n│   ├── 0659\n│   ├── 0660\n│   ├── 0661\n│   ├── 0662\n│   ├── 0663\n│   ├── 0664\n│   ├── 0665\n│   ├── 0666\n│   ├── 0667\n│   ├── 0668\n│   ├── 0669\n│   ├── 0670\n│   ├── 0671\n│   ├── 0672\n│   ├── 0673\n│   ├── 0674\n│   ├── 0675\n│   ├── 0676\n│   ├── 0677\n│   ├── 0678\n│   ├── 0679\n│   ├── 0680\n│   ├── 0681\n│   ├── 0682\n│   ├── 0683\n│   ├── 0684\n│   ├── 0685\n│   ├── 0686\n│   ├── 0687\n│   ├── 0688\n│   ├── 0689\n│   ├── 0690\n│   ├── 0691\n│   ├── 0692\n│   ├── 0693\n│   ├── 0694\n│   ├── 0695\n│   ├── 0696\n│   ├── 0697\n│   ├── 0698\n│   ├── 0699\n│   ├── 0700\n│   ├── 0701\n│   ├── 0702\n│   ├── 0703\n│   ├── 0704\n│   ├── 0705\n│   ├── 0706\n│   ├── 0707\n│   ├── 0708\n│   ├── 0709\n│   ├── 0710\n│   ├── 0711\n│   ├── 0712\n│   ├── 0713\n│   ├── 0714\n│   ├── 0715\n│   ├── 0716\n│   ├── 0717\n│   ├── 0718\n│   ├── 0719\n│   ├── 0720\n│   ├── 0721\n│   ├── 0722\n│   ├── 0723\n│   ├── 0724\n│   ├── 0725\n│   ├── 0726\n│   ├── 0727\n│   ├── 0728\n│   ├── 0729\n│   ├── 0730\n│   ├── 0731\n│   ├── 0732\n│   ├── 0733\n│   ├── 0734\n│   ├── 0735\n│   ├── 0736\n│   ├── 0737\n│   ├── 0738\n│   ├── 0739\n│   ├── 0740\n│   ├── 0741\n│   ├── 0742\n│   ├── 0743\n│   ├── 0744\n│   ├── 0745\n│   ├── 0746\n│   ├── 0747\n│   ├── 0748\n│   ├── 0749\n│   ├── 0750\n│   ├── 0751\n│   ├── 0752\n│   ├── 0753\n│   ├── 0754\n│   ├── 0755\n│   ├── 0756\n│   ├── 0757\n│   ├── 0758\n│   ├── 0759\n│   ├── 0760\n│   ├── 0761\n│   ├── 0762\n│   ├── 0763\n│   ├── 0764\n│   ├── 0765\n│   ├── 0766\n│   ├── 0767\n│   ├── 0768\n│   ├── 0769\n│   ├── 0770\n│   ├── 0771\n│   ├── 0772\n│   ├── 0773\n│   ├── 0774\n│   ├── 0775\n│   ├── 0776\n│   ├── 0777\n│   ├── 0778\n│   ├── 0779\n│   ├── 0780\n│   ├── 0781\n│   ├── 0782\n│   ├── 0783\n│   ├── 0784\n│   ├── 0785\n│   ├── 0786\n│   ├── 0787\n│   ├── 0788\n│   ├── 0789\n│   ├── 0790\n│   ├── 0791\n│   ├── 0792\n│   ├── 0793\n│   ├── 0794\n│   ├── 0795\n│   ├── 0796\n│   ├── 0797\n│   ├── 0798\n│   ├── 0799\n│   ├── 0800\n│   ├── 0801\n│   ├── 0802\n│   ├── 0803\n│   ├── 0804\n│   ├── 0805\n│   ├── 0806\n│   ├── 0807\n│   ├── 0808\n│   ├── 0809\n│   ├── 0810\n│   ├── 0811\n│   ├── 0812\n│   ├── 0813\n│   ├── 0814\n│   ├── 0815\n│   ├── 0816\n│   ├── 0817\n│   ├── 0818\n│   ├── 0819\n│   ├── 0820\n│   ├── 0821\n│   ├── 0822\n│   ├── 0823\n│   ├── 0824\n│   ├── 0825\n│   ├── 0826\n│   ├── 0827\n│   ├── 0828\n│   ├── 0829\n│   ├── 0830\n│   ├── 0831\n│   ├── 0832\n│   ├── 0833\n│   ├── 0834\n│   ├── 0835\n│   ├── 0836\n│   ├── 0837\n│   ├── 0838\n│   ├── 0839\n│   ├── 0840\n│   ├── 0841\n│   ├── 0842\n│   ├── 0843\n│   ├── 0844\n│   ├── 0845\n│   ├── 0846\n│   ├── 0847\n│   ├── 0848\n│   ├── 0849\n│   ├── 0850\n│   ├── 0851\n│   ├── 0852\n│   ├── 0853\n│   ├── 0854\n│   ├── 0855\n│   ├── 0856\n│   ├── 0857\n│   ├── 0858\n│   ├── 0859\n│   ├── 0860\n│   ├── 0861\n│   ├── 0862\n│   ├── 0863\n│   ├── 0864\n│   ├── 0865\n│   ├── 0866\n│   ├── 0867\n│   ├── 0868\n│   ├── 0869\n│   ├── 0870\n│   ├── 0871\n│   ├── 0872\n│   ├── 0873\n│   ├── 0874\n│   ├── 0875\n│   ├── 0876\n│   ├── 0877\n│   ├── 0878\n│   ├── 0879\n│   ├── 0880\n│   ├── 0881\n│   ├── 0882\n│   ├── 0883\n│   ├── 0884\n│   ├── 0885\n│   ├── 0886\n│   ├── 0887\n│   ├── 0888\n│   ├── 0889\n│   ├── 0890\n│   ├── 0891\n│   ├── 0892\n│   ├── 0893\n│   ├── 0894\n│   ├── 0895\n│   ├── 0896\n│   ├── 0897\n│   ├── 0898\n│   ├── 0899\n│   ├── 0900\n│   ├── 0901\n│   ├── 0902\n│   ├── 0903\n│   ├── 0904\n│   ├── 0905\n│   ├── 0906\n│   ├── 0907\n│   ├── 0908\n│   ├── 0909\n│   ├── 0910\n│   ├── 0911\n│   ├── 0912\n│   ├── 0913\n│   ├── 0914\n│   ├── 0915\n│   ├── 0916\n│   ├── 0917\n│   ├── 0918\n│   ├── 0919\n│   ├── 0920\n│   ├── 0921\n│   ├── 0922\n│   ├── 0923\n│   ├── 0924\n│   ├── 0925\n│   ├── 0926\n│   ├── 0927\n│   ├── 0928\n│   ├── 0929\n│   ├── 0930\n│   ├── 0931\n│   ├── 0932\n│   ├── 0933\n│   ├── 0934\n│   ├── 0935\n│   ├── 0936\n│   ├── 0937\n│   ├── 0938\n│   ├── 0939\n│   ├── 0940\n│   ├── 0941\n│   ├── 0942\n│   ├── 0943\n│   ├── 0944\n│   ├── 0945\n│   ├── 0946\n│   ├── 0947\n│   ├── 0948\n│   ├── 0949\n│   ├── 0950\n│   ├── 0951\n│   ├── 0952\n│   ├── 0953\n│   ├── 0954\n│   ├── 0955\n│   ├── 0956\n│   ├── 0957\n│   ├── 0958\n│   ├── 0959\n│   ├── 0960\n│   ├── 0961\n│   ├── 0962\n│   ├── 0963\n│   ├── 0964\n│   ├── 0965\n│   ├── 0966\n│   ├── 0967\n│   ├── 0968\n│   ├── 0969\n│   ├── 0970\n│   ├── 0971\n│   ├── 0972\n│   ├── 0973\n│   ├── 0974\n│   ├── 0975\n│   ├── 0976\n│   ├── 0977\n│   ├── 0978\n│   ├── 0979\n│   ├── 0980\n│   ├── 0981\n│   ├── 0982\n│   ├── 0983\n│   ├── 0984\n│   ├── 0985\n│   ├── 0986\n│   ├── 0987\n│   ├── 0988\n│   ├── 0989\n│   ├── 0990\n│   ├── 0991\n│   ├── 0992\n│   ├── 0993\n│   ├── 0994\n│   ├── 0995\n│   ├── 0996\n│   ├── 0997\n│   ├── 0998\n│   ├── 0999\n│   ├── 1000\n│   ├── file_000\n│   ├── file_001\n│   ├── file_002\n│   ├── file_003\n│   ├── file_004\n│   ├── file_005\n│   ├── file_006\n│   ├── file_007\n│   ├── file_008\n│   ├── file_009\n│   ├── file_010\n│   ├── file_011\n│   ├── file_012\n│   ├── file_013\n│   ├── file_014\n│   ├── file_015\n│   ├── file_016\n│   ├── file_017\n│   ├── file_018\n│   ├── file_019\n│   ├── file_020\n│   ├── file_021\n│   ├── file_022\n│   ├── file_023\n│   ├── file_024\n│   ├── file_025\n│   ├── file_026\n│   ├── file_027\n│   ├── file_028\n│   ├── file_029\n│   ├── file_030\n│   ├── file_031\n│   ├── file_032\n│   ├── file_033\n│   ├── file_034\n│   ├── file_035\n│   ├── file_036\n│   ├── file_037\n│   ├── file_038\n│   ├── file_039\n│   ├── file_040\n│   ├── file_041\n│   ├── file_042\n│   ├── file_043\n│   ├── file_044\n│   ├── file_045\n│   ├── file_046\n│   ├── file_047\n│   ├── file_048\n│   ├── file_049\n│   ├── file_050\n│   ├── file_051\n│   ├── file_052\n│   ├── file_053\n│   ├── file_054\n│   ├── file_055\n│   ├── file_056\n│   ├── file_057\n│   ├── file_058\n│   ├── file_059\n│   ├── file_060\n│   ├── file_061\n│   ├── file_062\n│   ├── file_063\n│   ├── file_064\n│   ├── file_065\n│   ├── file_066\n│   ├── file_067\n│   ├── file_068\n│   ├── file_069\n│   ├── file_070\n│   ├── file_071\n│   ├── file_072\n│   ├── file_073\n│   ├── file_074\n│   ├── file_075\n│   ├── file_076\n│   ├── file_077\n│   ├── file_078\n│   ├── file_079\n│   ├── file_080\n│   ├── file_081\n│   ├── file_082\n│   ├── file_083\n│   ├── file_084\n│   ├── file_085\n│   ├── file_086\n│   ├── file_087\n│   ├── file_088\n│   ├── file_089\n│   ├── file_090\n│   ├── file_091\n│   ├── file_092\n│   ├── file_093\n│   ├── file_094\n│   ├── file_095\n│   ├── file_096\n│   ├── file_097\n│   ├── file_098\n│   ├── file_099\n│   ├── file_100\n│   ├── file_101\n│   ├── file_102\n│   ├── file_103\n│   ├── file_104\n│   ├── file_105\n│   ├── file_106\n│   ├── file_107\n│   ├── file_108\n│   ├── file_109\n│   ├── file_110\n│   ├── file_111\n│   ├── file_112\n│   ├── file_113\n│   ├── file_114\n│   ├── file_115\n│   ├── file_116\n│   ├── file_117\n│   ├── file_118\n│   ├── file_119\n│   ├── file_120\n│   ├── file_121\n│   ├── file_122\n│   ├── file_123\n│   ├── file_124\n│   ├── file_125\n│   ├── file_126\n│   ├── file_127\n│   ├── file_128\n│   ├── file_129\n│   ├── file_130\n│   ├── file_131\n│   ├── file_132\n│   ├── file_133\n│   ├── file_134\n│   ├── file_135\n│   ├── file_136\n│   ├── file_137\n│   ├── file_138\n│   ├── file_139\n│   ├── file_140\n│   ├── file_141\n│   ├── file_142\n│   ├── file_143\n│   ├── file_144\n│   ├── file_145\n│   ├── file_146\n│   ├── file_147\n│   ├── file_148\n│   ├── file_149\n│   ├── file_150\n│   ├── file_151\n│   ├── file_152\n│   ├── file_153\n│   ├── file_154\n│   ├── file_155\n│   ├── file_156\n│   ├── file_157\n│   ├── file_158\n│   ├── file_159\n│   ├── file_160\n│   ├── file_161\n│   ├── file_162\n│   ├── file_163\n│   ├── file_164\n│   ├── file_165\n│   ├── file_166\n│   ├── file_167\n│   ├── file_168\n│   ├── file_169\n│   ├── file_170\n│   ├── file_171\n│   ├── file_172\n│   ├── file_173\n│   ├── file_174\n│   ├── file_175\n│   ├── file_176\n│   ├── file_177\n│   ├── file_178\n│   ├── file_179\n│   ├── file_180\n│   ├── file_181\n│   ├── file_182\n│   ├── file_183\n│   ├── file_184\n│   ├── file_185\n│   ├── file_186\n│   ├── file_187\n│   ├── file_188\n│   ├── file_189\n│   ├── file_190\n│   ├── file_191\n│   ├── file_192\n│   ├── file_193\n│   ├── file_194\n│   ├── file_195\n│   ├── file_196\n│   ├── file_197\n│   ├── file_198\n│   ├── file_199\n│   ├── file_200\n│   ├── file_201\n│   ├── file_202\n│   ├── file_203\n│   ├── file_204\n│   ├── file_205\n│   ├── file_206\n│   ├── file_207\n│   ├── file_208\n│   ├── file_209\n│   ├── file_210\n│   ├── file_211\n│   ├── file_212\n│   ├── file_213\n│   ├── file_214\n│   ├── file_215\n│   ├── file_216\n│   ├── file_217\n│   ├── file_218\n│   ├── file_219\n│   ├── file_220\n│   ├── file_221\n│   ├── file_222\n│   ├── file_223\n│   ├── file_224\n│   ├── file_225\n│   ├── file_226\n│   ├── file_227\n│   ├── file_228\n│   ├── file_229\n│   ├── file_230\n│   ├── file_231\n│   ├── file_232\n│   ├── file_233\n│   ├── file_234\n│   ├── file_235\n│   ├── file_236\n│   ├── file_237\n│   ├── file_238\n│   ├── file_239\n│   ├── file_240\n│   ├── file_241\n│   ├── file_242\n│   ├── file_243\n│   ├── file_244\n│   ├── file_245\n│   ├── file_246\n│   ├── file_247\n│   ├── file_248\n│   ├── file_249\n│   ├── file_250\n│   ├── file_251\n│   ├── file_252\n│   ├── file_253\n│   ├── file_254\n│   ├── file_255\n│   ├── file_256\n│   ├── file_257\n│   ├── file_258\n│   ├── file_259\n│   ├── file_260\n│   ├── file_261\n│   ├── file_262\n│   ├── file_263\n│   ├── file_264\n│   ├── file_265\n│   ├── file_266\n│   ├── file_267\n│   ├── file_268\n│   ├── file_269\n│   ├── file_270\n│   ├── file_271\n│   ├── file_272\n│   ├── file_273\n│   ├── file_274\n│   ├── file_275\n│   ├── file_276\n│   ├── file_277\n│   ├── file_278\n│   ├── file_279\n│   ├── file_280\n│   ├── file_281\n│   ├── file_282\n│   ├── file_283\n│   ├── file_284\n│   ├── file_285\n│   ├── file_286\n│   ├── file_287\n│   ├── file_288\n│   ├── file_289\n│   ├── file_290\n│   ├── file_291\n│   ├── file_292\n│   ├── file_293\n│   ├── file_294\n│   ├── file_295\n│   ├── file_296\n│   ├── file_297\n│   ├── file_298\n│   ├── file_299\n│   ├── file_300\n│   ├── file_301\n│   ├── file_302\n│   ├── file_303\n│   ├── file_304\n│   ├── file_305\n│   ├── file_306\n│   ├── file_307\n│   ├── file_308\n│   ├── file_309\n│   ├── file_310\n│   ├── file_311\n│   ├── file_312\n│   ├── file_313\n│   ├── file_314\n│   ├── file_315\n│   ├── file_316\n│   ├── file_317\n│   ├── file_318\n│   ├── file_319\n│   ├── file_320\n│   ├── file_321\n│   ├── file_322\n│   ├── file_323\n│   ├── file_324\n│   ├── file_325\n│   ├── file_326\n│   ├── file_327\n│   ├── file_328\n│   ├── file_329\n│   ├── file_330\n│   ├── file_331\n│   ├── file_332\n│   ├── file_333\n│   ├── file_334\n│   ├── file_335\n│   ├── file_336\n│   ├── file_337\n│   ├── file_338\n│   ├── file_339\n│   ├── file_340\n│   ├── file_341\n│   ├── file_342\n│   ├── file_343\n│   ├── file_344\n│   ├── file_345\n│   ├── file_346\n│   ├── file_347\n│   ├── file_348\n│   ├── file_349\n│   ├── file_350\n│   ├── file_351\n│   ├── file_352\n│   ├── file_353\n│   ├── file_354\n│   ├── file_355\n│   ├── file_356\n│   ├── file_357\n│   ├── file_358\n│   ├── file_359\n│   ├── file_360\n│   ├── file_361\n│   ├── file_362\n│   ├── file_363\n│   ├── file_364\n│   ├── file_365\n│   ├── file_366\n│   ├── file_367\n│   ├── file_368\n│   ├── file_369\n│   ├── file_370\n│   ├── file_371\n│   ├── file_372\n│   ├── file_373\n│   ├── file_374\n│   ├── file_375\n│   ├── file_376\n│   ├── file_377\n│   ├── file_378\n│   ├── file_379\n│   ├── file_380\n│   ├── file_381\n│   ├── file_382\n│   ├── file_383\n│   ├── file_384\n│   ├── file_385\n│   ├── file_386\n│   ├── file_387\n│   ├── file_388\n│   ├── file_389\n│   ├── file_390\n│   ├── file_391\n│   ├── file_392\n│   ├── file_393\n│   ├── file_394\n│   ├── file_395\n│   ├── file_396\n│   ├── file_397\n│   ├── file_398\n│   ├── file_399\n│   ├── file_400\n│   ├── file_401\n│   ├── file_402\n│   ├── file_403\n│   ├── file_404\n│   ├── file_405\n│   ├── file_406\n│   ├── file_407\n│   ├── file_408\n│   ├── file_409\n│   ├── file_410\n│   ├── file_411\n│   ├── file_412\n│   ├── file_413\n│   ├── file_414\n│   ├── file_415\n│   ├── file_416\n│   ├── file_417\n│   ├── file_418\n│   ├── file_419\n│   ├── file_420\n│   ├── file_421\n│   ├── file_422\n│   ├── file_423\n│   ├── file_424\n│   ├── file_425\n│   ├── file_426\n│   ├── file_427\n│   ├── file_428\n│   ├── file_429\n│   ├── file_430\n│   ├── file_431\n│   ├── file_432\n│   ├── file_433\n│   ├── file_434\n│   ├── file_435\n│   ├── file_436\n│   ├── file_437\n│   ├── file_438\n│   ├── file_439\n│   ├── file_440\n│   ├── file_441\n│   ├── file_442\n│   ├── file_443\n│   ├── file_444\n│   ├── file_445\n│   ├── file_446\n│   ├── file_447\n│   ├── file_448\n│   ├── file_449\n│   ├── file_450\n│   ├── file_451\n│   ├── file_452\n│   ├── file_453\n│   ├── file_454\n│   ├── file_455\n│   ├── file_456\n│   ├── file_457\n│   ├── file_458\n│   ├── file_459\n│   ├── file_460\n│   ├── file_461\n│   ├── file_462\n│   ├── file_463\n│   ├── file_464\n│   ├── file_465\n│   ├── file_466\n│   ├── file_467\n│   ├── file_468\n│   ├── file_469\n│   ├── file_470\n│   ├── file_471\n│   ├── file_472\n│   ├── file_473\n│   ├── file_474\n│   ├── file_475\n│   ├── file_476\n│   ├── file_477\n│   ├── file_478\n│   ├── file_479\n│   ├── file_480\n│   ├── file_481\n│   ├── file_482\n│   ├── file_483\n│   ├── file_484\n│   ├── file_485\n│   ├── file_486\n│   ├── file_487\n│   ├── file_488\n│   ├── file_489\n│   ├── file_490\n│   ├── file_491\n│   ├── file_492\n│   ├── file_493\n│   ├── file_494\n│   ├── file_495\n│   ├── file_496\n│   ├── file_497\n│   ├── file_498\n│   ├── file_499\n│   ├── file_500\n│   ├── file_501\n│   ├── file_502\n│   ├── file_503\n│   ├── file_504\n│   ├── file_505\n│   ├── file_506\n│   ├── file_507\n│   ├── file_508\n│   ├── file_509\n│   ├── file_510\n│   ├── file_511\n│   ├── file_512\n│   ├── file_513\n│   ├── file_514\n│   ├── file_515\n│   ├── file_516\n│   ├── file_517\n│   ├── file_518\n│   ├── file_519\n│   ├── file_520\n│   ├── file_521\n│   ├── file_522\n│   ├── file_523\n│   ├── file_524\n│   ├── file_525\n│   ├── file_526\n│   ├── file_527\n│   ├── file_528\n│   ├── file_529\n│   ├── file_530\n│   ├── file_531\n│   ├── file_532\n│   ├── file_533\n│   ├── file_534\n│   ├── file_535\n│   ├── file_536\n│   ├── file_537\n│   ├── file_538\n│   ├── file_539\n│   ├── file_540\n│   ├── file_541\n│   ├── file_542\n│   ├── file_543\n│   ├── file_544\n│   ├── file_545\n│   ├── file_546\n│   ├── file_547\n│   ├── file_548\n│   ├── file_549\n│   ├── file_550\n│   ├── file_551\n│   ├── file_552\n│   ├── file_553\n│   ├── file_554\n│   ├── file_555\n│   ├── file_556\n│   ├── file_557\n│   ├── file_558\n│   ├── file_559\n│   ├── file_560\n│   ├── file_561\n│   ├── file_562\n│   ├── file_563\n│   ├── file_564\n│   ├── file_565\n│   ├── file_566\n│   ├── file_567\n│   ├── file_568\n│   ├── file_569\n│   ├── file_570\n│   ├── file_571\n│   ├── file_572\n│   ├── file_573\n│   ├── file_574\n│   ├── file_575\n│   ├── file_576\n│   ├── file_577\n│   ├── file_578\n│   ├── file_579\n│   ├── file_580\n│   ├── file_581\n│   ├── file_582\n│   ├── file_583\n│   ├── file_584\n│   ├── file_585\n│   ├── file_586\n│   ├── file_587\n│   ├── file_588\n│   ├── file_589\n│   ├── file_590\n│   ├── file_591\n│   ├── file_592\n│   ├── file_593\n│   ├── file_594\n│   ├── file_595\n│   ├── file_596\n│   ├── file_597\n│   ├── file_598\n│   ├── file_599\n│   ├── file_600\n│   ├── file_601\n│   ├── file_602\n│   ├── file_603\n│   ├── file_604\n│   ├── file_605\n│   ├── file_606\n│   ├── file_607\n│   ├── file_608\n│   ├── file_609\n│   ├── file_610\n│   ├── file_611\n│   ├── file_612\n│   ├── file_613\n│   ├── file_614\n│   ├── file_615\n│   ├── file_616\n│   ├── file_617\n│   ├── file_618\n│   ├── file_619\n│   ├── file_620\n│   ├── file_621\n│   ├── file_622\n│   ├── file_623\n│   ├── file_624\n│   ├── file_625\n│   ├── file_626\n│   ├── file_627\n│   ├── file_628\n│   ├── file_629\n│   ├── file_630\n│   ├── file_631\n│   ├── file_632\n│   ├── file_633\n│   ├── file_634\n│   ├── file_635\n│   ├── file_636\n│   ├── file_637\n│   ├── file_638\n│   ├── file_639\n│   ├── file_640\n│   ├── file_641\n│   ├── file_642\n│   ├── file_643\n│   ├── file_644\n│   ├── file_645\n│   ├── file_646\n│   ├── file_647\n│   ├── file_648\n│   ├── file_649\n│   ├── file_650\n│   ├── file_651\n│   ├── file_652\n│   ├── file_653\n│   ├── file_654\n│   ├── file_655\n│   ├── file_656\n│   ├── file_657\n│   ├── file_658\n│   ├── file_659\n│   ├── file_660\n│   ├── file_661\n│   ├── file_662\n│   ├── file_663\n│   ├── file_664\n│   ├── file_665\n│   ├── file_666\n│   ├── file_667\n│   ├── file_668\n│   ├── file_669\n│   ├── file_670\n│   ├── file_671\n│   ├── file_672\n│   ├── file_673\n│   ├── file_674\n│   ├── file_675\n│   ├── file_676\n│   ├── file_677\n│   ├── file_678\n│   ├── file_679\n│   ├── file_680\n│   ├── file_681\n│   ├── file_682\n│   ├── file_683\n│   ├── file_684\n│   ├── file_685\n│   ├── file_686\n│   ├── file_687\n│   ├── file_688\n│   ├── file_689\n│   ├── file_690\n│   ├── file_691\n│   ├── file_692\n│   ├── file_693\n│   ├── file_694\n│   ├── file_695\n│   ├── file_696\n│   ├── file_697\n│   ├── file_698\n│   ├── file_699\n│   ├── file_700\n│   ├── file_701\n│   ├── file_702\n│   ├── file_703\n│   ├── file_704\n│   ├── file_705\n│   ├── file_706\n│   ├── file_707\n│   ├── file_708\n│   ├── file_709\n│   ├── file_710\n│   ├── file_711\n│   ├── file_712\n│   ├── file_713\n│   ├── file_714\n│   ├── file_715\n│   ├── file_716\n│   ├── file_717\n│   ├── file_718\n│   ├── file_719\n│   ├── file_720\n│   ├── file_721\n│   ├── file_722\n│   ├── file_723\n│   ├── file_724\n│   ├── file_725\n│   ├── file_726\n│   ├── file_727\n│   ├── file_728\n│   ├── file_729\n│   ├── file_730\n│   ├── file_731\n│   ├── file_732\n│   ├── file_733\n│   ├── file_734\n│   ├── file_735\n│   ├── file_736\n│   ├── file_737\n│   ├── file_738\n│   ├── file_739\n│   ├── file_740\n│   ├── file_741\n│   ├── file_742\n│   ├── file_743\n│   ├── file_744\n│   ├── file_745\n│   ├── file_746\n│   ├── file_747\n│   ├── file_748\n│   ├── file_749\n│   ├── file_750\n│   ├── file_751\n│   ├── file_752\n│   ├── file_753\n│   ├── file_754\n│   ├── file_755\n│   ├── file_756\n│   ├── file_757\n│   ├── file_758\n│   ├── file_759\n│   ├── file_760\n│   ├── file_761\n│   ├── file_762\n│   ├── file_763\n│   ├── file_764\n│   ├── file_765\n│   ├── file_766\n│   ├── file_767\n│   ├── file_768\n│   ├── file_769\n│   ├── file_770\n│   ├── file_771\n│   ├── file_772\n│   ├── file_773\n│   ├── file_774\n│   ├── file_775\n│   ├── file_776\n│   ├── file_777\n│   ├── file_778\n│   ├── file_779\n│   ├── file_780\n│   ├── file_781\n│   ├── file_782\n│   ├── file_783\n│   ├── file_784\n│   ├── file_785\n│   ├── file_786\n│   ├── file_787\n│   ├── file_788\n│   ├── file_789\n│   ├── file_790\n│   ├── file_791\n│   ├── file_792\n│   ├── file_793\n│   ├── file_794\n│   ├── file_795\n│   ├── file_796\n│   ├── file_797\n│   ├── file_798\n│   ├── file_799\n│   ├── file_800\n│   ├── file_801\n│   ├── file_802\n│   ├── file_803\n│   ├── file_804\n│   ├── file_805\n│   ├── file_806\n│   ├── file_807\n│   ├── file_808\n│   ├── file_809\n│   ├── file_810\n│   ├── file_811\n│   ├── file_812\n│   ├── file_813\n│   ├── file_814\n│   ├── file_815\n│   ├── file_816\n│   ├── file_817\n│   ├── file_818\n│   ├── file_819\n│   ├── file_820\n│   ├── file_821\n│   ├── file_822\n│   ├── file_823\n│   ├── file_824\n│   ├── file_825\n│   ├── file_826\n│   ├── file_827\n│   ├── file_828\n│   ├── file_829\n│   ├── file_830\n│   ├── file_831\n│   ├── file_832\n│   ├── file_833\n│   ├── file_834\n│   ├── file_835\n│   ├── file_836\n│   ├── file_837\n│   ├── file_838\n│   ├── file_839\n│   ├── file_840\n│   ├── file_841\n│   ├── file_842\n│   ├── file_843\n│   ├── file_844\n│   ├── file_845\n│   ├── file_846\n│   ├── file_847\n│   ├── file_848\n│   ├── file_849\n│   ├── file_850\n│   ├── file_851\n│   ├── file_852\n│   ├── file_853\n│   ├── file_854\n│   ├── file_855\n│   ├── file_856\n│   ├── file_857\n│   ├── file_858\n│   ├── file_859\n│   ├── file_860\n│   ├── file_861\n│   ├── file_862\n│   ├── file_863\n│   ├── file_864\n│   ├── file_865\n│   ├── file_866\n│   ├── file_867\n│   ├── file_868\n│   ├── file_869\n│   ├── file_870\n│   ├── file_871\n│   ├── file_872\n│   ├── file_873\n│   ├── file_874\n│   ├── file_875\n│   ├── file_876\n│   ├── file_877\n│   ├── file_878\n│   ├── file_879\n│   ├── file_880\n│   ├── file_881\n│   ├── file_882\n│   ├── file_883\n│   ├── file_884\n│   ├── file_885\n│   ├── file_886\n│   ├── file_887\n│   ├── file_888\n│   ├── file_889\n│   ├── file_890\n│   ├── file_891\n│   ├── file_892\n│   ├── file_893\n│   ├── file_894\n│   ├── file_895\n│   ├── file_896\n│   ├── file_897\n│   ├── file_898\n│   ├── file_899\n│   ├── file_900\n│   ├── file_901\n│   ├── file_902\n│   ├── file_903\n│   ├── file_904\n│   ├── file_905\n│   ├── file_906\n│   ├── file_907\n│   ├── file_908\n│   ├── file_909\n│   ├── file_910\n│   ├── file_911\n│   ├── file_912\n│   ├── file_913\n│   ├── file_914\n│   ├── file_915\n│   ├── file_916\n│   ├── file_917\n│   ├── file_918\n│   ├── file_919\n│   ├── file_920\n│   ├── file_921\n│   ├── file_922\n│   ├── file_923\n│   ├── file_924\n│   ├── file_925\n│   ├── file_926\n│   ├── file_927\n│   ├── file_928\n│   ├── file_929\n│   ├── file_930\n│   ├── file_931\n│   ├── file_932\n│   ├── file_933\n│   ├── file_934\n│   ├── file_935\n│   ├── file_936\n│   ├── file_937\n│   ├── file_938\n│   ├── file_939\n│   ├── file_940\n│   ├── file_941\n│   ├── file_942\n│   ├── file_943\n│   ├── file_944\n│   ├── file_945\n│   ├── file_946\n│   ├── file_947\n│   ├── file_948\n│   ├── file_949\n│   ├── file_950\n│   ├── file_951\n│   ├── file_952\n│   ├── file_953\n│   ├── file_954\n│   ├── file_955\n│   ├── file_956\n│   ├── file_957\n│   ├── file_958\n│   ├── file_959\n│   ├── file_960\n│   ├── file_961\n│   ├── file_962\n│   ├── file_963\n│   ├── file_964\n│   ├── file_965\n│   ├── file_966\n│   ├── file_967\n│   ├── file_968\n│   ├── file_969\n│   ├── file_970\n│   ├── file_971\n│   ├── file_972\n│   ├── file_973\n│   ├── file_974\n│   ├── file_975\n│   ├── file_976\n│   ├── file_977\n│   ├── file_978\n│   ├── file_979\n│   ├── file_980\n│   ├── file_981\n│   ├── file_982\n│   ├── file_983\n│   ├── file_984\n│   ├── file_985\n│   ├── file_986\n│   ├── file_987\n│   ├── file_988\n│   ├── file_989\n│   ├── file_990\n│   ├── file_991\n│   ├── file_992\n│   ├── file_993\n│   ├── file_994\n│   ├── file_995\n│   ├── file_996\n│   ├── file_997\n│   ├── file_998\n│   └── file_999\n├── group\n│   └── file\n├── icons\n│   ├── c++.cpp\n│   ├── c.c\n│   ├── css.css\n│   ├── file\n│   ├── go.go\n│   ├── html.html\n│   ├── java.java\n│   ├── javascript.js\n│   ├── man.1\n│   ├── marked.md\n│   ├── php.php\n│   ├── python.py\n│   ├── ruby.rb\n│   ├── rust.rs\n│   ├── shell.sh\n│   └── unknown.unknown\n├── perms\n│   ├── file\n│   └── file2\n├── size\n│   ├── 1B\n│   ├── 1K\n│   ├── 1M\n│   └── 1337\n├── specials\n├── symlinks\n│   ├── dir\n│   ├── file\n│   ├── ' lorem ipsum'\n│   ├── symlink -> file\n│   ├── symlink2 -> symlink\n│   ├── symlink3 -> dir\n│   └── symlink4 -> pipitek\n└── time\n    ├── 1d\n    ├── 1h\n    ├── 1m\n    ├── 1s\n    ├── 1y\n    └── epoch\n"
  },
  {
    "path": "tests/ptests/ptest_4b0ed60c44c669f.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --tree \""
  },
  {
    "path": "tests/ptests/ptest_4b30f7de50929327.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_4b30f7de50929327.stdout",
    "content": "[CWD]/tests/test_dir/git\n[CWD]/tests/test_dir/grid\n[CWD]/tests/test_dir/group\n[CWD]/tests/test_dir/icons\n[CWD]/tests/test_dir/perms\n[CWD]/tests/test_dir/size\n[CWD]/tests/test_dir/specials\n[CWD]/tests/test_dir/symlinks\n[CWD]/tests/test_dir/time\n"
  },
  {
    "path": "tests/ptests/ptest_4b30f7de50929327.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --absolute follow\""
  },
  {
    "path": "tests/ptests/ptest_4b538407f6a872e8.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_4b538407f6a872e8.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_4b538407f6a872e8.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --only-dirs \""
  },
  {
    "path": "tests/ptests/ptest_4b7165c936488151.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_4b7165c936488151.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_4b7165c936488151.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --absolute off\""
  },
  {
    "path": "tests/ptests/ptest_4e899e9b065acc8f.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_4e899e9b065acc8f.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_4e899e9b065acc8f.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --color never\""
  },
  {
    "path": "tests/ptests/ptest_4fd72fa9235ffc80.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_4fd72fa9235ffc80.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_4fd72fa9235ffc80.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -u \""
  },
  {
    "path": "tests/ptests/ptest_4ff72fb4d6bc110e.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_4ff72fb4d6bc110e.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_4ff72fb4d6bc110e.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --bytes \""
  },
  {
    "path": "tests/ptests/ptest_514bf873279385ba.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_514bf873279385ba.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_514bf873279385ba.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --git-ignore \""
  },
  {
    "path": "tests/ptests/ptest_52961e9e4d3030fc.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_52961e9e4d3030fc.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_52961e9e4d3030fc.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --git-repos \""
  },
  {
    "path": "tests/ptests/ptest_55383760e4618c41.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_55383760e4618c41.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_55383760e4618c41.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort type\""
  },
  {
    "path": "tests/ptests/ptest_56d755ade90650de.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_56d755ade90650de.stdout",
    "content": "tests/test_dir\n"
  },
  {
    "path": "tests/ptests/ptest_56d755ade90650de.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --treat-dirs-as-files \""
  },
  {
    "path": "tests/ptests/ptest_5709b91eb3610886.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_5709b91eb3610886.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_5709b91eb3610886.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --blocksize \""
  },
  {
    "path": "tests/ptests/ptest_57a5aac99c0c821c.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_57a5aac99c0c821c.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n\ntests/test_dir/git:\n001\n002\n003\n004\n005\n006\n007\n008\n009\n010\n\ntests/test_dir/git/001:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/002:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/003:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/004:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/005:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/006:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/007:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/008:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/009:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/010:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/grid:\n0001\n0002\n0003\n0004\n0005\n0006\n0007\n0008\n0009\n0010\n0011\n0012\n0013\n0014\n0015\n0016\n0017\n0018\n0019\n0020\n0021\n0022\n0023\n0024\n0025\n0026\n0027\n0028\n0029\n0030\n0031\n0032\n0033\n0034\n0035\n0036\n0037\n0038\n0039\n0040\n0041\n0042\n0043\n0044\n0045\n0046\n0047\n0048\n0049\n0050\n0051\n0052\n0053\n0054\n0055\n0056\n0057\n0058\n0059\n0060\n0061\n0062\n0063\n0064\n0065\n0066\n0067\n0068\n0069\n0070\n0071\n0072\n0073\n0074\n0075\n0076\n0077\n0078\n0079\n0080\n0081\n0082\n0083\n0084\n0085\n0086\n0087\n0088\n0089\n0090\n0091\n0092\n0093\n0094\n0095\n0096\n0097\n0098\n0099\n0100\n0101\n0102\n0103\n0104\n0105\n0106\n0107\n0108\n0109\n0110\n0111\n0112\n0113\n0114\n0115\n0116\n0117\n0118\n0119\n0120\n0121\n0122\n0123\n0124\n0125\n0126\n0127\n0128\n0129\n0130\n0131\n0132\n0133\n0134\n0135\n0136\n0137\n0138\n0139\n0140\n0141\n0142\n0143\n0144\n0145\n0146\n0147\n0148\n0149\n0150\n0151\n0152\n0153\n0154\n0155\n0156\n0157\n0158\n0159\n0160\n0161\n0162\n0163\n0164\n0165\n0166\n0167\n0168\n0169\n0170\n0171\n0172\n0173\n0174\n0175\n0176\n0177\n0178\n0179\n0180\n0181\n0182\n0183\n0184\n0185\n0186\n0187\n0188\n0189\n0190\n0191\n0192\n0193\n0194\n0195\n0196\n0197\n0198\n0199\n0200\n0201\n0202\n0203\n0204\n0205\n0206\n0207\n0208\n0209\n0210\n0211\n0212\n0213\n0214\n0215\n0216\n0217\n0218\n0219\n0220\n0221\n0222\n0223\n0224\n0225\n0226\n0227\n0228\n0229\n0230\n0231\n0232\n0233\n0234\n0235\n0236\n0237\n0238\n0239\n0240\n0241\n0242\n0243\n0244\n0245\n0246\n0247\n0248\n0249\n0250\n0251\n0252\n0253\n0254\n0255\n0256\n0257\n0258\n0259\n0260\n0261\n0262\n0263\n0264\n0265\n0266\n0267\n0268\n0269\n0270\n0271\n0272\n0273\n0274\n0275\n0276\n0277\n0278\n0279\n0280\n0281\n0282\n0283\n0284\n0285\n0286\n0287\n0288\n0289\n0290\n0291\n0292\n0293\n0294\n0295\n0296\n0297\n0298\n0299\n0300\n0301\n0302\n0303\n0304\n0305\n0306\n0307\n0308\n0309\n0310\n0311\n0312\n0313\n0314\n0315\n0316\n0317\n0318\n0319\n0320\n0321\n0322\n0323\n0324\n0325\n0326\n0327\n0328\n0329\n0330\n0331\n0332\n0333\n0334\n0335\n0336\n0337\n0338\n0339\n0340\n0341\n0342\n0343\n0344\n0345\n0346\n0347\n0348\n0349\n0350\n0351\n0352\n0353\n0354\n0355\n0356\n0357\n0358\n0359\n0360\n0361\n0362\n0363\n0364\n0365\n0366\n0367\n0368\n0369\n0370\n0371\n0372\n0373\n0374\n0375\n0376\n0377\n0378\n0379\n0380\n0381\n0382\n0383\n0384\n0385\n0386\n0387\n0388\n0389\n0390\n0391\n0392\n0393\n0394\n0395\n0396\n0397\n0398\n0399\n0400\n0401\n0402\n0403\n0404\n0405\n0406\n0407\n0408\n0409\n0410\n0411\n0412\n0413\n0414\n0415\n0416\n0417\n0418\n0419\n0420\n0421\n0422\n0423\n0424\n0425\n0426\n0427\n0428\n0429\n0430\n0431\n0432\n0433\n0434\n0435\n0436\n0437\n0438\n0439\n0440\n0441\n0442\n0443\n0444\n0445\n0446\n0447\n0448\n0449\n0450\n0451\n0452\n0453\n0454\n0455\n0456\n0457\n0458\n0459\n0460\n0461\n0462\n0463\n0464\n0465\n0466\n0467\n0468\n0469\n0470\n0471\n0472\n0473\n0474\n0475\n0476\n0477\n0478\n0479\n0480\n0481\n0482\n0483\n0484\n0485\n0486\n0487\n0488\n0489\n0490\n0491\n0492\n0493\n0494\n0495\n0496\n0497\n0498\n0499\n0500\n0501\n0502\n0503\n0504\n0505\n0506\n0507\n0508\n0509\n0510\n0511\n0512\n0513\n0514\n0515\n0516\n0517\n0518\n0519\n0520\n0521\n0522\n0523\n0524\n0525\n0526\n0527\n0528\n0529\n0530\n0531\n0532\n0533\n0534\n0535\n0536\n0537\n0538\n0539\n0540\n0541\n0542\n0543\n0544\n0545\n0546\n0547\n0548\n0549\n0550\n0551\n0552\n0553\n0554\n0555\n0556\n0557\n0558\n0559\n0560\n0561\n0562\n0563\n0564\n0565\n0566\n0567\n0568\n0569\n0570\n0571\n0572\n0573\n0574\n0575\n0576\n0577\n0578\n0579\n0580\n0581\n0582\n0583\n0584\n0585\n0586\n0587\n0588\n0589\n0590\n0591\n0592\n0593\n0594\n0595\n0596\n0597\n0598\n0599\n0600\n0601\n0602\n0603\n0604\n0605\n0606\n0607\n0608\n0609\n0610\n0611\n0612\n0613\n0614\n0615\n0616\n0617\n0618\n0619\n0620\n0621\n0622\n0623\n0624\n0625\n0626\n0627\n0628\n0629\n0630\n0631\n0632\n0633\n0634\n0635\n0636\n0637\n0638\n0639\n0640\n0641\n0642\n0643\n0644\n0645\n0646\n0647\n0648\n0649\n0650\n0651\n0652\n0653\n0654\n0655\n0656\n0657\n0658\n0659\n0660\n0661\n0662\n0663\n0664\n0665\n0666\n0667\n0668\n0669\n0670\n0671\n0672\n0673\n0674\n0675\n0676\n0677\n0678\n0679\n0680\n0681\n0682\n0683\n0684\n0685\n0686\n0687\n0688\n0689\n0690\n0691\n0692\n0693\n0694\n0695\n0696\n0697\n0698\n0699\n0700\n0701\n0702\n0703\n0704\n0705\n0706\n0707\n0708\n0709\n0710\n0711\n0712\n0713\n0714\n0715\n0716\n0717\n0718\n0719\n0720\n0721\n0722\n0723\n0724\n0725\n0726\n0727\n0728\n0729\n0730\n0731\n0732\n0733\n0734\n0735\n0736\n0737\n0738\n0739\n0740\n0741\n0742\n0743\n0744\n0745\n0746\n0747\n0748\n0749\n0750\n0751\n0752\n0753\n0754\n0755\n0756\n0757\n0758\n0759\n0760\n0761\n0762\n0763\n0764\n0765\n0766\n0767\n0768\n0769\n0770\n0771\n0772\n0773\n0774\n0775\n0776\n0777\n0778\n0779\n0780\n0781\n0782\n0783\n0784\n0785\n0786\n0787\n0788\n0789\n0790\n0791\n0792\n0793\n0794\n0795\n0796\n0797\n0798\n0799\n0800\n0801\n0802\n0803\n0804\n0805\n0806\n0807\n0808\n0809\n0810\n0811\n0812\n0813\n0814\n0815\n0816\n0817\n0818\n0819\n0820\n0821\n0822\n0823\n0824\n0825\n0826\n0827\n0828\n0829\n0830\n0831\n0832\n0833\n0834\n0835\n0836\n0837\n0838\n0839\n0840\n0841\n0842\n0843\n0844\n0845\n0846\n0847\n0848\n0849\n0850\n0851\n0852\n0853\n0854\n0855\n0856\n0857\n0858\n0859\n0860\n0861\n0862\n0863\n0864\n0865\n0866\n0867\n0868\n0869\n0870\n0871\n0872\n0873\n0874\n0875\n0876\n0877\n0878\n0879\n0880\n0881\n0882\n0883\n0884\n0885\n0886\n0887\n0888\n0889\n0890\n0891\n0892\n0893\n0894\n0895\n0896\n0897\n0898\n0899\n0900\n0901\n0902\n0903\n0904\n0905\n0906\n0907\n0908\n0909\n0910\n0911\n0912\n0913\n0914\n0915\n0916\n0917\n0918\n0919\n0920\n0921\n0922\n0923\n0924\n0925\n0926\n0927\n0928\n0929\n0930\n0931\n0932\n0933\n0934\n0935\n0936\n0937\n0938\n0939\n0940\n0941\n0942\n0943\n0944\n0945\n0946\n0947\n0948\n0949\n0950\n0951\n0952\n0953\n0954\n0955\n0956\n0957\n0958\n0959\n0960\n0961\n0962\n0963\n0964\n0965\n0966\n0967\n0968\n0969\n0970\n0971\n0972\n0973\n0974\n0975\n0976\n0977\n0978\n0979\n0980\n0981\n0982\n0983\n0984\n0985\n0986\n0987\n0988\n0989\n0990\n0991\n0992\n0993\n0994\n0995\n0996\n0997\n0998\n0999\n1000\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\nfile_010\nfile_011\nfile_012\nfile_013\nfile_014\nfile_015\nfile_016\nfile_017\nfile_018\nfile_019\nfile_020\nfile_021\nfile_022\nfile_023\nfile_024\nfile_025\nfile_026\nfile_027\nfile_028\nfile_029\nfile_030\nfile_031\nfile_032\nfile_033\nfile_034\nfile_035\nfile_036\nfile_037\nfile_038\nfile_039\nfile_040\nfile_041\nfile_042\nfile_043\nfile_044\nfile_045\nfile_046\nfile_047\nfile_048\nfile_049\nfile_050\nfile_051\nfile_052\nfile_053\nfile_054\nfile_055\nfile_056\nfile_057\nfile_058\nfile_059\nfile_060\nfile_061\nfile_062\nfile_063\nfile_064\nfile_065\nfile_066\nfile_067\nfile_068\nfile_069\nfile_070\nfile_071\nfile_072\nfile_073\nfile_074\nfile_075\nfile_076\nfile_077\nfile_078\nfile_079\nfile_080\nfile_081\nfile_082\nfile_083\nfile_084\nfile_085\nfile_086\nfile_087\nfile_088\nfile_089\nfile_090\nfile_091\nfile_092\nfile_093\nfile_094\nfile_095\nfile_096\nfile_097\nfile_098\nfile_099\nfile_100\nfile_101\nfile_102\nfile_103\nfile_104\nfile_105\nfile_106\nfile_107\nfile_108\nfile_109\nfile_110\nfile_111\nfile_112\nfile_113\nfile_114\nfile_115\nfile_116\nfile_117\nfile_118\nfile_119\nfile_120\nfile_121\nfile_122\nfile_123\nfile_124\nfile_125\nfile_126\nfile_127\nfile_128\nfile_129\nfile_130\nfile_131\nfile_132\nfile_133\nfile_134\nfile_135\nfile_136\nfile_137\nfile_138\nfile_139\nfile_140\nfile_141\nfile_142\nfile_143\nfile_144\nfile_145\nfile_146\nfile_147\nfile_148\nfile_149\nfile_150\nfile_151\nfile_152\nfile_153\nfile_154\nfile_155\nfile_156\nfile_157\nfile_158\nfile_159\nfile_160\nfile_161\nfile_162\nfile_163\nfile_164\nfile_165\nfile_166\nfile_167\nfile_168\nfile_169\nfile_170\nfile_171\nfile_172\nfile_173\nfile_174\nfile_175\nfile_176\nfile_177\nfile_178\nfile_179\nfile_180\nfile_181\nfile_182\nfile_183\nfile_184\nfile_185\nfile_186\nfile_187\nfile_188\nfile_189\nfile_190\nfile_191\nfile_192\nfile_193\nfile_194\nfile_195\nfile_196\nfile_197\nfile_198\nfile_199\nfile_200\nfile_201\nfile_202\nfile_203\nfile_204\nfile_205\nfile_206\nfile_207\nfile_208\nfile_209\nfile_210\nfile_211\nfile_212\nfile_213\nfile_214\nfile_215\nfile_216\nfile_217\nfile_218\nfile_219\nfile_220\nfile_221\nfile_222\nfile_223\nfile_224\nfile_225\nfile_226\nfile_227\nfile_228\nfile_229\nfile_230\nfile_231\nfile_232\nfile_233\nfile_234\nfile_235\nfile_236\nfile_237\nfile_238\nfile_239\nfile_240\nfile_241\nfile_242\nfile_243\nfile_244\nfile_245\nfile_246\nfile_247\nfile_248\nfile_249\nfile_250\nfile_251\nfile_252\nfile_253\nfile_254\nfile_255\nfile_256\nfile_257\nfile_258\nfile_259\nfile_260\nfile_261\nfile_262\nfile_263\nfile_264\nfile_265\nfile_266\nfile_267\nfile_268\nfile_269\nfile_270\nfile_271\nfile_272\nfile_273\nfile_274\nfile_275\nfile_276\nfile_277\nfile_278\nfile_279\nfile_280\nfile_281\nfile_282\nfile_283\nfile_284\nfile_285\nfile_286\nfile_287\nfile_288\nfile_289\nfile_290\nfile_291\nfile_292\nfile_293\nfile_294\nfile_295\nfile_296\nfile_297\nfile_298\nfile_299\nfile_300\nfile_301\nfile_302\nfile_303\nfile_304\nfile_305\nfile_306\nfile_307\nfile_308\nfile_309\nfile_310\nfile_311\nfile_312\nfile_313\nfile_314\nfile_315\nfile_316\nfile_317\nfile_318\nfile_319\nfile_320\nfile_321\nfile_322\nfile_323\nfile_324\nfile_325\nfile_326\nfile_327\nfile_328\nfile_329\nfile_330\nfile_331\nfile_332\nfile_333\nfile_334\nfile_335\nfile_336\nfile_337\nfile_338\nfile_339\nfile_340\nfile_341\nfile_342\nfile_343\nfile_344\nfile_345\nfile_346\nfile_347\nfile_348\nfile_349\nfile_350\nfile_351\nfile_352\nfile_353\nfile_354\nfile_355\nfile_356\nfile_357\nfile_358\nfile_359\nfile_360\nfile_361\nfile_362\nfile_363\nfile_364\nfile_365\nfile_366\nfile_367\nfile_368\nfile_369\nfile_370\nfile_371\nfile_372\nfile_373\nfile_374\nfile_375\nfile_376\nfile_377\nfile_378\nfile_379\nfile_380\nfile_381\nfile_382\nfile_383\nfile_384\nfile_385\nfile_386\nfile_387\nfile_388\nfile_389\nfile_390\nfile_391\nfile_392\nfile_393\nfile_394\nfile_395\nfile_396\nfile_397\nfile_398\nfile_399\nfile_400\nfile_401\nfile_402\nfile_403\nfile_404\nfile_405\nfile_406\nfile_407\nfile_408\nfile_409\nfile_410\nfile_411\nfile_412\nfile_413\nfile_414\nfile_415\nfile_416\nfile_417\nfile_418\nfile_419\nfile_420\nfile_421\nfile_422\nfile_423\nfile_424\nfile_425\nfile_426\nfile_427\nfile_428\nfile_429\nfile_430\nfile_431\nfile_432\nfile_433\nfile_434\nfile_435\nfile_436\nfile_437\nfile_438\nfile_439\nfile_440\nfile_441\nfile_442\nfile_443\nfile_444\nfile_445\nfile_446\nfile_447\nfile_448\nfile_449\nfile_450\nfile_451\nfile_452\nfile_453\nfile_454\nfile_455\nfile_456\nfile_457\nfile_458\nfile_459\nfile_460\nfile_461\nfile_462\nfile_463\nfile_464\nfile_465\nfile_466\nfile_467\nfile_468\nfile_469\nfile_470\nfile_471\nfile_472\nfile_473\nfile_474\nfile_475\nfile_476\nfile_477\nfile_478\nfile_479\nfile_480\nfile_481\nfile_482\nfile_483\nfile_484\nfile_485\nfile_486\nfile_487\nfile_488\nfile_489\nfile_490\nfile_491\nfile_492\nfile_493\nfile_494\nfile_495\nfile_496\nfile_497\nfile_498\nfile_499\nfile_500\nfile_501\nfile_502\nfile_503\nfile_504\nfile_505\nfile_506\nfile_507\nfile_508\nfile_509\nfile_510\nfile_511\nfile_512\nfile_513\nfile_514\nfile_515\nfile_516\nfile_517\nfile_518\nfile_519\nfile_520\nfile_521\nfile_522\nfile_523\nfile_524\nfile_525\nfile_526\nfile_527\nfile_528\nfile_529\nfile_530\nfile_531\nfile_532\nfile_533\nfile_534\nfile_535\nfile_536\nfile_537\nfile_538\nfile_539\nfile_540\nfile_541\nfile_542\nfile_543\nfile_544\nfile_545\nfile_546\nfile_547\nfile_548\nfile_549\nfile_550\nfile_551\nfile_552\nfile_553\nfile_554\nfile_555\nfile_556\nfile_557\nfile_558\nfile_559\nfile_560\nfile_561\nfile_562\nfile_563\nfile_564\nfile_565\nfile_566\nfile_567\nfile_568\nfile_569\nfile_570\nfile_571\nfile_572\nfile_573\nfile_574\nfile_575\nfile_576\nfile_577\nfile_578\nfile_579\nfile_580\nfile_581\nfile_582\nfile_583\nfile_584\nfile_585\nfile_586\nfile_587\nfile_588\nfile_589\nfile_590\nfile_591\nfile_592\nfile_593\nfile_594\nfile_595\nfile_596\nfile_597\nfile_598\nfile_599\nfile_600\nfile_601\nfile_602\nfile_603\nfile_604\nfile_605\nfile_606\nfile_607\nfile_608\nfile_609\nfile_610\nfile_611\nfile_612\nfile_613\nfile_614\nfile_615\nfile_616\nfile_617\nfile_618\nfile_619\nfile_620\nfile_621\nfile_622\nfile_623\nfile_624\nfile_625\nfile_626\nfile_627\nfile_628\nfile_629\nfile_630\nfile_631\nfile_632\nfile_633\nfile_634\nfile_635\nfile_636\nfile_637\nfile_638\nfile_639\nfile_640\nfile_641\nfile_642\nfile_643\nfile_644\nfile_645\nfile_646\nfile_647\nfile_648\nfile_649\nfile_650\nfile_651\nfile_652\nfile_653\nfile_654\nfile_655\nfile_656\nfile_657\nfile_658\nfile_659\nfile_660\nfile_661\nfile_662\nfile_663\nfile_664\nfile_665\nfile_666\nfile_667\nfile_668\nfile_669\nfile_670\nfile_671\nfile_672\nfile_673\nfile_674\nfile_675\nfile_676\nfile_677\nfile_678\nfile_679\nfile_680\nfile_681\nfile_682\nfile_683\nfile_684\nfile_685\nfile_686\nfile_687\nfile_688\nfile_689\nfile_690\nfile_691\nfile_692\nfile_693\nfile_694\nfile_695\nfile_696\nfile_697\nfile_698\nfile_699\nfile_700\nfile_701\nfile_702\nfile_703\nfile_704\nfile_705\nfile_706\nfile_707\nfile_708\nfile_709\nfile_710\nfile_711\nfile_712\nfile_713\nfile_714\nfile_715\nfile_716\nfile_717\nfile_718\nfile_719\nfile_720\nfile_721\nfile_722\nfile_723\nfile_724\nfile_725\nfile_726\nfile_727\nfile_728\nfile_729\nfile_730\nfile_731\nfile_732\nfile_733\nfile_734\nfile_735\nfile_736\nfile_737\nfile_738\nfile_739\nfile_740\nfile_741\nfile_742\nfile_743\nfile_744\nfile_745\nfile_746\nfile_747\nfile_748\nfile_749\nfile_750\nfile_751\nfile_752\nfile_753\nfile_754\nfile_755\nfile_756\nfile_757\nfile_758\nfile_759\nfile_760\nfile_761\nfile_762\nfile_763\nfile_764\nfile_765\nfile_766\nfile_767\nfile_768\nfile_769\nfile_770\nfile_771\nfile_772\nfile_773\nfile_774\nfile_775\nfile_776\nfile_777\nfile_778\nfile_779\nfile_780\nfile_781\nfile_782\nfile_783\nfile_784\nfile_785\nfile_786\nfile_787\nfile_788\nfile_789\nfile_790\nfile_791\nfile_792\nfile_793\nfile_794\nfile_795\nfile_796\nfile_797\nfile_798\nfile_799\nfile_800\nfile_801\nfile_802\nfile_803\nfile_804\nfile_805\nfile_806\nfile_807\nfile_808\nfile_809\nfile_810\nfile_811\nfile_812\nfile_813\nfile_814\nfile_815\nfile_816\nfile_817\nfile_818\nfile_819\nfile_820\nfile_821\nfile_822\nfile_823\nfile_824\nfile_825\nfile_826\nfile_827\nfile_828\nfile_829\nfile_830\nfile_831\nfile_832\nfile_833\nfile_834\nfile_835\nfile_836\nfile_837\nfile_838\nfile_839\nfile_840\nfile_841\nfile_842\nfile_843\nfile_844\nfile_845\nfile_846\nfile_847\nfile_848\nfile_849\nfile_850\nfile_851\nfile_852\nfile_853\nfile_854\nfile_855\nfile_856\nfile_857\nfile_858\nfile_859\nfile_860\nfile_861\nfile_862\nfile_863\nfile_864\nfile_865\nfile_866\nfile_867\nfile_868\nfile_869\nfile_870\nfile_871\nfile_872\nfile_873\nfile_874\nfile_875\nfile_876\nfile_877\nfile_878\nfile_879\nfile_880\nfile_881\nfile_882\nfile_883\nfile_884\nfile_885\nfile_886\nfile_887\nfile_888\nfile_889\nfile_890\nfile_891\nfile_892\nfile_893\nfile_894\nfile_895\nfile_896\nfile_897\nfile_898\nfile_899\nfile_900\nfile_901\nfile_902\nfile_903\nfile_904\nfile_905\nfile_906\nfile_907\nfile_908\nfile_909\nfile_910\nfile_911\nfile_912\nfile_913\nfile_914\nfile_915\nfile_916\nfile_917\nfile_918\nfile_919\nfile_920\nfile_921\nfile_922\nfile_923\nfile_924\nfile_925\nfile_926\nfile_927\nfile_928\nfile_929\nfile_930\nfile_931\nfile_932\nfile_933\nfile_934\nfile_935\nfile_936\nfile_937\nfile_938\nfile_939\nfile_940\nfile_941\nfile_942\nfile_943\nfile_944\nfile_945\nfile_946\nfile_947\nfile_948\nfile_949\nfile_950\nfile_951\nfile_952\nfile_953\nfile_954\nfile_955\nfile_956\nfile_957\nfile_958\nfile_959\nfile_960\nfile_961\nfile_962\nfile_963\nfile_964\nfile_965\nfile_966\nfile_967\nfile_968\nfile_969\nfile_970\nfile_971\nfile_972\nfile_973\nfile_974\nfile_975\nfile_976\nfile_977\nfile_978\nfile_979\nfile_980\nfile_981\nfile_982\nfile_983\nfile_984\nfile_985\nfile_986\nfile_987\nfile_988\nfile_989\nfile_990\nfile_991\nfile_992\nfile_993\nfile_994\nfile_995\nfile_996\nfile_997\nfile_998\nfile_999\n\ntests/test_dir/grid/0001:\n\ntests/test_dir/grid/0002:\n\ntests/test_dir/grid/0003:\n\ntests/test_dir/grid/0004:\n\ntests/test_dir/grid/0005:\n\ntests/test_dir/grid/0006:\n\ntests/test_dir/grid/0007:\n\ntests/test_dir/grid/0008:\n\ntests/test_dir/grid/0009:\n\ntests/test_dir/grid/0010:\n\ntests/test_dir/grid/0011:\n\ntests/test_dir/grid/0012:\n\ntests/test_dir/grid/0013:\n\ntests/test_dir/grid/0014:\n\ntests/test_dir/grid/0015:\n\ntests/test_dir/grid/0016:\n\ntests/test_dir/grid/0017:\n\ntests/test_dir/grid/0018:\n\ntests/test_dir/grid/0019:\n\ntests/test_dir/grid/0020:\n\ntests/test_dir/grid/0021:\n\ntests/test_dir/grid/0022:\n\ntests/test_dir/grid/0023:\n\ntests/test_dir/grid/0024:\n\ntests/test_dir/grid/0025:\n\ntests/test_dir/grid/0026:\n\ntests/test_dir/grid/0027:\n\ntests/test_dir/grid/0028:\n\ntests/test_dir/grid/0029:\n\ntests/test_dir/grid/0030:\n\ntests/test_dir/grid/0031:\n\ntests/test_dir/grid/0032:\n\ntests/test_dir/grid/0033:\n\ntests/test_dir/grid/0034:\n\ntests/test_dir/grid/0035:\n\ntests/test_dir/grid/0036:\n\ntests/test_dir/grid/0037:\n\ntests/test_dir/grid/0038:\n\ntests/test_dir/grid/0039:\n\ntests/test_dir/grid/0040:\n\ntests/test_dir/grid/0041:\n\ntests/test_dir/grid/0042:\n\ntests/test_dir/grid/0043:\n\ntests/test_dir/grid/0044:\n\ntests/test_dir/grid/0045:\n\ntests/test_dir/grid/0046:\n\ntests/test_dir/grid/0047:\n\ntests/test_dir/grid/0048:\n\ntests/test_dir/grid/0049:\n\ntests/test_dir/grid/0050:\n\ntests/test_dir/grid/0051:\n\ntests/test_dir/grid/0052:\n\ntests/test_dir/grid/0053:\n\ntests/test_dir/grid/0054:\n\ntests/test_dir/grid/0055:\n\ntests/test_dir/grid/0056:\n\ntests/test_dir/grid/0057:\n\ntests/test_dir/grid/0058:\n\ntests/test_dir/grid/0059:\n\ntests/test_dir/grid/0060:\n\ntests/test_dir/grid/0061:\n\ntests/test_dir/grid/0062:\n\ntests/test_dir/grid/0063:\n\ntests/test_dir/grid/0064:\n\ntests/test_dir/grid/0065:\n\ntests/test_dir/grid/0066:\n\ntests/test_dir/grid/0067:\n\ntests/test_dir/grid/0068:\n\ntests/test_dir/grid/0069:\n\ntests/test_dir/grid/0070:\n\ntests/test_dir/grid/0071:\n\ntests/test_dir/grid/0072:\n\ntests/test_dir/grid/0073:\n\ntests/test_dir/grid/0074:\n\ntests/test_dir/grid/0075:\n\ntests/test_dir/grid/0076:\n\ntests/test_dir/grid/0077:\n\ntests/test_dir/grid/0078:\n\ntests/test_dir/grid/0079:\n\ntests/test_dir/grid/0080:\n\ntests/test_dir/grid/0081:\n\ntests/test_dir/grid/0082:\n\ntests/test_dir/grid/0083:\n\ntests/test_dir/grid/0084:\n\ntests/test_dir/grid/0085:\n\ntests/test_dir/grid/0086:\n\ntests/test_dir/grid/0087:\n\ntests/test_dir/grid/0088:\n\ntests/test_dir/grid/0089:\n\ntests/test_dir/grid/0090:\n\ntests/test_dir/grid/0091:\n\ntests/test_dir/grid/0092:\n\ntests/test_dir/grid/0093:\n\ntests/test_dir/grid/0094:\n\ntests/test_dir/grid/0095:\n\ntests/test_dir/grid/0096:\n\ntests/test_dir/grid/0097:\n\ntests/test_dir/grid/0098:\n\ntests/test_dir/grid/0099:\n\ntests/test_dir/grid/0100:\n\ntests/test_dir/grid/0101:\n\ntests/test_dir/grid/0102:\n\ntests/test_dir/grid/0103:\n\ntests/test_dir/grid/0104:\n\ntests/test_dir/grid/0105:\n\ntests/test_dir/grid/0106:\n\ntests/test_dir/grid/0107:\n\ntests/test_dir/grid/0108:\n\ntests/test_dir/grid/0109:\n\ntests/test_dir/grid/0110:\n\ntests/test_dir/grid/0111:\n\ntests/test_dir/grid/0112:\n\ntests/test_dir/grid/0113:\n\ntests/test_dir/grid/0114:\n\ntests/test_dir/grid/0115:\n\ntests/test_dir/grid/0116:\n\ntests/test_dir/grid/0117:\n\ntests/test_dir/grid/0118:\n\ntests/test_dir/grid/0119:\n\ntests/test_dir/grid/0120:\n\ntests/test_dir/grid/0121:\n\ntests/test_dir/grid/0122:\n\ntests/test_dir/grid/0123:\n\ntests/test_dir/grid/0124:\n\ntests/test_dir/grid/0125:\n\ntests/test_dir/grid/0126:\n\ntests/test_dir/grid/0127:\n\ntests/test_dir/grid/0128:\n\ntests/test_dir/grid/0129:\n\ntests/test_dir/grid/0130:\n\ntests/test_dir/grid/0131:\n\ntests/test_dir/grid/0132:\n\ntests/test_dir/grid/0133:\n\ntests/test_dir/grid/0134:\n\ntests/test_dir/grid/0135:\n\ntests/test_dir/grid/0136:\n\ntests/test_dir/grid/0137:\n\ntests/test_dir/grid/0138:\n\ntests/test_dir/grid/0139:\n\ntests/test_dir/grid/0140:\n\ntests/test_dir/grid/0141:\n\ntests/test_dir/grid/0142:\n\ntests/test_dir/grid/0143:\n\ntests/test_dir/grid/0144:\n\ntests/test_dir/grid/0145:\n\ntests/test_dir/grid/0146:\n\ntests/test_dir/grid/0147:\n\ntests/test_dir/grid/0148:\n\ntests/test_dir/grid/0149:\n\ntests/test_dir/grid/0150:\n\ntests/test_dir/grid/0151:\n\ntests/test_dir/grid/0152:\n\ntests/test_dir/grid/0153:\n\ntests/test_dir/grid/0154:\n\ntests/test_dir/grid/0155:\n\ntests/test_dir/grid/0156:\n\ntests/test_dir/grid/0157:\n\ntests/test_dir/grid/0158:\n\ntests/test_dir/grid/0159:\n\ntests/test_dir/grid/0160:\n\ntests/test_dir/grid/0161:\n\ntests/test_dir/grid/0162:\n\ntests/test_dir/grid/0163:\n\ntests/test_dir/grid/0164:\n\ntests/test_dir/grid/0165:\n\ntests/test_dir/grid/0166:\n\ntests/test_dir/grid/0167:\n\ntests/test_dir/grid/0168:\n\ntests/test_dir/grid/0169:\n\ntests/test_dir/grid/0170:\n\ntests/test_dir/grid/0171:\n\ntests/test_dir/grid/0172:\n\ntests/test_dir/grid/0173:\n\ntests/test_dir/grid/0174:\n\ntests/test_dir/grid/0175:\n\ntests/test_dir/grid/0176:\n\ntests/test_dir/grid/0177:\n\ntests/test_dir/grid/0178:\n\ntests/test_dir/grid/0179:\n\ntests/test_dir/grid/0180:\n\ntests/test_dir/grid/0181:\n\ntests/test_dir/grid/0182:\n\ntests/test_dir/grid/0183:\n\ntests/test_dir/grid/0184:\n\ntests/test_dir/grid/0185:\n\ntests/test_dir/grid/0186:\n\ntests/test_dir/grid/0187:\n\ntests/test_dir/grid/0188:\n\ntests/test_dir/grid/0189:\n\ntests/test_dir/grid/0190:\n\ntests/test_dir/grid/0191:\n\ntests/test_dir/grid/0192:\n\ntests/test_dir/grid/0193:\n\ntests/test_dir/grid/0194:\n\ntests/test_dir/grid/0195:\n\ntests/test_dir/grid/0196:\n\ntests/test_dir/grid/0197:\n\ntests/test_dir/grid/0198:\n\ntests/test_dir/grid/0199:\n\ntests/test_dir/grid/0200:\n\ntests/test_dir/grid/0201:\n\ntests/test_dir/grid/0202:\n\ntests/test_dir/grid/0203:\n\ntests/test_dir/grid/0204:\n\ntests/test_dir/grid/0205:\n\ntests/test_dir/grid/0206:\n\ntests/test_dir/grid/0207:\n\ntests/test_dir/grid/0208:\n\ntests/test_dir/grid/0209:\n\ntests/test_dir/grid/0210:\n\ntests/test_dir/grid/0211:\n\ntests/test_dir/grid/0212:\n\ntests/test_dir/grid/0213:\n\ntests/test_dir/grid/0214:\n\ntests/test_dir/grid/0215:\n\ntests/test_dir/grid/0216:\n\ntests/test_dir/grid/0217:\n\ntests/test_dir/grid/0218:\n\ntests/test_dir/grid/0219:\n\ntests/test_dir/grid/0220:\n\ntests/test_dir/grid/0221:\n\ntests/test_dir/grid/0222:\n\ntests/test_dir/grid/0223:\n\ntests/test_dir/grid/0224:\n\ntests/test_dir/grid/0225:\n\ntests/test_dir/grid/0226:\n\ntests/test_dir/grid/0227:\n\ntests/test_dir/grid/0228:\n\ntests/test_dir/grid/0229:\n\ntests/test_dir/grid/0230:\n\ntests/test_dir/grid/0231:\n\ntests/test_dir/grid/0232:\n\ntests/test_dir/grid/0233:\n\ntests/test_dir/grid/0234:\n\ntests/test_dir/grid/0235:\n\ntests/test_dir/grid/0236:\n\ntests/test_dir/grid/0237:\n\ntests/test_dir/grid/0238:\n\ntests/test_dir/grid/0239:\n\ntests/test_dir/grid/0240:\n\ntests/test_dir/grid/0241:\n\ntests/test_dir/grid/0242:\n\ntests/test_dir/grid/0243:\n\ntests/test_dir/grid/0244:\n\ntests/test_dir/grid/0245:\n\ntests/test_dir/grid/0246:\n\ntests/test_dir/grid/0247:\n\ntests/test_dir/grid/0248:\n\ntests/test_dir/grid/0249:\n\ntests/test_dir/grid/0250:\n\ntests/test_dir/grid/0251:\n\ntests/test_dir/grid/0252:\n\ntests/test_dir/grid/0253:\n\ntests/test_dir/grid/0254:\n\ntests/test_dir/grid/0255:\n\ntests/test_dir/grid/0256:\n\ntests/test_dir/grid/0257:\n\ntests/test_dir/grid/0258:\n\ntests/test_dir/grid/0259:\n\ntests/test_dir/grid/0260:\n\ntests/test_dir/grid/0261:\n\ntests/test_dir/grid/0262:\n\ntests/test_dir/grid/0263:\n\ntests/test_dir/grid/0264:\n\ntests/test_dir/grid/0265:\n\ntests/test_dir/grid/0266:\n\ntests/test_dir/grid/0267:\n\ntests/test_dir/grid/0268:\n\ntests/test_dir/grid/0269:\n\ntests/test_dir/grid/0270:\n\ntests/test_dir/grid/0271:\n\ntests/test_dir/grid/0272:\n\ntests/test_dir/grid/0273:\n\ntests/test_dir/grid/0274:\n\ntests/test_dir/grid/0275:\n\ntests/test_dir/grid/0276:\n\ntests/test_dir/grid/0277:\n\ntests/test_dir/grid/0278:\n\ntests/test_dir/grid/0279:\n\ntests/test_dir/grid/0280:\n\ntests/test_dir/grid/0281:\n\ntests/test_dir/grid/0282:\n\ntests/test_dir/grid/0283:\n\ntests/test_dir/grid/0284:\n\ntests/test_dir/grid/0285:\n\ntests/test_dir/grid/0286:\n\ntests/test_dir/grid/0287:\n\ntests/test_dir/grid/0288:\n\ntests/test_dir/grid/0289:\n\ntests/test_dir/grid/0290:\n\ntests/test_dir/grid/0291:\n\ntests/test_dir/grid/0292:\n\ntests/test_dir/grid/0293:\n\ntests/test_dir/grid/0294:\n\ntests/test_dir/grid/0295:\n\ntests/test_dir/grid/0296:\n\ntests/test_dir/grid/0297:\n\ntests/test_dir/grid/0298:\n\ntests/test_dir/grid/0299:\n\ntests/test_dir/grid/0300:\n\ntests/test_dir/grid/0301:\n\ntests/test_dir/grid/0302:\n\ntests/test_dir/grid/0303:\n\ntests/test_dir/grid/0304:\n\ntests/test_dir/grid/0305:\n\ntests/test_dir/grid/0306:\n\ntests/test_dir/grid/0307:\n\ntests/test_dir/grid/0308:\n\ntests/test_dir/grid/0309:\n\ntests/test_dir/grid/0310:\n\ntests/test_dir/grid/0311:\n\ntests/test_dir/grid/0312:\n\ntests/test_dir/grid/0313:\n\ntests/test_dir/grid/0314:\n\ntests/test_dir/grid/0315:\n\ntests/test_dir/grid/0316:\n\ntests/test_dir/grid/0317:\n\ntests/test_dir/grid/0318:\n\ntests/test_dir/grid/0319:\n\ntests/test_dir/grid/0320:\n\ntests/test_dir/grid/0321:\n\ntests/test_dir/grid/0322:\n\ntests/test_dir/grid/0323:\n\ntests/test_dir/grid/0324:\n\ntests/test_dir/grid/0325:\n\ntests/test_dir/grid/0326:\n\ntests/test_dir/grid/0327:\n\ntests/test_dir/grid/0328:\n\ntests/test_dir/grid/0329:\n\ntests/test_dir/grid/0330:\n\ntests/test_dir/grid/0331:\n\ntests/test_dir/grid/0332:\n\ntests/test_dir/grid/0333:\n\ntests/test_dir/grid/0334:\n\ntests/test_dir/grid/0335:\n\ntests/test_dir/grid/0336:\n\ntests/test_dir/grid/0337:\n\ntests/test_dir/grid/0338:\n\ntests/test_dir/grid/0339:\n\ntests/test_dir/grid/0340:\n\ntests/test_dir/grid/0341:\n\ntests/test_dir/grid/0342:\n\ntests/test_dir/grid/0343:\n\ntests/test_dir/grid/0344:\n\ntests/test_dir/grid/0345:\n\ntests/test_dir/grid/0346:\n\ntests/test_dir/grid/0347:\n\ntests/test_dir/grid/0348:\n\ntests/test_dir/grid/0349:\n\ntests/test_dir/grid/0350:\n\ntests/test_dir/grid/0351:\n\ntests/test_dir/grid/0352:\n\ntests/test_dir/grid/0353:\n\ntests/test_dir/grid/0354:\n\ntests/test_dir/grid/0355:\n\ntests/test_dir/grid/0356:\n\ntests/test_dir/grid/0357:\n\ntests/test_dir/grid/0358:\n\ntests/test_dir/grid/0359:\n\ntests/test_dir/grid/0360:\n\ntests/test_dir/grid/0361:\n\ntests/test_dir/grid/0362:\n\ntests/test_dir/grid/0363:\n\ntests/test_dir/grid/0364:\n\ntests/test_dir/grid/0365:\n\ntests/test_dir/grid/0366:\n\ntests/test_dir/grid/0367:\n\ntests/test_dir/grid/0368:\n\ntests/test_dir/grid/0369:\n\ntests/test_dir/grid/0370:\n\ntests/test_dir/grid/0371:\n\ntests/test_dir/grid/0372:\n\ntests/test_dir/grid/0373:\n\ntests/test_dir/grid/0374:\n\ntests/test_dir/grid/0375:\n\ntests/test_dir/grid/0376:\n\ntests/test_dir/grid/0377:\n\ntests/test_dir/grid/0378:\n\ntests/test_dir/grid/0379:\n\ntests/test_dir/grid/0380:\n\ntests/test_dir/grid/0381:\n\ntests/test_dir/grid/0382:\n\ntests/test_dir/grid/0383:\n\ntests/test_dir/grid/0384:\n\ntests/test_dir/grid/0385:\n\ntests/test_dir/grid/0386:\n\ntests/test_dir/grid/0387:\n\ntests/test_dir/grid/0388:\n\ntests/test_dir/grid/0389:\n\ntests/test_dir/grid/0390:\n\ntests/test_dir/grid/0391:\n\ntests/test_dir/grid/0392:\n\ntests/test_dir/grid/0393:\n\ntests/test_dir/grid/0394:\n\ntests/test_dir/grid/0395:\n\ntests/test_dir/grid/0396:\n\ntests/test_dir/grid/0397:\n\ntests/test_dir/grid/0398:\n\ntests/test_dir/grid/0399:\n\ntests/test_dir/grid/0400:\n\ntests/test_dir/grid/0401:\n\ntests/test_dir/grid/0402:\n\ntests/test_dir/grid/0403:\n\ntests/test_dir/grid/0404:\n\ntests/test_dir/grid/0405:\n\ntests/test_dir/grid/0406:\n\ntests/test_dir/grid/0407:\n\ntests/test_dir/grid/0408:\n\ntests/test_dir/grid/0409:\n\ntests/test_dir/grid/0410:\n\ntests/test_dir/grid/0411:\n\ntests/test_dir/grid/0412:\n\ntests/test_dir/grid/0413:\n\ntests/test_dir/grid/0414:\n\ntests/test_dir/grid/0415:\n\ntests/test_dir/grid/0416:\n\ntests/test_dir/grid/0417:\n\ntests/test_dir/grid/0418:\n\ntests/test_dir/grid/0419:\n\ntests/test_dir/grid/0420:\n\ntests/test_dir/grid/0421:\n\ntests/test_dir/grid/0422:\n\ntests/test_dir/grid/0423:\n\ntests/test_dir/grid/0424:\n\ntests/test_dir/grid/0425:\n\ntests/test_dir/grid/0426:\n\ntests/test_dir/grid/0427:\n\ntests/test_dir/grid/0428:\n\ntests/test_dir/grid/0429:\n\ntests/test_dir/grid/0430:\n\ntests/test_dir/grid/0431:\n\ntests/test_dir/grid/0432:\n\ntests/test_dir/grid/0433:\n\ntests/test_dir/grid/0434:\n\ntests/test_dir/grid/0435:\n\ntests/test_dir/grid/0436:\n\ntests/test_dir/grid/0437:\n\ntests/test_dir/grid/0438:\n\ntests/test_dir/grid/0439:\n\ntests/test_dir/grid/0440:\n\ntests/test_dir/grid/0441:\n\ntests/test_dir/grid/0442:\n\ntests/test_dir/grid/0443:\n\ntests/test_dir/grid/0444:\n\ntests/test_dir/grid/0445:\n\ntests/test_dir/grid/0446:\n\ntests/test_dir/grid/0447:\n\ntests/test_dir/grid/0448:\n\ntests/test_dir/grid/0449:\n\ntests/test_dir/grid/0450:\n\ntests/test_dir/grid/0451:\n\ntests/test_dir/grid/0452:\n\ntests/test_dir/grid/0453:\n\ntests/test_dir/grid/0454:\n\ntests/test_dir/grid/0455:\n\ntests/test_dir/grid/0456:\n\ntests/test_dir/grid/0457:\n\ntests/test_dir/grid/0458:\n\ntests/test_dir/grid/0459:\n\ntests/test_dir/grid/0460:\n\ntests/test_dir/grid/0461:\n\ntests/test_dir/grid/0462:\n\ntests/test_dir/grid/0463:\n\ntests/test_dir/grid/0464:\n\ntests/test_dir/grid/0465:\n\ntests/test_dir/grid/0466:\n\ntests/test_dir/grid/0467:\n\ntests/test_dir/grid/0468:\n\ntests/test_dir/grid/0469:\n\ntests/test_dir/grid/0470:\n\ntests/test_dir/grid/0471:\n\ntests/test_dir/grid/0472:\n\ntests/test_dir/grid/0473:\n\ntests/test_dir/grid/0474:\n\ntests/test_dir/grid/0475:\n\ntests/test_dir/grid/0476:\n\ntests/test_dir/grid/0477:\n\ntests/test_dir/grid/0478:\n\ntests/test_dir/grid/0479:\n\ntests/test_dir/grid/0480:\n\ntests/test_dir/grid/0481:\n\ntests/test_dir/grid/0482:\n\ntests/test_dir/grid/0483:\n\ntests/test_dir/grid/0484:\n\ntests/test_dir/grid/0485:\n\ntests/test_dir/grid/0486:\n\ntests/test_dir/grid/0487:\n\ntests/test_dir/grid/0488:\n\ntests/test_dir/grid/0489:\n\ntests/test_dir/grid/0490:\n\ntests/test_dir/grid/0491:\n\ntests/test_dir/grid/0492:\n\ntests/test_dir/grid/0493:\n\ntests/test_dir/grid/0494:\n\ntests/test_dir/grid/0495:\n\ntests/test_dir/grid/0496:\n\ntests/test_dir/grid/0497:\n\ntests/test_dir/grid/0498:\n\ntests/test_dir/grid/0499:\n\ntests/test_dir/grid/0500:\n\ntests/test_dir/grid/0501:\n\ntests/test_dir/grid/0502:\n\ntests/test_dir/grid/0503:\n\ntests/test_dir/grid/0504:\n\ntests/test_dir/grid/0505:\n\ntests/test_dir/grid/0506:\n\ntests/test_dir/grid/0507:\n\ntests/test_dir/grid/0508:\n\ntests/test_dir/grid/0509:\n\ntests/test_dir/grid/0510:\n\ntests/test_dir/grid/0511:\n\ntests/test_dir/grid/0512:\n\ntests/test_dir/grid/0513:\n\ntests/test_dir/grid/0514:\n\ntests/test_dir/grid/0515:\n\ntests/test_dir/grid/0516:\n\ntests/test_dir/grid/0517:\n\ntests/test_dir/grid/0518:\n\ntests/test_dir/grid/0519:\n\ntests/test_dir/grid/0520:\n\ntests/test_dir/grid/0521:\n\ntests/test_dir/grid/0522:\n\ntests/test_dir/grid/0523:\n\ntests/test_dir/grid/0524:\n\ntests/test_dir/grid/0525:\n\ntests/test_dir/grid/0526:\n\ntests/test_dir/grid/0527:\n\ntests/test_dir/grid/0528:\n\ntests/test_dir/grid/0529:\n\ntests/test_dir/grid/0530:\n\ntests/test_dir/grid/0531:\n\ntests/test_dir/grid/0532:\n\ntests/test_dir/grid/0533:\n\ntests/test_dir/grid/0534:\n\ntests/test_dir/grid/0535:\n\ntests/test_dir/grid/0536:\n\ntests/test_dir/grid/0537:\n\ntests/test_dir/grid/0538:\n\ntests/test_dir/grid/0539:\n\ntests/test_dir/grid/0540:\n\ntests/test_dir/grid/0541:\n\ntests/test_dir/grid/0542:\n\ntests/test_dir/grid/0543:\n\ntests/test_dir/grid/0544:\n\ntests/test_dir/grid/0545:\n\ntests/test_dir/grid/0546:\n\ntests/test_dir/grid/0547:\n\ntests/test_dir/grid/0548:\n\ntests/test_dir/grid/0549:\n\ntests/test_dir/grid/0550:\n\ntests/test_dir/grid/0551:\n\ntests/test_dir/grid/0552:\n\ntests/test_dir/grid/0553:\n\ntests/test_dir/grid/0554:\n\ntests/test_dir/grid/0555:\n\ntests/test_dir/grid/0556:\n\ntests/test_dir/grid/0557:\n\ntests/test_dir/grid/0558:\n\ntests/test_dir/grid/0559:\n\ntests/test_dir/grid/0560:\n\ntests/test_dir/grid/0561:\n\ntests/test_dir/grid/0562:\n\ntests/test_dir/grid/0563:\n\ntests/test_dir/grid/0564:\n\ntests/test_dir/grid/0565:\n\ntests/test_dir/grid/0566:\n\ntests/test_dir/grid/0567:\n\ntests/test_dir/grid/0568:\n\ntests/test_dir/grid/0569:\n\ntests/test_dir/grid/0570:\n\ntests/test_dir/grid/0571:\n\ntests/test_dir/grid/0572:\n\ntests/test_dir/grid/0573:\n\ntests/test_dir/grid/0574:\n\ntests/test_dir/grid/0575:\n\ntests/test_dir/grid/0576:\n\ntests/test_dir/grid/0577:\n\ntests/test_dir/grid/0578:\n\ntests/test_dir/grid/0579:\n\ntests/test_dir/grid/0580:\n\ntests/test_dir/grid/0581:\n\ntests/test_dir/grid/0582:\n\ntests/test_dir/grid/0583:\n\ntests/test_dir/grid/0584:\n\ntests/test_dir/grid/0585:\n\ntests/test_dir/grid/0586:\n\ntests/test_dir/grid/0587:\n\ntests/test_dir/grid/0588:\n\ntests/test_dir/grid/0589:\n\ntests/test_dir/grid/0590:\n\ntests/test_dir/grid/0591:\n\ntests/test_dir/grid/0592:\n\ntests/test_dir/grid/0593:\n\ntests/test_dir/grid/0594:\n\ntests/test_dir/grid/0595:\n\ntests/test_dir/grid/0596:\n\ntests/test_dir/grid/0597:\n\ntests/test_dir/grid/0598:\n\ntests/test_dir/grid/0599:\n\ntests/test_dir/grid/0600:\n\ntests/test_dir/grid/0601:\n\ntests/test_dir/grid/0602:\n\ntests/test_dir/grid/0603:\n\ntests/test_dir/grid/0604:\n\ntests/test_dir/grid/0605:\n\ntests/test_dir/grid/0606:\n\ntests/test_dir/grid/0607:\n\ntests/test_dir/grid/0608:\n\ntests/test_dir/grid/0609:\n\ntests/test_dir/grid/0610:\n\ntests/test_dir/grid/0611:\n\ntests/test_dir/grid/0612:\n\ntests/test_dir/grid/0613:\n\ntests/test_dir/grid/0614:\n\ntests/test_dir/grid/0615:\n\ntests/test_dir/grid/0616:\n\ntests/test_dir/grid/0617:\n\ntests/test_dir/grid/0618:\n\ntests/test_dir/grid/0619:\n\ntests/test_dir/grid/0620:\n\ntests/test_dir/grid/0621:\n\ntests/test_dir/grid/0622:\n\ntests/test_dir/grid/0623:\n\ntests/test_dir/grid/0624:\n\ntests/test_dir/grid/0625:\n\ntests/test_dir/grid/0626:\n\ntests/test_dir/grid/0627:\n\ntests/test_dir/grid/0628:\n\ntests/test_dir/grid/0629:\n\ntests/test_dir/grid/0630:\n\ntests/test_dir/grid/0631:\n\ntests/test_dir/grid/0632:\n\ntests/test_dir/grid/0633:\n\ntests/test_dir/grid/0634:\n\ntests/test_dir/grid/0635:\n\ntests/test_dir/grid/0636:\n\ntests/test_dir/grid/0637:\n\ntests/test_dir/grid/0638:\n\ntests/test_dir/grid/0639:\n\ntests/test_dir/grid/0640:\n\ntests/test_dir/grid/0641:\n\ntests/test_dir/grid/0642:\n\ntests/test_dir/grid/0643:\n\ntests/test_dir/grid/0644:\n\ntests/test_dir/grid/0645:\n\ntests/test_dir/grid/0646:\n\ntests/test_dir/grid/0647:\n\ntests/test_dir/grid/0648:\n\ntests/test_dir/grid/0649:\n\ntests/test_dir/grid/0650:\n\ntests/test_dir/grid/0651:\n\ntests/test_dir/grid/0652:\n\ntests/test_dir/grid/0653:\n\ntests/test_dir/grid/0654:\n\ntests/test_dir/grid/0655:\n\ntests/test_dir/grid/0656:\n\ntests/test_dir/grid/0657:\n\ntests/test_dir/grid/0658:\n\ntests/test_dir/grid/0659:\n\ntests/test_dir/grid/0660:\n\ntests/test_dir/grid/0661:\n\ntests/test_dir/grid/0662:\n\ntests/test_dir/grid/0663:\n\ntests/test_dir/grid/0664:\n\ntests/test_dir/grid/0665:\n\ntests/test_dir/grid/0666:\n\ntests/test_dir/grid/0667:\n\ntests/test_dir/grid/0668:\n\ntests/test_dir/grid/0669:\n\ntests/test_dir/grid/0670:\n\ntests/test_dir/grid/0671:\n\ntests/test_dir/grid/0672:\n\ntests/test_dir/grid/0673:\n\ntests/test_dir/grid/0674:\n\ntests/test_dir/grid/0675:\n\ntests/test_dir/grid/0676:\n\ntests/test_dir/grid/0677:\n\ntests/test_dir/grid/0678:\n\ntests/test_dir/grid/0679:\n\ntests/test_dir/grid/0680:\n\ntests/test_dir/grid/0681:\n\ntests/test_dir/grid/0682:\n\ntests/test_dir/grid/0683:\n\ntests/test_dir/grid/0684:\n\ntests/test_dir/grid/0685:\n\ntests/test_dir/grid/0686:\n\ntests/test_dir/grid/0687:\n\ntests/test_dir/grid/0688:\n\ntests/test_dir/grid/0689:\n\ntests/test_dir/grid/0690:\n\ntests/test_dir/grid/0691:\n\ntests/test_dir/grid/0692:\n\ntests/test_dir/grid/0693:\n\ntests/test_dir/grid/0694:\n\ntests/test_dir/grid/0695:\n\ntests/test_dir/grid/0696:\n\ntests/test_dir/grid/0697:\n\ntests/test_dir/grid/0698:\n\ntests/test_dir/grid/0699:\n\ntests/test_dir/grid/0700:\n\ntests/test_dir/grid/0701:\n\ntests/test_dir/grid/0702:\n\ntests/test_dir/grid/0703:\n\ntests/test_dir/grid/0704:\n\ntests/test_dir/grid/0705:\n\ntests/test_dir/grid/0706:\n\ntests/test_dir/grid/0707:\n\ntests/test_dir/grid/0708:\n\ntests/test_dir/grid/0709:\n\ntests/test_dir/grid/0710:\n\ntests/test_dir/grid/0711:\n\ntests/test_dir/grid/0712:\n\ntests/test_dir/grid/0713:\n\ntests/test_dir/grid/0714:\n\ntests/test_dir/grid/0715:\n\ntests/test_dir/grid/0716:\n\ntests/test_dir/grid/0717:\n\ntests/test_dir/grid/0718:\n\ntests/test_dir/grid/0719:\n\ntests/test_dir/grid/0720:\n\ntests/test_dir/grid/0721:\n\ntests/test_dir/grid/0722:\n\ntests/test_dir/grid/0723:\n\ntests/test_dir/grid/0724:\n\ntests/test_dir/grid/0725:\n\ntests/test_dir/grid/0726:\n\ntests/test_dir/grid/0727:\n\ntests/test_dir/grid/0728:\n\ntests/test_dir/grid/0729:\n\ntests/test_dir/grid/0730:\n\ntests/test_dir/grid/0731:\n\ntests/test_dir/grid/0732:\n\ntests/test_dir/grid/0733:\n\ntests/test_dir/grid/0734:\n\ntests/test_dir/grid/0735:\n\ntests/test_dir/grid/0736:\n\ntests/test_dir/grid/0737:\n\ntests/test_dir/grid/0738:\n\ntests/test_dir/grid/0739:\n\ntests/test_dir/grid/0740:\n\ntests/test_dir/grid/0741:\n\ntests/test_dir/grid/0742:\n\ntests/test_dir/grid/0743:\n\ntests/test_dir/grid/0744:\n\ntests/test_dir/grid/0745:\n\ntests/test_dir/grid/0746:\n\ntests/test_dir/grid/0747:\n\ntests/test_dir/grid/0748:\n\ntests/test_dir/grid/0749:\n\ntests/test_dir/grid/0750:\n\ntests/test_dir/grid/0751:\n\ntests/test_dir/grid/0752:\n\ntests/test_dir/grid/0753:\n\ntests/test_dir/grid/0754:\n\ntests/test_dir/grid/0755:\n\ntests/test_dir/grid/0756:\n\ntests/test_dir/grid/0757:\n\ntests/test_dir/grid/0758:\n\ntests/test_dir/grid/0759:\n\ntests/test_dir/grid/0760:\n\ntests/test_dir/grid/0761:\n\ntests/test_dir/grid/0762:\n\ntests/test_dir/grid/0763:\n\ntests/test_dir/grid/0764:\n\ntests/test_dir/grid/0765:\n\ntests/test_dir/grid/0766:\n\ntests/test_dir/grid/0767:\n\ntests/test_dir/grid/0768:\n\ntests/test_dir/grid/0769:\n\ntests/test_dir/grid/0770:\n\ntests/test_dir/grid/0771:\n\ntests/test_dir/grid/0772:\n\ntests/test_dir/grid/0773:\n\ntests/test_dir/grid/0774:\n\ntests/test_dir/grid/0775:\n\ntests/test_dir/grid/0776:\n\ntests/test_dir/grid/0777:\n\ntests/test_dir/grid/0778:\n\ntests/test_dir/grid/0779:\n\ntests/test_dir/grid/0780:\n\ntests/test_dir/grid/0781:\n\ntests/test_dir/grid/0782:\n\ntests/test_dir/grid/0783:\n\ntests/test_dir/grid/0784:\n\ntests/test_dir/grid/0785:\n\ntests/test_dir/grid/0786:\n\ntests/test_dir/grid/0787:\n\ntests/test_dir/grid/0788:\n\ntests/test_dir/grid/0789:\n\ntests/test_dir/grid/0790:\n\ntests/test_dir/grid/0791:\n\ntests/test_dir/grid/0792:\n\ntests/test_dir/grid/0793:\n\ntests/test_dir/grid/0794:\n\ntests/test_dir/grid/0795:\n\ntests/test_dir/grid/0796:\n\ntests/test_dir/grid/0797:\n\ntests/test_dir/grid/0798:\n\ntests/test_dir/grid/0799:\n\ntests/test_dir/grid/0800:\n\ntests/test_dir/grid/0801:\n\ntests/test_dir/grid/0802:\n\ntests/test_dir/grid/0803:\n\ntests/test_dir/grid/0804:\n\ntests/test_dir/grid/0805:\n\ntests/test_dir/grid/0806:\n\ntests/test_dir/grid/0807:\n\ntests/test_dir/grid/0808:\n\ntests/test_dir/grid/0809:\n\ntests/test_dir/grid/0810:\n\ntests/test_dir/grid/0811:\n\ntests/test_dir/grid/0812:\n\ntests/test_dir/grid/0813:\n\ntests/test_dir/grid/0814:\n\ntests/test_dir/grid/0815:\n\ntests/test_dir/grid/0816:\n\ntests/test_dir/grid/0817:\n\ntests/test_dir/grid/0818:\n\ntests/test_dir/grid/0819:\n\ntests/test_dir/grid/0820:\n\ntests/test_dir/grid/0821:\n\ntests/test_dir/grid/0822:\n\ntests/test_dir/grid/0823:\n\ntests/test_dir/grid/0824:\n\ntests/test_dir/grid/0825:\n\ntests/test_dir/grid/0826:\n\ntests/test_dir/grid/0827:\n\ntests/test_dir/grid/0828:\n\ntests/test_dir/grid/0829:\n\ntests/test_dir/grid/0830:\n\ntests/test_dir/grid/0831:\n\ntests/test_dir/grid/0832:\n\ntests/test_dir/grid/0833:\n\ntests/test_dir/grid/0834:\n\ntests/test_dir/grid/0835:\n\ntests/test_dir/grid/0836:\n\ntests/test_dir/grid/0837:\n\ntests/test_dir/grid/0838:\n\ntests/test_dir/grid/0839:\n\ntests/test_dir/grid/0840:\n\ntests/test_dir/grid/0841:\n\ntests/test_dir/grid/0842:\n\ntests/test_dir/grid/0843:\n\ntests/test_dir/grid/0844:\n\ntests/test_dir/grid/0845:\n\ntests/test_dir/grid/0846:\n\ntests/test_dir/grid/0847:\n\ntests/test_dir/grid/0848:\n\ntests/test_dir/grid/0849:\n\ntests/test_dir/grid/0850:\n\ntests/test_dir/grid/0851:\n\ntests/test_dir/grid/0852:\n\ntests/test_dir/grid/0853:\n\ntests/test_dir/grid/0854:\n\ntests/test_dir/grid/0855:\n\ntests/test_dir/grid/0856:\n\ntests/test_dir/grid/0857:\n\ntests/test_dir/grid/0858:\n\ntests/test_dir/grid/0859:\n\ntests/test_dir/grid/0860:\n\ntests/test_dir/grid/0861:\n\ntests/test_dir/grid/0862:\n\ntests/test_dir/grid/0863:\n\ntests/test_dir/grid/0864:\n\ntests/test_dir/grid/0865:\n\ntests/test_dir/grid/0866:\n\ntests/test_dir/grid/0867:\n\ntests/test_dir/grid/0868:\n\ntests/test_dir/grid/0869:\n\ntests/test_dir/grid/0870:\n\ntests/test_dir/grid/0871:\n\ntests/test_dir/grid/0872:\n\ntests/test_dir/grid/0873:\n\ntests/test_dir/grid/0874:\n\ntests/test_dir/grid/0875:\n\ntests/test_dir/grid/0876:\n\ntests/test_dir/grid/0877:\n\ntests/test_dir/grid/0878:\n\ntests/test_dir/grid/0879:\n\ntests/test_dir/grid/0880:\n\ntests/test_dir/grid/0881:\n\ntests/test_dir/grid/0882:\n\ntests/test_dir/grid/0883:\n\ntests/test_dir/grid/0884:\n\ntests/test_dir/grid/0885:\n\ntests/test_dir/grid/0886:\n\ntests/test_dir/grid/0887:\n\ntests/test_dir/grid/0888:\n\ntests/test_dir/grid/0889:\n\ntests/test_dir/grid/0890:\n\ntests/test_dir/grid/0891:\n\ntests/test_dir/grid/0892:\n\ntests/test_dir/grid/0893:\n\ntests/test_dir/grid/0894:\n\ntests/test_dir/grid/0895:\n\ntests/test_dir/grid/0896:\n\ntests/test_dir/grid/0897:\n\ntests/test_dir/grid/0898:\n\ntests/test_dir/grid/0899:\n\ntests/test_dir/grid/0900:\n\ntests/test_dir/grid/0901:\n\ntests/test_dir/grid/0902:\n\ntests/test_dir/grid/0903:\n\ntests/test_dir/grid/0904:\n\ntests/test_dir/grid/0905:\n\ntests/test_dir/grid/0906:\n\ntests/test_dir/grid/0907:\n\ntests/test_dir/grid/0908:\n\ntests/test_dir/grid/0909:\n\ntests/test_dir/grid/0910:\n\ntests/test_dir/grid/0911:\n\ntests/test_dir/grid/0912:\n\ntests/test_dir/grid/0913:\n\ntests/test_dir/grid/0914:\n\ntests/test_dir/grid/0915:\n\ntests/test_dir/grid/0916:\n\ntests/test_dir/grid/0917:\n\ntests/test_dir/grid/0918:\n\ntests/test_dir/grid/0919:\n\ntests/test_dir/grid/0920:\n\ntests/test_dir/grid/0921:\n\ntests/test_dir/grid/0922:\n\ntests/test_dir/grid/0923:\n\ntests/test_dir/grid/0924:\n\ntests/test_dir/grid/0925:\n\ntests/test_dir/grid/0926:\n\ntests/test_dir/grid/0927:\n\ntests/test_dir/grid/0928:\n\ntests/test_dir/grid/0929:\n\ntests/test_dir/grid/0930:\n\ntests/test_dir/grid/0931:\n\ntests/test_dir/grid/0932:\n\ntests/test_dir/grid/0933:\n\ntests/test_dir/grid/0934:\n\ntests/test_dir/grid/0935:\n\ntests/test_dir/grid/0936:\n\ntests/test_dir/grid/0937:\n\ntests/test_dir/grid/0938:\n\ntests/test_dir/grid/0939:\n\ntests/test_dir/grid/0940:\n\ntests/test_dir/grid/0941:\n\ntests/test_dir/grid/0942:\n\ntests/test_dir/grid/0943:\n\ntests/test_dir/grid/0944:\n\ntests/test_dir/grid/0945:\n\ntests/test_dir/grid/0946:\n\ntests/test_dir/grid/0947:\n\ntests/test_dir/grid/0948:\n\ntests/test_dir/grid/0949:\n\ntests/test_dir/grid/0950:\n\ntests/test_dir/grid/0951:\n\ntests/test_dir/grid/0952:\n\ntests/test_dir/grid/0953:\n\ntests/test_dir/grid/0954:\n\ntests/test_dir/grid/0955:\n\ntests/test_dir/grid/0956:\n\ntests/test_dir/grid/0957:\n\ntests/test_dir/grid/0958:\n\ntests/test_dir/grid/0959:\n\ntests/test_dir/grid/0960:\n\ntests/test_dir/grid/0961:\n\ntests/test_dir/grid/0962:\n\ntests/test_dir/grid/0963:\n\ntests/test_dir/grid/0964:\n\ntests/test_dir/grid/0965:\n\ntests/test_dir/grid/0966:\n\ntests/test_dir/grid/0967:\n\ntests/test_dir/grid/0968:\n\ntests/test_dir/grid/0969:\n\ntests/test_dir/grid/0970:\n\ntests/test_dir/grid/0971:\n\ntests/test_dir/grid/0972:\n\ntests/test_dir/grid/0973:\n\ntests/test_dir/grid/0974:\n\ntests/test_dir/grid/0975:\n\ntests/test_dir/grid/0976:\n\ntests/test_dir/grid/0977:\n\ntests/test_dir/grid/0978:\n\ntests/test_dir/grid/0979:\n\ntests/test_dir/grid/0980:\n\ntests/test_dir/grid/0981:\n\ntests/test_dir/grid/0982:\n\ntests/test_dir/grid/0983:\n\ntests/test_dir/grid/0984:\n\ntests/test_dir/grid/0985:\n\ntests/test_dir/grid/0986:\n\ntests/test_dir/grid/0987:\n\ntests/test_dir/grid/0988:\n\ntests/test_dir/grid/0989:\n\ntests/test_dir/grid/0990:\n\ntests/test_dir/grid/0991:\n\ntests/test_dir/grid/0992:\n\ntests/test_dir/grid/0993:\n\ntests/test_dir/grid/0994:\n\ntests/test_dir/grid/0995:\n\ntests/test_dir/grid/0996:\n\ntests/test_dir/grid/0997:\n\ntests/test_dir/grid/0998:\n\ntests/test_dir/grid/0999:\n\ntests/test_dir/grid/1000:\n\ntests/test_dir/group:\nfile\n\ntests/test_dir/icons:\nc++.cpp\nc.c\ncss.css\nfile\ngo.go\nhtml.html\njava.java\njavascript.js\nman.1\nmarked.md\nphp.php\npython.py\nruby.rb\nrust.rs\nshell.sh\nunknown.unknown\n\ntests/test_dir/perms:\nfile\nfile2\n\ntests/test_dir/size:\n1B\n1K\n1M\n1337\n\ntests/test_dir/specials:\n\ntests/test_dir/symlinks:\ndir\nfile\n' lorem ipsum'\nsymlink -> file\nsymlink2 -> symlink\nsymlink3 -> dir\nsymlink4 -> pipitek\n\ntests/test_dir/symlinks/dir:\n\ntests/test_dir/time:\n1d\n1h\n1m\n1s\n1y\nepoch\n"
  },
  {
    "path": "tests/ptests/ptest_57a5aac99c0c821c.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -R \""
  },
  {
    "path": "tests/ptests/ptest_581533c37ac03853.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_581533c37ac03853.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_581533c37ac03853.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --icons never\""
  },
  {
    "path": "tests/ptests/ptest_585bdfd3218af4a0.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_585bdfd3218af4a0.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_585bdfd3218af4a0.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --accessed \""
  },
  {
    "path": "tests/ptests/ptest_5ba3cfebbb42c1f9.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_5ba3cfebbb42c1f9.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_5ba3cfebbb42c1f9.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s Ext\""
  },
  {
    "path": "tests/ptests/ptest_5bf846977eb5a96e.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_5bf846977eb5a96e.stdout",
    "content": "tests/test_dir\n├── git\n│   ├── 001\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 002\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 003\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 004\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 005\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 006\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 007\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 008\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 009\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   └── 010\n│       ├── file_000\n│       ├── file_001\n│       ├── file_002\n│       ├── file_003\n│       ├── file_004\n│       ├── file_005\n│       ├── file_006\n│       ├── file_007\n│       ├── file_008\n│       └── file_009\n├── grid\n│   ├── 0001\n│   ├── 0002\n│   ├── 0003\n│   ├── 0004\n│   ├── 0005\n│   ├── 0006\n│   ├── 0007\n│   ├── 0008\n│   ├── 0009\n│   ├── 0010\n│   ├── 0011\n│   ├── 0012\n│   ├── 0013\n│   ├── 0014\n│   ├── 0015\n│   ├── 0016\n│   ├── 0017\n│   ├── 0018\n│   ├── 0019\n│   ├── 0020\n│   ├── 0021\n│   ├── 0022\n│   ├── 0023\n│   ├── 0024\n│   ├── 0025\n│   ├── 0026\n│   ├── 0027\n│   ├── 0028\n│   ├── 0029\n│   ├── 0030\n│   ├── 0031\n│   ├── 0032\n│   ├── 0033\n│   ├── 0034\n│   ├── 0035\n│   ├── 0036\n│   ├── 0037\n│   ├── 0038\n│   ├── 0039\n│   ├── 0040\n│   ├── 0041\n│   ├── 0042\n│   ├── 0043\n│   ├── 0044\n│   ├── 0045\n│   ├── 0046\n│   ├── 0047\n│   ├── 0048\n│   ├── 0049\n│   ├── 0050\n│   ├── 0051\n│   ├── 0052\n│   ├── 0053\n│   ├── 0054\n│   ├── 0055\n│   ├── 0056\n│   ├── 0057\n│   ├── 0058\n│   ├── 0059\n│   ├── 0060\n│   ├── 0061\n│   ├── 0062\n│   ├── 0063\n│   ├── 0064\n│   ├── 0065\n│   ├── 0066\n│   ├── 0067\n│   ├── 0068\n│   ├── 0069\n│   ├── 0070\n│   ├── 0071\n│   ├── 0072\n│   ├── 0073\n│   ├── 0074\n│   ├── 0075\n│   ├── 0076\n│   ├── 0077\n│   ├── 0078\n│   ├── 0079\n│   ├── 0080\n│   ├── 0081\n│   ├── 0082\n│   ├── 0083\n│   ├── 0084\n│   ├── 0085\n│   ├── 0086\n│   ├── 0087\n│   ├── 0088\n│   ├── 0089\n│   ├── 0090\n│   ├── 0091\n│   ├── 0092\n│   ├── 0093\n│   ├── 0094\n│   ├── 0095\n│   ├── 0096\n│   ├── 0097\n│   ├── 0098\n│   ├── 0099\n│   ├── 0100\n│   ├── 0101\n│   ├── 0102\n│   ├── 0103\n│   ├── 0104\n│   ├── 0105\n│   ├── 0106\n│   ├── 0107\n│   ├── 0108\n│   ├── 0109\n│   ├── 0110\n│   ├── 0111\n│   ├── 0112\n│   ├── 0113\n│   ├── 0114\n│   ├── 0115\n│   ├── 0116\n│   ├── 0117\n│   ├── 0118\n│   ├── 0119\n│   ├── 0120\n│   ├── 0121\n│   ├── 0122\n│   ├── 0123\n│   ├── 0124\n│   ├── 0125\n│   ├── 0126\n│   ├── 0127\n│   ├── 0128\n│   ├── 0129\n│   ├── 0130\n│   ├── 0131\n│   ├── 0132\n│   ├── 0133\n│   ├── 0134\n│   ├── 0135\n│   ├── 0136\n│   ├── 0137\n│   ├── 0138\n│   ├── 0139\n│   ├── 0140\n│   ├── 0141\n│   ├── 0142\n│   ├── 0143\n│   ├── 0144\n│   ├── 0145\n│   ├── 0146\n│   ├── 0147\n│   ├── 0148\n│   ├── 0149\n│   ├── 0150\n│   ├── 0151\n│   ├── 0152\n│   ├── 0153\n│   ├── 0154\n│   ├── 0155\n│   ├── 0156\n│   ├── 0157\n│   ├── 0158\n│   ├── 0159\n│   ├── 0160\n│   ├── 0161\n│   ├── 0162\n│   ├── 0163\n│   ├── 0164\n│   ├── 0165\n│   ├── 0166\n│   ├── 0167\n│   ├── 0168\n│   ├── 0169\n│   ├── 0170\n│   ├── 0171\n│   ├── 0172\n│   ├── 0173\n│   ├── 0174\n│   ├── 0175\n│   ├── 0176\n│   ├── 0177\n│   ├── 0178\n│   ├── 0179\n│   ├── 0180\n│   ├── 0181\n│   ├── 0182\n│   ├── 0183\n│   ├── 0184\n│   ├── 0185\n│   ├── 0186\n│   ├── 0187\n│   ├── 0188\n│   ├── 0189\n│   ├── 0190\n│   ├── 0191\n│   ├── 0192\n│   ├── 0193\n│   ├── 0194\n│   ├── 0195\n│   ├── 0196\n│   ├── 0197\n│   ├── 0198\n│   ├── 0199\n│   ├── 0200\n│   ├── 0201\n│   ├── 0202\n│   ├── 0203\n│   ├── 0204\n│   ├── 0205\n│   ├── 0206\n│   ├── 0207\n│   ├── 0208\n│   ├── 0209\n│   ├── 0210\n│   ├── 0211\n│   ├── 0212\n│   ├── 0213\n│   ├── 0214\n│   ├── 0215\n│   ├── 0216\n│   ├── 0217\n│   ├── 0218\n│   ├── 0219\n│   ├── 0220\n│   ├── 0221\n│   ├── 0222\n│   ├── 0223\n│   ├── 0224\n│   ├── 0225\n│   ├── 0226\n│   ├── 0227\n│   ├── 0228\n│   ├── 0229\n│   ├── 0230\n│   ├── 0231\n│   ├── 0232\n│   ├── 0233\n│   ├── 0234\n│   ├── 0235\n│   ├── 0236\n│   ├── 0237\n│   ├── 0238\n│   ├── 0239\n│   ├── 0240\n│   ├── 0241\n│   ├── 0242\n│   ├── 0243\n│   ├── 0244\n│   ├── 0245\n│   ├── 0246\n│   ├── 0247\n│   ├── 0248\n│   ├── 0249\n│   ├── 0250\n│   ├── 0251\n│   ├── 0252\n│   ├── 0253\n│   ├── 0254\n│   ├── 0255\n│   ├── 0256\n│   ├── 0257\n│   ├── 0258\n│   ├── 0259\n│   ├── 0260\n│   ├── 0261\n│   ├── 0262\n│   ├── 0263\n│   ├── 0264\n│   ├── 0265\n│   ├── 0266\n│   ├── 0267\n│   ├── 0268\n│   ├── 0269\n│   ├── 0270\n│   ├── 0271\n│   ├── 0272\n│   ├── 0273\n│   ├── 0274\n│   ├── 0275\n│   ├── 0276\n│   ├── 0277\n│   ├── 0278\n│   ├── 0279\n│   ├── 0280\n│   ├── 0281\n│   ├── 0282\n│   ├── 0283\n│   ├── 0284\n│   ├── 0285\n│   ├── 0286\n│   ├── 0287\n│   ├── 0288\n│   ├── 0289\n│   ├── 0290\n│   ├── 0291\n│   ├── 0292\n│   ├── 0293\n│   ├── 0294\n│   ├── 0295\n│   ├── 0296\n│   ├── 0297\n│   ├── 0298\n│   ├── 0299\n│   ├── 0300\n│   ├── 0301\n│   ├── 0302\n│   ├── 0303\n│   ├── 0304\n│   ├── 0305\n│   ├── 0306\n│   ├── 0307\n│   ├── 0308\n│   ├── 0309\n│   ├── 0310\n│   ├── 0311\n│   ├── 0312\n│   ├── 0313\n│   ├── 0314\n│   ├── 0315\n│   ├── 0316\n│   ├── 0317\n│   ├── 0318\n│   ├── 0319\n│   ├── 0320\n│   ├── 0321\n│   ├── 0322\n│   ├── 0323\n│   ├── 0324\n│   ├── 0325\n│   ├── 0326\n│   ├── 0327\n│   ├── 0328\n│   ├── 0329\n│   ├── 0330\n│   ├── 0331\n│   ├── 0332\n│   ├── 0333\n│   ├── 0334\n│   ├── 0335\n│   ├── 0336\n│   ├── 0337\n│   ├── 0338\n│   ├── 0339\n│   ├── 0340\n│   ├── 0341\n│   ├── 0342\n│   ├── 0343\n│   ├── 0344\n│   ├── 0345\n│   ├── 0346\n│   ├── 0347\n│   ├── 0348\n│   ├── 0349\n│   ├── 0350\n│   ├── 0351\n│   ├── 0352\n│   ├── 0353\n│   ├── 0354\n│   ├── 0355\n│   ├── 0356\n│   ├── 0357\n│   ├── 0358\n│   ├── 0359\n│   ├── 0360\n│   ├── 0361\n│   ├── 0362\n│   ├── 0363\n│   ├── 0364\n│   ├── 0365\n│   ├── 0366\n│   ├── 0367\n│   ├── 0368\n│   ├── 0369\n│   ├── 0370\n│   ├── 0371\n│   ├── 0372\n│   ├── 0373\n│   ├── 0374\n│   ├── 0375\n│   ├── 0376\n│   ├── 0377\n│   ├── 0378\n│   ├── 0379\n│   ├── 0380\n│   ├── 0381\n│   ├── 0382\n│   ├── 0383\n│   ├── 0384\n│   ├── 0385\n│   ├── 0386\n│   ├── 0387\n│   ├── 0388\n│   ├── 0389\n│   ├── 0390\n│   ├── 0391\n│   ├── 0392\n│   ├── 0393\n│   ├── 0394\n│   ├── 0395\n│   ├── 0396\n│   ├── 0397\n│   ├── 0398\n│   ├── 0399\n│   ├── 0400\n│   ├── 0401\n│   ├── 0402\n│   ├── 0403\n│   ├── 0404\n│   ├── 0405\n│   ├── 0406\n│   ├── 0407\n│   ├── 0408\n│   ├── 0409\n│   ├── 0410\n│   ├── 0411\n│   ├── 0412\n│   ├── 0413\n│   ├── 0414\n│   ├── 0415\n│   ├── 0416\n│   ├── 0417\n│   ├── 0418\n│   ├── 0419\n│   ├── 0420\n│   ├── 0421\n│   ├── 0422\n│   ├── 0423\n│   ├── 0424\n│   ├── 0425\n│   ├── 0426\n│   ├── 0427\n│   ├── 0428\n│   ├── 0429\n│   ├── 0430\n│   ├── 0431\n│   ├── 0432\n│   ├── 0433\n│   ├── 0434\n│   ├── 0435\n│   ├── 0436\n│   ├── 0437\n│   ├── 0438\n│   ├── 0439\n│   ├── 0440\n│   ├── 0441\n│   ├── 0442\n│   ├── 0443\n│   ├── 0444\n│   ├── 0445\n│   ├── 0446\n│   ├── 0447\n│   ├── 0448\n│   ├── 0449\n│   ├── 0450\n│   ├── 0451\n│   ├── 0452\n│   ├── 0453\n│   ├── 0454\n│   ├── 0455\n│   ├── 0456\n│   ├── 0457\n│   ├── 0458\n│   ├── 0459\n│   ├── 0460\n│   ├── 0461\n│   ├── 0462\n│   ├── 0463\n│   ├── 0464\n│   ├── 0465\n│   ├── 0466\n│   ├── 0467\n│   ├── 0468\n│   ├── 0469\n│   ├── 0470\n│   ├── 0471\n│   ├── 0472\n│   ├── 0473\n│   ├── 0474\n│   ├── 0475\n│   ├── 0476\n│   ├── 0477\n│   ├── 0478\n│   ├── 0479\n│   ├── 0480\n│   ├── 0481\n│   ├── 0482\n│   ├── 0483\n│   ├── 0484\n│   ├── 0485\n│   ├── 0486\n│   ├── 0487\n│   ├── 0488\n│   ├── 0489\n│   ├── 0490\n│   ├── 0491\n│   ├── 0492\n│   ├── 0493\n│   ├── 0494\n│   ├── 0495\n│   ├── 0496\n│   ├── 0497\n│   ├── 0498\n│   ├── 0499\n│   ├── 0500\n│   ├── 0501\n│   ├── 0502\n│   ├── 0503\n│   ├── 0504\n│   ├── 0505\n│   ├── 0506\n│   ├── 0507\n│   ├── 0508\n│   ├── 0509\n│   ├── 0510\n│   ├── 0511\n│   ├── 0512\n│   ├── 0513\n│   ├── 0514\n│   ├── 0515\n│   ├── 0516\n│   ├── 0517\n│   ├── 0518\n│   ├── 0519\n│   ├── 0520\n│   ├── 0521\n│   ├── 0522\n│   ├── 0523\n│   ├── 0524\n│   ├── 0525\n│   ├── 0526\n│   ├── 0527\n│   ├── 0528\n│   ├── 0529\n│   ├── 0530\n│   ├── 0531\n│   ├── 0532\n│   ├── 0533\n│   ├── 0534\n│   ├── 0535\n│   ├── 0536\n│   ├── 0537\n│   ├── 0538\n│   ├── 0539\n│   ├── 0540\n│   ├── 0541\n│   ├── 0542\n│   ├── 0543\n│   ├── 0544\n│   ├── 0545\n│   ├── 0546\n│   ├── 0547\n│   ├── 0548\n│   ├── 0549\n│   ├── 0550\n│   ├── 0551\n│   ├── 0552\n│   ├── 0553\n│   ├── 0554\n│   ├── 0555\n│   ├── 0556\n│   ├── 0557\n│   ├── 0558\n│   ├── 0559\n│   ├── 0560\n│   ├── 0561\n│   ├── 0562\n│   ├── 0563\n│   ├── 0564\n│   ├── 0565\n│   ├── 0566\n│   ├── 0567\n│   ├── 0568\n│   ├── 0569\n│   ├── 0570\n│   ├── 0571\n│   ├── 0572\n│   ├── 0573\n│   ├── 0574\n│   ├── 0575\n│   ├── 0576\n│   ├── 0577\n│   ├── 0578\n│   ├── 0579\n│   ├── 0580\n│   ├── 0581\n│   ├── 0582\n│   ├── 0583\n│   ├── 0584\n│   ├── 0585\n│   ├── 0586\n│   ├── 0587\n│   ├── 0588\n│   ├── 0589\n│   ├── 0590\n│   ├── 0591\n│   ├── 0592\n│   ├── 0593\n│   ├── 0594\n│   ├── 0595\n│   ├── 0596\n│   ├── 0597\n│   ├── 0598\n│   ├── 0599\n│   ├── 0600\n│   ├── 0601\n│   ├── 0602\n│   ├── 0603\n│   ├── 0604\n│   ├── 0605\n│   ├── 0606\n│   ├── 0607\n│   ├── 0608\n│   ├── 0609\n│   ├── 0610\n│   ├── 0611\n│   ├── 0612\n│   ├── 0613\n│   ├── 0614\n│   ├── 0615\n│   ├── 0616\n│   ├── 0617\n│   ├── 0618\n│   ├── 0619\n│   ├── 0620\n│   ├── 0621\n│   ├── 0622\n│   ├── 0623\n│   ├── 0624\n│   ├── 0625\n│   ├── 0626\n│   ├── 0627\n│   ├── 0628\n│   ├── 0629\n│   ├── 0630\n│   ├── 0631\n│   ├── 0632\n│   ├── 0633\n│   ├── 0634\n│   ├── 0635\n│   ├── 0636\n│   ├── 0637\n│   ├── 0638\n│   ├── 0639\n│   ├── 0640\n│   ├── 0641\n│   ├── 0642\n│   ├── 0643\n│   ├── 0644\n│   ├── 0645\n│   ├── 0646\n│   ├── 0647\n│   ├── 0648\n│   ├── 0649\n│   ├── 0650\n│   ├── 0651\n│   ├── 0652\n│   ├── 0653\n│   ├── 0654\n│   ├── 0655\n│   ├── 0656\n│   ├── 0657\n│   ├── 0658\n│   ├── 0659\n│   ├── 0660\n│   ├── 0661\n│   ├── 0662\n│   ├── 0663\n│   ├── 0664\n│   ├── 0665\n│   ├── 0666\n│   ├── 0667\n│   ├── 0668\n│   ├── 0669\n│   ├── 0670\n│   ├── 0671\n│   ├── 0672\n│   ├── 0673\n│   ├── 0674\n│   ├── 0675\n│   ├── 0676\n│   ├── 0677\n│   ├── 0678\n│   ├── 0679\n│   ├── 0680\n│   ├── 0681\n│   ├── 0682\n│   ├── 0683\n│   ├── 0684\n│   ├── 0685\n│   ├── 0686\n│   ├── 0687\n│   ├── 0688\n│   ├── 0689\n│   ├── 0690\n│   ├── 0691\n│   ├── 0692\n│   ├── 0693\n│   ├── 0694\n│   ├── 0695\n│   ├── 0696\n│   ├── 0697\n│   ├── 0698\n│   ├── 0699\n│   ├── 0700\n│   ├── 0701\n│   ├── 0702\n│   ├── 0703\n│   ├── 0704\n│   ├── 0705\n│   ├── 0706\n│   ├── 0707\n│   ├── 0708\n│   ├── 0709\n│   ├── 0710\n│   ├── 0711\n│   ├── 0712\n│   ├── 0713\n│   ├── 0714\n│   ├── 0715\n│   ├── 0716\n│   ├── 0717\n│   ├── 0718\n│   ├── 0719\n│   ├── 0720\n│   ├── 0721\n│   ├── 0722\n│   ├── 0723\n│   ├── 0724\n│   ├── 0725\n│   ├── 0726\n│   ├── 0727\n│   ├── 0728\n│   ├── 0729\n│   ├── 0730\n│   ├── 0731\n│   ├── 0732\n│   ├── 0733\n│   ├── 0734\n│   ├── 0735\n│   ├── 0736\n│   ├── 0737\n│   ├── 0738\n│   ├── 0739\n│   ├── 0740\n│   ├── 0741\n│   ├── 0742\n│   ├── 0743\n│   ├── 0744\n│   ├── 0745\n│   ├── 0746\n│   ├── 0747\n│   ├── 0748\n│   ├── 0749\n│   ├── 0750\n│   ├── 0751\n│   ├── 0752\n│   ├── 0753\n│   ├── 0754\n│   ├── 0755\n│   ├── 0756\n│   ├── 0757\n│   ├── 0758\n│   ├── 0759\n│   ├── 0760\n│   ├── 0761\n│   ├── 0762\n│   ├── 0763\n│   ├── 0764\n│   ├── 0765\n│   ├── 0766\n│   ├── 0767\n│   ├── 0768\n│   ├── 0769\n│   ├── 0770\n│   ├── 0771\n│   ├── 0772\n│   ├── 0773\n│   ├── 0774\n│   ├── 0775\n│   ├── 0776\n│   ├── 0777\n│   ├── 0778\n│   ├── 0779\n│   ├── 0780\n│   ├── 0781\n│   ├── 0782\n│   ├── 0783\n│   ├── 0784\n│   ├── 0785\n│   ├── 0786\n│   ├── 0787\n│   ├── 0788\n│   ├── 0789\n│   ├── 0790\n│   ├── 0791\n│   ├── 0792\n│   ├── 0793\n│   ├── 0794\n│   ├── 0795\n│   ├── 0796\n│   ├── 0797\n│   ├── 0798\n│   ├── 0799\n│   ├── 0800\n│   ├── 0801\n│   ├── 0802\n│   ├── 0803\n│   ├── 0804\n│   ├── 0805\n│   ├── 0806\n│   ├── 0807\n│   ├── 0808\n│   ├── 0809\n│   ├── 0810\n│   ├── 0811\n│   ├── 0812\n│   ├── 0813\n│   ├── 0814\n│   ├── 0815\n│   ├── 0816\n│   ├── 0817\n│   ├── 0818\n│   ├── 0819\n│   ├── 0820\n│   ├── 0821\n│   ├── 0822\n│   ├── 0823\n│   ├── 0824\n│   ├── 0825\n│   ├── 0826\n│   ├── 0827\n│   ├── 0828\n│   ├── 0829\n│   ├── 0830\n│   ├── 0831\n│   ├── 0832\n│   ├── 0833\n│   ├── 0834\n│   ├── 0835\n│   ├── 0836\n│   ├── 0837\n│   ├── 0838\n│   ├── 0839\n│   ├── 0840\n│   ├── 0841\n│   ├── 0842\n│   ├── 0843\n│   ├── 0844\n│   ├── 0845\n│   ├── 0846\n│   ├── 0847\n│   ├── 0848\n│   ├── 0849\n│   ├── 0850\n│   ├── 0851\n│   ├── 0852\n│   ├── 0853\n│   ├── 0854\n│   ├── 0855\n│   ├── 0856\n│   ├── 0857\n│   ├── 0858\n│   ├── 0859\n│   ├── 0860\n│   ├── 0861\n│   ├── 0862\n│   ├── 0863\n│   ├── 0864\n│   ├── 0865\n│   ├── 0866\n│   ├── 0867\n│   ├── 0868\n│   ├── 0869\n│   ├── 0870\n│   ├── 0871\n│   ├── 0872\n│   ├── 0873\n│   ├── 0874\n│   ├── 0875\n│   ├── 0876\n│   ├── 0877\n│   ├── 0878\n│   ├── 0879\n│   ├── 0880\n│   ├── 0881\n│   ├── 0882\n│   ├── 0883\n│   ├── 0884\n│   ├── 0885\n│   ├── 0886\n│   ├── 0887\n│   ├── 0888\n│   ├── 0889\n│   ├── 0890\n│   ├── 0891\n│   ├── 0892\n│   ├── 0893\n│   ├── 0894\n│   ├── 0895\n│   ├── 0896\n│   ├── 0897\n│   ├── 0898\n│   ├── 0899\n│   ├── 0900\n│   ├── 0901\n│   ├── 0902\n│   ├── 0903\n│   ├── 0904\n│   ├── 0905\n│   ├── 0906\n│   ├── 0907\n│   ├── 0908\n│   ├── 0909\n│   ├── 0910\n│   ├── 0911\n│   ├── 0912\n│   ├── 0913\n│   ├── 0914\n│   ├── 0915\n│   ├── 0916\n│   ├── 0917\n│   ├── 0918\n│   ├── 0919\n│   ├── 0920\n│   ├── 0921\n│   ├── 0922\n│   ├── 0923\n│   ├── 0924\n│   ├── 0925\n│   ├── 0926\n│   ├── 0927\n│   ├── 0928\n│   ├── 0929\n│   ├── 0930\n│   ├── 0931\n│   ├── 0932\n│   ├── 0933\n│   ├── 0934\n│   ├── 0935\n│   ├── 0936\n│   ├── 0937\n│   ├── 0938\n│   ├── 0939\n│   ├── 0940\n│   ├── 0941\n│   ├── 0942\n│   ├── 0943\n│   ├── 0944\n│   ├── 0945\n│   ├── 0946\n│   ├── 0947\n│   ├── 0948\n│   ├── 0949\n│   ├── 0950\n│   ├── 0951\n│   ├── 0952\n│   ├── 0953\n│   ├── 0954\n│   ├── 0955\n│   ├── 0956\n│   ├── 0957\n│   ├── 0958\n│   ├── 0959\n│   ├── 0960\n│   ├── 0961\n│   ├── 0962\n│   ├── 0963\n│   ├── 0964\n│   ├── 0965\n│   ├── 0966\n│   ├── 0967\n│   ├── 0968\n│   ├── 0969\n│   ├── 0970\n│   ├── 0971\n│   ├── 0972\n│   ├── 0973\n│   ├── 0974\n│   ├── 0975\n│   ├── 0976\n│   ├── 0977\n│   ├── 0978\n│   ├── 0979\n│   ├── 0980\n│   ├── 0981\n│   ├── 0982\n│   ├── 0983\n│   ├── 0984\n│   ├── 0985\n│   ├── 0986\n│   ├── 0987\n│   ├── 0988\n│   ├── 0989\n│   ├── 0990\n│   ├── 0991\n│   ├── 0992\n│   ├── 0993\n│   ├── 0994\n│   ├── 0995\n│   ├── 0996\n│   ├── 0997\n│   ├── 0998\n│   ├── 0999\n│   ├── 1000\n│   ├── file_000\n│   ├── file_001\n│   ├── file_002\n│   ├── file_003\n│   ├── file_004\n│   ├── file_005\n│   ├── file_006\n│   ├── file_007\n│   ├── file_008\n│   ├── file_009\n│   ├── file_010\n│   ├── file_011\n│   ├── file_012\n│   ├── file_013\n│   ├── file_014\n│   ├── file_015\n│   ├── file_016\n│   ├── file_017\n│   ├── file_018\n│   ├── file_019\n│   ├── file_020\n│   ├── file_021\n│   ├── file_022\n│   ├── file_023\n│   ├── file_024\n│   ├── file_025\n│   ├── file_026\n│   ├── file_027\n│   ├── file_028\n│   ├── file_029\n│   ├── file_030\n│   ├── file_031\n│   ├── file_032\n│   ├── file_033\n│   ├── file_034\n│   ├── file_035\n│   ├── file_036\n│   ├── file_037\n│   ├── file_038\n│   ├── file_039\n│   ├── file_040\n│   ├── file_041\n│   ├── file_042\n│   ├── file_043\n│   ├── file_044\n│   ├── file_045\n│   ├── file_046\n│   ├── file_047\n│   ├── file_048\n│   ├── file_049\n│   ├── file_050\n│   ├── file_051\n│   ├── file_052\n│   ├── file_053\n│   ├── file_054\n│   ├── file_055\n│   ├── file_056\n│   ├── file_057\n│   ├── file_058\n│   ├── file_059\n│   ├── file_060\n│   ├── file_061\n│   ├── file_062\n│   ├── file_063\n│   ├── file_064\n│   ├── file_065\n│   ├── file_066\n│   ├── file_067\n│   ├── file_068\n│   ├── file_069\n│   ├── file_070\n│   ├── file_071\n│   ├── file_072\n│   ├── file_073\n│   ├── file_074\n│   ├── file_075\n│   ├── file_076\n│   ├── file_077\n│   ├── file_078\n│   ├── file_079\n│   ├── file_080\n│   ├── file_081\n│   ├── file_082\n│   ├── file_083\n│   ├── file_084\n│   ├── file_085\n│   ├── file_086\n│   ├── file_087\n│   ├── file_088\n│   ├── file_089\n│   ├── file_090\n│   ├── file_091\n│   ├── file_092\n│   ├── file_093\n│   ├── file_094\n│   ├── file_095\n│   ├── file_096\n│   ├── file_097\n│   ├── file_098\n│   ├── file_099\n│   ├── file_100\n│   ├── file_101\n│   ├── file_102\n│   ├── file_103\n│   ├── file_104\n│   ├── file_105\n│   ├── file_106\n│   ├── file_107\n│   ├── file_108\n│   ├── file_109\n│   ├── file_110\n│   ├── file_111\n│   ├── file_112\n│   ├── file_113\n│   ├── file_114\n│   ├── file_115\n│   ├── file_116\n│   ├── file_117\n│   ├── file_118\n│   ├── file_119\n│   ├── file_120\n│   ├── file_121\n│   ├── file_122\n│   ├── file_123\n│   ├── file_124\n│   ├── file_125\n│   ├── file_126\n│   ├── file_127\n│   ├── file_128\n│   ├── file_129\n│   ├── file_130\n│   ├── file_131\n│   ├── file_132\n│   ├── file_133\n│   ├── file_134\n│   ├── file_135\n│   ├── file_136\n│   ├── file_137\n│   ├── file_138\n│   ├── file_139\n│   ├── file_140\n│   ├── file_141\n│   ├── file_142\n│   ├── file_143\n│   ├── file_144\n│   ├── file_145\n│   ├── file_146\n│   ├── file_147\n│   ├── file_148\n│   ├── file_149\n│   ├── file_150\n│   ├── file_151\n│   ├── file_152\n│   ├── file_153\n│   ├── file_154\n│   ├── file_155\n│   ├── file_156\n│   ├── file_157\n│   ├── file_158\n│   ├── file_159\n│   ├── file_160\n│   ├── file_161\n│   ├── file_162\n│   ├── file_163\n│   ├── file_164\n│   ├── file_165\n│   ├── file_166\n│   ├── file_167\n│   ├── file_168\n│   ├── file_169\n│   ├── file_170\n│   ├── file_171\n│   ├── file_172\n│   ├── file_173\n│   ├── file_174\n│   ├── file_175\n│   ├── file_176\n│   ├── file_177\n│   ├── file_178\n│   ├── file_179\n│   ├── file_180\n│   ├── file_181\n│   ├── file_182\n│   ├── file_183\n│   ├── file_184\n│   ├── file_185\n│   ├── file_186\n│   ├── file_187\n│   ├── file_188\n│   ├── file_189\n│   ├── file_190\n│   ├── file_191\n│   ├── file_192\n│   ├── file_193\n│   ├── file_194\n│   ├── file_195\n│   ├── file_196\n│   ├── file_197\n│   ├── file_198\n│   ├── file_199\n│   ├── file_200\n│   ├── file_201\n│   ├── file_202\n│   ├── file_203\n│   ├── file_204\n│   ├── file_205\n│   ├── file_206\n│   ├── file_207\n│   ├── file_208\n│   ├── file_209\n│   ├── file_210\n│   ├── file_211\n│   ├── file_212\n│   ├── file_213\n│   ├── file_214\n│   ├── file_215\n│   ├── file_216\n│   ├── file_217\n│   ├── file_218\n│   ├── file_219\n│   ├── file_220\n│   ├── file_221\n│   ├── file_222\n│   ├── file_223\n│   ├── file_224\n│   ├── file_225\n│   ├── file_226\n│   ├── file_227\n│   ├── file_228\n│   ├── file_229\n│   ├── file_230\n│   ├── file_231\n│   ├── file_232\n│   ├── file_233\n│   ├── file_234\n│   ├── file_235\n│   ├── file_236\n│   ├── file_237\n│   ├── file_238\n│   ├── file_239\n│   ├── file_240\n│   ├── file_241\n│   ├── file_242\n│   ├── file_243\n│   ├── file_244\n│   ├── file_245\n│   ├── file_246\n│   ├── file_247\n│   ├── file_248\n│   ├── file_249\n│   ├── file_250\n│   ├── file_251\n│   ├── file_252\n│   ├── file_253\n│   ├── file_254\n│   ├── file_255\n│   ├── file_256\n│   ├── file_257\n│   ├── file_258\n│   ├── file_259\n│   ├── file_260\n│   ├── file_261\n│   ├── file_262\n│   ├── file_263\n│   ├── file_264\n│   ├── file_265\n│   ├── file_266\n│   ├── file_267\n│   ├── file_268\n│   ├── file_269\n│   ├── file_270\n│   ├── file_271\n│   ├── file_272\n│   ├── file_273\n│   ├── file_274\n│   ├── file_275\n│   ├── file_276\n│   ├── file_277\n│   ├── file_278\n│   ├── file_279\n│   ├── file_280\n│   ├── file_281\n│   ├── file_282\n│   ├── file_283\n│   ├── file_284\n│   ├── file_285\n│   ├── file_286\n│   ├── file_287\n│   ├── file_288\n│   ├── file_289\n│   ├── file_290\n│   ├── file_291\n│   ├── file_292\n│   ├── file_293\n│   ├── file_294\n│   ├── file_295\n│   ├── file_296\n│   ├── file_297\n│   ├── file_298\n│   ├── file_299\n│   ├── file_300\n│   ├── file_301\n│   ├── file_302\n│   ├── file_303\n│   ├── file_304\n│   ├── file_305\n│   ├── file_306\n│   ├── file_307\n│   ├── file_308\n│   ├── file_309\n│   ├── file_310\n│   ├── file_311\n│   ├── file_312\n│   ├── file_313\n│   ├── file_314\n│   ├── file_315\n│   ├── file_316\n│   ├── file_317\n│   ├── file_318\n│   ├── file_319\n│   ├── file_320\n│   ├── file_321\n│   ├── file_322\n│   ├── file_323\n│   ├── file_324\n│   ├── file_325\n│   ├── file_326\n│   ├── file_327\n│   ├── file_328\n│   ├── file_329\n│   ├── file_330\n│   ├── file_331\n│   ├── file_332\n│   ├── file_333\n│   ├── file_334\n│   ├── file_335\n│   ├── file_336\n│   ├── file_337\n│   ├── file_338\n│   ├── file_339\n│   ├── file_340\n│   ├── file_341\n│   ├── file_342\n│   ├── file_343\n│   ├── file_344\n│   ├── file_345\n│   ├── file_346\n│   ├── file_347\n│   ├── file_348\n│   ├── file_349\n│   ├── file_350\n│   ├── file_351\n│   ├── file_352\n│   ├── file_353\n│   ├── file_354\n│   ├── file_355\n│   ├── file_356\n│   ├── file_357\n│   ├── file_358\n│   ├── file_359\n│   ├── file_360\n│   ├── file_361\n│   ├── file_362\n│   ├── file_363\n│   ├── file_364\n│   ├── file_365\n│   ├── file_366\n│   ├── file_367\n│   ├── file_368\n│   ├── file_369\n│   ├── file_370\n│   ├── file_371\n│   ├── file_372\n│   ├── file_373\n│   ├── file_374\n│   ├── file_375\n│   ├── file_376\n│   ├── file_377\n│   ├── file_378\n│   ├── file_379\n│   ├── file_380\n│   ├── file_381\n│   ├── file_382\n│   ├── file_383\n│   ├── file_384\n│   ├── file_385\n│   ├── file_386\n│   ├── file_387\n│   ├── file_388\n│   ├── file_389\n│   ├── file_390\n│   ├── file_391\n│   ├── file_392\n│   ├── file_393\n│   ├── file_394\n│   ├── file_395\n│   ├── file_396\n│   ├── file_397\n│   ├── file_398\n│   ├── file_399\n│   ├── file_400\n│   ├── file_401\n│   ├── file_402\n│   ├── file_403\n│   ├── file_404\n│   ├── file_405\n│   ├── file_406\n│   ├── file_407\n│   ├── file_408\n│   ├── file_409\n│   ├── file_410\n│   ├── file_411\n│   ├── file_412\n│   ├── file_413\n│   ├── file_414\n│   ├── file_415\n│   ├── file_416\n│   ├── file_417\n│   ├── file_418\n│   ├── file_419\n│   ├── file_420\n│   ├── file_421\n│   ├── file_422\n│   ├── file_423\n│   ├── file_424\n│   ├── file_425\n│   ├── file_426\n│   ├── file_427\n│   ├── file_428\n│   ├── file_429\n│   ├── file_430\n│   ├── file_431\n│   ├── file_432\n│   ├── file_433\n│   ├── file_434\n│   ├── file_435\n│   ├── file_436\n│   ├── file_437\n│   ├── file_438\n│   ├── file_439\n│   ├── file_440\n│   ├── file_441\n│   ├── file_442\n│   ├── file_443\n│   ├── file_444\n│   ├── file_445\n│   ├── file_446\n│   ├── file_447\n│   ├── file_448\n│   ├── file_449\n│   ├── file_450\n│   ├── file_451\n│   ├── file_452\n│   ├── file_453\n│   ├── file_454\n│   ├── file_455\n│   ├── file_456\n│   ├── file_457\n│   ├── file_458\n│   ├── file_459\n│   ├── file_460\n│   ├── file_461\n│   ├── file_462\n│   ├── file_463\n│   ├── file_464\n│   ├── file_465\n│   ├── file_466\n│   ├── file_467\n│   ├── file_468\n│   ├── file_469\n│   ├── file_470\n│   ├── file_471\n│   ├── file_472\n│   ├── file_473\n│   ├── file_474\n│   ├── file_475\n│   ├── file_476\n│   ├── file_477\n│   ├── file_478\n│   ├── file_479\n│   ├── file_480\n│   ├── file_481\n│   ├── file_482\n│   ├── file_483\n│   ├── file_484\n│   ├── file_485\n│   ├── file_486\n│   ├── file_487\n│   ├── file_488\n│   ├── file_489\n│   ├── file_490\n│   ├── file_491\n│   ├── file_492\n│   ├── file_493\n│   ├── file_494\n│   ├── file_495\n│   ├── file_496\n│   ├── file_497\n│   ├── file_498\n│   ├── file_499\n│   ├── file_500\n│   ├── file_501\n│   ├── file_502\n│   ├── file_503\n│   ├── file_504\n│   ├── file_505\n│   ├── file_506\n│   ├── file_507\n│   ├── file_508\n│   ├── file_509\n│   ├── file_510\n│   ├── file_511\n│   ├── file_512\n│   ├── file_513\n│   ├── file_514\n│   ├── file_515\n│   ├── file_516\n│   ├── file_517\n│   ├── file_518\n│   ├── file_519\n│   ├── file_520\n│   ├── file_521\n│   ├── file_522\n│   ├── file_523\n│   ├── file_524\n│   ├── file_525\n│   ├── file_526\n│   ├── file_527\n│   ├── file_528\n│   ├── file_529\n│   ├── file_530\n│   ├── file_531\n│   ├── file_532\n│   ├── file_533\n│   ├── file_534\n│   ├── file_535\n│   ├── file_536\n│   ├── file_537\n│   ├── file_538\n│   ├── file_539\n│   ├── file_540\n│   ├── file_541\n│   ├── file_542\n│   ├── file_543\n│   ├── file_544\n│   ├── file_545\n│   ├── file_546\n│   ├── file_547\n│   ├── file_548\n│   ├── file_549\n│   ├── file_550\n│   ├── file_551\n│   ├── file_552\n│   ├── file_553\n│   ├── file_554\n│   ├── file_555\n│   ├── file_556\n│   ├── file_557\n│   ├── file_558\n│   ├── file_559\n│   ├── file_560\n│   ├── file_561\n│   ├── file_562\n│   ├── file_563\n│   ├── file_564\n│   ├── file_565\n│   ├── file_566\n│   ├── file_567\n│   ├── file_568\n│   ├── file_569\n│   ├── file_570\n│   ├── file_571\n│   ├── file_572\n│   ├── file_573\n│   ├── file_574\n│   ├── file_575\n│   ├── file_576\n│   ├── file_577\n│   ├── file_578\n│   ├── file_579\n│   ├── file_580\n│   ├── file_581\n│   ├── file_582\n│   ├── file_583\n│   ├── file_584\n│   ├── file_585\n│   ├── file_586\n│   ├── file_587\n│   ├── file_588\n│   ├── file_589\n│   ├── file_590\n│   ├── file_591\n│   ├── file_592\n│   ├── file_593\n│   ├── file_594\n│   ├── file_595\n│   ├── file_596\n│   ├── file_597\n│   ├── file_598\n│   ├── file_599\n│   ├── file_600\n│   ├── file_601\n│   ├── file_602\n│   ├── file_603\n│   ├── file_604\n│   ├── file_605\n│   ├── file_606\n│   ├── file_607\n│   ├── file_608\n│   ├── file_609\n│   ├── file_610\n│   ├── file_611\n│   ├── file_612\n│   ├── file_613\n│   ├── file_614\n│   ├── file_615\n│   ├── file_616\n│   ├── file_617\n│   ├── file_618\n│   ├── file_619\n│   ├── file_620\n│   ├── file_621\n│   ├── file_622\n│   ├── file_623\n│   ├── file_624\n│   ├── file_625\n│   ├── file_626\n│   ├── file_627\n│   ├── file_628\n│   ├── file_629\n│   ├── file_630\n│   ├── file_631\n│   ├── file_632\n│   ├── file_633\n│   ├── file_634\n│   ├── file_635\n│   ├── file_636\n│   ├── file_637\n│   ├── file_638\n│   ├── file_639\n│   ├── file_640\n│   ├── file_641\n│   ├── file_642\n│   ├── file_643\n│   ├── file_644\n│   ├── file_645\n│   ├── file_646\n│   ├── file_647\n│   ├── file_648\n│   ├── file_649\n│   ├── file_650\n│   ├── file_651\n│   ├── file_652\n│   ├── file_653\n│   ├── file_654\n│   ├── file_655\n│   ├── file_656\n│   ├── file_657\n│   ├── file_658\n│   ├── file_659\n│   ├── file_660\n│   ├── file_661\n│   ├── file_662\n│   ├── file_663\n│   ├── file_664\n│   ├── file_665\n│   ├── file_666\n│   ├── file_667\n│   ├── file_668\n│   ├── file_669\n│   ├── file_670\n│   ├── file_671\n│   ├── file_672\n│   ├── file_673\n│   ├── file_674\n│   ├── file_675\n│   ├── file_676\n│   ├── file_677\n│   ├── file_678\n│   ├── file_679\n│   ├── file_680\n│   ├── file_681\n│   ├── file_682\n│   ├── file_683\n│   ├── file_684\n│   ├── file_685\n│   ├── file_686\n│   ├── file_687\n│   ├── file_688\n│   ├── file_689\n│   ├── file_690\n│   ├── file_691\n│   ├── file_692\n│   ├── file_693\n│   ├── file_694\n│   ├── file_695\n│   ├── file_696\n│   ├── file_697\n│   ├── file_698\n│   ├── file_699\n│   ├── file_700\n│   ├── file_701\n│   ├── file_702\n│   ├── file_703\n│   ├── file_704\n│   ├── file_705\n│   ├── file_706\n│   ├── file_707\n│   ├── file_708\n│   ├── file_709\n│   ├── file_710\n│   ├── file_711\n│   ├── file_712\n│   ├── file_713\n│   ├── file_714\n│   ├── file_715\n│   ├── file_716\n│   ├── file_717\n│   ├── file_718\n│   ├── file_719\n│   ├── file_720\n│   ├── file_721\n│   ├── file_722\n│   ├── file_723\n│   ├── file_724\n│   ├── file_725\n│   ├── file_726\n│   ├── file_727\n│   ├── file_728\n│   ├── file_729\n│   ├── file_730\n│   ├── file_731\n│   ├── file_732\n│   ├── file_733\n│   ├── file_734\n│   ├── file_735\n│   ├── file_736\n│   ├── file_737\n│   ├── file_738\n│   ├── file_739\n│   ├── file_740\n│   ├── file_741\n│   ├── file_742\n│   ├── file_743\n│   ├── file_744\n│   ├── file_745\n│   ├── file_746\n│   ├── file_747\n│   ├── file_748\n│   ├── file_749\n│   ├── file_750\n│   ├── file_751\n│   ├── file_752\n│   ├── file_753\n│   ├── file_754\n│   ├── file_755\n│   ├── file_756\n│   ├── file_757\n│   ├── file_758\n│   ├── file_759\n│   ├── file_760\n│   ├── file_761\n│   ├── file_762\n│   ├── file_763\n│   ├── file_764\n│   ├── file_765\n│   ├── file_766\n│   ├── file_767\n│   ├── file_768\n│   ├── file_769\n│   ├── file_770\n│   ├── file_771\n│   ├── file_772\n│   ├── file_773\n│   ├── file_774\n│   ├── file_775\n│   ├── file_776\n│   ├── file_777\n│   ├── file_778\n│   ├── file_779\n│   ├── file_780\n│   ├── file_781\n│   ├── file_782\n│   ├── file_783\n│   ├── file_784\n│   ├── file_785\n│   ├── file_786\n│   ├── file_787\n│   ├── file_788\n│   ├── file_789\n│   ├── file_790\n│   ├── file_791\n│   ├── file_792\n│   ├── file_793\n│   ├── file_794\n│   ├── file_795\n│   ├── file_796\n│   ├── file_797\n│   ├── file_798\n│   ├── file_799\n│   ├── file_800\n│   ├── file_801\n│   ├── file_802\n│   ├── file_803\n│   ├── file_804\n│   ├── file_805\n│   ├── file_806\n│   ├── file_807\n│   ├── file_808\n│   ├── file_809\n│   ├── file_810\n│   ├── file_811\n│   ├── file_812\n│   ├── file_813\n│   ├── file_814\n│   ├── file_815\n│   ├── file_816\n│   ├── file_817\n│   ├── file_818\n│   ├── file_819\n│   ├── file_820\n│   ├── file_821\n│   ├── file_822\n│   ├── file_823\n│   ├── file_824\n│   ├── file_825\n│   ├── file_826\n│   ├── file_827\n│   ├── file_828\n│   ├── file_829\n│   ├── file_830\n│   ├── file_831\n│   ├── file_832\n│   ├── file_833\n│   ├── file_834\n│   ├── file_835\n│   ├── file_836\n│   ├── file_837\n│   ├── file_838\n│   ├── file_839\n│   ├── file_840\n│   ├── file_841\n│   ├── file_842\n│   ├── file_843\n│   ├── file_844\n│   ├── file_845\n│   ├── file_846\n│   ├── file_847\n│   ├── file_848\n│   ├── file_849\n│   ├── file_850\n│   ├── file_851\n│   ├── file_852\n│   ├── file_853\n│   ├── file_854\n│   ├── file_855\n│   ├── file_856\n│   ├── file_857\n│   ├── file_858\n│   ├── file_859\n│   ├── file_860\n│   ├── file_861\n│   ├── file_862\n│   ├── file_863\n│   ├── file_864\n│   ├── file_865\n│   ├── file_866\n│   ├── file_867\n│   ├── file_868\n│   ├── file_869\n│   ├── file_870\n│   ├── file_871\n│   ├── file_872\n│   ├── file_873\n│   ├── file_874\n│   ├── file_875\n│   ├── file_876\n│   ├── file_877\n│   ├── file_878\n│   ├── file_879\n│   ├── file_880\n│   ├── file_881\n│   ├── file_882\n│   ├── file_883\n│   ├── file_884\n│   ├── file_885\n│   ├── file_886\n│   ├── file_887\n│   ├── file_888\n│   ├── file_889\n│   ├── file_890\n│   ├── file_891\n│   ├── file_892\n│   ├── file_893\n│   ├── file_894\n│   ├── file_895\n│   ├── file_896\n│   ├── file_897\n│   ├── file_898\n│   ├── file_899\n│   ├── file_900\n│   ├── file_901\n│   ├── file_902\n│   ├── file_903\n│   ├── file_904\n│   ├── file_905\n│   ├── file_906\n│   ├── file_907\n│   ├── file_908\n│   ├── file_909\n│   ├── file_910\n│   ├── file_911\n│   ├── file_912\n│   ├── file_913\n│   ├── file_914\n│   ├── file_915\n│   ├── file_916\n│   ├── file_917\n│   ├── file_918\n│   ├── file_919\n│   ├── file_920\n│   ├── file_921\n│   ├── file_922\n│   ├── file_923\n│   ├── file_924\n│   ├── file_925\n│   ├── file_926\n│   ├── file_927\n│   ├── file_928\n│   ├── file_929\n│   ├── file_930\n│   ├── file_931\n│   ├── file_932\n│   ├── file_933\n│   ├── file_934\n│   ├── file_935\n│   ├── file_936\n│   ├── file_937\n│   ├── file_938\n│   ├── file_939\n│   ├── file_940\n│   ├── file_941\n│   ├── file_942\n│   ├── file_943\n│   ├── file_944\n│   ├── file_945\n│   ├── file_946\n│   ├── file_947\n│   ├── file_948\n│   ├── file_949\n│   ├── file_950\n│   ├── file_951\n│   ├── file_952\n│   ├── file_953\n│   ├── file_954\n│   ├── file_955\n│   ├── file_956\n│   ├── file_957\n│   ├── file_958\n│   ├── file_959\n│   ├── file_960\n│   ├── file_961\n│   ├── file_962\n│   ├── file_963\n│   ├── file_964\n│   ├── file_965\n│   ├── file_966\n│   ├── file_967\n│   ├── file_968\n│   ├── file_969\n│   ├── file_970\n│   ├── file_971\n│   ├── file_972\n│   ├── file_973\n│   ├── file_974\n│   ├── file_975\n│   ├── file_976\n│   ├── file_977\n│   ├── file_978\n│   ├── file_979\n│   ├── file_980\n│   ├── file_981\n│   ├── file_982\n│   ├── file_983\n│   ├── file_984\n│   ├── file_985\n│   ├── file_986\n│   ├── file_987\n│   ├── file_988\n│   ├── file_989\n│   ├── file_990\n│   ├── file_991\n│   ├── file_992\n│   ├── file_993\n│   ├── file_994\n│   ├── file_995\n│   ├── file_996\n│   ├── file_997\n│   ├── file_998\n│   └── file_999\n├── group\n│   └── file\n├── icons\n│   ├── c++.cpp\n│   ├── c.c\n│   ├── css.css\n│   ├── file\n│   ├── go.go\n│   ├── html.html\n│   ├── java.java\n│   ├── javascript.js\n│   ├── man.1\n│   ├── marked.md\n│   ├── php.php\n│   ├── python.py\n│   ├── ruby.rb\n│   ├── rust.rs\n│   ├── shell.sh\n│   └── unknown.unknown\n├── perms\n│   ├── file\n│   └── file2\n├── size\n│   ├── 1B\n│   ├── 1K\n│   ├── 1M\n│   └── 1337\n├── specials\n├── symlinks\n│   ├── dir\n│   ├── file\n│   ├── ' lorem ipsum'\n│   ├── symlink -> file\n│   ├── symlink2 -> symlink\n│   ├── symlink3 -> dir\n│   └── symlink4 -> pipitek\n└── time\n    ├── 1d\n    ├── 1h\n    ├── 1m\n    ├── 1s\n    ├── 1y\n    └── epoch\n"
  },
  {
    "path": "tests/ptests/ptest_5bf846977eb5a96e.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T --level 3\""
  },
  {
    "path": "tests/ptests/ptest_5c5f8c58460e0026.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_5c5f8c58460e0026.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_5c5f8c58460e0026.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --group-directories-last \""
  },
  {
    "path": "tests/ptests/ptest_5d72b8a5ba66436b.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_5d72b8a5ba66436b.stdout",
    "content": "tests/test_dir\n├── git\n│   ├── 001\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 002\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 003\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 004\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 005\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 006\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 007\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 008\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 009\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   └── 010\n│       ├── file_000\n│       ├── file_001\n│       ├── file_002\n│       ├── file_003\n│       ├── file_004\n│       ├── file_005\n│       ├── file_006\n│       ├── file_007\n│       ├── file_008\n│       └── file_009\n├── grid\n│   ├── 0001\n│   ├── 0002\n│   ├── 0003\n│   ├── 0004\n│   ├── 0005\n│   ├── 0006\n│   ├── 0007\n│   ├── 0008\n│   ├── 0009\n│   ├── 0010\n│   ├── 0011\n│   ├── 0012\n│   ├── 0013\n│   ├── 0014\n│   ├── 0015\n│   ├── 0016\n│   ├── 0017\n│   ├── 0018\n│   ├── 0019\n│   ├── 0020\n│   ├── 0021\n│   ├── 0022\n│   ├── 0023\n│   ├── 0024\n│   ├── 0025\n│   ├── 0026\n│   ├── 0027\n│   ├── 0028\n│   ├── 0029\n│   ├── 0030\n│   ├── 0031\n│   ├── 0032\n│   ├── 0033\n│   ├── 0034\n│   ├── 0035\n│   ├── 0036\n│   ├── 0037\n│   ├── 0038\n│   ├── 0039\n│   ├── 0040\n│   ├── 0041\n│   ├── 0042\n│   ├── 0043\n│   ├── 0044\n│   ├── 0045\n│   ├── 0046\n│   ├── 0047\n│   ├── 0048\n│   ├── 0049\n│   ├── 0050\n│   ├── 0051\n│   ├── 0052\n│   ├── 0053\n│   ├── 0054\n│   ├── 0055\n│   ├── 0056\n│   ├── 0057\n│   ├── 0058\n│   ├── 0059\n│   ├── 0060\n│   ├── 0061\n│   ├── 0062\n│   ├── 0063\n│   ├── 0064\n│   ├── 0065\n│   ├── 0066\n│   ├── 0067\n│   ├── 0068\n│   ├── 0069\n│   ├── 0070\n│   ├── 0071\n│   ├── 0072\n│   ├── 0073\n│   ├── 0074\n│   ├── 0075\n│   ├── 0076\n│   ├── 0077\n│   ├── 0078\n│   ├── 0079\n│   ├── 0080\n│   ├── 0081\n│   ├── 0082\n│   ├── 0083\n│   ├── 0084\n│   ├── 0085\n│   ├── 0086\n│   ├── 0087\n│   ├── 0088\n│   ├── 0089\n│   ├── 0090\n│   ├── 0091\n│   ├── 0092\n│   ├── 0093\n│   ├── 0094\n│   ├── 0095\n│   ├── 0096\n│   ├── 0097\n│   ├── 0098\n│   ├── 0099\n│   ├── 0100\n│   ├── 0101\n│   ├── 0102\n│   ├── 0103\n│   ├── 0104\n│   ├── 0105\n│   ├── 0106\n│   ├── 0107\n│   ├── 0108\n│   ├── 0109\n│   ├── 0110\n│   ├── 0111\n│   ├── 0112\n│   ├── 0113\n│   ├── 0114\n│   ├── 0115\n│   ├── 0116\n│   ├── 0117\n│   ├── 0118\n│   ├── 0119\n│   ├── 0120\n│   ├── 0121\n│   ├── 0122\n│   ├── 0123\n│   ├── 0124\n│   ├── 0125\n│   ├── 0126\n│   ├── 0127\n│   ├── 0128\n│   ├── 0129\n│   ├── 0130\n│   ├── 0131\n│   ├── 0132\n│   ├── 0133\n│   ├── 0134\n│   ├── 0135\n│   ├── 0136\n│   ├── 0137\n│   ├── 0138\n│   ├── 0139\n│   ├── 0140\n│   ├── 0141\n│   ├── 0142\n│   ├── 0143\n│   ├── 0144\n│   ├── 0145\n│   ├── 0146\n│   ├── 0147\n│   ├── 0148\n│   ├── 0149\n│   ├── 0150\n│   ├── 0151\n│   ├── 0152\n│   ├── 0153\n│   ├── 0154\n│   ├── 0155\n│   ├── 0156\n│   ├── 0157\n│   ├── 0158\n│   ├── 0159\n│   ├── 0160\n│   ├── 0161\n│   ├── 0162\n│   ├── 0163\n│   ├── 0164\n│   ├── 0165\n│   ├── 0166\n│   ├── 0167\n│   ├── 0168\n│   ├── 0169\n│   ├── 0170\n│   ├── 0171\n│   ├── 0172\n│   ├── 0173\n│   ├── 0174\n│   ├── 0175\n│   ├── 0176\n│   ├── 0177\n│   ├── 0178\n│   ├── 0179\n│   ├── 0180\n│   ├── 0181\n│   ├── 0182\n│   ├── 0183\n│   ├── 0184\n│   ├── 0185\n│   ├── 0186\n│   ├── 0187\n│   ├── 0188\n│   ├── 0189\n│   ├── 0190\n│   ├── 0191\n│   ├── 0192\n│   ├── 0193\n│   ├── 0194\n│   ├── 0195\n│   ├── 0196\n│   ├── 0197\n│   ├── 0198\n│   ├── 0199\n│   ├── 0200\n│   ├── 0201\n│   ├── 0202\n│   ├── 0203\n│   ├── 0204\n│   ├── 0205\n│   ├── 0206\n│   ├── 0207\n│   ├── 0208\n│   ├── 0209\n│   ├── 0210\n│   ├── 0211\n│   ├── 0212\n│   ├── 0213\n│   ├── 0214\n│   ├── 0215\n│   ├── 0216\n│   ├── 0217\n│   ├── 0218\n│   ├── 0219\n│   ├── 0220\n│   ├── 0221\n│   ├── 0222\n│   ├── 0223\n│   ├── 0224\n│   ├── 0225\n│   ├── 0226\n│   ├── 0227\n│   ├── 0228\n│   ├── 0229\n│   ├── 0230\n│   ├── 0231\n│   ├── 0232\n│   ├── 0233\n│   ├── 0234\n│   ├── 0235\n│   ├── 0236\n│   ├── 0237\n│   ├── 0238\n│   ├── 0239\n│   ├── 0240\n│   ├── 0241\n│   ├── 0242\n│   ├── 0243\n│   ├── 0244\n│   ├── 0245\n│   ├── 0246\n│   ├── 0247\n│   ├── 0248\n│   ├── 0249\n│   ├── 0250\n│   ├── 0251\n│   ├── 0252\n│   ├── 0253\n│   ├── 0254\n│   ├── 0255\n│   ├── 0256\n│   ├── 0257\n│   ├── 0258\n│   ├── 0259\n│   ├── 0260\n│   ├── 0261\n│   ├── 0262\n│   ├── 0263\n│   ├── 0264\n│   ├── 0265\n│   ├── 0266\n│   ├── 0267\n│   ├── 0268\n│   ├── 0269\n│   ├── 0270\n│   ├── 0271\n│   ├── 0272\n│   ├── 0273\n│   ├── 0274\n│   ├── 0275\n│   ├── 0276\n│   ├── 0277\n│   ├── 0278\n│   ├── 0279\n│   ├── 0280\n│   ├── 0281\n│   ├── 0282\n│   ├── 0283\n│   ├── 0284\n│   ├── 0285\n│   ├── 0286\n│   ├── 0287\n│   ├── 0288\n│   ├── 0289\n│   ├── 0290\n│   ├── 0291\n│   ├── 0292\n│   ├── 0293\n│   ├── 0294\n│   ├── 0295\n│   ├── 0296\n│   ├── 0297\n│   ├── 0298\n│   ├── 0299\n│   ├── 0300\n│   ├── 0301\n│   ├── 0302\n│   ├── 0303\n│   ├── 0304\n│   ├── 0305\n│   ├── 0306\n│   ├── 0307\n│   ├── 0308\n│   ├── 0309\n│   ├── 0310\n│   ├── 0311\n│   ├── 0312\n│   ├── 0313\n│   ├── 0314\n│   ├── 0315\n│   ├── 0316\n│   ├── 0317\n│   ├── 0318\n│   ├── 0319\n│   ├── 0320\n│   ├── 0321\n│   ├── 0322\n│   ├── 0323\n│   ├── 0324\n│   ├── 0325\n│   ├── 0326\n│   ├── 0327\n│   ├── 0328\n│   ├── 0329\n│   ├── 0330\n│   ├── 0331\n│   ├── 0332\n│   ├── 0333\n│   ├── 0334\n│   ├── 0335\n│   ├── 0336\n│   ├── 0337\n│   ├── 0338\n│   ├── 0339\n│   ├── 0340\n│   ├── 0341\n│   ├── 0342\n│   ├── 0343\n│   ├── 0344\n│   ├── 0345\n│   ├── 0346\n│   ├── 0347\n│   ├── 0348\n│   ├── 0349\n│   ├── 0350\n│   ├── 0351\n│   ├── 0352\n│   ├── 0353\n│   ├── 0354\n│   ├── 0355\n│   ├── 0356\n│   ├── 0357\n│   ├── 0358\n│   ├── 0359\n│   ├── 0360\n│   ├── 0361\n│   ├── 0362\n│   ├── 0363\n│   ├── 0364\n│   ├── 0365\n│   ├── 0366\n│   ├── 0367\n│   ├── 0368\n│   ├── 0369\n│   ├── 0370\n│   ├── 0371\n│   ├── 0372\n│   ├── 0373\n│   ├── 0374\n│   ├── 0375\n│   ├── 0376\n│   ├── 0377\n│   ├── 0378\n│   ├── 0379\n│   ├── 0380\n│   ├── 0381\n│   ├── 0382\n│   ├── 0383\n│   ├── 0384\n│   ├── 0385\n│   ├── 0386\n│   ├── 0387\n│   ├── 0388\n│   ├── 0389\n│   ├── 0390\n│   ├── 0391\n│   ├── 0392\n│   ├── 0393\n│   ├── 0394\n│   ├── 0395\n│   ├── 0396\n│   ├── 0397\n│   ├── 0398\n│   ├── 0399\n│   ├── 0400\n│   ├── 0401\n│   ├── 0402\n│   ├── 0403\n│   ├── 0404\n│   ├── 0405\n│   ├── 0406\n│   ├── 0407\n│   ├── 0408\n│   ├── 0409\n│   ├── 0410\n│   ├── 0411\n│   ├── 0412\n│   ├── 0413\n│   ├── 0414\n│   ├── 0415\n│   ├── 0416\n│   ├── 0417\n│   ├── 0418\n│   ├── 0419\n│   ├── 0420\n│   ├── 0421\n│   ├── 0422\n│   ├── 0423\n│   ├── 0424\n│   ├── 0425\n│   ├── 0426\n│   ├── 0427\n│   ├── 0428\n│   ├── 0429\n│   ├── 0430\n│   ├── 0431\n│   ├── 0432\n│   ├── 0433\n│   ├── 0434\n│   ├── 0435\n│   ├── 0436\n│   ├── 0437\n│   ├── 0438\n│   ├── 0439\n│   ├── 0440\n│   ├── 0441\n│   ├── 0442\n│   ├── 0443\n│   ├── 0444\n│   ├── 0445\n│   ├── 0446\n│   ├── 0447\n│   ├── 0448\n│   ├── 0449\n│   ├── 0450\n│   ├── 0451\n│   ├── 0452\n│   ├── 0453\n│   ├── 0454\n│   ├── 0455\n│   ├── 0456\n│   ├── 0457\n│   ├── 0458\n│   ├── 0459\n│   ├── 0460\n│   ├── 0461\n│   ├── 0462\n│   ├── 0463\n│   ├── 0464\n│   ├── 0465\n│   ├── 0466\n│   ├── 0467\n│   ├── 0468\n│   ├── 0469\n│   ├── 0470\n│   ├── 0471\n│   ├── 0472\n│   ├── 0473\n│   ├── 0474\n│   ├── 0475\n│   ├── 0476\n│   ├── 0477\n│   ├── 0478\n│   ├── 0479\n│   ├── 0480\n│   ├── 0481\n│   ├── 0482\n│   ├── 0483\n│   ├── 0484\n│   ├── 0485\n│   ├── 0486\n│   ├── 0487\n│   ├── 0488\n│   ├── 0489\n│   ├── 0490\n│   ├── 0491\n│   ├── 0492\n│   ├── 0493\n│   ├── 0494\n│   ├── 0495\n│   ├── 0496\n│   ├── 0497\n│   ├── 0498\n│   ├── 0499\n│   ├── 0500\n│   ├── 0501\n│   ├── 0502\n│   ├── 0503\n│   ├── 0504\n│   ├── 0505\n│   ├── 0506\n│   ├── 0507\n│   ├── 0508\n│   ├── 0509\n│   ├── 0510\n│   ├── 0511\n│   ├── 0512\n│   ├── 0513\n│   ├── 0514\n│   ├── 0515\n│   ├── 0516\n│   ├── 0517\n│   ├── 0518\n│   ├── 0519\n│   ├── 0520\n│   ├── 0521\n│   ├── 0522\n│   ├── 0523\n│   ├── 0524\n│   ├── 0525\n│   ├── 0526\n│   ├── 0527\n│   ├── 0528\n│   ├── 0529\n│   ├── 0530\n│   ├── 0531\n│   ├── 0532\n│   ├── 0533\n│   ├── 0534\n│   ├── 0535\n│   ├── 0536\n│   ├── 0537\n│   ├── 0538\n│   ├── 0539\n│   ├── 0540\n│   ├── 0541\n│   ├── 0542\n│   ├── 0543\n│   ├── 0544\n│   ├── 0545\n│   ├── 0546\n│   ├── 0547\n│   ├── 0548\n│   ├── 0549\n│   ├── 0550\n│   ├── 0551\n│   ├── 0552\n│   ├── 0553\n│   ├── 0554\n│   ├── 0555\n│   ├── 0556\n│   ├── 0557\n│   ├── 0558\n│   ├── 0559\n│   ├── 0560\n│   ├── 0561\n│   ├── 0562\n│   ├── 0563\n│   ├── 0564\n│   ├── 0565\n│   ├── 0566\n│   ├── 0567\n│   ├── 0568\n│   ├── 0569\n│   ├── 0570\n│   ├── 0571\n│   ├── 0572\n│   ├── 0573\n│   ├── 0574\n│   ├── 0575\n│   ├── 0576\n│   ├── 0577\n│   ├── 0578\n│   ├── 0579\n│   ├── 0580\n│   ├── 0581\n│   ├── 0582\n│   ├── 0583\n│   ├── 0584\n│   ├── 0585\n│   ├── 0586\n│   ├── 0587\n│   ├── 0588\n│   ├── 0589\n│   ├── 0590\n│   ├── 0591\n│   ├── 0592\n│   ├── 0593\n│   ├── 0594\n│   ├── 0595\n│   ├── 0596\n│   ├── 0597\n│   ├── 0598\n│   ├── 0599\n│   ├── 0600\n│   ├── 0601\n│   ├── 0602\n│   ├── 0603\n│   ├── 0604\n│   ├── 0605\n│   ├── 0606\n│   ├── 0607\n│   ├── 0608\n│   ├── 0609\n│   ├── 0610\n│   ├── 0611\n│   ├── 0612\n│   ├── 0613\n│   ├── 0614\n│   ├── 0615\n│   ├── 0616\n│   ├── 0617\n│   ├── 0618\n│   ├── 0619\n│   ├── 0620\n│   ├── 0621\n│   ├── 0622\n│   ├── 0623\n│   ├── 0624\n│   ├── 0625\n│   ├── 0626\n│   ├── 0627\n│   ├── 0628\n│   ├── 0629\n│   ├── 0630\n│   ├── 0631\n│   ├── 0632\n│   ├── 0633\n│   ├── 0634\n│   ├── 0635\n│   ├── 0636\n│   ├── 0637\n│   ├── 0638\n│   ├── 0639\n│   ├── 0640\n│   ├── 0641\n│   ├── 0642\n│   ├── 0643\n│   ├── 0644\n│   ├── 0645\n│   ├── 0646\n│   ├── 0647\n│   ├── 0648\n│   ├── 0649\n│   ├── 0650\n│   ├── 0651\n│   ├── 0652\n│   ├── 0653\n│   ├── 0654\n│   ├── 0655\n│   ├── 0656\n│   ├── 0657\n│   ├── 0658\n│   ├── 0659\n│   ├── 0660\n│   ├── 0661\n│   ├── 0662\n│   ├── 0663\n│   ├── 0664\n│   ├── 0665\n│   ├── 0666\n│   ├── 0667\n│   ├── 0668\n│   ├── 0669\n│   ├── 0670\n│   ├── 0671\n│   ├── 0672\n│   ├── 0673\n│   ├── 0674\n│   ├── 0675\n│   ├── 0676\n│   ├── 0677\n│   ├── 0678\n│   ├── 0679\n│   ├── 0680\n│   ├── 0681\n│   ├── 0682\n│   ├── 0683\n│   ├── 0684\n│   ├── 0685\n│   ├── 0686\n│   ├── 0687\n│   ├── 0688\n│   ├── 0689\n│   ├── 0690\n│   ├── 0691\n│   ├── 0692\n│   ├── 0693\n│   ├── 0694\n│   ├── 0695\n│   ├── 0696\n│   ├── 0697\n│   ├── 0698\n│   ├── 0699\n│   ├── 0700\n│   ├── 0701\n│   ├── 0702\n│   ├── 0703\n│   ├── 0704\n│   ├── 0705\n│   ├── 0706\n│   ├── 0707\n│   ├── 0708\n│   ├── 0709\n│   ├── 0710\n│   ├── 0711\n│   ├── 0712\n│   ├── 0713\n│   ├── 0714\n│   ├── 0715\n│   ├── 0716\n│   ├── 0717\n│   ├── 0718\n│   ├── 0719\n│   ├── 0720\n│   ├── 0721\n│   ├── 0722\n│   ├── 0723\n│   ├── 0724\n│   ├── 0725\n│   ├── 0726\n│   ├── 0727\n│   ├── 0728\n│   ├── 0729\n│   ├── 0730\n│   ├── 0731\n│   ├── 0732\n│   ├── 0733\n│   ├── 0734\n│   ├── 0735\n│   ├── 0736\n│   ├── 0737\n│   ├── 0738\n│   ├── 0739\n│   ├── 0740\n│   ├── 0741\n│   ├── 0742\n│   ├── 0743\n│   ├── 0744\n│   ├── 0745\n│   ├── 0746\n│   ├── 0747\n│   ├── 0748\n│   ├── 0749\n│   ├── 0750\n│   ├── 0751\n│   ├── 0752\n│   ├── 0753\n│   ├── 0754\n│   ├── 0755\n│   ├── 0756\n│   ├── 0757\n│   ├── 0758\n│   ├── 0759\n│   ├── 0760\n│   ├── 0761\n│   ├── 0762\n│   ├── 0763\n│   ├── 0764\n│   ├── 0765\n│   ├── 0766\n│   ├── 0767\n│   ├── 0768\n│   ├── 0769\n│   ├── 0770\n│   ├── 0771\n│   ├── 0772\n│   ├── 0773\n│   ├── 0774\n│   ├── 0775\n│   ├── 0776\n│   ├── 0777\n│   ├── 0778\n│   ├── 0779\n│   ├── 0780\n│   ├── 0781\n│   ├── 0782\n│   ├── 0783\n│   ├── 0784\n│   ├── 0785\n│   ├── 0786\n│   ├── 0787\n│   ├── 0788\n│   ├── 0789\n│   ├── 0790\n│   ├── 0791\n│   ├── 0792\n│   ├── 0793\n│   ├── 0794\n│   ├── 0795\n│   ├── 0796\n│   ├── 0797\n│   ├── 0798\n│   ├── 0799\n│   ├── 0800\n│   ├── 0801\n│   ├── 0802\n│   ├── 0803\n│   ├── 0804\n│   ├── 0805\n│   ├── 0806\n│   ├── 0807\n│   ├── 0808\n│   ├── 0809\n│   ├── 0810\n│   ├── 0811\n│   ├── 0812\n│   ├── 0813\n│   ├── 0814\n│   ├── 0815\n│   ├── 0816\n│   ├── 0817\n│   ├── 0818\n│   ├── 0819\n│   ├── 0820\n│   ├── 0821\n│   ├── 0822\n│   ├── 0823\n│   ├── 0824\n│   ├── 0825\n│   ├── 0826\n│   ├── 0827\n│   ├── 0828\n│   ├── 0829\n│   ├── 0830\n│   ├── 0831\n│   ├── 0832\n│   ├── 0833\n│   ├── 0834\n│   ├── 0835\n│   ├── 0836\n│   ├── 0837\n│   ├── 0838\n│   ├── 0839\n│   ├── 0840\n│   ├── 0841\n│   ├── 0842\n│   ├── 0843\n│   ├── 0844\n│   ├── 0845\n│   ├── 0846\n│   ├── 0847\n│   ├── 0848\n│   ├── 0849\n│   ├── 0850\n│   ├── 0851\n│   ├── 0852\n│   ├── 0853\n│   ├── 0854\n│   ├── 0855\n│   ├── 0856\n│   ├── 0857\n│   ├── 0858\n│   ├── 0859\n│   ├── 0860\n│   ├── 0861\n│   ├── 0862\n│   ├── 0863\n│   ├── 0864\n│   ├── 0865\n│   ├── 0866\n│   ├── 0867\n│   ├── 0868\n│   ├── 0869\n│   ├── 0870\n│   ├── 0871\n│   ├── 0872\n│   ├── 0873\n│   ├── 0874\n│   ├── 0875\n│   ├── 0876\n│   ├── 0877\n│   ├── 0878\n│   ├── 0879\n│   ├── 0880\n│   ├── 0881\n│   ├── 0882\n│   ├── 0883\n│   ├── 0884\n│   ├── 0885\n│   ├── 0886\n│   ├── 0887\n│   ├── 0888\n│   ├── 0889\n│   ├── 0890\n│   ├── 0891\n│   ├── 0892\n│   ├── 0893\n│   ├── 0894\n│   ├── 0895\n│   ├── 0896\n│   ├── 0897\n│   ├── 0898\n│   ├── 0899\n│   ├── 0900\n│   ├── 0901\n│   ├── 0902\n│   ├── 0903\n│   ├── 0904\n│   ├── 0905\n│   ├── 0906\n│   ├── 0907\n│   ├── 0908\n│   ├── 0909\n│   ├── 0910\n│   ├── 0911\n│   ├── 0912\n│   ├── 0913\n│   ├── 0914\n│   ├── 0915\n│   ├── 0916\n│   ├── 0917\n│   ├── 0918\n│   ├── 0919\n│   ├── 0920\n│   ├── 0921\n│   ├── 0922\n│   ├── 0923\n│   ├── 0924\n│   ├── 0925\n│   ├── 0926\n│   ├── 0927\n│   ├── 0928\n│   ├── 0929\n│   ├── 0930\n│   ├── 0931\n│   ├── 0932\n│   ├── 0933\n│   ├── 0934\n│   ├── 0935\n│   ├── 0936\n│   ├── 0937\n│   ├── 0938\n│   ├── 0939\n│   ├── 0940\n│   ├── 0941\n│   ├── 0942\n│   ├── 0943\n│   ├── 0944\n│   ├── 0945\n│   ├── 0946\n│   ├── 0947\n│   ├── 0948\n│   ├── 0949\n│   ├── 0950\n│   ├── 0951\n│   ├── 0952\n│   ├── 0953\n│   ├── 0954\n│   ├── 0955\n│   ├── 0956\n│   ├── 0957\n│   ├── 0958\n│   ├── 0959\n│   ├── 0960\n│   ├── 0961\n│   ├── 0962\n│   ├── 0963\n│   ├── 0964\n│   ├── 0965\n│   ├── 0966\n│   ├── 0967\n│   ├── 0968\n│   ├── 0969\n│   ├── 0970\n│   ├── 0971\n│   ├── 0972\n│   ├── 0973\n│   ├── 0974\n│   ├── 0975\n│   ├── 0976\n│   ├── 0977\n│   ├── 0978\n│   ├── 0979\n│   ├── 0980\n│   ├── 0981\n│   ├── 0982\n│   ├── 0983\n│   ├── 0984\n│   ├── 0985\n│   ├── 0986\n│   ├── 0987\n│   ├── 0988\n│   ├── 0989\n│   ├── 0990\n│   ├── 0991\n│   ├── 0992\n│   ├── 0993\n│   ├── 0994\n│   ├── 0995\n│   ├── 0996\n│   ├── 0997\n│   ├── 0998\n│   ├── 0999\n│   ├── 1000\n│   ├── file_000\n│   ├── file_001\n│   ├── file_002\n│   ├── file_003\n│   ├── file_004\n│   ├── file_005\n│   ├── file_006\n│   ├── file_007\n│   ├── file_008\n│   ├── file_009\n│   ├── file_010\n│   ├── file_011\n│   ├── file_012\n│   ├── file_013\n│   ├── file_014\n│   ├── file_015\n│   ├── file_016\n│   ├── file_017\n│   ├── file_018\n│   ├── file_019\n│   ├── file_020\n│   ├── file_021\n│   ├── file_022\n│   ├── file_023\n│   ├── file_024\n│   ├── file_025\n│   ├── file_026\n│   ├── file_027\n│   ├── file_028\n│   ├── file_029\n│   ├── file_030\n│   ├── file_031\n│   ├── file_032\n│   ├── file_033\n│   ├── file_034\n│   ├── file_035\n│   ├── file_036\n│   ├── file_037\n│   ├── file_038\n│   ├── file_039\n│   ├── file_040\n│   ├── file_041\n│   ├── file_042\n│   ├── file_043\n│   ├── file_044\n│   ├── file_045\n│   ├── file_046\n│   ├── file_047\n│   ├── file_048\n│   ├── file_049\n│   ├── file_050\n│   ├── file_051\n│   ├── file_052\n│   ├── file_053\n│   ├── file_054\n│   ├── file_055\n│   ├── file_056\n│   ├── file_057\n│   ├── file_058\n│   ├── file_059\n│   ├── file_060\n│   ├── file_061\n│   ├── file_062\n│   ├── file_063\n│   ├── file_064\n│   ├── file_065\n│   ├── file_066\n│   ├── file_067\n│   ├── file_068\n│   ├── file_069\n│   ├── file_070\n│   ├── file_071\n│   ├── file_072\n│   ├── file_073\n│   ├── file_074\n│   ├── file_075\n│   ├── file_076\n│   ├── file_077\n│   ├── file_078\n│   ├── file_079\n│   ├── file_080\n│   ├── file_081\n│   ├── file_082\n│   ├── file_083\n│   ├── file_084\n│   ├── file_085\n│   ├── file_086\n│   ├── file_087\n│   ├── file_088\n│   ├── file_089\n│   ├── file_090\n│   ├── file_091\n│   ├── file_092\n│   ├── file_093\n│   ├── file_094\n│   ├── file_095\n│   ├── file_096\n│   ├── file_097\n│   ├── file_098\n│   ├── file_099\n│   ├── file_100\n│   ├── file_101\n│   ├── file_102\n│   ├── file_103\n│   ├── file_104\n│   ├── file_105\n│   ├── file_106\n│   ├── file_107\n│   ├── file_108\n│   ├── file_109\n│   ├── file_110\n│   ├── file_111\n│   ├── file_112\n│   ├── file_113\n│   ├── file_114\n│   ├── file_115\n│   ├── file_116\n│   ├── file_117\n│   ├── file_118\n│   ├── file_119\n│   ├── file_120\n│   ├── file_121\n│   ├── file_122\n│   ├── file_123\n│   ├── file_124\n│   ├── file_125\n│   ├── file_126\n│   ├── file_127\n│   ├── file_128\n│   ├── file_129\n│   ├── file_130\n│   ├── file_131\n│   ├── file_132\n│   ├── file_133\n│   ├── file_134\n│   ├── file_135\n│   ├── file_136\n│   ├── file_137\n│   ├── file_138\n│   ├── file_139\n│   ├── file_140\n│   ├── file_141\n│   ├── file_142\n│   ├── file_143\n│   ├── file_144\n│   ├── file_145\n│   ├── file_146\n│   ├── file_147\n│   ├── file_148\n│   ├── file_149\n│   ├── file_150\n│   ├── file_151\n│   ├── file_152\n│   ├── file_153\n│   ├── file_154\n│   ├── file_155\n│   ├── file_156\n│   ├── file_157\n│   ├── file_158\n│   ├── file_159\n│   ├── file_160\n│   ├── file_161\n│   ├── file_162\n│   ├── file_163\n│   ├── file_164\n│   ├── file_165\n│   ├── file_166\n│   ├── file_167\n│   ├── file_168\n│   ├── file_169\n│   ├── file_170\n│   ├── file_171\n│   ├── file_172\n│   ├── file_173\n│   ├── file_174\n│   ├── file_175\n│   ├── file_176\n│   ├── file_177\n│   ├── file_178\n│   ├── file_179\n│   ├── file_180\n│   ├── file_181\n│   ├── file_182\n│   ├── file_183\n│   ├── file_184\n│   ├── file_185\n│   ├── file_186\n│   ├── file_187\n│   ├── file_188\n│   ├── file_189\n│   ├── file_190\n│   ├── file_191\n│   ├── file_192\n│   ├── file_193\n│   ├── file_194\n│   ├── file_195\n│   ├── file_196\n│   ├── file_197\n│   ├── file_198\n│   ├── file_199\n│   ├── file_200\n│   ├── file_201\n│   ├── file_202\n│   ├── file_203\n│   ├── file_204\n│   ├── file_205\n│   ├── file_206\n│   ├── file_207\n│   ├── file_208\n│   ├── file_209\n│   ├── file_210\n│   ├── file_211\n│   ├── file_212\n│   ├── file_213\n│   ├── file_214\n│   ├── file_215\n│   ├── file_216\n│   ├── file_217\n│   ├── file_218\n│   ├── file_219\n│   ├── file_220\n│   ├── file_221\n│   ├── file_222\n│   ├── file_223\n│   ├── file_224\n│   ├── file_225\n│   ├── file_226\n│   ├── file_227\n│   ├── file_228\n│   ├── file_229\n│   ├── file_230\n│   ├── file_231\n│   ├── file_232\n│   ├── file_233\n│   ├── file_234\n│   ├── file_235\n│   ├── file_236\n│   ├── file_237\n│   ├── file_238\n│   ├── file_239\n│   ├── file_240\n│   ├── file_241\n│   ├── file_242\n│   ├── file_243\n│   ├── file_244\n│   ├── file_245\n│   ├── file_246\n│   ├── file_247\n│   ├── file_248\n│   ├── file_249\n│   ├── file_250\n│   ├── file_251\n│   ├── file_252\n│   ├── file_253\n│   ├── file_254\n│   ├── file_255\n│   ├── file_256\n│   ├── file_257\n│   ├── file_258\n│   ├── file_259\n│   ├── file_260\n│   ├── file_261\n│   ├── file_262\n│   ├── file_263\n│   ├── file_264\n│   ├── file_265\n│   ├── file_266\n│   ├── file_267\n│   ├── file_268\n│   ├── file_269\n│   ├── file_270\n│   ├── file_271\n│   ├── file_272\n│   ├── file_273\n│   ├── file_274\n│   ├── file_275\n│   ├── file_276\n│   ├── file_277\n│   ├── file_278\n│   ├── file_279\n│   ├── file_280\n│   ├── file_281\n│   ├── file_282\n│   ├── file_283\n│   ├── file_284\n│   ├── file_285\n│   ├── file_286\n│   ├── file_287\n│   ├── file_288\n│   ├── file_289\n│   ├── file_290\n│   ├── file_291\n│   ├── file_292\n│   ├── file_293\n│   ├── file_294\n│   ├── file_295\n│   ├── file_296\n│   ├── file_297\n│   ├── file_298\n│   ├── file_299\n│   ├── file_300\n│   ├── file_301\n│   ├── file_302\n│   ├── file_303\n│   ├── file_304\n│   ├── file_305\n│   ├── file_306\n│   ├── file_307\n│   ├── file_308\n│   ├── file_309\n│   ├── file_310\n│   ├── file_311\n│   ├── file_312\n│   ├── file_313\n│   ├── file_314\n│   ├── file_315\n│   ├── file_316\n│   ├── file_317\n│   ├── file_318\n│   ├── file_319\n│   ├── file_320\n│   ├── file_321\n│   ├── file_322\n│   ├── file_323\n│   ├── file_324\n│   ├── file_325\n│   ├── file_326\n│   ├── file_327\n│   ├── file_328\n│   ├── file_329\n│   ├── file_330\n│   ├── file_331\n│   ├── file_332\n│   ├── file_333\n│   ├── file_334\n│   ├── file_335\n│   ├── file_336\n│   ├── file_337\n│   ├── file_338\n│   ├── file_339\n│   ├── file_340\n│   ├── file_341\n│   ├── file_342\n│   ├── file_343\n│   ├── file_344\n│   ├── file_345\n│   ├── file_346\n│   ├── file_347\n│   ├── file_348\n│   ├── file_349\n│   ├── file_350\n│   ├── file_351\n│   ├── file_352\n│   ├── file_353\n│   ├── file_354\n│   ├── file_355\n│   ├── file_356\n│   ├── file_357\n│   ├── file_358\n│   ├── file_359\n│   ├── file_360\n│   ├── file_361\n│   ├── file_362\n│   ├── file_363\n│   ├── file_364\n│   ├── file_365\n│   ├── file_366\n│   ├── file_367\n│   ├── file_368\n│   ├── file_369\n│   ├── file_370\n│   ├── file_371\n│   ├── file_372\n│   ├── file_373\n│   ├── file_374\n│   ├── file_375\n│   ├── file_376\n│   ├── file_377\n│   ├── file_378\n│   ├── file_379\n│   ├── file_380\n│   ├── file_381\n│   ├── file_382\n│   ├── file_383\n│   ├── file_384\n│   ├── file_385\n│   ├── file_386\n│   ├── file_387\n│   ├── file_388\n│   ├── file_389\n│   ├── file_390\n│   ├── file_391\n│   ├── file_392\n│   ├── file_393\n│   ├── file_394\n│   ├── file_395\n│   ├── file_396\n│   ├── file_397\n│   ├── file_398\n│   ├── file_399\n│   ├── file_400\n│   ├── file_401\n│   ├── file_402\n│   ├── file_403\n│   ├── file_404\n│   ├── file_405\n│   ├── file_406\n│   ├── file_407\n│   ├── file_408\n│   ├── file_409\n│   ├── file_410\n│   ├── file_411\n│   ├── file_412\n│   ├── file_413\n│   ├── file_414\n│   ├── file_415\n│   ├── file_416\n│   ├── file_417\n│   ├── file_418\n│   ├── file_419\n│   ├── file_420\n│   ├── file_421\n│   ├── file_422\n│   ├── file_423\n│   ├── file_424\n│   ├── file_425\n│   ├── file_426\n│   ├── file_427\n│   ├── file_428\n│   ├── file_429\n│   ├── file_430\n│   ├── file_431\n│   ├── file_432\n│   ├── file_433\n│   ├── file_434\n│   ├── file_435\n│   ├── file_436\n│   ├── file_437\n│   ├── file_438\n│   ├── file_439\n│   ├── file_440\n│   ├── file_441\n│   ├── file_442\n│   ├── file_443\n│   ├── file_444\n│   ├── file_445\n│   ├── file_446\n│   ├── file_447\n│   ├── file_448\n│   ├── file_449\n│   ├── file_450\n│   ├── file_451\n│   ├── file_452\n│   ├── file_453\n│   ├── file_454\n│   ├── file_455\n│   ├── file_456\n│   ├── file_457\n│   ├── file_458\n│   ├── file_459\n│   ├── file_460\n│   ├── file_461\n│   ├── file_462\n│   ├── file_463\n│   ├── file_464\n│   ├── file_465\n│   ├── file_466\n│   ├── file_467\n│   ├── file_468\n│   ├── file_469\n│   ├── file_470\n│   ├── file_471\n│   ├── file_472\n│   ├── file_473\n│   ├── file_474\n│   ├── file_475\n│   ├── file_476\n│   ├── file_477\n│   ├── file_478\n│   ├── file_479\n│   ├── file_480\n│   ├── file_481\n│   ├── file_482\n│   ├── file_483\n│   ├── file_484\n│   ├── file_485\n│   ├── file_486\n│   ├── file_487\n│   ├── file_488\n│   ├── file_489\n│   ├── file_490\n│   ├── file_491\n│   ├── file_492\n│   ├── file_493\n│   ├── file_494\n│   ├── file_495\n│   ├── file_496\n│   ├── file_497\n│   ├── file_498\n│   ├── file_499\n│   ├── file_500\n│   ├── file_501\n│   ├── file_502\n│   ├── file_503\n│   ├── file_504\n│   ├── file_505\n│   ├── file_506\n│   ├── file_507\n│   ├── file_508\n│   ├── file_509\n│   ├── file_510\n│   ├── file_511\n│   ├── file_512\n│   ├── file_513\n│   ├── file_514\n│   ├── file_515\n│   ├── file_516\n│   ├── file_517\n│   ├── file_518\n│   ├── file_519\n│   ├── file_520\n│   ├── file_521\n│   ├── file_522\n│   ├── file_523\n│   ├── file_524\n│   ├── file_525\n│   ├── file_526\n│   ├── file_527\n│   ├── file_528\n│   ├── file_529\n│   ├── file_530\n│   ├── file_531\n│   ├── file_532\n│   ├── file_533\n│   ├── file_534\n│   ├── file_535\n│   ├── file_536\n│   ├── file_537\n│   ├── file_538\n│   ├── file_539\n│   ├── file_540\n│   ├── file_541\n│   ├── file_542\n│   ├── file_543\n│   ├── file_544\n│   ├── file_545\n│   ├── file_546\n│   ├── file_547\n│   ├── file_548\n│   ├── file_549\n│   ├── file_550\n│   ├── file_551\n│   ├── file_552\n│   ├── file_553\n│   ├── file_554\n│   ├── file_555\n│   ├── file_556\n│   ├── file_557\n│   ├── file_558\n│   ├── file_559\n│   ├── file_560\n│   ├── file_561\n│   ├── file_562\n│   ├── file_563\n│   ├── file_564\n│   ├── file_565\n│   ├── file_566\n│   ├── file_567\n│   ├── file_568\n│   ├── file_569\n│   ├── file_570\n│   ├── file_571\n│   ├── file_572\n│   ├── file_573\n│   ├── file_574\n│   ├── file_575\n│   ├── file_576\n│   ├── file_577\n│   ├── file_578\n│   ├── file_579\n│   ├── file_580\n│   ├── file_581\n│   ├── file_582\n│   ├── file_583\n│   ├── file_584\n│   ├── file_585\n│   ├── file_586\n│   ├── file_587\n│   ├── file_588\n│   ├── file_589\n│   ├── file_590\n│   ├── file_591\n│   ├── file_592\n│   ├── file_593\n│   ├── file_594\n│   ├── file_595\n│   ├── file_596\n│   ├── file_597\n│   ├── file_598\n│   ├── file_599\n│   ├── file_600\n│   ├── file_601\n│   ├── file_602\n│   ├── file_603\n│   ├── file_604\n│   ├── file_605\n│   ├── file_606\n│   ├── file_607\n│   ├── file_608\n│   ├── file_609\n│   ├── file_610\n│   ├── file_611\n│   ├── file_612\n│   ├── file_613\n│   ├── file_614\n│   ├── file_615\n│   ├── file_616\n│   ├── file_617\n│   ├── file_618\n│   ├── file_619\n│   ├── file_620\n│   ├── file_621\n│   ├── file_622\n│   ├── file_623\n│   ├── file_624\n│   ├── file_625\n│   ├── file_626\n│   ├── file_627\n│   ├── file_628\n│   ├── file_629\n│   ├── file_630\n│   ├── file_631\n│   ├── file_632\n│   ├── file_633\n│   ├── file_634\n│   ├── file_635\n│   ├── file_636\n│   ├── file_637\n│   ├── file_638\n│   ├── file_639\n│   ├── file_640\n│   ├── file_641\n│   ├── file_642\n│   ├── file_643\n│   ├── file_644\n│   ├── file_645\n│   ├── file_646\n│   ├── file_647\n│   ├── file_648\n│   ├── file_649\n│   ├── file_650\n│   ├── file_651\n│   ├── file_652\n│   ├── file_653\n│   ├── file_654\n│   ├── file_655\n│   ├── file_656\n│   ├── file_657\n│   ├── file_658\n│   ├── file_659\n│   ├── file_660\n│   ├── file_661\n│   ├── file_662\n│   ├── file_663\n│   ├── file_664\n│   ├── file_665\n│   ├── file_666\n│   ├── file_667\n│   ├── file_668\n│   ├── file_669\n│   ├── file_670\n│   ├── file_671\n│   ├── file_672\n│   ├── file_673\n│   ├── file_674\n│   ├── file_675\n│   ├── file_676\n│   ├── file_677\n│   ├── file_678\n│   ├── file_679\n│   ├── file_680\n│   ├── file_681\n│   ├── file_682\n│   ├── file_683\n│   ├── file_684\n│   ├── file_685\n│   ├── file_686\n│   ├── file_687\n│   ├── file_688\n│   ├── file_689\n│   ├── file_690\n│   ├── file_691\n│   ├── file_692\n│   ├── file_693\n│   ├── file_694\n│   ├── file_695\n│   ├── file_696\n│   ├── file_697\n│   ├── file_698\n│   ├── file_699\n│   ├── file_700\n│   ├── file_701\n│   ├── file_702\n│   ├── file_703\n│   ├── file_704\n│   ├── file_705\n│   ├── file_706\n│   ├── file_707\n│   ├── file_708\n│   ├── file_709\n│   ├── file_710\n│   ├── file_711\n│   ├── file_712\n│   ├── file_713\n│   ├── file_714\n│   ├── file_715\n│   ├── file_716\n│   ├── file_717\n│   ├── file_718\n│   ├── file_719\n│   ├── file_720\n│   ├── file_721\n│   ├── file_722\n│   ├── file_723\n│   ├── file_724\n│   ├── file_725\n│   ├── file_726\n│   ├── file_727\n│   ├── file_728\n│   ├── file_729\n│   ├── file_730\n│   ├── file_731\n│   ├── file_732\n│   ├── file_733\n│   ├── file_734\n│   ├── file_735\n│   ├── file_736\n│   ├── file_737\n│   ├── file_738\n│   ├── file_739\n│   ├── file_740\n│   ├── file_741\n│   ├── file_742\n│   ├── file_743\n│   ├── file_744\n│   ├── file_745\n│   ├── file_746\n│   ├── file_747\n│   ├── file_748\n│   ├── file_749\n│   ├── file_750\n│   ├── file_751\n│   ├── file_752\n│   ├── file_753\n│   ├── file_754\n│   ├── file_755\n│   ├── file_756\n│   ├── file_757\n│   ├── file_758\n│   ├── file_759\n│   ├── file_760\n│   ├── file_761\n│   ├── file_762\n│   ├── file_763\n│   ├── file_764\n│   ├── file_765\n│   ├── file_766\n│   ├── file_767\n│   ├── file_768\n│   ├── file_769\n│   ├── file_770\n│   ├── file_771\n│   ├── file_772\n│   ├── file_773\n│   ├── file_774\n│   ├── file_775\n│   ├── file_776\n│   ├── file_777\n│   ├── file_778\n│   ├── file_779\n│   ├── file_780\n│   ├── file_781\n│   ├── file_782\n│   ├── file_783\n│   ├── file_784\n│   ├── file_785\n│   ├── file_786\n│   ├── file_787\n│   ├── file_788\n│   ├── file_789\n│   ├── file_790\n│   ├── file_791\n│   ├── file_792\n│   ├── file_793\n│   ├── file_794\n│   ├── file_795\n│   ├── file_796\n│   ├── file_797\n│   ├── file_798\n│   ├── file_799\n│   ├── file_800\n│   ├── file_801\n│   ├── file_802\n│   ├── file_803\n│   ├── file_804\n│   ├── file_805\n│   ├── file_806\n│   ├── file_807\n│   ├── file_808\n│   ├── file_809\n│   ├── file_810\n│   ├── file_811\n│   ├── file_812\n│   ├── file_813\n│   ├── file_814\n│   ├── file_815\n│   ├── file_816\n│   ├── file_817\n│   ├── file_818\n│   ├── file_819\n│   ├── file_820\n│   ├── file_821\n│   ├── file_822\n│   ├── file_823\n│   ├── file_824\n│   ├── file_825\n│   ├── file_826\n│   ├── file_827\n│   ├── file_828\n│   ├── file_829\n│   ├── file_830\n│   ├── file_831\n│   ├── file_832\n│   ├── file_833\n│   ├── file_834\n│   ├── file_835\n│   ├── file_836\n│   ├── file_837\n│   ├── file_838\n│   ├── file_839\n│   ├── file_840\n│   ├── file_841\n│   ├── file_842\n│   ├── file_843\n│   ├── file_844\n│   ├── file_845\n│   ├── file_846\n│   ├── file_847\n│   ├── file_848\n│   ├── file_849\n│   ├── file_850\n│   ├── file_851\n│   ├── file_852\n│   ├── file_853\n│   ├── file_854\n│   ├── file_855\n│   ├── file_856\n│   ├── file_857\n│   ├── file_858\n│   ├── file_859\n│   ├── file_860\n│   ├── file_861\n│   ├── file_862\n│   ├── file_863\n│   ├── file_864\n│   ├── file_865\n│   ├── file_866\n│   ├── file_867\n│   ├── file_868\n│   ├── file_869\n│   ├── file_870\n│   ├── file_871\n│   ├── file_872\n│   ├── file_873\n│   ├── file_874\n│   ├── file_875\n│   ├── file_876\n│   ├── file_877\n│   ├── file_878\n│   ├── file_879\n│   ├── file_880\n│   ├── file_881\n│   ├── file_882\n│   ├── file_883\n│   ├── file_884\n│   ├── file_885\n│   ├── file_886\n│   ├── file_887\n│   ├── file_888\n│   ├── file_889\n│   ├── file_890\n│   ├── file_891\n│   ├── file_892\n│   ├── file_893\n│   ├── file_894\n│   ├── file_895\n│   ├── file_896\n│   ├── file_897\n│   ├── file_898\n│   ├── file_899\n│   ├── file_900\n│   ├── file_901\n│   ├── file_902\n│   ├── file_903\n│   ├── file_904\n│   ├── file_905\n│   ├── file_906\n│   ├── file_907\n│   ├── file_908\n│   ├── file_909\n│   ├── file_910\n│   ├── file_911\n│   ├── file_912\n│   ├── file_913\n│   ├── file_914\n│   ├── file_915\n│   ├── file_916\n│   ├── file_917\n│   ├── file_918\n│   ├── file_919\n│   ├── file_920\n│   ├── file_921\n│   ├── file_922\n│   ├── file_923\n│   ├── file_924\n│   ├── file_925\n│   ├── file_926\n│   ├── file_927\n│   ├── file_928\n│   ├── file_929\n│   ├── file_930\n│   ├── file_931\n│   ├── file_932\n│   ├── file_933\n│   ├── file_934\n│   ├── file_935\n│   ├── file_936\n│   ├── file_937\n│   ├── file_938\n│   ├── file_939\n│   ├── file_940\n│   ├── file_941\n│   ├── file_942\n│   ├── file_943\n│   ├── file_944\n│   ├── file_945\n│   ├── file_946\n│   ├── file_947\n│   ├── file_948\n│   ├── file_949\n│   ├── file_950\n│   ├── file_951\n│   ├── file_952\n│   ├── file_953\n│   ├── file_954\n│   ├── file_955\n│   ├── file_956\n│   ├── file_957\n│   ├── file_958\n│   ├── file_959\n│   ├── file_960\n│   ├── file_961\n│   ├── file_962\n│   ├── file_963\n│   ├── file_964\n│   ├── file_965\n│   ├── file_966\n│   ├── file_967\n│   ├── file_968\n│   ├── file_969\n│   ├── file_970\n│   ├── file_971\n│   ├── file_972\n│   ├── file_973\n│   ├── file_974\n│   ├── file_975\n│   ├── file_976\n│   ├── file_977\n│   ├── file_978\n│   ├── file_979\n│   ├── file_980\n│   ├── file_981\n│   ├── file_982\n│   ├── file_983\n│   ├── file_984\n│   ├── file_985\n│   ├── file_986\n│   ├── file_987\n│   ├── file_988\n│   ├── file_989\n│   ├── file_990\n│   ├── file_991\n│   ├── file_992\n│   ├── file_993\n│   ├── file_994\n│   ├── file_995\n│   ├── file_996\n│   ├── file_997\n│   ├── file_998\n│   └── file_999\n├── group\n│   └── file\n├── icons\n│   ├── c++.cpp\n│   ├── c.c\n│   ├── css.css\n│   ├── file\n│   ├── go.go\n│   ├── html.html\n│   ├── java.java\n│   ├── javascript.js\n│   ├── man.1\n│   ├── marked.md\n│   ├── php.php\n│   ├── python.py\n│   ├── ruby.rb\n│   ├── rust.rs\n│   ├── shell.sh\n│   └── unknown.unknown\n├── perms\n│   ├── file\n│   └── file2\n├── size\n│   ├── 1B\n│   ├── 1K\n│   ├── 1M\n│   └── 1337\n├── specials\n├── symlinks\n│   ├── dir\n│   ├── file\n│   ├── ' lorem ipsum'\n│   ├── symlink -> file\n│   ├── symlink2 -> symlink\n│   ├── symlink3 -> dir\n│   └── symlink4 -> pipitek\n└── time\n    ├── 1d\n    ├── 1h\n    ├── 1m\n    ├── 1s\n    ├── 1y\n    └── epoch\n"
  },
  {
    "path": "tests/ptests/ptest_5d72b8a5ba66436b.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T -L 5\""
  },
  {
    "path": "tests/ptests/ptest_5eac3027be1d2909.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_5eac3027be1d2909.stdout",
    "content": "tests/test_dir\n"
  },
  {
    "path": "tests/ptests/ptest_5eac3027be1d2909.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T --level 0\""
  },
  {
    "path": "tests/ptests/ptest_607792764dd84355.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_607792764dd84355.stdout",
    "content": "tests/test_dir\n├── git\n│   ├── 001\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 002\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 003\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 004\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 005\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 006\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 007\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 008\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 009\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   └── 010\n│       ├── file_000\n│       ├── file_001\n│       ├── file_002\n│       ├── file_003\n│       ├── file_004\n│       ├── file_005\n│       ├── file_006\n│       ├── file_007\n│       ├── file_008\n│       └── file_009\n├── grid\n│   ├── 0001\n│   ├── 0002\n│   ├── 0003\n│   ├── 0004\n│   ├── 0005\n│   ├── 0006\n│   ├── 0007\n│   ├── 0008\n│   ├── 0009\n│   ├── 0010\n│   ├── 0011\n│   ├── 0012\n│   ├── 0013\n│   ├── 0014\n│   ├── 0015\n│   ├── 0016\n│   ├── 0017\n│   ├── 0018\n│   ├── 0019\n│   ├── 0020\n│   ├── 0021\n│   ├── 0022\n│   ├── 0023\n│   ├── 0024\n│   ├── 0025\n│   ├── 0026\n│   ├── 0027\n│   ├── 0028\n│   ├── 0029\n│   ├── 0030\n│   ├── 0031\n│   ├── 0032\n│   ├── 0033\n│   ├── 0034\n│   ├── 0035\n│   ├── 0036\n│   ├── 0037\n│   ├── 0038\n│   ├── 0039\n│   ├── 0040\n│   ├── 0041\n│   ├── 0042\n│   ├── 0043\n│   ├── 0044\n│   ├── 0045\n│   ├── 0046\n│   ├── 0047\n│   ├── 0048\n│   ├── 0049\n│   ├── 0050\n│   ├── 0051\n│   ├── 0052\n│   ├── 0053\n│   ├── 0054\n│   ├── 0055\n│   ├── 0056\n│   ├── 0057\n│   ├── 0058\n│   ├── 0059\n│   ├── 0060\n│   ├── 0061\n│   ├── 0062\n│   ├── 0063\n│   ├── 0064\n│   ├── 0065\n│   ├── 0066\n│   ├── 0067\n│   ├── 0068\n│   ├── 0069\n│   ├── 0070\n│   ├── 0071\n│   ├── 0072\n│   ├── 0073\n│   ├── 0074\n│   ├── 0075\n│   ├── 0076\n│   ├── 0077\n│   ├── 0078\n│   ├── 0079\n│   ├── 0080\n│   ├── 0081\n│   ├── 0082\n│   ├── 0083\n│   ├── 0084\n│   ├── 0085\n│   ├── 0086\n│   ├── 0087\n│   ├── 0088\n│   ├── 0089\n│   ├── 0090\n│   ├── 0091\n│   ├── 0092\n│   ├── 0093\n│   ├── 0094\n│   ├── 0095\n│   ├── 0096\n│   ├── 0097\n│   ├── 0098\n│   ├── 0099\n│   ├── 0100\n│   ├── 0101\n│   ├── 0102\n│   ├── 0103\n│   ├── 0104\n│   ├── 0105\n│   ├── 0106\n│   ├── 0107\n│   ├── 0108\n│   ├── 0109\n│   ├── 0110\n│   ├── 0111\n│   ├── 0112\n│   ├── 0113\n│   ├── 0114\n│   ├── 0115\n│   ├── 0116\n│   ├── 0117\n│   ├── 0118\n│   ├── 0119\n│   ├── 0120\n│   ├── 0121\n│   ├── 0122\n│   ├── 0123\n│   ├── 0124\n│   ├── 0125\n│   ├── 0126\n│   ├── 0127\n│   ├── 0128\n│   ├── 0129\n│   ├── 0130\n│   ├── 0131\n│   ├── 0132\n│   ├── 0133\n│   ├── 0134\n│   ├── 0135\n│   ├── 0136\n│   ├── 0137\n│   ├── 0138\n│   ├── 0139\n│   ├── 0140\n│   ├── 0141\n│   ├── 0142\n│   ├── 0143\n│   ├── 0144\n│   ├── 0145\n│   ├── 0146\n│   ├── 0147\n│   ├── 0148\n│   ├── 0149\n│   ├── 0150\n│   ├── 0151\n│   ├── 0152\n│   ├── 0153\n│   ├── 0154\n│   ├── 0155\n│   ├── 0156\n│   ├── 0157\n│   ├── 0158\n│   ├── 0159\n│   ├── 0160\n│   ├── 0161\n│   ├── 0162\n│   ├── 0163\n│   ├── 0164\n│   ├── 0165\n│   ├── 0166\n│   ├── 0167\n│   ├── 0168\n│   ├── 0169\n│   ├── 0170\n│   ├── 0171\n│   ├── 0172\n│   ├── 0173\n│   ├── 0174\n│   ├── 0175\n│   ├── 0176\n│   ├── 0177\n│   ├── 0178\n│   ├── 0179\n│   ├── 0180\n│   ├── 0181\n│   ├── 0182\n│   ├── 0183\n│   ├── 0184\n│   ├── 0185\n│   ├── 0186\n│   ├── 0187\n│   ├── 0188\n│   ├── 0189\n│   ├── 0190\n│   ├── 0191\n│   ├── 0192\n│   ├── 0193\n│   ├── 0194\n│   ├── 0195\n│   ├── 0196\n│   ├── 0197\n│   ├── 0198\n│   ├── 0199\n│   ├── 0200\n│   ├── 0201\n│   ├── 0202\n│   ├── 0203\n│   ├── 0204\n│   ├── 0205\n│   ├── 0206\n│   ├── 0207\n│   ├── 0208\n│   ├── 0209\n│   ├── 0210\n│   ├── 0211\n│   ├── 0212\n│   ├── 0213\n│   ├── 0214\n│   ├── 0215\n│   ├── 0216\n│   ├── 0217\n│   ├── 0218\n│   ├── 0219\n│   ├── 0220\n│   ├── 0221\n│   ├── 0222\n│   ├── 0223\n│   ├── 0224\n│   ├── 0225\n│   ├── 0226\n│   ├── 0227\n│   ├── 0228\n│   ├── 0229\n│   ├── 0230\n│   ├── 0231\n│   ├── 0232\n│   ├── 0233\n│   ├── 0234\n│   ├── 0235\n│   ├── 0236\n│   ├── 0237\n│   ├── 0238\n│   ├── 0239\n│   ├── 0240\n│   ├── 0241\n│   ├── 0242\n│   ├── 0243\n│   ├── 0244\n│   ├── 0245\n│   ├── 0246\n│   ├── 0247\n│   ├── 0248\n│   ├── 0249\n│   ├── 0250\n│   ├── 0251\n│   ├── 0252\n│   ├── 0253\n│   ├── 0254\n│   ├── 0255\n│   ├── 0256\n│   ├── 0257\n│   ├── 0258\n│   ├── 0259\n│   ├── 0260\n│   ├── 0261\n│   ├── 0262\n│   ├── 0263\n│   ├── 0264\n│   ├── 0265\n│   ├── 0266\n│   ├── 0267\n│   ├── 0268\n│   ├── 0269\n│   ├── 0270\n│   ├── 0271\n│   ├── 0272\n│   ├── 0273\n│   ├── 0274\n│   ├── 0275\n│   ├── 0276\n│   ├── 0277\n│   ├── 0278\n│   ├── 0279\n│   ├── 0280\n│   ├── 0281\n│   ├── 0282\n│   ├── 0283\n│   ├── 0284\n│   ├── 0285\n│   ├── 0286\n│   ├── 0287\n│   ├── 0288\n│   ├── 0289\n│   ├── 0290\n│   ├── 0291\n│   ├── 0292\n│   ├── 0293\n│   ├── 0294\n│   ├── 0295\n│   ├── 0296\n│   ├── 0297\n│   ├── 0298\n│   ├── 0299\n│   ├── 0300\n│   ├── 0301\n│   ├── 0302\n│   ├── 0303\n│   ├── 0304\n│   ├── 0305\n│   ├── 0306\n│   ├── 0307\n│   ├── 0308\n│   ├── 0309\n│   ├── 0310\n│   ├── 0311\n│   ├── 0312\n│   ├── 0313\n│   ├── 0314\n│   ├── 0315\n│   ├── 0316\n│   ├── 0317\n│   ├── 0318\n│   ├── 0319\n│   ├── 0320\n│   ├── 0321\n│   ├── 0322\n│   ├── 0323\n│   ├── 0324\n│   ├── 0325\n│   ├── 0326\n│   ├── 0327\n│   ├── 0328\n│   ├── 0329\n│   ├── 0330\n│   ├── 0331\n│   ├── 0332\n│   ├── 0333\n│   ├── 0334\n│   ├── 0335\n│   ├── 0336\n│   ├── 0337\n│   ├── 0338\n│   ├── 0339\n│   ├── 0340\n│   ├── 0341\n│   ├── 0342\n│   ├── 0343\n│   ├── 0344\n│   ├── 0345\n│   ├── 0346\n│   ├── 0347\n│   ├── 0348\n│   ├── 0349\n│   ├── 0350\n│   ├── 0351\n│   ├── 0352\n│   ├── 0353\n│   ├── 0354\n│   ├── 0355\n│   ├── 0356\n│   ├── 0357\n│   ├── 0358\n│   ├── 0359\n│   ├── 0360\n│   ├── 0361\n│   ├── 0362\n│   ├── 0363\n│   ├── 0364\n│   ├── 0365\n│   ├── 0366\n│   ├── 0367\n│   ├── 0368\n│   ├── 0369\n│   ├── 0370\n│   ├── 0371\n│   ├── 0372\n│   ├── 0373\n│   ├── 0374\n│   ├── 0375\n│   ├── 0376\n│   ├── 0377\n│   ├── 0378\n│   ├── 0379\n│   ├── 0380\n│   ├── 0381\n│   ├── 0382\n│   ├── 0383\n│   ├── 0384\n│   ├── 0385\n│   ├── 0386\n│   ├── 0387\n│   ├── 0388\n│   ├── 0389\n│   ├── 0390\n│   ├── 0391\n│   ├── 0392\n│   ├── 0393\n│   ├── 0394\n│   ├── 0395\n│   ├── 0396\n│   ├── 0397\n│   ├── 0398\n│   ├── 0399\n│   ├── 0400\n│   ├── 0401\n│   ├── 0402\n│   ├── 0403\n│   ├── 0404\n│   ├── 0405\n│   ├── 0406\n│   ├── 0407\n│   ├── 0408\n│   ├── 0409\n│   ├── 0410\n│   ├── 0411\n│   ├── 0412\n│   ├── 0413\n│   ├── 0414\n│   ├── 0415\n│   ├── 0416\n│   ├── 0417\n│   ├── 0418\n│   ├── 0419\n│   ├── 0420\n│   ├── 0421\n│   ├── 0422\n│   ├── 0423\n│   ├── 0424\n│   ├── 0425\n│   ├── 0426\n│   ├── 0427\n│   ├── 0428\n│   ├── 0429\n│   ├── 0430\n│   ├── 0431\n│   ├── 0432\n│   ├── 0433\n│   ├── 0434\n│   ├── 0435\n│   ├── 0436\n│   ├── 0437\n│   ├── 0438\n│   ├── 0439\n│   ├── 0440\n│   ├── 0441\n│   ├── 0442\n│   ├── 0443\n│   ├── 0444\n│   ├── 0445\n│   ├── 0446\n│   ├── 0447\n│   ├── 0448\n│   ├── 0449\n│   ├── 0450\n│   ├── 0451\n│   ├── 0452\n│   ├── 0453\n│   ├── 0454\n│   ├── 0455\n│   ├── 0456\n│   ├── 0457\n│   ├── 0458\n│   ├── 0459\n│   ├── 0460\n│   ├── 0461\n│   ├── 0462\n│   ├── 0463\n│   ├── 0464\n│   ├── 0465\n│   ├── 0466\n│   ├── 0467\n│   ├── 0468\n│   ├── 0469\n│   ├── 0470\n│   ├── 0471\n│   ├── 0472\n│   ├── 0473\n│   ├── 0474\n│   ├── 0475\n│   ├── 0476\n│   ├── 0477\n│   ├── 0478\n│   ├── 0479\n│   ├── 0480\n│   ├── 0481\n│   ├── 0482\n│   ├── 0483\n│   ├── 0484\n│   ├── 0485\n│   ├── 0486\n│   ├── 0487\n│   ├── 0488\n│   ├── 0489\n│   ├── 0490\n│   ├── 0491\n│   ├── 0492\n│   ├── 0493\n│   ├── 0494\n│   ├── 0495\n│   ├── 0496\n│   ├── 0497\n│   ├── 0498\n│   ├── 0499\n│   ├── 0500\n│   ├── 0501\n│   ├── 0502\n│   ├── 0503\n│   ├── 0504\n│   ├── 0505\n│   ├── 0506\n│   ├── 0507\n│   ├── 0508\n│   ├── 0509\n│   ├── 0510\n│   ├── 0511\n│   ├── 0512\n│   ├── 0513\n│   ├── 0514\n│   ├── 0515\n│   ├── 0516\n│   ├── 0517\n│   ├── 0518\n│   ├── 0519\n│   ├── 0520\n│   ├── 0521\n│   ├── 0522\n│   ├── 0523\n│   ├── 0524\n│   ├── 0525\n│   ├── 0526\n│   ├── 0527\n│   ├── 0528\n│   ├── 0529\n│   ├── 0530\n│   ├── 0531\n│   ├── 0532\n│   ├── 0533\n│   ├── 0534\n│   ├── 0535\n│   ├── 0536\n│   ├── 0537\n│   ├── 0538\n│   ├── 0539\n│   ├── 0540\n│   ├── 0541\n│   ├── 0542\n│   ├── 0543\n│   ├── 0544\n│   ├── 0545\n│   ├── 0546\n│   ├── 0547\n│   ├── 0548\n│   ├── 0549\n│   ├── 0550\n│   ├── 0551\n│   ├── 0552\n│   ├── 0553\n│   ├── 0554\n│   ├── 0555\n│   ├── 0556\n│   ├── 0557\n│   ├── 0558\n│   ├── 0559\n│   ├── 0560\n│   ├── 0561\n│   ├── 0562\n│   ├── 0563\n│   ├── 0564\n│   ├── 0565\n│   ├── 0566\n│   ├── 0567\n│   ├── 0568\n│   ├── 0569\n│   ├── 0570\n│   ├── 0571\n│   ├── 0572\n│   ├── 0573\n│   ├── 0574\n│   ├── 0575\n│   ├── 0576\n│   ├── 0577\n│   ├── 0578\n│   ├── 0579\n│   ├── 0580\n│   ├── 0581\n│   ├── 0582\n│   ├── 0583\n│   ├── 0584\n│   ├── 0585\n│   ├── 0586\n│   ├── 0587\n│   ├── 0588\n│   ├── 0589\n│   ├── 0590\n│   ├── 0591\n│   ├── 0592\n│   ├── 0593\n│   ├── 0594\n│   ├── 0595\n│   ├── 0596\n│   ├── 0597\n│   ├── 0598\n│   ├── 0599\n│   ├── 0600\n│   ├── 0601\n│   ├── 0602\n│   ├── 0603\n│   ├── 0604\n│   ├── 0605\n│   ├── 0606\n│   ├── 0607\n│   ├── 0608\n│   ├── 0609\n│   ├── 0610\n│   ├── 0611\n│   ├── 0612\n│   ├── 0613\n│   ├── 0614\n│   ├── 0615\n│   ├── 0616\n│   ├── 0617\n│   ├── 0618\n│   ├── 0619\n│   ├── 0620\n│   ├── 0621\n│   ├── 0622\n│   ├── 0623\n│   ├── 0624\n│   ├── 0625\n│   ├── 0626\n│   ├── 0627\n│   ├── 0628\n│   ├── 0629\n│   ├── 0630\n│   ├── 0631\n│   ├── 0632\n│   ├── 0633\n│   ├── 0634\n│   ├── 0635\n│   ├── 0636\n│   ├── 0637\n│   ├── 0638\n│   ├── 0639\n│   ├── 0640\n│   ├── 0641\n│   ├── 0642\n│   ├── 0643\n│   ├── 0644\n│   ├── 0645\n│   ├── 0646\n│   ├── 0647\n│   ├── 0648\n│   ├── 0649\n│   ├── 0650\n│   ├── 0651\n│   ├── 0652\n│   ├── 0653\n│   ├── 0654\n│   ├── 0655\n│   ├── 0656\n│   ├── 0657\n│   ├── 0658\n│   ├── 0659\n│   ├── 0660\n│   ├── 0661\n│   ├── 0662\n│   ├── 0663\n│   ├── 0664\n│   ├── 0665\n│   ├── 0666\n│   ├── 0667\n│   ├── 0668\n│   ├── 0669\n│   ├── 0670\n│   ├── 0671\n│   ├── 0672\n│   ├── 0673\n│   ├── 0674\n│   ├── 0675\n│   ├── 0676\n│   ├── 0677\n│   ├── 0678\n│   ├── 0679\n│   ├── 0680\n│   ├── 0681\n│   ├── 0682\n│   ├── 0683\n│   ├── 0684\n│   ├── 0685\n│   ├── 0686\n│   ├── 0687\n│   ├── 0688\n│   ├── 0689\n│   ├── 0690\n│   ├── 0691\n│   ├── 0692\n│   ├── 0693\n│   ├── 0694\n│   ├── 0695\n│   ├── 0696\n│   ├── 0697\n│   ├── 0698\n│   ├── 0699\n│   ├── 0700\n│   ├── 0701\n│   ├── 0702\n│   ├── 0703\n│   ├── 0704\n│   ├── 0705\n│   ├── 0706\n│   ├── 0707\n│   ├── 0708\n│   ├── 0709\n│   ├── 0710\n│   ├── 0711\n│   ├── 0712\n│   ├── 0713\n│   ├── 0714\n│   ├── 0715\n│   ├── 0716\n│   ├── 0717\n│   ├── 0718\n│   ├── 0719\n│   ├── 0720\n│   ├── 0721\n│   ├── 0722\n│   ├── 0723\n│   ├── 0724\n│   ├── 0725\n│   ├── 0726\n│   ├── 0727\n│   ├── 0728\n│   ├── 0729\n│   ├── 0730\n│   ├── 0731\n│   ├── 0732\n│   ├── 0733\n│   ├── 0734\n│   ├── 0735\n│   ├── 0736\n│   ├── 0737\n│   ├── 0738\n│   ├── 0739\n│   ├── 0740\n│   ├── 0741\n│   ├── 0742\n│   ├── 0743\n│   ├── 0744\n│   ├── 0745\n│   ├── 0746\n│   ├── 0747\n│   ├── 0748\n│   ├── 0749\n│   ├── 0750\n│   ├── 0751\n│   ├── 0752\n│   ├── 0753\n│   ├── 0754\n│   ├── 0755\n│   ├── 0756\n│   ├── 0757\n│   ├── 0758\n│   ├── 0759\n│   ├── 0760\n│   ├── 0761\n│   ├── 0762\n│   ├── 0763\n│   ├── 0764\n│   ├── 0765\n│   ├── 0766\n│   ├── 0767\n│   ├── 0768\n│   ├── 0769\n│   ├── 0770\n│   ├── 0771\n│   ├── 0772\n│   ├── 0773\n│   ├── 0774\n│   ├── 0775\n│   ├── 0776\n│   ├── 0777\n│   ├── 0778\n│   ├── 0779\n│   ├── 0780\n│   ├── 0781\n│   ├── 0782\n│   ├── 0783\n│   ├── 0784\n│   ├── 0785\n│   ├── 0786\n│   ├── 0787\n│   ├── 0788\n│   ├── 0789\n│   ├── 0790\n│   ├── 0791\n│   ├── 0792\n│   ├── 0793\n│   ├── 0794\n│   ├── 0795\n│   ├── 0796\n│   ├── 0797\n│   ├── 0798\n│   ├── 0799\n│   ├── 0800\n│   ├── 0801\n│   ├── 0802\n│   ├── 0803\n│   ├── 0804\n│   ├── 0805\n│   ├── 0806\n│   ├── 0807\n│   ├── 0808\n│   ├── 0809\n│   ├── 0810\n│   ├── 0811\n│   ├── 0812\n│   ├── 0813\n│   ├── 0814\n│   ├── 0815\n│   ├── 0816\n│   ├── 0817\n│   ├── 0818\n│   ├── 0819\n│   ├── 0820\n│   ├── 0821\n│   ├── 0822\n│   ├── 0823\n│   ├── 0824\n│   ├── 0825\n│   ├── 0826\n│   ├── 0827\n│   ├── 0828\n│   ├── 0829\n│   ├── 0830\n│   ├── 0831\n│   ├── 0832\n│   ├── 0833\n│   ├── 0834\n│   ├── 0835\n│   ├── 0836\n│   ├── 0837\n│   ├── 0838\n│   ├── 0839\n│   ├── 0840\n│   ├── 0841\n│   ├── 0842\n│   ├── 0843\n│   ├── 0844\n│   ├── 0845\n│   ├── 0846\n│   ├── 0847\n│   ├── 0848\n│   ├── 0849\n│   ├── 0850\n│   ├── 0851\n│   ├── 0852\n│   ├── 0853\n│   ├── 0854\n│   ├── 0855\n│   ├── 0856\n│   ├── 0857\n│   ├── 0858\n│   ├── 0859\n│   ├── 0860\n│   ├── 0861\n│   ├── 0862\n│   ├── 0863\n│   ├── 0864\n│   ├── 0865\n│   ├── 0866\n│   ├── 0867\n│   ├── 0868\n│   ├── 0869\n│   ├── 0870\n│   ├── 0871\n│   ├── 0872\n│   ├── 0873\n│   ├── 0874\n│   ├── 0875\n│   ├── 0876\n│   ├── 0877\n│   ├── 0878\n│   ├── 0879\n│   ├── 0880\n│   ├── 0881\n│   ├── 0882\n│   ├── 0883\n│   ├── 0884\n│   ├── 0885\n│   ├── 0886\n│   ├── 0887\n│   ├── 0888\n│   ├── 0889\n│   ├── 0890\n│   ├── 0891\n│   ├── 0892\n│   ├── 0893\n│   ├── 0894\n│   ├── 0895\n│   ├── 0896\n│   ├── 0897\n│   ├── 0898\n│   ├── 0899\n│   ├── 0900\n│   ├── 0901\n│   ├── 0902\n│   ├── 0903\n│   ├── 0904\n│   ├── 0905\n│   ├── 0906\n│   ├── 0907\n│   ├── 0908\n│   ├── 0909\n│   ├── 0910\n│   ├── 0911\n│   ├── 0912\n│   ├── 0913\n│   ├── 0914\n│   ├── 0915\n│   ├── 0916\n│   ├── 0917\n│   ├── 0918\n│   ├── 0919\n│   ├── 0920\n│   ├── 0921\n│   ├── 0922\n│   ├── 0923\n│   ├── 0924\n│   ├── 0925\n│   ├── 0926\n│   ├── 0927\n│   ├── 0928\n│   ├── 0929\n│   ├── 0930\n│   ├── 0931\n│   ├── 0932\n│   ├── 0933\n│   ├── 0934\n│   ├── 0935\n│   ├── 0936\n│   ├── 0937\n│   ├── 0938\n│   ├── 0939\n│   ├── 0940\n│   ├── 0941\n│   ├── 0942\n│   ├── 0943\n│   ├── 0944\n│   ├── 0945\n│   ├── 0946\n│   ├── 0947\n│   ├── 0948\n│   ├── 0949\n│   ├── 0950\n│   ├── 0951\n│   ├── 0952\n│   ├── 0953\n│   ├── 0954\n│   ├── 0955\n│   ├── 0956\n│   ├── 0957\n│   ├── 0958\n│   ├── 0959\n│   ├── 0960\n│   ├── 0961\n│   ├── 0962\n│   ├── 0963\n│   ├── 0964\n│   ├── 0965\n│   ├── 0966\n│   ├── 0967\n│   ├── 0968\n│   ├── 0969\n│   ├── 0970\n│   ├── 0971\n│   ├── 0972\n│   ├── 0973\n│   ├── 0974\n│   ├── 0975\n│   ├── 0976\n│   ├── 0977\n│   ├── 0978\n│   ├── 0979\n│   ├── 0980\n│   ├── 0981\n│   ├── 0982\n│   ├── 0983\n│   ├── 0984\n│   ├── 0985\n│   ├── 0986\n│   ├── 0987\n│   ├── 0988\n│   ├── 0989\n│   ├── 0990\n│   ├── 0991\n│   ├── 0992\n│   ├── 0993\n│   ├── 0994\n│   ├── 0995\n│   ├── 0996\n│   ├── 0997\n│   ├── 0998\n│   ├── 0999\n│   ├── 1000\n│   ├── file_000\n│   ├── file_001\n│   ├── file_002\n│   ├── file_003\n│   ├── file_004\n│   ├── file_005\n│   ├── file_006\n│   ├── file_007\n│   ├── file_008\n│   ├── file_009\n│   ├── file_010\n│   ├── file_011\n│   ├── file_012\n│   ├── file_013\n│   ├── file_014\n│   ├── file_015\n│   ├── file_016\n│   ├── file_017\n│   ├── file_018\n│   ├── file_019\n│   ├── file_020\n│   ├── file_021\n│   ├── file_022\n│   ├── file_023\n│   ├── file_024\n│   ├── file_025\n│   ├── file_026\n│   ├── file_027\n│   ├── file_028\n│   ├── file_029\n│   ├── file_030\n│   ├── file_031\n│   ├── file_032\n│   ├── file_033\n│   ├── file_034\n│   ├── file_035\n│   ├── file_036\n│   ├── file_037\n│   ├── file_038\n│   ├── file_039\n│   ├── file_040\n│   ├── file_041\n│   ├── file_042\n│   ├── file_043\n│   ├── file_044\n│   ├── file_045\n│   ├── file_046\n│   ├── file_047\n│   ├── file_048\n│   ├── file_049\n│   ├── file_050\n│   ├── file_051\n│   ├── file_052\n│   ├── file_053\n│   ├── file_054\n│   ├── file_055\n│   ├── file_056\n│   ├── file_057\n│   ├── file_058\n│   ├── file_059\n│   ├── file_060\n│   ├── file_061\n│   ├── file_062\n│   ├── file_063\n│   ├── file_064\n│   ├── file_065\n│   ├── file_066\n│   ├── file_067\n│   ├── file_068\n│   ├── file_069\n│   ├── file_070\n│   ├── file_071\n│   ├── file_072\n│   ├── file_073\n│   ├── file_074\n│   ├── file_075\n│   ├── file_076\n│   ├── file_077\n│   ├── file_078\n│   ├── file_079\n│   ├── file_080\n│   ├── file_081\n│   ├── file_082\n│   ├── file_083\n│   ├── file_084\n│   ├── file_085\n│   ├── file_086\n│   ├── file_087\n│   ├── file_088\n│   ├── file_089\n│   ├── file_090\n│   ├── file_091\n│   ├── file_092\n│   ├── file_093\n│   ├── file_094\n│   ├── file_095\n│   ├── file_096\n│   ├── file_097\n│   ├── file_098\n│   ├── file_099\n│   ├── file_100\n│   ├── file_101\n│   ├── file_102\n│   ├── file_103\n│   ├── file_104\n│   ├── file_105\n│   ├── file_106\n│   ├── file_107\n│   ├── file_108\n│   ├── file_109\n│   ├── file_110\n│   ├── file_111\n│   ├── file_112\n│   ├── file_113\n│   ├── file_114\n│   ├── file_115\n│   ├── file_116\n│   ├── file_117\n│   ├── file_118\n│   ├── file_119\n│   ├── file_120\n│   ├── file_121\n│   ├── file_122\n│   ├── file_123\n│   ├── file_124\n│   ├── file_125\n│   ├── file_126\n│   ├── file_127\n│   ├── file_128\n│   ├── file_129\n│   ├── file_130\n│   ├── file_131\n│   ├── file_132\n│   ├── file_133\n│   ├── file_134\n│   ├── file_135\n│   ├── file_136\n│   ├── file_137\n│   ├── file_138\n│   ├── file_139\n│   ├── file_140\n│   ├── file_141\n│   ├── file_142\n│   ├── file_143\n│   ├── file_144\n│   ├── file_145\n│   ├── file_146\n│   ├── file_147\n│   ├── file_148\n│   ├── file_149\n│   ├── file_150\n│   ├── file_151\n│   ├── file_152\n│   ├── file_153\n│   ├── file_154\n│   ├── file_155\n│   ├── file_156\n│   ├── file_157\n│   ├── file_158\n│   ├── file_159\n│   ├── file_160\n│   ├── file_161\n│   ├── file_162\n│   ├── file_163\n│   ├── file_164\n│   ├── file_165\n│   ├── file_166\n│   ├── file_167\n│   ├── file_168\n│   ├── file_169\n│   ├── file_170\n│   ├── file_171\n│   ├── file_172\n│   ├── file_173\n│   ├── file_174\n│   ├── file_175\n│   ├── file_176\n│   ├── file_177\n│   ├── file_178\n│   ├── file_179\n│   ├── file_180\n│   ├── file_181\n│   ├── file_182\n│   ├── file_183\n│   ├── file_184\n│   ├── file_185\n│   ├── file_186\n│   ├── file_187\n│   ├── file_188\n│   ├── file_189\n│   ├── file_190\n│   ├── file_191\n│   ├── file_192\n│   ├── file_193\n│   ├── file_194\n│   ├── file_195\n│   ├── file_196\n│   ├── file_197\n│   ├── file_198\n│   ├── file_199\n│   ├── file_200\n│   ├── file_201\n│   ├── file_202\n│   ├── file_203\n│   ├── file_204\n│   ├── file_205\n│   ├── file_206\n│   ├── file_207\n│   ├── file_208\n│   ├── file_209\n│   ├── file_210\n│   ├── file_211\n│   ├── file_212\n│   ├── file_213\n│   ├── file_214\n│   ├── file_215\n│   ├── file_216\n│   ├── file_217\n│   ├── file_218\n│   ├── file_219\n│   ├── file_220\n│   ├── file_221\n│   ├── file_222\n│   ├── file_223\n│   ├── file_224\n│   ├── file_225\n│   ├── file_226\n│   ├── file_227\n│   ├── file_228\n│   ├── file_229\n│   ├── file_230\n│   ├── file_231\n│   ├── file_232\n│   ├── file_233\n│   ├── file_234\n│   ├── file_235\n│   ├── file_236\n│   ├── file_237\n│   ├── file_238\n│   ├── file_239\n│   ├── file_240\n│   ├── file_241\n│   ├── file_242\n│   ├── file_243\n│   ├── file_244\n│   ├── file_245\n│   ├── file_246\n│   ├── file_247\n│   ├── file_248\n│   ├── file_249\n│   ├── file_250\n│   ├── file_251\n│   ├── file_252\n│   ├── file_253\n│   ├── file_254\n│   ├── file_255\n│   ├── file_256\n│   ├── file_257\n│   ├── file_258\n│   ├── file_259\n│   ├── file_260\n│   ├── file_261\n│   ├── file_262\n│   ├── file_263\n│   ├── file_264\n│   ├── file_265\n│   ├── file_266\n│   ├── file_267\n│   ├── file_268\n│   ├── file_269\n│   ├── file_270\n│   ├── file_271\n│   ├── file_272\n│   ├── file_273\n│   ├── file_274\n│   ├── file_275\n│   ├── file_276\n│   ├── file_277\n│   ├── file_278\n│   ├── file_279\n│   ├── file_280\n│   ├── file_281\n│   ├── file_282\n│   ├── file_283\n│   ├── file_284\n│   ├── file_285\n│   ├── file_286\n│   ├── file_287\n│   ├── file_288\n│   ├── file_289\n│   ├── file_290\n│   ├── file_291\n│   ├── file_292\n│   ├── file_293\n│   ├── file_294\n│   ├── file_295\n│   ├── file_296\n│   ├── file_297\n│   ├── file_298\n│   ├── file_299\n│   ├── file_300\n│   ├── file_301\n│   ├── file_302\n│   ├── file_303\n│   ├── file_304\n│   ├── file_305\n│   ├── file_306\n│   ├── file_307\n│   ├── file_308\n│   ├── file_309\n│   ├── file_310\n│   ├── file_311\n│   ├── file_312\n│   ├── file_313\n│   ├── file_314\n│   ├── file_315\n│   ├── file_316\n│   ├── file_317\n│   ├── file_318\n│   ├── file_319\n│   ├── file_320\n│   ├── file_321\n│   ├── file_322\n│   ├── file_323\n│   ├── file_324\n│   ├── file_325\n│   ├── file_326\n│   ├── file_327\n│   ├── file_328\n│   ├── file_329\n│   ├── file_330\n│   ├── file_331\n│   ├── file_332\n│   ├── file_333\n│   ├── file_334\n│   ├── file_335\n│   ├── file_336\n│   ├── file_337\n│   ├── file_338\n│   ├── file_339\n│   ├── file_340\n│   ├── file_341\n│   ├── file_342\n│   ├── file_343\n│   ├── file_344\n│   ├── file_345\n│   ├── file_346\n│   ├── file_347\n│   ├── file_348\n│   ├── file_349\n│   ├── file_350\n│   ├── file_351\n│   ├── file_352\n│   ├── file_353\n│   ├── file_354\n│   ├── file_355\n│   ├── file_356\n│   ├── file_357\n│   ├── file_358\n│   ├── file_359\n│   ├── file_360\n│   ├── file_361\n│   ├── file_362\n│   ├── file_363\n│   ├── file_364\n│   ├── file_365\n│   ├── file_366\n│   ├── file_367\n│   ├── file_368\n│   ├── file_369\n│   ├── file_370\n│   ├── file_371\n│   ├── file_372\n│   ├── file_373\n│   ├── file_374\n│   ├── file_375\n│   ├── file_376\n│   ├── file_377\n│   ├── file_378\n│   ├── file_379\n│   ├── file_380\n│   ├── file_381\n│   ├── file_382\n│   ├── file_383\n│   ├── file_384\n│   ├── file_385\n│   ├── file_386\n│   ├── file_387\n│   ├── file_388\n│   ├── file_389\n│   ├── file_390\n│   ├── file_391\n│   ├── file_392\n│   ├── file_393\n│   ├── file_394\n│   ├── file_395\n│   ├── file_396\n│   ├── file_397\n│   ├── file_398\n│   ├── file_399\n│   ├── file_400\n│   ├── file_401\n│   ├── file_402\n│   ├── file_403\n│   ├── file_404\n│   ├── file_405\n│   ├── file_406\n│   ├── file_407\n│   ├── file_408\n│   ├── file_409\n│   ├── file_410\n│   ├── file_411\n│   ├── file_412\n│   ├── file_413\n│   ├── file_414\n│   ├── file_415\n│   ├── file_416\n│   ├── file_417\n│   ├── file_418\n│   ├── file_419\n│   ├── file_420\n│   ├── file_421\n│   ├── file_422\n│   ├── file_423\n│   ├── file_424\n│   ├── file_425\n│   ├── file_426\n│   ├── file_427\n│   ├── file_428\n│   ├── file_429\n│   ├── file_430\n│   ├── file_431\n│   ├── file_432\n│   ├── file_433\n│   ├── file_434\n│   ├── file_435\n│   ├── file_436\n│   ├── file_437\n│   ├── file_438\n│   ├── file_439\n│   ├── file_440\n│   ├── file_441\n│   ├── file_442\n│   ├── file_443\n│   ├── file_444\n│   ├── file_445\n│   ├── file_446\n│   ├── file_447\n│   ├── file_448\n│   ├── file_449\n│   ├── file_450\n│   ├── file_451\n│   ├── file_452\n│   ├── file_453\n│   ├── file_454\n│   ├── file_455\n│   ├── file_456\n│   ├── file_457\n│   ├── file_458\n│   ├── file_459\n│   ├── file_460\n│   ├── file_461\n│   ├── file_462\n│   ├── file_463\n│   ├── file_464\n│   ├── file_465\n│   ├── file_466\n│   ├── file_467\n│   ├── file_468\n│   ├── file_469\n│   ├── file_470\n│   ├── file_471\n│   ├── file_472\n│   ├── file_473\n│   ├── file_474\n│   ├── file_475\n│   ├── file_476\n│   ├── file_477\n│   ├── file_478\n│   ├── file_479\n│   ├── file_480\n│   ├── file_481\n│   ├── file_482\n│   ├── file_483\n│   ├── file_484\n│   ├── file_485\n│   ├── file_486\n│   ├── file_487\n│   ├── file_488\n│   ├── file_489\n│   ├── file_490\n│   ├── file_491\n│   ├── file_492\n│   ├── file_493\n│   ├── file_494\n│   ├── file_495\n│   ├── file_496\n│   ├── file_497\n│   ├── file_498\n│   ├── file_499\n│   ├── file_500\n│   ├── file_501\n│   ├── file_502\n│   ├── file_503\n│   ├── file_504\n│   ├── file_505\n│   ├── file_506\n│   ├── file_507\n│   ├── file_508\n│   ├── file_509\n│   ├── file_510\n│   ├── file_511\n│   ├── file_512\n│   ├── file_513\n│   ├── file_514\n│   ├── file_515\n│   ├── file_516\n│   ├── file_517\n│   ├── file_518\n│   ├── file_519\n│   ├── file_520\n│   ├── file_521\n│   ├── file_522\n│   ├── file_523\n│   ├── file_524\n│   ├── file_525\n│   ├── file_526\n│   ├── file_527\n│   ├── file_528\n│   ├── file_529\n│   ├── file_530\n│   ├── file_531\n│   ├── file_532\n│   ├── file_533\n│   ├── file_534\n│   ├── file_535\n│   ├── file_536\n│   ├── file_537\n│   ├── file_538\n│   ├── file_539\n│   ├── file_540\n│   ├── file_541\n│   ├── file_542\n│   ├── file_543\n│   ├── file_544\n│   ├── file_545\n│   ├── file_546\n│   ├── file_547\n│   ├── file_548\n│   ├── file_549\n│   ├── file_550\n│   ├── file_551\n│   ├── file_552\n│   ├── file_553\n│   ├── file_554\n│   ├── file_555\n│   ├── file_556\n│   ├── file_557\n│   ├── file_558\n│   ├── file_559\n│   ├── file_560\n│   ├── file_561\n│   ├── file_562\n│   ├── file_563\n│   ├── file_564\n│   ├── file_565\n│   ├── file_566\n│   ├── file_567\n│   ├── file_568\n│   ├── file_569\n│   ├── file_570\n│   ├── file_571\n│   ├── file_572\n│   ├── file_573\n│   ├── file_574\n│   ├── file_575\n│   ├── file_576\n│   ├── file_577\n│   ├── file_578\n│   ├── file_579\n│   ├── file_580\n│   ├── file_581\n│   ├── file_582\n│   ├── file_583\n│   ├── file_584\n│   ├── file_585\n│   ├── file_586\n│   ├── file_587\n│   ├── file_588\n│   ├── file_589\n│   ├── file_590\n│   ├── file_591\n│   ├── file_592\n│   ├── file_593\n│   ├── file_594\n│   ├── file_595\n│   ├── file_596\n│   ├── file_597\n│   ├── file_598\n│   ├── file_599\n│   ├── file_600\n│   ├── file_601\n│   ├── file_602\n│   ├── file_603\n│   ├── file_604\n│   ├── file_605\n│   ├── file_606\n│   ├── file_607\n│   ├── file_608\n│   ├── file_609\n│   ├── file_610\n│   ├── file_611\n│   ├── file_612\n│   ├── file_613\n│   ├── file_614\n│   ├── file_615\n│   ├── file_616\n│   ├── file_617\n│   ├── file_618\n│   ├── file_619\n│   ├── file_620\n│   ├── file_621\n│   ├── file_622\n│   ├── file_623\n│   ├── file_624\n│   ├── file_625\n│   ├── file_626\n│   ├── file_627\n│   ├── file_628\n│   ├── file_629\n│   ├── file_630\n│   ├── file_631\n│   ├── file_632\n│   ├── file_633\n│   ├── file_634\n│   ├── file_635\n│   ├── file_636\n│   ├── file_637\n│   ├── file_638\n│   ├── file_639\n│   ├── file_640\n│   ├── file_641\n│   ├── file_642\n│   ├── file_643\n│   ├── file_644\n│   ├── file_645\n│   ├── file_646\n│   ├── file_647\n│   ├── file_648\n│   ├── file_649\n│   ├── file_650\n│   ├── file_651\n│   ├── file_652\n│   ├── file_653\n│   ├── file_654\n│   ├── file_655\n│   ├── file_656\n│   ├── file_657\n│   ├── file_658\n│   ├── file_659\n│   ├── file_660\n│   ├── file_661\n│   ├── file_662\n│   ├── file_663\n│   ├── file_664\n│   ├── file_665\n│   ├── file_666\n│   ├── file_667\n│   ├── file_668\n│   ├── file_669\n│   ├── file_670\n│   ├── file_671\n│   ├── file_672\n│   ├── file_673\n│   ├── file_674\n│   ├── file_675\n│   ├── file_676\n│   ├── file_677\n│   ├── file_678\n│   ├── file_679\n│   ├── file_680\n│   ├── file_681\n│   ├── file_682\n│   ├── file_683\n│   ├── file_684\n│   ├── file_685\n│   ├── file_686\n│   ├── file_687\n│   ├── file_688\n│   ├── file_689\n│   ├── file_690\n│   ├── file_691\n│   ├── file_692\n│   ├── file_693\n│   ├── file_694\n│   ├── file_695\n│   ├── file_696\n│   ├── file_697\n│   ├── file_698\n│   ├── file_699\n│   ├── file_700\n│   ├── file_701\n│   ├── file_702\n│   ├── file_703\n│   ├── file_704\n│   ├── file_705\n│   ├── file_706\n│   ├── file_707\n│   ├── file_708\n│   ├── file_709\n│   ├── file_710\n│   ├── file_711\n│   ├── file_712\n│   ├── file_713\n│   ├── file_714\n│   ├── file_715\n│   ├── file_716\n│   ├── file_717\n│   ├── file_718\n│   ├── file_719\n│   ├── file_720\n│   ├── file_721\n│   ├── file_722\n│   ├── file_723\n│   ├── file_724\n│   ├── file_725\n│   ├── file_726\n│   ├── file_727\n│   ├── file_728\n│   ├── file_729\n│   ├── file_730\n│   ├── file_731\n│   ├── file_732\n│   ├── file_733\n│   ├── file_734\n│   ├── file_735\n│   ├── file_736\n│   ├── file_737\n│   ├── file_738\n│   ├── file_739\n│   ├── file_740\n│   ├── file_741\n│   ├── file_742\n│   ├── file_743\n│   ├── file_744\n│   ├── file_745\n│   ├── file_746\n│   ├── file_747\n│   ├── file_748\n│   ├── file_749\n│   ├── file_750\n│   ├── file_751\n│   ├── file_752\n│   ├── file_753\n│   ├── file_754\n│   ├── file_755\n│   ├── file_756\n│   ├── file_757\n│   ├── file_758\n│   ├── file_759\n│   ├── file_760\n│   ├── file_761\n│   ├── file_762\n│   ├── file_763\n│   ├── file_764\n│   ├── file_765\n│   ├── file_766\n│   ├── file_767\n│   ├── file_768\n│   ├── file_769\n│   ├── file_770\n│   ├── file_771\n│   ├── file_772\n│   ├── file_773\n│   ├── file_774\n│   ├── file_775\n│   ├── file_776\n│   ├── file_777\n│   ├── file_778\n│   ├── file_779\n│   ├── file_780\n│   ├── file_781\n│   ├── file_782\n│   ├── file_783\n│   ├── file_784\n│   ├── file_785\n│   ├── file_786\n│   ├── file_787\n│   ├── file_788\n│   ├── file_789\n│   ├── file_790\n│   ├── file_791\n│   ├── file_792\n│   ├── file_793\n│   ├── file_794\n│   ├── file_795\n│   ├── file_796\n│   ├── file_797\n│   ├── file_798\n│   ├── file_799\n│   ├── file_800\n│   ├── file_801\n│   ├── file_802\n│   ├── file_803\n│   ├── file_804\n│   ├── file_805\n│   ├── file_806\n│   ├── file_807\n│   ├── file_808\n│   ├── file_809\n│   ├── file_810\n│   ├── file_811\n│   ├── file_812\n│   ├── file_813\n│   ├── file_814\n│   ├── file_815\n│   ├── file_816\n│   ├── file_817\n│   ├── file_818\n│   ├── file_819\n│   ├── file_820\n│   ├── file_821\n│   ├── file_822\n│   ├── file_823\n│   ├── file_824\n│   ├── file_825\n│   ├── file_826\n│   ├── file_827\n│   ├── file_828\n│   ├── file_829\n│   ├── file_830\n│   ├── file_831\n│   ├── file_832\n│   ├── file_833\n│   ├── file_834\n│   ├── file_835\n│   ├── file_836\n│   ├── file_837\n│   ├── file_838\n│   ├── file_839\n│   ├── file_840\n│   ├── file_841\n│   ├── file_842\n│   ├── file_843\n│   ├── file_844\n│   ├── file_845\n│   ├── file_846\n│   ├── file_847\n│   ├── file_848\n│   ├── file_849\n│   ├── file_850\n│   ├── file_851\n│   ├── file_852\n│   ├── file_853\n│   ├── file_854\n│   ├── file_855\n│   ├── file_856\n│   ├── file_857\n│   ├── file_858\n│   ├── file_859\n│   ├── file_860\n│   ├── file_861\n│   ├── file_862\n│   ├── file_863\n│   ├── file_864\n│   ├── file_865\n│   ├── file_866\n│   ├── file_867\n│   ├── file_868\n│   ├── file_869\n│   ├── file_870\n│   ├── file_871\n│   ├── file_872\n│   ├── file_873\n│   ├── file_874\n│   ├── file_875\n│   ├── file_876\n│   ├── file_877\n│   ├── file_878\n│   ├── file_879\n│   ├── file_880\n│   ├── file_881\n│   ├── file_882\n│   ├── file_883\n│   ├── file_884\n│   ├── file_885\n│   ├── file_886\n│   ├── file_887\n│   ├── file_888\n│   ├── file_889\n│   ├── file_890\n│   ├── file_891\n│   ├── file_892\n│   ├── file_893\n│   ├── file_894\n│   ├── file_895\n│   ├── file_896\n│   ├── file_897\n│   ├── file_898\n│   ├── file_899\n│   ├── file_900\n│   ├── file_901\n│   ├── file_902\n│   ├── file_903\n│   ├── file_904\n│   ├── file_905\n│   ├── file_906\n│   ├── file_907\n│   ├── file_908\n│   ├── file_909\n│   ├── file_910\n│   ├── file_911\n│   ├── file_912\n│   ├── file_913\n│   ├── file_914\n│   ├── file_915\n│   ├── file_916\n│   ├── file_917\n│   ├── file_918\n│   ├── file_919\n│   ├── file_920\n│   ├── file_921\n│   ├── file_922\n│   ├── file_923\n│   ├── file_924\n│   ├── file_925\n│   ├── file_926\n│   ├── file_927\n│   ├── file_928\n│   ├── file_929\n│   ├── file_930\n│   ├── file_931\n│   ├── file_932\n│   ├── file_933\n│   ├── file_934\n│   ├── file_935\n│   ├── file_936\n│   ├── file_937\n│   ├── file_938\n│   ├── file_939\n│   ├── file_940\n│   ├── file_941\n│   ├── file_942\n│   ├── file_943\n│   ├── file_944\n│   ├── file_945\n│   ├── file_946\n│   ├── file_947\n│   ├── file_948\n│   ├── file_949\n│   ├── file_950\n│   ├── file_951\n│   ├── file_952\n│   ├── file_953\n│   ├── file_954\n│   ├── file_955\n│   ├── file_956\n│   ├── file_957\n│   ├── file_958\n│   ├── file_959\n│   ├── file_960\n│   ├── file_961\n│   ├── file_962\n│   ├── file_963\n│   ├── file_964\n│   ├── file_965\n│   ├── file_966\n│   ├── file_967\n│   ├── file_968\n│   ├── file_969\n│   ├── file_970\n│   ├── file_971\n│   ├── file_972\n│   ├── file_973\n│   ├── file_974\n│   ├── file_975\n│   ├── file_976\n│   ├── file_977\n│   ├── file_978\n│   ├── file_979\n│   ├── file_980\n│   ├── file_981\n│   ├── file_982\n│   ├── file_983\n│   ├── file_984\n│   ├── file_985\n│   ├── file_986\n│   ├── file_987\n│   ├── file_988\n│   ├── file_989\n│   ├── file_990\n│   ├── file_991\n│   ├── file_992\n│   ├── file_993\n│   ├── file_994\n│   ├── file_995\n│   ├── file_996\n│   ├── file_997\n│   ├── file_998\n│   └── file_999\n├── group\n│   └── file\n├── icons\n│   ├── c++.cpp\n│   ├── c.c\n│   ├── css.css\n│   ├── file\n│   ├── go.go\n│   ├── html.html\n│   ├── java.java\n│   ├── javascript.js\n│   ├── man.1\n│   ├── marked.md\n│   ├── php.php\n│   ├── python.py\n│   ├── ruby.rb\n│   ├── rust.rs\n│   ├── shell.sh\n│   └── unknown.unknown\n├── perms\n│   ├── file\n│   └── file2\n├── size\n│   ├── 1B\n│   ├── 1K\n│   ├── 1M\n│   └── 1337\n├── specials\n├── symlinks\n│   ├── dir\n│   ├── file\n│   ├── ' lorem ipsum'\n│   ├── symlink -> file\n│   ├── symlink2 -> symlink\n│   ├── symlink3 -> dir\n│   └── symlink4 -> pipitek\n└── time\n    ├── 1d\n    ├── 1h\n    ├── 1m\n    ├── 1s\n    ├── 1y\n    └── epoch\n"
  },
  {
    "path": "tests/ptests/ptest_607792764dd84355.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T --level 5\""
  },
  {
    "path": "tests/ptests/ptest_62034c92edbb1244.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_62034c92edbb1244.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_62034c92edbb1244.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -n \""
  },
  {
    "path": "tests/ptests/ptest_631e7c0eadc876e3.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_631e7c0eadc876e3.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_631e7c0eadc876e3.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --dereference \""
  },
  {
    "path": "tests/ptests/ptest_66a65e6644555c05.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_66a65e6644555c05.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_66a65e6644555c05.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -I *.toml\""
  },
  {
    "path": "tests/ptests/ptest_6796295d6420d03a.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_6796295d6420d03a.stdout",
    "content": "tests/test_dir\n├── git\n│   ├── 001\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 002\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 003\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 004\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 005\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 006\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 007\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 008\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 009\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   └── 010\n│       ├── file_000\n│       ├── file_001\n│       ├── file_002\n│       ├── file_003\n│       ├── file_004\n│       ├── file_005\n│       ├── file_006\n│       ├── file_007\n│       ├── file_008\n│       └── file_009\n├── grid\n│   ├── 0001\n│   ├── 0002\n│   ├── 0003\n│   ├── 0004\n│   ├── 0005\n│   ├── 0006\n│   ├── 0007\n│   ├── 0008\n│   ├── 0009\n│   ├── 0010\n│   ├── 0011\n│   ├── 0012\n│   ├── 0013\n│   ├── 0014\n│   ├── 0015\n│   ├── 0016\n│   ├── 0017\n│   ├── 0018\n│   ├── 0019\n│   ├── 0020\n│   ├── 0021\n│   ├── 0022\n│   ├── 0023\n│   ├── 0024\n│   ├── 0025\n│   ├── 0026\n│   ├── 0027\n│   ├── 0028\n│   ├── 0029\n│   ├── 0030\n│   ├── 0031\n│   ├── 0032\n│   ├── 0033\n│   ├── 0034\n│   ├── 0035\n│   ├── 0036\n│   ├── 0037\n│   ├── 0038\n│   ├── 0039\n│   ├── 0040\n│   ├── 0041\n│   ├── 0042\n│   ├── 0043\n│   ├── 0044\n│   ├── 0045\n│   ├── 0046\n│   ├── 0047\n│   ├── 0048\n│   ├── 0049\n│   ├── 0050\n│   ├── 0051\n│   ├── 0052\n│   ├── 0053\n│   ├── 0054\n│   ├── 0055\n│   ├── 0056\n│   ├── 0057\n│   ├── 0058\n│   ├── 0059\n│   ├── 0060\n│   ├── 0061\n│   ├── 0062\n│   ├── 0063\n│   ├── 0064\n│   ├── 0065\n│   ├── 0066\n│   ├── 0067\n│   ├── 0068\n│   ├── 0069\n│   ├── 0070\n│   ├── 0071\n│   ├── 0072\n│   ├── 0073\n│   ├── 0074\n│   ├── 0075\n│   ├── 0076\n│   ├── 0077\n│   ├── 0078\n│   ├── 0079\n│   ├── 0080\n│   ├── 0081\n│   ├── 0082\n│   ├── 0083\n│   ├── 0084\n│   ├── 0085\n│   ├── 0086\n│   ├── 0087\n│   ├── 0088\n│   ├── 0089\n│   ├── 0090\n│   ├── 0091\n│   ├── 0092\n│   ├── 0093\n│   ├── 0094\n│   ├── 0095\n│   ├── 0096\n│   ├── 0097\n│   ├── 0098\n│   ├── 0099\n│   ├── 0100\n│   ├── 0101\n│   ├── 0102\n│   ├── 0103\n│   ├── 0104\n│   ├── 0105\n│   ├── 0106\n│   ├── 0107\n│   ├── 0108\n│   ├── 0109\n│   ├── 0110\n│   ├── 0111\n│   ├── 0112\n│   ├── 0113\n│   ├── 0114\n│   ├── 0115\n│   ├── 0116\n│   ├── 0117\n│   ├── 0118\n│   ├── 0119\n│   ├── 0120\n│   ├── 0121\n│   ├── 0122\n│   ├── 0123\n│   ├── 0124\n│   ├── 0125\n│   ├── 0126\n│   ├── 0127\n│   ├── 0128\n│   ├── 0129\n│   ├── 0130\n│   ├── 0131\n│   ├── 0132\n│   ├── 0133\n│   ├── 0134\n│   ├── 0135\n│   ├── 0136\n│   ├── 0137\n│   ├── 0138\n│   ├── 0139\n│   ├── 0140\n│   ├── 0141\n│   ├── 0142\n│   ├── 0143\n│   ├── 0144\n│   ├── 0145\n│   ├── 0146\n│   ├── 0147\n│   ├── 0148\n│   ├── 0149\n│   ├── 0150\n│   ├── 0151\n│   ├── 0152\n│   ├── 0153\n│   ├── 0154\n│   ├── 0155\n│   ├── 0156\n│   ├── 0157\n│   ├── 0158\n│   ├── 0159\n│   ├── 0160\n│   ├── 0161\n│   ├── 0162\n│   ├── 0163\n│   ├── 0164\n│   ├── 0165\n│   ├── 0166\n│   ├── 0167\n│   ├── 0168\n│   ├── 0169\n│   ├── 0170\n│   ├── 0171\n│   ├── 0172\n│   ├── 0173\n│   ├── 0174\n│   ├── 0175\n│   ├── 0176\n│   ├── 0177\n│   ├── 0178\n│   ├── 0179\n│   ├── 0180\n│   ├── 0181\n│   ├── 0182\n│   ├── 0183\n│   ├── 0184\n│   ├── 0185\n│   ├── 0186\n│   ├── 0187\n│   ├── 0188\n│   ├── 0189\n│   ├── 0190\n│   ├── 0191\n│   ├── 0192\n│   ├── 0193\n│   ├── 0194\n│   ├── 0195\n│   ├── 0196\n│   ├── 0197\n│   ├── 0198\n│   ├── 0199\n│   ├── 0200\n│   ├── 0201\n│   ├── 0202\n│   ├── 0203\n│   ├── 0204\n│   ├── 0205\n│   ├── 0206\n│   ├── 0207\n│   ├── 0208\n│   ├── 0209\n│   ├── 0210\n│   ├── 0211\n│   ├── 0212\n│   ├── 0213\n│   ├── 0214\n│   ├── 0215\n│   ├── 0216\n│   ├── 0217\n│   ├── 0218\n│   ├── 0219\n│   ├── 0220\n│   ├── 0221\n│   ├── 0222\n│   ├── 0223\n│   ├── 0224\n│   ├── 0225\n│   ├── 0226\n│   ├── 0227\n│   ├── 0228\n│   ├── 0229\n│   ├── 0230\n│   ├── 0231\n│   ├── 0232\n│   ├── 0233\n│   ├── 0234\n│   ├── 0235\n│   ├── 0236\n│   ├── 0237\n│   ├── 0238\n│   ├── 0239\n│   ├── 0240\n│   ├── 0241\n│   ├── 0242\n│   ├── 0243\n│   ├── 0244\n│   ├── 0245\n│   ├── 0246\n│   ├── 0247\n│   ├── 0248\n│   ├── 0249\n│   ├── 0250\n│   ├── 0251\n│   ├── 0252\n│   ├── 0253\n│   ├── 0254\n│   ├── 0255\n│   ├── 0256\n│   ├── 0257\n│   ├── 0258\n│   ├── 0259\n│   ├── 0260\n│   ├── 0261\n│   ├── 0262\n│   ├── 0263\n│   ├── 0264\n│   ├── 0265\n│   ├── 0266\n│   ├── 0267\n│   ├── 0268\n│   ├── 0269\n│   ├── 0270\n│   ├── 0271\n│   ├── 0272\n│   ├── 0273\n│   ├── 0274\n│   ├── 0275\n│   ├── 0276\n│   ├── 0277\n│   ├── 0278\n│   ├── 0279\n│   ├── 0280\n│   ├── 0281\n│   ├── 0282\n│   ├── 0283\n│   ├── 0284\n│   ├── 0285\n│   ├── 0286\n│   ├── 0287\n│   ├── 0288\n│   ├── 0289\n│   ├── 0290\n│   ├── 0291\n│   ├── 0292\n│   ├── 0293\n│   ├── 0294\n│   ├── 0295\n│   ├── 0296\n│   ├── 0297\n│   ├── 0298\n│   ├── 0299\n│   ├── 0300\n│   ├── 0301\n│   ├── 0302\n│   ├── 0303\n│   ├── 0304\n│   ├── 0305\n│   ├── 0306\n│   ├── 0307\n│   ├── 0308\n│   ├── 0309\n│   ├── 0310\n│   ├── 0311\n│   ├── 0312\n│   ├── 0313\n│   ├── 0314\n│   ├── 0315\n│   ├── 0316\n│   ├── 0317\n│   ├── 0318\n│   ├── 0319\n│   ├── 0320\n│   ├── 0321\n│   ├── 0322\n│   ├── 0323\n│   ├── 0324\n│   ├── 0325\n│   ├── 0326\n│   ├── 0327\n│   ├── 0328\n│   ├── 0329\n│   ├── 0330\n│   ├── 0331\n│   ├── 0332\n│   ├── 0333\n│   ├── 0334\n│   ├── 0335\n│   ├── 0336\n│   ├── 0337\n│   ├── 0338\n│   ├── 0339\n│   ├── 0340\n│   ├── 0341\n│   ├── 0342\n│   ├── 0343\n│   ├── 0344\n│   ├── 0345\n│   ├── 0346\n│   ├── 0347\n│   ├── 0348\n│   ├── 0349\n│   ├── 0350\n│   ├── 0351\n│   ├── 0352\n│   ├── 0353\n│   ├── 0354\n│   ├── 0355\n│   ├── 0356\n│   ├── 0357\n│   ├── 0358\n│   ├── 0359\n│   ├── 0360\n│   ├── 0361\n│   ├── 0362\n│   ├── 0363\n│   ├── 0364\n│   ├── 0365\n│   ├── 0366\n│   ├── 0367\n│   ├── 0368\n│   ├── 0369\n│   ├── 0370\n│   ├── 0371\n│   ├── 0372\n│   ├── 0373\n│   ├── 0374\n│   ├── 0375\n│   ├── 0376\n│   ├── 0377\n│   ├── 0378\n│   ├── 0379\n│   ├── 0380\n│   ├── 0381\n│   ├── 0382\n│   ├── 0383\n│   ├── 0384\n│   ├── 0385\n│   ├── 0386\n│   ├── 0387\n│   ├── 0388\n│   ├── 0389\n│   ├── 0390\n│   ├── 0391\n│   ├── 0392\n│   ├── 0393\n│   ├── 0394\n│   ├── 0395\n│   ├── 0396\n│   ├── 0397\n│   ├── 0398\n│   ├── 0399\n│   ├── 0400\n│   ├── 0401\n│   ├── 0402\n│   ├── 0403\n│   ├── 0404\n│   ├── 0405\n│   ├── 0406\n│   ├── 0407\n│   ├── 0408\n│   ├── 0409\n│   ├── 0410\n│   ├── 0411\n│   ├── 0412\n│   ├── 0413\n│   ├── 0414\n│   ├── 0415\n│   ├── 0416\n│   ├── 0417\n│   ├── 0418\n│   ├── 0419\n│   ├── 0420\n│   ├── 0421\n│   ├── 0422\n│   ├── 0423\n│   ├── 0424\n│   ├── 0425\n│   ├── 0426\n│   ├── 0427\n│   ├── 0428\n│   ├── 0429\n│   ├── 0430\n│   ├── 0431\n│   ├── 0432\n│   ├── 0433\n│   ├── 0434\n│   ├── 0435\n│   ├── 0436\n│   ├── 0437\n│   ├── 0438\n│   ├── 0439\n│   ├── 0440\n│   ├── 0441\n│   ├── 0442\n│   ├── 0443\n│   ├── 0444\n│   ├── 0445\n│   ├── 0446\n│   ├── 0447\n│   ├── 0448\n│   ├── 0449\n│   ├── 0450\n│   ├── 0451\n│   ├── 0452\n│   ├── 0453\n│   ├── 0454\n│   ├── 0455\n│   ├── 0456\n│   ├── 0457\n│   ├── 0458\n│   ├── 0459\n│   ├── 0460\n│   ├── 0461\n│   ├── 0462\n│   ├── 0463\n│   ├── 0464\n│   ├── 0465\n│   ├── 0466\n│   ├── 0467\n│   ├── 0468\n│   ├── 0469\n│   ├── 0470\n│   ├── 0471\n│   ├── 0472\n│   ├── 0473\n│   ├── 0474\n│   ├── 0475\n│   ├── 0476\n│   ├── 0477\n│   ├── 0478\n│   ├── 0479\n│   ├── 0480\n│   ├── 0481\n│   ├── 0482\n│   ├── 0483\n│   ├── 0484\n│   ├── 0485\n│   ├── 0486\n│   ├── 0487\n│   ├── 0488\n│   ├── 0489\n│   ├── 0490\n│   ├── 0491\n│   ├── 0492\n│   ├── 0493\n│   ├── 0494\n│   ├── 0495\n│   ├── 0496\n│   ├── 0497\n│   ├── 0498\n│   ├── 0499\n│   ├── 0500\n│   ├── 0501\n│   ├── 0502\n│   ├── 0503\n│   ├── 0504\n│   ├── 0505\n│   ├── 0506\n│   ├── 0507\n│   ├── 0508\n│   ├── 0509\n│   ├── 0510\n│   ├── 0511\n│   ├── 0512\n│   ├── 0513\n│   ├── 0514\n│   ├── 0515\n│   ├── 0516\n│   ├── 0517\n│   ├── 0518\n│   ├── 0519\n│   ├── 0520\n│   ├── 0521\n│   ├── 0522\n│   ├── 0523\n│   ├── 0524\n│   ├── 0525\n│   ├── 0526\n│   ├── 0527\n│   ├── 0528\n│   ├── 0529\n│   ├── 0530\n│   ├── 0531\n│   ├── 0532\n│   ├── 0533\n│   ├── 0534\n│   ├── 0535\n│   ├── 0536\n│   ├── 0537\n│   ├── 0538\n│   ├── 0539\n│   ├── 0540\n│   ├── 0541\n│   ├── 0542\n│   ├── 0543\n│   ├── 0544\n│   ├── 0545\n│   ├── 0546\n│   ├── 0547\n│   ├── 0548\n│   ├── 0549\n│   ├── 0550\n│   ├── 0551\n│   ├── 0552\n│   ├── 0553\n│   ├── 0554\n│   ├── 0555\n│   ├── 0556\n│   ├── 0557\n│   ├── 0558\n│   ├── 0559\n│   ├── 0560\n│   ├── 0561\n│   ├── 0562\n│   ├── 0563\n│   ├── 0564\n│   ├── 0565\n│   ├── 0566\n│   ├── 0567\n│   ├── 0568\n│   ├── 0569\n│   ├── 0570\n│   ├── 0571\n│   ├── 0572\n│   ├── 0573\n│   ├── 0574\n│   ├── 0575\n│   ├── 0576\n│   ├── 0577\n│   ├── 0578\n│   ├── 0579\n│   ├── 0580\n│   ├── 0581\n│   ├── 0582\n│   ├── 0583\n│   ├── 0584\n│   ├── 0585\n│   ├── 0586\n│   ├── 0587\n│   ├── 0588\n│   ├── 0589\n│   ├── 0590\n│   ├── 0591\n│   ├── 0592\n│   ├── 0593\n│   ├── 0594\n│   ├── 0595\n│   ├── 0596\n│   ├── 0597\n│   ├── 0598\n│   ├── 0599\n│   ├── 0600\n│   ├── 0601\n│   ├── 0602\n│   ├── 0603\n│   ├── 0604\n│   ├── 0605\n│   ├── 0606\n│   ├── 0607\n│   ├── 0608\n│   ├── 0609\n│   ├── 0610\n│   ├── 0611\n│   ├── 0612\n│   ├── 0613\n│   ├── 0614\n│   ├── 0615\n│   ├── 0616\n│   ├── 0617\n│   ├── 0618\n│   ├── 0619\n│   ├── 0620\n│   ├── 0621\n│   ├── 0622\n│   ├── 0623\n│   ├── 0624\n│   ├── 0625\n│   ├── 0626\n│   ├── 0627\n│   ├── 0628\n│   ├── 0629\n│   ├── 0630\n│   ├── 0631\n│   ├── 0632\n│   ├── 0633\n│   ├── 0634\n│   ├── 0635\n│   ├── 0636\n│   ├── 0637\n│   ├── 0638\n│   ├── 0639\n│   ├── 0640\n│   ├── 0641\n│   ├── 0642\n│   ├── 0643\n│   ├── 0644\n│   ├── 0645\n│   ├── 0646\n│   ├── 0647\n│   ├── 0648\n│   ├── 0649\n│   ├── 0650\n│   ├── 0651\n│   ├── 0652\n│   ├── 0653\n│   ├── 0654\n│   ├── 0655\n│   ├── 0656\n│   ├── 0657\n│   ├── 0658\n│   ├── 0659\n│   ├── 0660\n│   ├── 0661\n│   ├── 0662\n│   ├── 0663\n│   ├── 0664\n│   ├── 0665\n│   ├── 0666\n│   ├── 0667\n│   ├── 0668\n│   ├── 0669\n│   ├── 0670\n│   ├── 0671\n│   ├── 0672\n│   ├── 0673\n│   ├── 0674\n│   ├── 0675\n│   ├── 0676\n│   ├── 0677\n│   ├── 0678\n│   ├── 0679\n│   ├── 0680\n│   ├── 0681\n│   ├── 0682\n│   ├── 0683\n│   ├── 0684\n│   ├── 0685\n│   ├── 0686\n│   ├── 0687\n│   ├── 0688\n│   ├── 0689\n│   ├── 0690\n│   ├── 0691\n│   ├── 0692\n│   ├── 0693\n│   ├── 0694\n│   ├── 0695\n│   ├── 0696\n│   ├── 0697\n│   ├── 0698\n│   ├── 0699\n│   ├── 0700\n│   ├── 0701\n│   ├── 0702\n│   ├── 0703\n│   ├── 0704\n│   ├── 0705\n│   ├── 0706\n│   ├── 0707\n│   ├── 0708\n│   ├── 0709\n│   ├── 0710\n│   ├── 0711\n│   ├── 0712\n│   ├── 0713\n│   ├── 0714\n│   ├── 0715\n│   ├── 0716\n│   ├── 0717\n│   ├── 0718\n│   ├── 0719\n│   ├── 0720\n│   ├── 0721\n│   ├── 0722\n│   ├── 0723\n│   ├── 0724\n│   ├── 0725\n│   ├── 0726\n│   ├── 0727\n│   ├── 0728\n│   ├── 0729\n│   ├── 0730\n│   ├── 0731\n│   ├── 0732\n│   ├── 0733\n│   ├── 0734\n│   ├── 0735\n│   ├── 0736\n│   ├── 0737\n│   ├── 0738\n│   ├── 0739\n│   ├── 0740\n│   ├── 0741\n│   ├── 0742\n│   ├── 0743\n│   ├── 0744\n│   ├── 0745\n│   ├── 0746\n│   ├── 0747\n│   ├── 0748\n│   ├── 0749\n│   ├── 0750\n│   ├── 0751\n│   ├── 0752\n│   ├── 0753\n│   ├── 0754\n│   ├── 0755\n│   ├── 0756\n│   ├── 0757\n│   ├── 0758\n│   ├── 0759\n│   ├── 0760\n│   ├── 0761\n│   ├── 0762\n│   ├── 0763\n│   ├── 0764\n│   ├── 0765\n│   ├── 0766\n│   ├── 0767\n│   ├── 0768\n│   ├── 0769\n│   ├── 0770\n│   ├── 0771\n│   ├── 0772\n│   ├── 0773\n│   ├── 0774\n│   ├── 0775\n│   ├── 0776\n│   ├── 0777\n│   ├── 0778\n│   ├── 0779\n│   ├── 0780\n│   ├── 0781\n│   ├── 0782\n│   ├── 0783\n│   ├── 0784\n│   ├── 0785\n│   ├── 0786\n│   ├── 0787\n│   ├── 0788\n│   ├── 0789\n│   ├── 0790\n│   ├── 0791\n│   ├── 0792\n│   ├── 0793\n│   ├── 0794\n│   ├── 0795\n│   ├── 0796\n│   ├── 0797\n│   ├── 0798\n│   ├── 0799\n│   ├── 0800\n│   ├── 0801\n│   ├── 0802\n│   ├── 0803\n│   ├── 0804\n│   ├── 0805\n│   ├── 0806\n│   ├── 0807\n│   ├── 0808\n│   ├── 0809\n│   ├── 0810\n│   ├── 0811\n│   ├── 0812\n│   ├── 0813\n│   ├── 0814\n│   ├── 0815\n│   ├── 0816\n│   ├── 0817\n│   ├── 0818\n│   ├── 0819\n│   ├── 0820\n│   ├── 0821\n│   ├── 0822\n│   ├── 0823\n│   ├── 0824\n│   ├── 0825\n│   ├── 0826\n│   ├── 0827\n│   ├── 0828\n│   ├── 0829\n│   ├── 0830\n│   ├── 0831\n│   ├── 0832\n│   ├── 0833\n│   ├── 0834\n│   ├── 0835\n│   ├── 0836\n│   ├── 0837\n│   ├── 0838\n│   ├── 0839\n│   ├── 0840\n│   ├── 0841\n│   ├── 0842\n│   ├── 0843\n│   ├── 0844\n│   ├── 0845\n│   ├── 0846\n│   ├── 0847\n│   ├── 0848\n│   ├── 0849\n│   ├── 0850\n│   ├── 0851\n│   ├── 0852\n│   ├── 0853\n│   ├── 0854\n│   ├── 0855\n│   ├── 0856\n│   ├── 0857\n│   ├── 0858\n│   ├── 0859\n│   ├── 0860\n│   ├── 0861\n│   ├── 0862\n│   ├── 0863\n│   ├── 0864\n│   ├── 0865\n│   ├── 0866\n│   ├── 0867\n│   ├── 0868\n│   ├── 0869\n│   ├── 0870\n│   ├── 0871\n│   ├── 0872\n│   ├── 0873\n│   ├── 0874\n│   ├── 0875\n│   ├── 0876\n│   ├── 0877\n│   ├── 0878\n│   ├── 0879\n│   ├── 0880\n│   ├── 0881\n│   ├── 0882\n│   ├── 0883\n│   ├── 0884\n│   ├── 0885\n│   ├── 0886\n│   ├── 0887\n│   ├── 0888\n│   ├── 0889\n│   ├── 0890\n│   ├── 0891\n│   ├── 0892\n│   ├── 0893\n│   ├── 0894\n│   ├── 0895\n│   ├── 0896\n│   ├── 0897\n│   ├── 0898\n│   ├── 0899\n│   ├── 0900\n│   ├── 0901\n│   ├── 0902\n│   ├── 0903\n│   ├── 0904\n│   ├── 0905\n│   ├── 0906\n│   ├── 0907\n│   ├── 0908\n│   ├── 0909\n│   ├── 0910\n│   ├── 0911\n│   ├── 0912\n│   ├── 0913\n│   ├── 0914\n│   ├── 0915\n│   ├── 0916\n│   ├── 0917\n│   ├── 0918\n│   ├── 0919\n│   ├── 0920\n│   ├── 0921\n│   ├── 0922\n│   ├── 0923\n│   ├── 0924\n│   ├── 0925\n│   ├── 0926\n│   ├── 0927\n│   ├── 0928\n│   ├── 0929\n│   ├── 0930\n│   ├── 0931\n│   ├── 0932\n│   ├── 0933\n│   ├── 0934\n│   ├── 0935\n│   ├── 0936\n│   ├── 0937\n│   ├── 0938\n│   ├── 0939\n│   ├── 0940\n│   ├── 0941\n│   ├── 0942\n│   ├── 0943\n│   ├── 0944\n│   ├── 0945\n│   ├── 0946\n│   ├── 0947\n│   ├── 0948\n│   ├── 0949\n│   ├── 0950\n│   ├── 0951\n│   ├── 0952\n│   ├── 0953\n│   ├── 0954\n│   ├── 0955\n│   ├── 0956\n│   ├── 0957\n│   ├── 0958\n│   ├── 0959\n│   ├── 0960\n│   ├── 0961\n│   ├── 0962\n│   ├── 0963\n│   ├── 0964\n│   ├── 0965\n│   ├── 0966\n│   ├── 0967\n│   ├── 0968\n│   ├── 0969\n│   ├── 0970\n│   ├── 0971\n│   ├── 0972\n│   ├── 0973\n│   ├── 0974\n│   ├── 0975\n│   ├── 0976\n│   ├── 0977\n│   ├── 0978\n│   ├── 0979\n│   ├── 0980\n│   ├── 0981\n│   ├── 0982\n│   ├── 0983\n│   ├── 0984\n│   ├── 0985\n│   ├── 0986\n│   ├── 0987\n│   ├── 0988\n│   ├── 0989\n│   ├── 0990\n│   ├── 0991\n│   ├── 0992\n│   ├── 0993\n│   ├── 0994\n│   ├── 0995\n│   ├── 0996\n│   ├── 0997\n│   ├── 0998\n│   ├── 0999\n│   ├── 1000\n│   ├── file_000\n│   ├── file_001\n│   ├── file_002\n│   ├── file_003\n│   ├── file_004\n│   ├── file_005\n│   ├── file_006\n│   ├── file_007\n│   ├── file_008\n│   ├── file_009\n│   ├── file_010\n│   ├── file_011\n│   ├── file_012\n│   ├── file_013\n│   ├── file_014\n│   ├── file_015\n│   ├── file_016\n│   ├── file_017\n│   ├── file_018\n│   ├── file_019\n│   ├── file_020\n│   ├── file_021\n│   ├── file_022\n│   ├── file_023\n│   ├── file_024\n│   ├── file_025\n│   ├── file_026\n│   ├── file_027\n│   ├── file_028\n│   ├── file_029\n│   ├── file_030\n│   ├── file_031\n│   ├── file_032\n│   ├── file_033\n│   ├── file_034\n│   ├── file_035\n│   ├── file_036\n│   ├── file_037\n│   ├── file_038\n│   ├── file_039\n│   ├── file_040\n│   ├── file_041\n│   ├── file_042\n│   ├── file_043\n│   ├── file_044\n│   ├── file_045\n│   ├── file_046\n│   ├── file_047\n│   ├── file_048\n│   ├── file_049\n│   ├── file_050\n│   ├── file_051\n│   ├── file_052\n│   ├── file_053\n│   ├── file_054\n│   ├── file_055\n│   ├── file_056\n│   ├── file_057\n│   ├── file_058\n│   ├── file_059\n│   ├── file_060\n│   ├── file_061\n│   ├── file_062\n│   ├── file_063\n│   ├── file_064\n│   ├── file_065\n│   ├── file_066\n│   ├── file_067\n│   ├── file_068\n│   ├── file_069\n│   ├── file_070\n│   ├── file_071\n│   ├── file_072\n│   ├── file_073\n│   ├── file_074\n│   ├── file_075\n│   ├── file_076\n│   ├── file_077\n│   ├── file_078\n│   ├── file_079\n│   ├── file_080\n│   ├── file_081\n│   ├── file_082\n│   ├── file_083\n│   ├── file_084\n│   ├── file_085\n│   ├── file_086\n│   ├── file_087\n│   ├── file_088\n│   ├── file_089\n│   ├── file_090\n│   ├── file_091\n│   ├── file_092\n│   ├── file_093\n│   ├── file_094\n│   ├── file_095\n│   ├── file_096\n│   ├── file_097\n│   ├── file_098\n│   ├── file_099\n│   ├── file_100\n│   ├── file_101\n│   ├── file_102\n│   ├── file_103\n│   ├── file_104\n│   ├── file_105\n│   ├── file_106\n│   ├── file_107\n│   ├── file_108\n│   ├── file_109\n│   ├── file_110\n│   ├── file_111\n│   ├── file_112\n│   ├── file_113\n│   ├── file_114\n│   ├── file_115\n│   ├── file_116\n│   ├── file_117\n│   ├── file_118\n│   ├── file_119\n│   ├── file_120\n│   ├── file_121\n│   ├── file_122\n│   ├── file_123\n│   ├── file_124\n│   ├── file_125\n│   ├── file_126\n│   ├── file_127\n│   ├── file_128\n│   ├── file_129\n│   ├── file_130\n│   ├── file_131\n│   ├── file_132\n│   ├── file_133\n│   ├── file_134\n│   ├── file_135\n│   ├── file_136\n│   ├── file_137\n│   ├── file_138\n│   ├── file_139\n│   ├── file_140\n│   ├── file_141\n│   ├── file_142\n│   ├── file_143\n│   ├── file_144\n│   ├── file_145\n│   ├── file_146\n│   ├── file_147\n│   ├── file_148\n│   ├── file_149\n│   ├── file_150\n│   ├── file_151\n│   ├── file_152\n│   ├── file_153\n│   ├── file_154\n│   ├── file_155\n│   ├── file_156\n│   ├── file_157\n│   ├── file_158\n│   ├── file_159\n│   ├── file_160\n│   ├── file_161\n│   ├── file_162\n│   ├── file_163\n│   ├── file_164\n│   ├── file_165\n│   ├── file_166\n│   ├── file_167\n│   ├── file_168\n│   ├── file_169\n│   ├── file_170\n│   ├── file_171\n│   ├── file_172\n│   ├── file_173\n│   ├── file_174\n│   ├── file_175\n│   ├── file_176\n│   ├── file_177\n│   ├── file_178\n│   ├── file_179\n│   ├── file_180\n│   ├── file_181\n│   ├── file_182\n│   ├── file_183\n│   ├── file_184\n│   ├── file_185\n│   ├── file_186\n│   ├── file_187\n│   ├── file_188\n│   ├── file_189\n│   ├── file_190\n│   ├── file_191\n│   ├── file_192\n│   ├── file_193\n│   ├── file_194\n│   ├── file_195\n│   ├── file_196\n│   ├── file_197\n│   ├── file_198\n│   ├── file_199\n│   ├── file_200\n│   ├── file_201\n│   ├── file_202\n│   ├── file_203\n│   ├── file_204\n│   ├── file_205\n│   ├── file_206\n│   ├── file_207\n│   ├── file_208\n│   ├── file_209\n│   ├── file_210\n│   ├── file_211\n│   ├── file_212\n│   ├── file_213\n│   ├── file_214\n│   ├── file_215\n│   ├── file_216\n│   ├── file_217\n│   ├── file_218\n│   ├── file_219\n│   ├── file_220\n│   ├── file_221\n│   ├── file_222\n│   ├── file_223\n│   ├── file_224\n│   ├── file_225\n│   ├── file_226\n│   ├── file_227\n│   ├── file_228\n│   ├── file_229\n│   ├── file_230\n│   ├── file_231\n│   ├── file_232\n│   ├── file_233\n│   ├── file_234\n│   ├── file_235\n│   ├── file_236\n│   ├── file_237\n│   ├── file_238\n│   ├── file_239\n│   ├── file_240\n│   ├── file_241\n│   ├── file_242\n│   ├── file_243\n│   ├── file_244\n│   ├── file_245\n│   ├── file_246\n│   ├── file_247\n│   ├── file_248\n│   ├── file_249\n│   ├── file_250\n│   ├── file_251\n│   ├── file_252\n│   ├── file_253\n│   ├── file_254\n│   ├── file_255\n│   ├── file_256\n│   ├── file_257\n│   ├── file_258\n│   ├── file_259\n│   ├── file_260\n│   ├── file_261\n│   ├── file_262\n│   ├── file_263\n│   ├── file_264\n│   ├── file_265\n│   ├── file_266\n│   ├── file_267\n│   ├── file_268\n│   ├── file_269\n│   ├── file_270\n│   ├── file_271\n│   ├── file_272\n│   ├── file_273\n│   ├── file_274\n│   ├── file_275\n│   ├── file_276\n│   ├── file_277\n│   ├── file_278\n│   ├── file_279\n│   ├── file_280\n│   ├── file_281\n│   ├── file_282\n│   ├── file_283\n│   ├── file_284\n│   ├── file_285\n│   ├── file_286\n│   ├── file_287\n│   ├── file_288\n│   ├── file_289\n│   ├── file_290\n│   ├── file_291\n│   ├── file_292\n│   ├── file_293\n│   ├── file_294\n│   ├── file_295\n│   ├── file_296\n│   ├── file_297\n│   ├── file_298\n│   ├── file_299\n│   ├── file_300\n│   ├── file_301\n│   ├── file_302\n│   ├── file_303\n│   ├── file_304\n│   ├── file_305\n│   ├── file_306\n│   ├── file_307\n│   ├── file_308\n│   ├── file_309\n│   ├── file_310\n│   ├── file_311\n│   ├── file_312\n│   ├── file_313\n│   ├── file_314\n│   ├── file_315\n│   ├── file_316\n│   ├── file_317\n│   ├── file_318\n│   ├── file_319\n│   ├── file_320\n│   ├── file_321\n│   ├── file_322\n│   ├── file_323\n│   ├── file_324\n│   ├── file_325\n│   ├── file_326\n│   ├── file_327\n│   ├── file_328\n│   ├── file_329\n│   ├── file_330\n│   ├── file_331\n│   ├── file_332\n│   ├── file_333\n│   ├── file_334\n│   ├── file_335\n│   ├── file_336\n│   ├── file_337\n│   ├── file_338\n│   ├── file_339\n│   ├── file_340\n│   ├── file_341\n│   ├── file_342\n│   ├── file_343\n│   ├── file_344\n│   ├── file_345\n│   ├── file_346\n│   ├── file_347\n│   ├── file_348\n│   ├── file_349\n│   ├── file_350\n│   ├── file_351\n│   ├── file_352\n│   ├── file_353\n│   ├── file_354\n│   ├── file_355\n│   ├── file_356\n│   ├── file_357\n│   ├── file_358\n│   ├── file_359\n│   ├── file_360\n│   ├── file_361\n│   ├── file_362\n│   ├── file_363\n│   ├── file_364\n│   ├── file_365\n│   ├── file_366\n│   ├── file_367\n│   ├── file_368\n│   ├── file_369\n│   ├── file_370\n│   ├── file_371\n│   ├── file_372\n│   ├── file_373\n│   ├── file_374\n│   ├── file_375\n│   ├── file_376\n│   ├── file_377\n│   ├── file_378\n│   ├── file_379\n│   ├── file_380\n│   ├── file_381\n│   ├── file_382\n│   ├── file_383\n│   ├── file_384\n│   ├── file_385\n│   ├── file_386\n│   ├── file_387\n│   ├── file_388\n│   ├── file_389\n│   ├── file_390\n│   ├── file_391\n│   ├── file_392\n│   ├── file_393\n│   ├── file_394\n│   ├── file_395\n│   ├── file_396\n│   ├── file_397\n│   ├── file_398\n│   ├── file_399\n│   ├── file_400\n│   ├── file_401\n│   ├── file_402\n│   ├── file_403\n│   ├── file_404\n│   ├── file_405\n│   ├── file_406\n│   ├── file_407\n│   ├── file_408\n│   ├── file_409\n│   ├── file_410\n│   ├── file_411\n│   ├── file_412\n│   ├── file_413\n│   ├── file_414\n│   ├── file_415\n│   ├── file_416\n│   ├── file_417\n│   ├── file_418\n│   ├── file_419\n│   ├── file_420\n│   ├── file_421\n│   ├── file_422\n│   ├── file_423\n│   ├── file_424\n│   ├── file_425\n│   ├── file_426\n│   ├── file_427\n│   ├── file_428\n│   ├── file_429\n│   ├── file_430\n│   ├── file_431\n│   ├── file_432\n│   ├── file_433\n│   ├── file_434\n│   ├── file_435\n│   ├── file_436\n│   ├── file_437\n│   ├── file_438\n│   ├── file_439\n│   ├── file_440\n│   ├── file_441\n│   ├── file_442\n│   ├── file_443\n│   ├── file_444\n│   ├── file_445\n│   ├── file_446\n│   ├── file_447\n│   ├── file_448\n│   ├── file_449\n│   ├── file_450\n│   ├── file_451\n│   ├── file_452\n│   ├── file_453\n│   ├── file_454\n│   ├── file_455\n│   ├── file_456\n│   ├── file_457\n│   ├── file_458\n│   ├── file_459\n│   ├── file_460\n│   ├── file_461\n│   ├── file_462\n│   ├── file_463\n│   ├── file_464\n│   ├── file_465\n│   ├── file_466\n│   ├── file_467\n│   ├── file_468\n│   ├── file_469\n│   ├── file_470\n│   ├── file_471\n│   ├── file_472\n│   ├── file_473\n│   ├── file_474\n│   ├── file_475\n│   ├── file_476\n│   ├── file_477\n│   ├── file_478\n│   ├── file_479\n│   ├── file_480\n│   ├── file_481\n│   ├── file_482\n│   ├── file_483\n│   ├── file_484\n│   ├── file_485\n│   ├── file_486\n│   ├── file_487\n│   ├── file_488\n│   ├── file_489\n│   ├── file_490\n│   ├── file_491\n│   ├── file_492\n│   ├── file_493\n│   ├── file_494\n│   ├── file_495\n│   ├── file_496\n│   ├── file_497\n│   ├── file_498\n│   ├── file_499\n│   ├── file_500\n│   ├── file_501\n│   ├── file_502\n│   ├── file_503\n│   ├── file_504\n│   ├── file_505\n│   ├── file_506\n│   ├── file_507\n│   ├── file_508\n│   ├── file_509\n│   ├── file_510\n│   ├── file_511\n│   ├── file_512\n│   ├── file_513\n│   ├── file_514\n│   ├── file_515\n│   ├── file_516\n│   ├── file_517\n│   ├── file_518\n│   ├── file_519\n│   ├── file_520\n│   ├── file_521\n│   ├── file_522\n│   ├── file_523\n│   ├── file_524\n│   ├── file_525\n│   ├── file_526\n│   ├── file_527\n│   ├── file_528\n│   ├── file_529\n│   ├── file_530\n│   ├── file_531\n│   ├── file_532\n│   ├── file_533\n│   ├── file_534\n│   ├── file_535\n│   ├── file_536\n│   ├── file_537\n│   ├── file_538\n│   ├── file_539\n│   ├── file_540\n│   ├── file_541\n│   ├── file_542\n│   ├── file_543\n│   ├── file_544\n│   ├── file_545\n│   ├── file_546\n│   ├── file_547\n│   ├── file_548\n│   ├── file_549\n│   ├── file_550\n│   ├── file_551\n│   ├── file_552\n│   ├── file_553\n│   ├── file_554\n│   ├── file_555\n│   ├── file_556\n│   ├── file_557\n│   ├── file_558\n│   ├── file_559\n│   ├── file_560\n│   ├── file_561\n│   ├── file_562\n│   ├── file_563\n│   ├── file_564\n│   ├── file_565\n│   ├── file_566\n│   ├── file_567\n│   ├── file_568\n│   ├── file_569\n│   ├── file_570\n│   ├── file_571\n│   ├── file_572\n│   ├── file_573\n│   ├── file_574\n│   ├── file_575\n│   ├── file_576\n│   ├── file_577\n│   ├── file_578\n│   ├── file_579\n│   ├── file_580\n│   ├── file_581\n│   ├── file_582\n│   ├── file_583\n│   ├── file_584\n│   ├── file_585\n│   ├── file_586\n│   ├── file_587\n│   ├── file_588\n│   ├── file_589\n│   ├── file_590\n│   ├── file_591\n│   ├── file_592\n│   ├── file_593\n│   ├── file_594\n│   ├── file_595\n│   ├── file_596\n│   ├── file_597\n│   ├── file_598\n│   ├── file_599\n│   ├── file_600\n│   ├── file_601\n│   ├── file_602\n│   ├── file_603\n│   ├── file_604\n│   ├── file_605\n│   ├── file_606\n│   ├── file_607\n│   ├── file_608\n│   ├── file_609\n│   ├── file_610\n│   ├── file_611\n│   ├── file_612\n│   ├── file_613\n│   ├── file_614\n│   ├── file_615\n│   ├── file_616\n│   ├── file_617\n│   ├── file_618\n│   ├── file_619\n│   ├── file_620\n│   ├── file_621\n│   ├── file_622\n│   ├── file_623\n│   ├── file_624\n│   ├── file_625\n│   ├── file_626\n│   ├── file_627\n│   ├── file_628\n│   ├── file_629\n│   ├── file_630\n│   ├── file_631\n│   ├── file_632\n│   ├── file_633\n│   ├── file_634\n│   ├── file_635\n│   ├── file_636\n│   ├── file_637\n│   ├── file_638\n│   ├── file_639\n│   ├── file_640\n│   ├── file_641\n│   ├── file_642\n│   ├── file_643\n│   ├── file_644\n│   ├── file_645\n│   ├── file_646\n│   ├── file_647\n│   ├── file_648\n│   ├── file_649\n│   ├── file_650\n│   ├── file_651\n│   ├── file_652\n│   ├── file_653\n│   ├── file_654\n│   ├── file_655\n│   ├── file_656\n│   ├── file_657\n│   ├── file_658\n│   ├── file_659\n│   ├── file_660\n│   ├── file_661\n│   ├── file_662\n│   ├── file_663\n│   ├── file_664\n│   ├── file_665\n│   ├── file_666\n│   ├── file_667\n│   ├── file_668\n│   ├── file_669\n│   ├── file_670\n│   ├── file_671\n│   ├── file_672\n│   ├── file_673\n│   ├── file_674\n│   ├── file_675\n│   ├── file_676\n│   ├── file_677\n│   ├── file_678\n│   ├── file_679\n│   ├── file_680\n│   ├── file_681\n│   ├── file_682\n│   ├── file_683\n│   ├── file_684\n│   ├── file_685\n│   ├── file_686\n│   ├── file_687\n│   ├── file_688\n│   ├── file_689\n│   ├── file_690\n│   ├── file_691\n│   ├── file_692\n│   ├── file_693\n│   ├── file_694\n│   ├── file_695\n│   ├── file_696\n│   ├── file_697\n│   ├── file_698\n│   ├── file_699\n│   ├── file_700\n│   ├── file_701\n│   ├── file_702\n│   ├── file_703\n│   ├── file_704\n│   ├── file_705\n│   ├── file_706\n│   ├── file_707\n│   ├── file_708\n│   ├── file_709\n│   ├── file_710\n│   ├── file_711\n│   ├── file_712\n│   ├── file_713\n│   ├── file_714\n│   ├── file_715\n│   ├── file_716\n│   ├── file_717\n│   ├── file_718\n│   ├── file_719\n│   ├── file_720\n│   ├── file_721\n│   ├── file_722\n│   ├── file_723\n│   ├── file_724\n│   ├── file_725\n│   ├── file_726\n│   ├── file_727\n│   ├── file_728\n│   ├── file_729\n│   ├── file_730\n│   ├── file_731\n│   ├── file_732\n│   ├── file_733\n│   ├── file_734\n│   ├── file_735\n│   ├── file_736\n│   ├── file_737\n│   ├── file_738\n│   ├── file_739\n│   ├── file_740\n│   ├── file_741\n│   ├── file_742\n│   ├── file_743\n│   ├── file_744\n│   ├── file_745\n│   ├── file_746\n│   ├── file_747\n│   ├── file_748\n│   ├── file_749\n│   ├── file_750\n│   ├── file_751\n│   ├── file_752\n│   ├── file_753\n│   ├── file_754\n│   ├── file_755\n│   ├── file_756\n│   ├── file_757\n│   ├── file_758\n│   ├── file_759\n│   ├── file_760\n│   ├── file_761\n│   ├── file_762\n│   ├── file_763\n│   ├── file_764\n│   ├── file_765\n│   ├── file_766\n│   ├── file_767\n│   ├── file_768\n│   ├── file_769\n│   ├── file_770\n│   ├── file_771\n│   ├── file_772\n│   ├── file_773\n│   ├── file_774\n│   ├── file_775\n│   ├── file_776\n│   ├── file_777\n│   ├── file_778\n│   ├── file_779\n│   ├── file_780\n│   ├── file_781\n│   ├── file_782\n│   ├── file_783\n│   ├── file_784\n│   ├── file_785\n│   ├── file_786\n│   ├── file_787\n│   ├── file_788\n│   ├── file_789\n│   ├── file_790\n│   ├── file_791\n│   ├── file_792\n│   ├── file_793\n│   ├── file_794\n│   ├── file_795\n│   ├── file_796\n│   ├── file_797\n│   ├── file_798\n│   ├── file_799\n│   ├── file_800\n│   ├── file_801\n│   ├── file_802\n│   ├── file_803\n│   ├── file_804\n│   ├── file_805\n│   ├── file_806\n│   ├── file_807\n│   ├── file_808\n│   ├── file_809\n│   ├── file_810\n│   ├── file_811\n│   ├── file_812\n│   ├── file_813\n│   ├── file_814\n│   ├── file_815\n│   ├── file_816\n│   ├── file_817\n│   ├── file_818\n│   ├── file_819\n│   ├── file_820\n│   ├── file_821\n│   ├── file_822\n│   ├── file_823\n│   ├── file_824\n│   ├── file_825\n│   ├── file_826\n│   ├── file_827\n│   ├── file_828\n│   ├── file_829\n│   ├── file_830\n│   ├── file_831\n│   ├── file_832\n│   ├── file_833\n│   ├── file_834\n│   ├── file_835\n│   ├── file_836\n│   ├── file_837\n│   ├── file_838\n│   ├── file_839\n│   ├── file_840\n│   ├── file_841\n│   ├── file_842\n│   ├── file_843\n│   ├── file_844\n│   ├── file_845\n│   ├── file_846\n│   ├── file_847\n│   ├── file_848\n│   ├── file_849\n│   ├── file_850\n│   ├── file_851\n│   ├── file_852\n│   ├── file_853\n│   ├── file_854\n│   ├── file_855\n│   ├── file_856\n│   ├── file_857\n│   ├── file_858\n│   ├── file_859\n│   ├── file_860\n│   ├── file_861\n│   ├── file_862\n│   ├── file_863\n│   ├── file_864\n│   ├── file_865\n│   ├── file_866\n│   ├── file_867\n│   ├── file_868\n│   ├── file_869\n│   ├── file_870\n│   ├── file_871\n│   ├── file_872\n│   ├── file_873\n│   ├── file_874\n│   ├── file_875\n│   ├── file_876\n│   ├── file_877\n│   ├── file_878\n│   ├── file_879\n│   ├── file_880\n│   ├── file_881\n│   ├── file_882\n│   ├── file_883\n│   ├── file_884\n│   ├── file_885\n│   ├── file_886\n│   ├── file_887\n│   ├── file_888\n│   ├── file_889\n│   ├── file_890\n│   ├── file_891\n│   ├── file_892\n│   ├── file_893\n│   ├── file_894\n│   ├── file_895\n│   ├── file_896\n│   ├── file_897\n│   ├── file_898\n│   ├── file_899\n│   ├── file_900\n│   ├── file_901\n│   ├── file_902\n│   ├── file_903\n│   ├── file_904\n│   ├── file_905\n│   ├── file_906\n│   ├── file_907\n│   ├── file_908\n│   ├── file_909\n│   ├── file_910\n│   ├── file_911\n│   ├── file_912\n│   ├── file_913\n│   ├── file_914\n│   ├── file_915\n│   ├── file_916\n│   ├── file_917\n│   ├── file_918\n│   ├── file_919\n│   ├── file_920\n│   ├── file_921\n│   ├── file_922\n│   ├── file_923\n│   ├── file_924\n│   ├── file_925\n│   ├── file_926\n│   ├── file_927\n│   ├── file_928\n│   ├── file_929\n│   ├── file_930\n│   ├── file_931\n│   ├── file_932\n│   ├── file_933\n│   ├── file_934\n│   ├── file_935\n│   ├── file_936\n│   ├── file_937\n│   ├── file_938\n│   ├── file_939\n│   ├── file_940\n│   ├── file_941\n│   ├── file_942\n│   ├── file_943\n│   ├── file_944\n│   ├── file_945\n│   ├── file_946\n│   ├── file_947\n│   ├── file_948\n│   ├── file_949\n│   ├── file_950\n│   ├── file_951\n│   ├── file_952\n│   ├── file_953\n│   ├── file_954\n│   ├── file_955\n│   ├── file_956\n│   ├── file_957\n│   ├── file_958\n│   ├── file_959\n│   ├── file_960\n│   ├── file_961\n│   ├── file_962\n│   ├── file_963\n│   ├── file_964\n│   ├── file_965\n│   ├── file_966\n│   ├── file_967\n│   ├── file_968\n│   ├── file_969\n│   ├── file_970\n│   ├── file_971\n│   ├── file_972\n│   ├── file_973\n│   ├── file_974\n│   ├── file_975\n│   ├── file_976\n│   ├── file_977\n│   ├── file_978\n│   ├── file_979\n│   ├── file_980\n│   ├── file_981\n│   ├── file_982\n│   ├── file_983\n│   ├── file_984\n│   ├── file_985\n│   ├── file_986\n│   ├── file_987\n│   ├── file_988\n│   ├── file_989\n│   ├── file_990\n│   ├── file_991\n│   ├── file_992\n│   ├── file_993\n│   ├── file_994\n│   ├── file_995\n│   ├── file_996\n│   ├── file_997\n│   ├── file_998\n│   └── file_999\n├── group\n│   └── file\n├── icons\n│   ├── c++.cpp\n│   ├── c.c\n│   ├── css.css\n│   ├── file\n│   ├── go.go\n│   ├── html.html\n│   ├── java.java\n│   ├── javascript.js\n│   ├── man.1\n│   ├── marked.md\n│   ├── php.php\n│   ├── python.py\n│   ├── ruby.rb\n│   ├── rust.rs\n│   ├── shell.sh\n│   └── unknown.unknown\n├── perms\n│   ├── file\n│   └── file2\n├── size\n│   ├── 1B\n│   ├── 1K\n│   ├── 1M\n│   └── 1337\n├── specials\n├── symlinks\n│   ├── dir\n│   ├── file\n│   ├── ' lorem ipsum'\n│   ├── symlink -> file\n│   ├── symlink2 -> symlink\n│   ├── symlink3 -> dir\n│   └── symlink4 -> pipitek\n└── time\n    ├── 1d\n    ├── 1h\n    ├── 1m\n    ├── 1s\n    ├── 1y\n    └── epoch\n"
  },
  {
    "path": "tests/ptests/ptest_6796295d6420d03a.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T --level 4\""
  },
  {
    "path": "tests/ptests/ptest_69fb8da018a73af3.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_69fb8da018a73af3.stdout",
    "content": "\u001b[1;34mgit\u001b[0m\n\u001b[1;34mgrid\u001b[0m\n\u001b[1;34mgroup\u001b[0m\n\u001b[1;34micons\u001b[0m\n\u001b[1;34mperms\u001b[0m\n\u001b[1;34msize\u001b[0m\n\u001b[1;34mspecials\u001b[0m\n\u001b[1;34msymlinks\u001b[0m\n\u001b[1;34mtime\u001b[0m\n"
  },
  {
    "path": "tests/ptests/ptest_69fb8da018a73af3.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --colour always\""
  },
  {
    "path": "tests/ptests/ptest_6abf99c853aede16.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_6abf99c853aede16.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_6abf99c853aede16.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --numeric \""
  },
  {
    "path": "tests/ptests/ptest_6d64a7584b621832.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_6d64a7584b621832.stdout",
    "content": " git\n grid\n group\n icons\n perms\n size\n specials\n symlinks\n time\n"
  },
  {
    "path": "tests/ptests/ptest_6d64a7584b621832.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --icons always\""
  },
  {
    "path": "tests/ptests/ptest_6e6893c2c2254622.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_6e6893c2c2254622.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\n"
  },
  {
    "path": "tests/ptests/ptest_6e6893c2c2254622.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort time\""
  },
  {
    "path": "tests/ptests/ptest_6eabf01c1fcde44e.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_6eabf01c1fcde44e.stdout",
    "content": "time\nsymlinks\nspecials\nsize\nperms\nicons\ngroup\ngrid\ngit\n"
  },
  {
    "path": "tests/ptests/ptest_6eabf01c1fcde44e.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -r \""
  },
  {
    "path": "tests/ptests/ptest_7212f6096d7b2f6c.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_7212f6096d7b2f6c.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_7212f6096d7b2f6c.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l \""
  },
  {
    "path": "tests/ptests/ptest_74825603975f419c.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_74825603975f419c.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_74825603975f419c.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --octal-permissions \""
  },
  {
    "path": "tests/ptests/ptest_767aca4b412a3f3e.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_767aca4b412a3f3e.stdout",
    "content": "\u001b[1;34mgit\u001b[0m\n\u001b[1;34mgrid\u001b[0m\n\u001b[1;34mgroup\u001b[0m\n\u001b[1;34micons\u001b[0m\n\u001b[1;34mperms\u001b[0m\n\u001b[1;34msize\u001b[0m\n\u001b[1;34mspecials\u001b[0m\n\u001b[1;34msymlinks\u001b[0m\n\u001b[1;34mtime\u001b[0m\n"
  },
  {
    "path": "tests/ptests/ptest_767aca4b412a3f3e.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --color always\""
  },
  {
    "path": "tests/ptests/ptest_79116932e9ca8b26.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_79116932e9ca8b26.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_79116932e9ca8b26.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s extension\""
  },
  {
    "path": "tests/ptests/ptest_7a449fd794fd3993.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_7a449fd794fd3993.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_7a449fd794fd3993.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s name\""
  },
  {
    "path": "tests/ptests/ptest_7b9a096392df2be1.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_7b9a096392df2be1.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_7b9a096392df2be1.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --changed \""
  },
  {
    "path": "tests/ptests/ptest_7cad7af690128a39.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_7cad7af690128a39.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_7cad7af690128a39.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -@ \""
  },
  {
    "path": "tests/ptests/ptest_7d1cd636566df8cd.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_7d1cd636566df8cd.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\n"
  },
  {
    "path": "tests/ptests/ptest_7d1cd636566df8cd.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s oldest\""
  },
  {
    "path": "tests/ptests/ptest_80cd40f7a3947055.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_80cd40f7a3947055.stdout",
    "content": "git/\ngrid/\ngroup/\nicons/\nperms/\nsize/\nspecials/\nsymlinks/\ntime/\n"
  },
  {
    "path": "tests/ptests/ptest_80cd40f7a3947055.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --classify always\""
  },
  {
    "path": "tests/ptests/ptest_818bdf865ff2e514.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_818bdf865ff2e514.stdout",
    "content": "tests/test_dir\n"
  },
  {
    "path": "tests/ptests/ptest_818bdf865ff2e514.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -d \""
  },
  {
    "path": "tests/ptests/ptest_825e60e73630f857.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_825e60e73630f857.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\n"
  },
  {
    "path": "tests/ptests/ptest_825e60e73630f857.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s age\""
  },
  {
    "path": "tests/ptests/ptest_83b42c3f144d78ba.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_83b42c3f144d78ba.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_83b42c3f144d78ba.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -Z \""
  },
  {
    "path": "tests/ptests/ptest_86f826124c5b4511.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_86f826124c5b4511.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_86f826124c5b4511.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --oneline \""
  },
  {
    "path": "tests/ptests/ptest_8822968d21a463f5.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_8822968d21a463f5.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_8822968d21a463f5.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s Name\""
  },
  {
    "path": "tests/ptests/ptest_88f8528f0c592965.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_88f8528f0c592965.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_88f8528f0c592965.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -a \""
  },
  {
    "path": "tests/ptests/ptest_89146337fb6b0967.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_89146337fb6b0967.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_89146337fb6b0967.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -X \""
  },
  {
    "path": "tests/ptests/ptest_8becd3030ba5621c.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_8becd3030ba5621c.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\n"
  },
  {
    "path": "tests/ptests/ptest_8becd3030ba5621c.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s time\""
  },
  {
    "path": "tests/ptests/ptest_8cd9b0ae2930d704.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_8cd9b0ae2930d704.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\n"
  },
  {
    "path": "tests/ptests/ptest_8cd9b0ae2930d704.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s inode\""
  },
  {
    "path": "tests/ptests/ptest_91d7b6efe549ede0.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_91d7b6efe549ede0.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_91d7b6efe549ede0.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -B \""
  },
  {
    "path": "tests/ptests/ptest_91e89705f7a716a7.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_91e89705f7a716a7.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_91e89705f7a716a7.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s Filename\""
  },
  {
    "path": "tests/ptests/ptest_94d98e7060506df0.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_94d98e7060506df0.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_94d98e7060506df0.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --colour never\""
  },
  {
    "path": "tests/ptests/ptest_94ed50412bfc177f.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_94ed50412bfc177f.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_94ed50412bfc177f.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s type\""
  },
  {
    "path": "tests/ptests/ptest_97958c59351ef010.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_97958c59351ef010.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n\ntests/test_dir/git:\n001\n002\n003\n004\n005\n006\n007\n008\n009\n010\n\ntests/test_dir/git/001:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/002:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/003:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/004:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/005:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/006:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/007:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/008:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/009:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/git/010:\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\n\ntests/test_dir/grid:\n0001\n0002\n0003\n0004\n0005\n0006\n0007\n0008\n0009\n0010\n0011\n0012\n0013\n0014\n0015\n0016\n0017\n0018\n0019\n0020\n0021\n0022\n0023\n0024\n0025\n0026\n0027\n0028\n0029\n0030\n0031\n0032\n0033\n0034\n0035\n0036\n0037\n0038\n0039\n0040\n0041\n0042\n0043\n0044\n0045\n0046\n0047\n0048\n0049\n0050\n0051\n0052\n0053\n0054\n0055\n0056\n0057\n0058\n0059\n0060\n0061\n0062\n0063\n0064\n0065\n0066\n0067\n0068\n0069\n0070\n0071\n0072\n0073\n0074\n0075\n0076\n0077\n0078\n0079\n0080\n0081\n0082\n0083\n0084\n0085\n0086\n0087\n0088\n0089\n0090\n0091\n0092\n0093\n0094\n0095\n0096\n0097\n0098\n0099\n0100\n0101\n0102\n0103\n0104\n0105\n0106\n0107\n0108\n0109\n0110\n0111\n0112\n0113\n0114\n0115\n0116\n0117\n0118\n0119\n0120\n0121\n0122\n0123\n0124\n0125\n0126\n0127\n0128\n0129\n0130\n0131\n0132\n0133\n0134\n0135\n0136\n0137\n0138\n0139\n0140\n0141\n0142\n0143\n0144\n0145\n0146\n0147\n0148\n0149\n0150\n0151\n0152\n0153\n0154\n0155\n0156\n0157\n0158\n0159\n0160\n0161\n0162\n0163\n0164\n0165\n0166\n0167\n0168\n0169\n0170\n0171\n0172\n0173\n0174\n0175\n0176\n0177\n0178\n0179\n0180\n0181\n0182\n0183\n0184\n0185\n0186\n0187\n0188\n0189\n0190\n0191\n0192\n0193\n0194\n0195\n0196\n0197\n0198\n0199\n0200\n0201\n0202\n0203\n0204\n0205\n0206\n0207\n0208\n0209\n0210\n0211\n0212\n0213\n0214\n0215\n0216\n0217\n0218\n0219\n0220\n0221\n0222\n0223\n0224\n0225\n0226\n0227\n0228\n0229\n0230\n0231\n0232\n0233\n0234\n0235\n0236\n0237\n0238\n0239\n0240\n0241\n0242\n0243\n0244\n0245\n0246\n0247\n0248\n0249\n0250\n0251\n0252\n0253\n0254\n0255\n0256\n0257\n0258\n0259\n0260\n0261\n0262\n0263\n0264\n0265\n0266\n0267\n0268\n0269\n0270\n0271\n0272\n0273\n0274\n0275\n0276\n0277\n0278\n0279\n0280\n0281\n0282\n0283\n0284\n0285\n0286\n0287\n0288\n0289\n0290\n0291\n0292\n0293\n0294\n0295\n0296\n0297\n0298\n0299\n0300\n0301\n0302\n0303\n0304\n0305\n0306\n0307\n0308\n0309\n0310\n0311\n0312\n0313\n0314\n0315\n0316\n0317\n0318\n0319\n0320\n0321\n0322\n0323\n0324\n0325\n0326\n0327\n0328\n0329\n0330\n0331\n0332\n0333\n0334\n0335\n0336\n0337\n0338\n0339\n0340\n0341\n0342\n0343\n0344\n0345\n0346\n0347\n0348\n0349\n0350\n0351\n0352\n0353\n0354\n0355\n0356\n0357\n0358\n0359\n0360\n0361\n0362\n0363\n0364\n0365\n0366\n0367\n0368\n0369\n0370\n0371\n0372\n0373\n0374\n0375\n0376\n0377\n0378\n0379\n0380\n0381\n0382\n0383\n0384\n0385\n0386\n0387\n0388\n0389\n0390\n0391\n0392\n0393\n0394\n0395\n0396\n0397\n0398\n0399\n0400\n0401\n0402\n0403\n0404\n0405\n0406\n0407\n0408\n0409\n0410\n0411\n0412\n0413\n0414\n0415\n0416\n0417\n0418\n0419\n0420\n0421\n0422\n0423\n0424\n0425\n0426\n0427\n0428\n0429\n0430\n0431\n0432\n0433\n0434\n0435\n0436\n0437\n0438\n0439\n0440\n0441\n0442\n0443\n0444\n0445\n0446\n0447\n0448\n0449\n0450\n0451\n0452\n0453\n0454\n0455\n0456\n0457\n0458\n0459\n0460\n0461\n0462\n0463\n0464\n0465\n0466\n0467\n0468\n0469\n0470\n0471\n0472\n0473\n0474\n0475\n0476\n0477\n0478\n0479\n0480\n0481\n0482\n0483\n0484\n0485\n0486\n0487\n0488\n0489\n0490\n0491\n0492\n0493\n0494\n0495\n0496\n0497\n0498\n0499\n0500\n0501\n0502\n0503\n0504\n0505\n0506\n0507\n0508\n0509\n0510\n0511\n0512\n0513\n0514\n0515\n0516\n0517\n0518\n0519\n0520\n0521\n0522\n0523\n0524\n0525\n0526\n0527\n0528\n0529\n0530\n0531\n0532\n0533\n0534\n0535\n0536\n0537\n0538\n0539\n0540\n0541\n0542\n0543\n0544\n0545\n0546\n0547\n0548\n0549\n0550\n0551\n0552\n0553\n0554\n0555\n0556\n0557\n0558\n0559\n0560\n0561\n0562\n0563\n0564\n0565\n0566\n0567\n0568\n0569\n0570\n0571\n0572\n0573\n0574\n0575\n0576\n0577\n0578\n0579\n0580\n0581\n0582\n0583\n0584\n0585\n0586\n0587\n0588\n0589\n0590\n0591\n0592\n0593\n0594\n0595\n0596\n0597\n0598\n0599\n0600\n0601\n0602\n0603\n0604\n0605\n0606\n0607\n0608\n0609\n0610\n0611\n0612\n0613\n0614\n0615\n0616\n0617\n0618\n0619\n0620\n0621\n0622\n0623\n0624\n0625\n0626\n0627\n0628\n0629\n0630\n0631\n0632\n0633\n0634\n0635\n0636\n0637\n0638\n0639\n0640\n0641\n0642\n0643\n0644\n0645\n0646\n0647\n0648\n0649\n0650\n0651\n0652\n0653\n0654\n0655\n0656\n0657\n0658\n0659\n0660\n0661\n0662\n0663\n0664\n0665\n0666\n0667\n0668\n0669\n0670\n0671\n0672\n0673\n0674\n0675\n0676\n0677\n0678\n0679\n0680\n0681\n0682\n0683\n0684\n0685\n0686\n0687\n0688\n0689\n0690\n0691\n0692\n0693\n0694\n0695\n0696\n0697\n0698\n0699\n0700\n0701\n0702\n0703\n0704\n0705\n0706\n0707\n0708\n0709\n0710\n0711\n0712\n0713\n0714\n0715\n0716\n0717\n0718\n0719\n0720\n0721\n0722\n0723\n0724\n0725\n0726\n0727\n0728\n0729\n0730\n0731\n0732\n0733\n0734\n0735\n0736\n0737\n0738\n0739\n0740\n0741\n0742\n0743\n0744\n0745\n0746\n0747\n0748\n0749\n0750\n0751\n0752\n0753\n0754\n0755\n0756\n0757\n0758\n0759\n0760\n0761\n0762\n0763\n0764\n0765\n0766\n0767\n0768\n0769\n0770\n0771\n0772\n0773\n0774\n0775\n0776\n0777\n0778\n0779\n0780\n0781\n0782\n0783\n0784\n0785\n0786\n0787\n0788\n0789\n0790\n0791\n0792\n0793\n0794\n0795\n0796\n0797\n0798\n0799\n0800\n0801\n0802\n0803\n0804\n0805\n0806\n0807\n0808\n0809\n0810\n0811\n0812\n0813\n0814\n0815\n0816\n0817\n0818\n0819\n0820\n0821\n0822\n0823\n0824\n0825\n0826\n0827\n0828\n0829\n0830\n0831\n0832\n0833\n0834\n0835\n0836\n0837\n0838\n0839\n0840\n0841\n0842\n0843\n0844\n0845\n0846\n0847\n0848\n0849\n0850\n0851\n0852\n0853\n0854\n0855\n0856\n0857\n0858\n0859\n0860\n0861\n0862\n0863\n0864\n0865\n0866\n0867\n0868\n0869\n0870\n0871\n0872\n0873\n0874\n0875\n0876\n0877\n0878\n0879\n0880\n0881\n0882\n0883\n0884\n0885\n0886\n0887\n0888\n0889\n0890\n0891\n0892\n0893\n0894\n0895\n0896\n0897\n0898\n0899\n0900\n0901\n0902\n0903\n0904\n0905\n0906\n0907\n0908\n0909\n0910\n0911\n0912\n0913\n0914\n0915\n0916\n0917\n0918\n0919\n0920\n0921\n0922\n0923\n0924\n0925\n0926\n0927\n0928\n0929\n0930\n0931\n0932\n0933\n0934\n0935\n0936\n0937\n0938\n0939\n0940\n0941\n0942\n0943\n0944\n0945\n0946\n0947\n0948\n0949\n0950\n0951\n0952\n0953\n0954\n0955\n0956\n0957\n0958\n0959\n0960\n0961\n0962\n0963\n0964\n0965\n0966\n0967\n0968\n0969\n0970\n0971\n0972\n0973\n0974\n0975\n0976\n0977\n0978\n0979\n0980\n0981\n0982\n0983\n0984\n0985\n0986\n0987\n0988\n0989\n0990\n0991\n0992\n0993\n0994\n0995\n0996\n0997\n0998\n0999\n1000\nfile_000\nfile_001\nfile_002\nfile_003\nfile_004\nfile_005\nfile_006\nfile_007\nfile_008\nfile_009\nfile_010\nfile_011\nfile_012\nfile_013\nfile_014\nfile_015\nfile_016\nfile_017\nfile_018\nfile_019\nfile_020\nfile_021\nfile_022\nfile_023\nfile_024\nfile_025\nfile_026\nfile_027\nfile_028\nfile_029\nfile_030\nfile_031\nfile_032\nfile_033\nfile_034\nfile_035\nfile_036\nfile_037\nfile_038\nfile_039\nfile_040\nfile_041\nfile_042\nfile_043\nfile_044\nfile_045\nfile_046\nfile_047\nfile_048\nfile_049\nfile_050\nfile_051\nfile_052\nfile_053\nfile_054\nfile_055\nfile_056\nfile_057\nfile_058\nfile_059\nfile_060\nfile_061\nfile_062\nfile_063\nfile_064\nfile_065\nfile_066\nfile_067\nfile_068\nfile_069\nfile_070\nfile_071\nfile_072\nfile_073\nfile_074\nfile_075\nfile_076\nfile_077\nfile_078\nfile_079\nfile_080\nfile_081\nfile_082\nfile_083\nfile_084\nfile_085\nfile_086\nfile_087\nfile_088\nfile_089\nfile_090\nfile_091\nfile_092\nfile_093\nfile_094\nfile_095\nfile_096\nfile_097\nfile_098\nfile_099\nfile_100\nfile_101\nfile_102\nfile_103\nfile_104\nfile_105\nfile_106\nfile_107\nfile_108\nfile_109\nfile_110\nfile_111\nfile_112\nfile_113\nfile_114\nfile_115\nfile_116\nfile_117\nfile_118\nfile_119\nfile_120\nfile_121\nfile_122\nfile_123\nfile_124\nfile_125\nfile_126\nfile_127\nfile_128\nfile_129\nfile_130\nfile_131\nfile_132\nfile_133\nfile_134\nfile_135\nfile_136\nfile_137\nfile_138\nfile_139\nfile_140\nfile_141\nfile_142\nfile_143\nfile_144\nfile_145\nfile_146\nfile_147\nfile_148\nfile_149\nfile_150\nfile_151\nfile_152\nfile_153\nfile_154\nfile_155\nfile_156\nfile_157\nfile_158\nfile_159\nfile_160\nfile_161\nfile_162\nfile_163\nfile_164\nfile_165\nfile_166\nfile_167\nfile_168\nfile_169\nfile_170\nfile_171\nfile_172\nfile_173\nfile_174\nfile_175\nfile_176\nfile_177\nfile_178\nfile_179\nfile_180\nfile_181\nfile_182\nfile_183\nfile_184\nfile_185\nfile_186\nfile_187\nfile_188\nfile_189\nfile_190\nfile_191\nfile_192\nfile_193\nfile_194\nfile_195\nfile_196\nfile_197\nfile_198\nfile_199\nfile_200\nfile_201\nfile_202\nfile_203\nfile_204\nfile_205\nfile_206\nfile_207\nfile_208\nfile_209\nfile_210\nfile_211\nfile_212\nfile_213\nfile_214\nfile_215\nfile_216\nfile_217\nfile_218\nfile_219\nfile_220\nfile_221\nfile_222\nfile_223\nfile_224\nfile_225\nfile_226\nfile_227\nfile_228\nfile_229\nfile_230\nfile_231\nfile_232\nfile_233\nfile_234\nfile_235\nfile_236\nfile_237\nfile_238\nfile_239\nfile_240\nfile_241\nfile_242\nfile_243\nfile_244\nfile_245\nfile_246\nfile_247\nfile_248\nfile_249\nfile_250\nfile_251\nfile_252\nfile_253\nfile_254\nfile_255\nfile_256\nfile_257\nfile_258\nfile_259\nfile_260\nfile_261\nfile_262\nfile_263\nfile_264\nfile_265\nfile_266\nfile_267\nfile_268\nfile_269\nfile_270\nfile_271\nfile_272\nfile_273\nfile_274\nfile_275\nfile_276\nfile_277\nfile_278\nfile_279\nfile_280\nfile_281\nfile_282\nfile_283\nfile_284\nfile_285\nfile_286\nfile_287\nfile_288\nfile_289\nfile_290\nfile_291\nfile_292\nfile_293\nfile_294\nfile_295\nfile_296\nfile_297\nfile_298\nfile_299\nfile_300\nfile_301\nfile_302\nfile_303\nfile_304\nfile_305\nfile_306\nfile_307\nfile_308\nfile_309\nfile_310\nfile_311\nfile_312\nfile_313\nfile_314\nfile_315\nfile_316\nfile_317\nfile_318\nfile_319\nfile_320\nfile_321\nfile_322\nfile_323\nfile_324\nfile_325\nfile_326\nfile_327\nfile_328\nfile_329\nfile_330\nfile_331\nfile_332\nfile_333\nfile_334\nfile_335\nfile_336\nfile_337\nfile_338\nfile_339\nfile_340\nfile_341\nfile_342\nfile_343\nfile_344\nfile_345\nfile_346\nfile_347\nfile_348\nfile_349\nfile_350\nfile_351\nfile_352\nfile_353\nfile_354\nfile_355\nfile_356\nfile_357\nfile_358\nfile_359\nfile_360\nfile_361\nfile_362\nfile_363\nfile_364\nfile_365\nfile_366\nfile_367\nfile_368\nfile_369\nfile_370\nfile_371\nfile_372\nfile_373\nfile_374\nfile_375\nfile_376\nfile_377\nfile_378\nfile_379\nfile_380\nfile_381\nfile_382\nfile_383\nfile_384\nfile_385\nfile_386\nfile_387\nfile_388\nfile_389\nfile_390\nfile_391\nfile_392\nfile_393\nfile_394\nfile_395\nfile_396\nfile_397\nfile_398\nfile_399\nfile_400\nfile_401\nfile_402\nfile_403\nfile_404\nfile_405\nfile_406\nfile_407\nfile_408\nfile_409\nfile_410\nfile_411\nfile_412\nfile_413\nfile_414\nfile_415\nfile_416\nfile_417\nfile_418\nfile_419\nfile_420\nfile_421\nfile_422\nfile_423\nfile_424\nfile_425\nfile_426\nfile_427\nfile_428\nfile_429\nfile_430\nfile_431\nfile_432\nfile_433\nfile_434\nfile_435\nfile_436\nfile_437\nfile_438\nfile_439\nfile_440\nfile_441\nfile_442\nfile_443\nfile_444\nfile_445\nfile_446\nfile_447\nfile_448\nfile_449\nfile_450\nfile_451\nfile_452\nfile_453\nfile_454\nfile_455\nfile_456\nfile_457\nfile_458\nfile_459\nfile_460\nfile_461\nfile_462\nfile_463\nfile_464\nfile_465\nfile_466\nfile_467\nfile_468\nfile_469\nfile_470\nfile_471\nfile_472\nfile_473\nfile_474\nfile_475\nfile_476\nfile_477\nfile_478\nfile_479\nfile_480\nfile_481\nfile_482\nfile_483\nfile_484\nfile_485\nfile_486\nfile_487\nfile_488\nfile_489\nfile_490\nfile_491\nfile_492\nfile_493\nfile_494\nfile_495\nfile_496\nfile_497\nfile_498\nfile_499\nfile_500\nfile_501\nfile_502\nfile_503\nfile_504\nfile_505\nfile_506\nfile_507\nfile_508\nfile_509\nfile_510\nfile_511\nfile_512\nfile_513\nfile_514\nfile_515\nfile_516\nfile_517\nfile_518\nfile_519\nfile_520\nfile_521\nfile_522\nfile_523\nfile_524\nfile_525\nfile_526\nfile_527\nfile_528\nfile_529\nfile_530\nfile_531\nfile_532\nfile_533\nfile_534\nfile_535\nfile_536\nfile_537\nfile_538\nfile_539\nfile_540\nfile_541\nfile_542\nfile_543\nfile_544\nfile_545\nfile_546\nfile_547\nfile_548\nfile_549\nfile_550\nfile_551\nfile_552\nfile_553\nfile_554\nfile_555\nfile_556\nfile_557\nfile_558\nfile_559\nfile_560\nfile_561\nfile_562\nfile_563\nfile_564\nfile_565\nfile_566\nfile_567\nfile_568\nfile_569\nfile_570\nfile_571\nfile_572\nfile_573\nfile_574\nfile_575\nfile_576\nfile_577\nfile_578\nfile_579\nfile_580\nfile_581\nfile_582\nfile_583\nfile_584\nfile_585\nfile_586\nfile_587\nfile_588\nfile_589\nfile_590\nfile_591\nfile_592\nfile_593\nfile_594\nfile_595\nfile_596\nfile_597\nfile_598\nfile_599\nfile_600\nfile_601\nfile_602\nfile_603\nfile_604\nfile_605\nfile_606\nfile_607\nfile_608\nfile_609\nfile_610\nfile_611\nfile_612\nfile_613\nfile_614\nfile_615\nfile_616\nfile_617\nfile_618\nfile_619\nfile_620\nfile_621\nfile_622\nfile_623\nfile_624\nfile_625\nfile_626\nfile_627\nfile_628\nfile_629\nfile_630\nfile_631\nfile_632\nfile_633\nfile_634\nfile_635\nfile_636\nfile_637\nfile_638\nfile_639\nfile_640\nfile_641\nfile_642\nfile_643\nfile_644\nfile_645\nfile_646\nfile_647\nfile_648\nfile_649\nfile_650\nfile_651\nfile_652\nfile_653\nfile_654\nfile_655\nfile_656\nfile_657\nfile_658\nfile_659\nfile_660\nfile_661\nfile_662\nfile_663\nfile_664\nfile_665\nfile_666\nfile_667\nfile_668\nfile_669\nfile_670\nfile_671\nfile_672\nfile_673\nfile_674\nfile_675\nfile_676\nfile_677\nfile_678\nfile_679\nfile_680\nfile_681\nfile_682\nfile_683\nfile_684\nfile_685\nfile_686\nfile_687\nfile_688\nfile_689\nfile_690\nfile_691\nfile_692\nfile_693\nfile_694\nfile_695\nfile_696\nfile_697\nfile_698\nfile_699\nfile_700\nfile_701\nfile_702\nfile_703\nfile_704\nfile_705\nfile_706\nfile_707\nfile_708\nfile_709\nfile_710\nfile_711\nfile_712\nfile_713\nfile_714\nfile_715\nfile_716\nfile_717\nfile_718\nfile_719\nfile_720\nfile_721\nfile_722\nfile_723\nfile_724\nfile_725\nfile_726\nfile_727\nfile_728\nfile_729\nfile_730\nfile_731\nfile_732\nfile_733\nfile_734\nfile_735\nfile_736\nfile_737\nfile_738\nfile_739\nfile_740\nfile_741\nfile_742\nfile_743\nfile_744\nfile_745\nfile_746\nfile_747\nfile_748\nfile_749\nfile_750\nfile_751\nfile_752\nfile_753\nfile_754\nfile_755\nfile_756\nfile_757\nfile_758\nfile_759\nfile_760\nfile_761\nfile_762\nfile_763\nfile_764\nfile_765\nfile_766\nfile_767\nfile_768\nfile_769\nfile_770\nfile_771\nfile_772\nfile_773\nfile_774\nfile_775\nfile_776\nfile_777\nfile_778\nfile_779\nfile_780\nfile_781\nfile_782\nfile_783\nfile_784\nfile_785\nfile_786\nfile_787\nfile_788\nfile_789\nfile_790\nfile_791\nfile_792\nfile_793\nfile_794\nfile_795\nfile_796\nfile_797\nfile_798\nfile_799\nfile_800\nfile_801\nfile_802\nfile_803\nfile_804\nfile_805\nfile_806\nfile_807\nfile_808\nfile_809\nfile_810\nfile_811\nfile_812\nfile_813\nfile_814\nfile_815\nfile_816\nfile_817\nfile_818\nfile_819\nfile_820\nfile_821\nfile_822\nfile_823\nfile_824\nfile_825\nfile_826\nfile_827\nfile_828\nfile_829\nfile_830\nfile_831\nfile_832\nfile_833\nfile_834\nfile_835\nfile_836\nfile_837\nfile_838\nfile_839\nfile_840\nfile_841\nfile_842\nfile_843\nfile_844\nfile_845\nfile_846\nfile_847\nfile_848\nfile_849\nfile_850\nfile_851\nfile_852\nfile_853\nfile_854\nfile_855\nfile_856\nfile_857\nfile_858\nfile_859\nfile_860\nfile_861\nfile_862\nfile_863\nfile_864\nfile_865\nfile_866\nfile_867\nfile_868\nfile_869\nfile_870\nfile_871\nfile_872\nfile_873\nfile_874\nfile_875\nfile_876\nfile_877\nfile_878\nfile_879\nfile_880\nfile_881\nfile_882\nfile_883\nfile_884\nfile_885\nfile_886\nfile_887\nfile_888\nfile_889\nfile_890\nfile_891\nfile_892\nfile_893\nfile_894\nfile_895\nfile_896\nfile_897\nfile_898\nfile_899\nfile_900\nfile_901\nfile_902\nfile_903\nfile_904\nfile_905\nfile_906\nfile_907\nfile_908\nfile_909\nfile_910\nfile_911\nfile_912\nfile_913\nfile_914\nfile_915\nfile_916\nfile_917\nfile_918\nfile_919\nfile_920\nfile_921\nfile_922\nfile_923\nfile_924\nfile_925\nfile_926\nfile_927\nfile_928\nfile_929\nfile_930\nfile_931\nfile_932\nfile_933\nfile_934\nfile_935\nfile_936\nfile_937\nfile_938\nfile_939\nfile_940\nfile_941\nfile_942\nfile_943\nfile_944\nfile_945\nfile_946\nfile_947\nfile_948\nfile_949\nfile_950\nfile_951\nfile_952\nfile_953\nfile_954\nfile_955\nfile_956\nfile_957\nfile_958\nfile_959\nfile_960\nfile_961\nfile_962\nfile_963\nfile_964\nfile_965\nfile_966\nfile_967\nfile_968\nfile_969\nfile_970\nfile_971\nfile_972\nfile_973\nfile_974\nfile_975\nfile_976\nfile_977\nfile_978\nfile_979\nfile_980\nfile_981\nfile_982\nfile_983\nfile_984\nfile_985\nfile_986\nfile_987\nfile_988\nfile_989\nfile_990\nfile_991\nfile_992\nfile_993\nfile_994\nfile_995\nfile_996\nfile_997\nfile_998\nfile_999\n\ntests/test_dir/grid/0001:\n\ntests/test_dir/grid/0002:\n\ntests/test_dir/grid/0003:\n\ntests/test_dir/grid/0004:\n\ntests/test_dir/grid/0005:\n\ntests/test_dir/grid/0006:\n\ntests/test_dir/grid/0007:\n\ntests/test_dir/grid/0008:\n\ntests/test_dir/grid/0009:\n\ntests/test_dir/grid/0010:\n\ntests/test_dir/grid/0011:\n\ntests/test_dir/grid/0012:\n\ntests/test_dir/grid/0013:\n\ntests/test_dir/grid/0014:\n\ntests/test_dir/grid/0015:\n\ntests/test_dir/grid/0016:\n\ntests/test_dir/grid/0017:\n\ntests/test_dir/grid/0018:\n\ntests/test_dir/grid/0019:\n\ntests/test_dir/grid/0020:\n\ntests/test_dir/grid/0021:\n\ntests/test_dir/grid/0022:\n\ntests/test_dir/grid/0023:\n\ntests/test_dir/grid/0024:\n\ntests/test_dir/grid/0025:\n\ntests/test_dir/grid/0026:\n\ntests/test_dir/grid/0027:\n\ntests/test_dir/grid/0028:\n\ntests/test_dir/grid/0029:\n\ntests/test_dir/grid/0030:\n\ntests/test_dir/grid/0031:\n\ntests/test_dir/grid/0032:\n\ntests/test_dir/grid/0033:\n\ntests/test_dir/grid/0034:\n\ntests/test_dir/grid/0035:\n\ntests/test_dir/grid/0036:\n\ntests/test_dir/grid/0037:\n\ntests/test_dir/grid/0038:\n\ntests/test_dir/grid/0039:\n\ntests/test_dir/grid/0040:\n\ntests/test_dir/grid/0041:\n\ntests/test_dir/grid/0042:\n\ntests/test_dir/grid/0043:\n\ntests/test_dir/grid/0044:\n\ntests/test_dir/grid/0045:\n\ntests/test_dir/grid/0046:\n\ntests/test_dir/grid/0047:\n\ntests/test_dir/grid/0048:\n\ntests/test_dir/grid/0049:\n\ntests/test_dir/grid/0050:\n\ntests/test_dir/grid/0051:\n\ntests/test_dir/grid/0052:\n\ntests/test_dir/grid/0053:\n\ntests/test_dir/grid/0054:\n\ntests/test_dir/grid/0055:\n\ntests/test_dir/grid/0056:\n\ntests/test_dir/grid/0057:\n\ntests/test_dir/grid/0058:\n\ntests/test_dir/grid/0059:\n\ntests/test_dir/grid/0060:\n\ntests/test_dir/grid/0061:\n\ntests/test_dir/grid/0062:\n\ntests/test_dir/grid/0063:\n\ntests/test_dir/grid/0064:\n\ntests/test_dir/grid/0065:\n\ntests/test_dir/grid/0066:\n\ntests/test_dir/grid/0067:\n\ntests/test_dir/grid/0068:\n\ntests/test_dir/grid/0069:\n\ntests/test_dir/grid/0070:\n\ntests/test_dir/grid/0071:\n\ntests/test_dir/grid/0072:\n\ntests/test_dir/grid/0073:\n\ntests/test_dir/grid/0074:\n\ntests/test_dir/grid/0075:\n\ntests/test_dir/grid/0076:\n\ntests/test_dir/grid/0077:\n\ntests/test_dir/grid/0078:\n\ntests/test_dir/grid/0079:\n\ntests/test_dir/grid/0080:\n\ntests/test_dir/grid/0081:\n\ntests/test_dir/grid/0082:\n\ntests/test_dir/grid/0083:\n\ntests/test_dir/grid/0084:\n\ntests/test_dir/grid/0085:\n\ntests/test_dir/grid/0086:\n\ntests/test_dir/grid/0087:\n\ntests/test_dir/grid/0088:\n\ntests/test_dir/grid/0089:\n\ntests/test_dir/grid/0090:\n\ntests/test_dir/grid/0091:\n\ntests/test_dir/grid/0092:\n\ntests/test_dir/grid/0093:\n\ntests/test_dir/grid/0094:\n\ntests/test_dir/grid/0095:\n\ntests/test_dir/grid/0096:\n\ntests/test_dir/grid/0097:\n\ntests/test_dir/grid/0098:\n\ntests/test_dir/grid/0099:\n\ntests/test_dir/grid/0100:\n\ntests/test_dir/grid/0101:\n\ntests/test_dir/grid/0102:\n\ntests/test_dir/grid/0103:\n\ntests/test_dir/grid/0104:\n\ntests/test_dir/grid/0105:\n\ntests/test_dir/grid/0106:\n\ntests/test_dir/grid/0107:\n\ntests/test_dir/grid/0108:\n\ntests/test_dir/grid/0109:\n\ntests/test_dir/grid/0110:\n\ntests/test_dir/grid/0111:\n\ntests/test_dir/grid/0112:\n\ntests/test_dir/grid/0113:\n\ntests/test_dir/grid/0114:\n\ntests/test_dir/grid/0115:\n\ntests/test_dir/grid/0116:\n\ntests/test_dir/grid/0117:\n\ntests/test_dir/grid/0118:\n\ntests/test_dir/grid/0119:\n\ntests/test_dir/grid/0120:\n\ntests/test_dir/grid/0121:\n\ntests/test_dir/grid/0122:\n\ntests/test_dir/grid/0123:\n\ntests/test_dir/grid/0124:\n\ntests/test_dir/grid/0125:\n\ntests/test_dir/grid/0126:\n\ntests/test_dir/grid/0127:\n\ntests/test_dir/grid/0128:\n\ntests/test_dir/grid/0129:\n\ntests/test_dir/grid/0130:\n\ntests/test_dir/grid/0131:\n\ntests/test_dir/grid/0132:\n\ntests/test_dir/grid/0133:\n\ntests/test_dir/grid/0134:\n\ntests/test_dir/grid/0135:\n\ntests/test_dir/grid/0136:\n\ntests/test_dir/grid/0137:\n\ntests/test_dir/grid/0138:\n\ntests/test_dir/grid/0139:\n\ntests/test_dir/grid/0140:\n\ntests/test_dir/grid/0141:\n\ntests/test_dir/grid/0142:\n\ntests/test_dir/grid/0143:\n\ntests/test_dir/grid/0144:\n\ntests/test_dir/grid/0145:\n\ntests/test_dir/grid/0146:\n\ntests/test_dir/grid/0147:\n\ntests/test_dir/grid/0148:\n\ntests/test_dir/grid/0149:\n\ntests/test_dir/grid/0150:\n\ntests/test_dir/grid/0151:\n\ntests/test_dir/grid/0152:\n\ntests/test_dir/grid/0153:\n\ntests/test_dir/grid/0154:\n\ntests/test_dir/grid/0155:\n\ntests/test_dir/grid/0156:\n\ntests/test_dir/grid/0157:\n\ntests/test_dir/grid/0158:\n\ntests/test_dir/grid/0159:\n\ntests/test_dir/grid/0160:\n\ntests/test_dir/grid/0161:\n\ntests/test_dir/grid/0162:\n\ntests/test_dir/grid/0163:\n\ntests/test_dir/grid/0164:\n\ntests/test_dir/grid/0165:\n\ntests/test_dir/grid/0166:\n\ntests/test_dir/grid/0167:\n\ntests/test_dir/grid/0168:\n\ntests/test_dir/grid/0169:\n\ntests/test_dir/grid/0170:\n\ntests/test_dir/grid/0171:\n\ntests/test_dir/grid/0172:\n\ntests/test_dir/grid/0173:\n\ntests/test_dir/grid/0174:\n\ntests/test_dir/grid/0175:\n\ntests/test_dir/grid/0176:\n\ntests/test_dir/grid/0177:\n\ntests/test_dir/grid/0178:\n\ntests/test_dir/grid/0179:\n\ntests/test_dir/grid/0180:\n\ntests/test_dir/grid/0181:\n\ntests/test_dir/grid/0182:\n\ntests/test_dir/grid/0183:\n\ntests/test_dir/grid/0184:\n\ntests/test_dir/grid/0185:\n\ntests/test_dir/grid/0186:\n\ntests/test_dir/grid/0187:\n\ntests/test_dir/grid/0188:\n\ntests/test_dir/grid/0189:\n\ntests/test_dir/grid/0190:\n\ntests/test_dir/grid/0191:\n\ntests/test_dir/grid/0192:\n\ntests/test_dir/grid/0193:\n\ntests/test_dir/grid/0194:\n\ntests/test_dir/grid/0195:\n\ntests/test_dir/grid/0196:\n\ntests/test_dir/grid/0197:\n\ntests/test_dir/grid/0198:\n\ntests/test_dir/grid/0199:\n\ntests/test_dir/grid/0200:\n\ntests/test_dir/grid/0201:\n\ntests/test_dir/grid/0202:\n\ntests/test_dir/grid/0203:\n\ntests/test_dir/grid/0204:\n\ntests/test_dir/grid/0205:\n\ntests/test_dir/grid/0206:\n\ntests/test_dir/grid/0207:\n\ntests/test_dir/grid/0208:\n\ntests/test_dir/grid/0209:\n\ntests/test_dir/grid/0210:\n\ntests/test_dir/grid/0211:\n\ntests/test_dir/grid/0212:\n\ntests/test_dir/grid/0213:\n\ntests/test_dir/grid/0214:\n\ntests/test_dir/grid/0215:\n\ntests/test_dir/grid/0216:\n\ntests/test_dir/grid/0217:\n\ntests/test_dir/grid/0218:\n\ntests/test_dir/grid/0219:\n\ntests/test_dir/grid/0220:\n\ntests/test_dir/grid/0221:\n\ntests/test_dir/grid/0222:\n\ntests/test_dir/grid/0223:\n\ntests/test_dir/grid/0224:\n\ntests/test_dir/grid/0225:\n\ntests/test_dir/grid/0226:\n\ntests/test_dir/grid/0227:\n\ntests/test_dir/grid/0228:\n\ntests/test_dir/grid/0229:\n\ntests/test_dir/grid/0230:\n\ntests/test_dir/grid/0231:\n\ntests/test_dir/grid/0232:\n\ntests/test_dir/grid/0233:\n\ntests/test_dir/grid/0234:\n\ntests/test_dir/grid/0235:\n\ntests/test_dir/grid/0236:\n\ntests/test_dir/grid/0237:\n\ntests/test_dir/grid/0238:\n\ntests/test_dir/grid/0239:\n\ntests/test_dir/grid/0240:\n\ntests/test_dir/grid/0241:\n\ntests/test_dir/grid/0242:\n\ntests/test_dir/grid/0243:\n\ntests/test_dir/grid/0244:\n\ntests/test_dir/grid/0245:\n\ntests/test_dir/grid/0246:\n\ntests/test_dir/grid/0247:\n\ntests/test_dir/grid/0248:\n\ntests/test_dir/grid/0249:\n\ntests/test_dir/grid/0250:\n\ntests/test_dir/grid/0251:\n\ntests/test_dir/grid/0252:\n\ntests/test_dir/grid/0253:\n\ntests/test_dir/grid/0254:\n\ntests/test_dir/grid/0255:\n\ntests/test_dir/grid/0256:\n\ntests/test_dir/grid/0257:\n\ntests/test_dir/grid/0258:\n\ntests/test_dir/grid/0259:\n\ntests/test_dir/grid/0260:\n\ntests/test_dir/grid/0261:\n\ntests/test_dir/grid/0262:\n\ntests/test_dir/grid/0263:\n\ntests/test_dir/grid/0264:\n\ntests/test_dir/grid/0265:\n\ntests/test_dir/grid/0266:\n\ntests/test_dir/grid/0267:\n\ntests/test_dir/grid/0268:\n\ntests/test_dir/grid/0269:\n\ntests/test_dir/grid/0270:\n\ntests/test_dir/grid/0271:\n\ntests/test_dir/grid/0272:\n\ntests/test_dir/grid/0273:\n\ntests/test_dir/grid/0274:\n\ntests/test_dir/grid/0275:\n\ntests/test_dir/grid/0276:\n\ntests/test_dir/grid/0277:\n\ntests/test_dir/grid/0278:\n\ntests/test_dir/grid/0279:\n\ntests/test_dir/grid/0280:\n\ntests/test_dir/grid/0281:\n\ntests/test_dir/grid/0282:\n\ntests/test_dir/grid/0283:\n\ntests/test_dir/grid/0284:\n\ntests/test_dir/grid/0285:\n\ntests/test_dir/grid/0286:\n\ntests/test_dir/grid/0287:\n\ntests/test_dir/grid/0288:\n\ntests/test_dir/grid/0289:\n\ntests/test_dir/grid/0290:\n\ntests/test_dir/grid/0291:\n\ntests/test_dir/grid/0292:\n\ntests/test_dir/grid/0293:\n\ntests/test_dir/grid/0294:\n\ntests/test_dir/grid/0295:\n\ntests/test_dir/grid/0296:\n\ntests/test_dir/grid/0297:\n\ntests/test_dir/grid/0298:\n\ntests/test_dir/grid/0299:\n\ntests/test_dir/grid/0300:\n\ntests/test_dir/grid/0301:\n\ntests/test_dir/grid/0302:\n\ntests/test_dir/grid/0303:\n\ntests/test_dir/grid/0304:\n\ntests/test_dir/grid/0305:\n\ntests/test_dir/grid/0306:\n\ntests/test_dir/grid/0307:\n\ntests/test_dir/grid/0308:\n\ntests/test_dir/grid/0309:\n\ntests/test_dir/grid/0310:\n\ntests/test_dir/grid/0311:\n\ntests/test_dir/grid/0312:\n\ntests/test_dir/grid/0313:\n\ntests/test_dir/grid/0314:\n\ntests/test_dir/grid/0315:\n\ntests/test_dir/grid/0316:\n\ntests/test_dir/grid/0317:\n\ntests/test_dir/grid/0318:\n\ntests/test_dir/grid/0319:\n\ntests/test_dir/grid/0320:\n\ntests/test_dir/grid/0321:\n\ntests/test_dir/grid/0322:\n\ntests/test_dir/grid/0323:\n\ntests/test_dir/grid/0324:\n\ntests/test_dir/grid/0325:\n\ntests/test_dir/grid/0326:\n\ntests/test_dir/grid/0327:\n\ntests/test_dir/grid/0328:\n\ntests/test_dir/grid/0329:\n\ntests/test_dir/grid/0330:\n\ntests/test_dir/grid/0331:\n\ntests/test_dir/grid/0332:\n\ntests/test_dir/grid/0333:\n\ntests/test_dir/grid/0334:\n\ntests/test_dir/grid/0335:\n\ntests/test_dir/grid/0336:\n\ntests/test_dir/grid/0337:\n\ntests/test_dir/grid/0338:\n\ntests/test_dir/grid/0339:\n\ntests/test_dir/grid/0340:\n\ntests/test_dir/grid/0341:\n\ntests/test_dir/grid/0342:\n\ntests/test_dir/grid/0343:\n\ntests/test_dir/grid/0344:\n\ntests/test_dir/grid/0345:\n\ntests/test_dir/grid/0346:\n\ntests/test_dir/grid/0347:\n\ntests/test_dir/grid/0348:\n\ntests/test_dir/grid/0349:\n\ntests/test_dir/grid/0350:\n\ntests/test_dir/grid/0351:\n\ntests/test_dir/grid/0352:\n\ntests/test_dir/grid/0353:\n\ntests/test_dir/grid/0354:\n\ntests/test_dir/grid/0355:\n\ntests/test_dir/grid/0356:\n\ntests/test_dir/grid/0357:\n\ntests/test_dir/grid/0358:\n\ntests/test_dir/grid/0359:\n\ntests/test_dir/grid/0360:\n\ntests/test_dir/grid/0361:\n\ntests/test_dir/grid/0362:\n\ntests/test_dir/grid/0363:\n\ntests/test_dir/grid/0364:\n\ntests/test_dir/grid/0365:\n\ntests/test_dir/grid/0366:\n\ntests/test_dir/grid/0367:\n\ntests/test_dir/grid/0368:\n\ntests/test_dir/grid/0369:\n\ntests/test_dir/grid/0370:\n\ntests/test_dir/grid/0371:\n\ntests/test_dir/grid/0372:\n\ntests/test_dir/grid/0373:\n\ntests/test_dir/grid/0374:\n\ntests/test_dir/grid/0375:\n\ntests/test_dir/grid/0376:\n\ntests/test_dir/grid/0377:\n\ntests/test_dir/grid/0378:\n\ntests/test_dir/grid/0379:\n\ntests/test_dir/grid/0380:\n\ntests/test_dir/grid/0381:\n\ntests/test_dir/grid/0382:\n\ntests/test_dir/grid/0383:\n\ntests/test_dir/grid/0384:\n\ntests/test_dir/grid/0385:\n\ntests/test_dir/grid/0386:\n\ntests/test_dir/grid/0387:\n\ntests/test_dir/grid/0388:\n\ntests/test_dir/grid/0389:\n\ntests/test_dir/grid/0390:\n\ntests/test_dir/grid/0391:\n\ntests/test_dir/grid/0392:\n\ntests/test_dir/grid/0393:\n\ntests/test_dir/grid/0394:\n\ntests/test_dir/grid/0395:\n\ntests/test_dir/grid/0396:\n\ntests/test_dir/grid/0397:\n\ntests/test_dir/grid/0398:\n\ntests/test_dir/grid/0399:\n\ntests/test_dir/grid/0400:\n\ntests/test_dir/grid/0401:\n\ntests/test_dir/grid/0402:\n\ntests/test_dir/grid/0403:\n\ntests/test_dir/grid/0404:\n\ntests/test_dir/grid/0405:\n\ntests/test_dir/grid/0406:\n\ntests/test_dir/grid/0407:\n\ntests/test_dir/grid/0408:\n\ntests/test_dir/grid/0409:\n\ntests/test_dir/grid/0410:\n\ntests/test_dir/grid/0411:\n\ntests/test_dir/grid/0412:\n\ntests/test_dir/grid/0413:\n\ntests/test_dir/grid/0414:\n\ntests/test_dir/grid/0415:\n\ntests/test_dir/grid/0416:\n\ntests/test_dir/grid/0417:\n\ntests/test_dir/grid/0418:\n\ntests/test_dir/grid/0419:\n\ntests/test_dir/grid/0420:\n\ntests/test_dir/grid/0421:\n\ntests/test_dir/grid/0422:\n\ntests/test_dir/grid/0423:\n\ntests/test_dir/grid/0424:\n\ntests/test_dir/grid/0425:\n\ntests/test_dir/grid/0426:\n\ntests/test_dir/grid/0427:\n\ntests/test_dir/grid/0428:\n\ntests/test_dir/grid/0429:\n\ntests/test_dir/grid/0430:\n\ntests/test_dir/grid/0431:\n\ntests/test_dir/grid/0432:\n\ntests/test_dir/grid/0433:\n\ntests/test_dir/grid/0434:\n\ntests/test_dir/grid/0435:\n\ntests/test_dir/grid/0436:\n\ntests/test_dir/grid/0437:\n\ntests/test_dir/grid/0438:\n\ntests/test_dir/grid/0439:\n\ntests/test_dir/grid/0440:\n\ntests/test_dir/grid/0441:\n\ntests/test_dir/grid/0442:\n\ntests/test_dir/grid/0443:\n\ntests/test_dir/grid/0444:\n\ntests/test_dir/grid/0445:\n\ntests/test_dir/grid/0446:\n\ntests/test_dir/grid/0447:\n\ntests/test_dir/grid/0448:\n\ntests/test_dir/grid/0449:\n\ntests/test_dir/grid/0450:\n\ntests/test_dir/grid/0451:\n\ntests/test_dir/grid/0452:\n\ntests/test_dir/grid/0453:\n\ntests/test_dir/grid/0454:\n\ntests/test_dir/grid/0455:\n\ntests/test_dir/grid/0456:\n\ntests/test_dir/grid/0457:\n\ntests/test_dir/grid/0458:\n\ntests/test_dir/grid/0459:\n\ntests/test_dir/grid/0460:\n\ntests/test_dir/grid/0461:\n\ntests/test_dir/grid/0462:\n\ntests/test_dir/grid/0463:\n\ntests/test_dir/grid/0464:\n\ntests/test_dir/grid/0465:\n\ntests/test_dir/grid/0466:\n\ntests/test_dir/grid/0467:\n\ntests/test_dir/grid/0468:\n\ntests/test_dir/grid/0469:\n\ntests/test_dir/grid/0470:\n\ntests/test_dir/grid/0471:\n\ntests/test_dir/grid/0472:\n\ntests/test_dir/grid/0473:\n\ntests/test_dir/grid/0474:\n\ntests/test_dir/grid/0475:\n\ntests/test_dir/grid/0476:\n\ntests/test_dir/grid/0477:\n\ntests/test_dir/grid/0478:\n\ntests/test_dir/grid/0479:\n\ntests/test_dir/grid/0480:\n\ntests/test_dir/grid/0481:\n\ntests/test_dir/grid/0482:\n\ntests/test_dir/grid/0483:\n\ntests/test_dir/grid/0484:\n\ntests/test_dir/grid/0485:\n\ntests/test_dir/grid/0486:\n\ntests/test_dir/grid/0487:\n\ntests/test_dir/grid/0488:\n\ntests/test_dir/grid/0489:\n\ntests/test_dir/grid/0490:\n\ntests/test_dir/grid/0491:\n\ntests/test_dir/grid/0492:\n\ntests/test_dir/grid/0493:\n\ntests/test_dir/grid/0494:\n\ntests/test_dir/grid/0495:\n\ntests/test_dir/grid/0496:\n\ntests/test_dir/grid/0497:\n\ntests/test_dir/grid/0498:\n\ntests/test_dir/grid/0499:\n\ntests/test_dir/grid/0500:\n\ntests/test_dir/grid/0501:\n\ntests/test_dir/grid/0502:\n\ntests/test_dir/grid/0503:\n\ntests/test_dir/grid/0504:\n\ntests/test_dir/grid/0505:\n\ntests/test_dir/grid/0506:\n\ntests/test_dir/grid/0507:\n\ntests/test_dir/grid/0508:\n\ntests/test_dir/grid/0509:\n\ntests/test_dir/grid/0510:\n\ntests/test_dir/grid/0511:\n\ntests/test_dir/grid/0512:\n\ntests/test_dir/grid/0513:\n\ntests/test_dir/grid/0514:\n\ntests/test_dir/grid/0515:\n\ntests/test_dir/grid/0516:\n\ntests/test_dir/grid/0517:\n\ntests/test_dir/grid/0518:\n\ntests/test_dir/grid/0519:\n\ntests/test_dir/grid/0520:\n\ntests/test_dir/grid/0521:\n\ntests/test_dir/grid/0522:\n\ntests/test_dir/grid/0523:\n\ntests/test_dir/grid/0524:\n\ntests/test_dir/grid/0525:\n\ntests/test_dir/grid/0526:\n\ntests/test_dir/grid/0527:\n\ntests/test_dir/grid/0528:\n\ntests/test_dir/grid/0529:\n\ntests/test_dir/grid/0530:\n\ntests/test_dir/grid/0531:\n\ntests/test_dir/grid/0532:\n\ntests/test_dir/grid/0533:\n\ntests/test_dir/grid/0534:\n\ntests/test_dir/grid/0535:\n\ntests/test_dir/grid/0536:\n\ntests/test_dir/grid/0537:\n\ntests/test_dir/grid/0538:\n\ntests/test_dir/grid/0539:\n\ntests/test_dir/grid/0540:\n\ntests/test_dir/grid/0541:\n\ntests/test_dir/grid/0542:\n\ntests/test_dir/grid/0543:\n\ntests/test_dir/grid/0544:\n\ntests/test_dir/grid/0545:\n\ntests/test_dir/grid/0546:\n\ntests/test_dir/grid/0547:\n\ntests/test_dir/grid/0548:\n\ntests/test_dir/grid/0549:\n\ntests/test_dir/grid/0550:\n\ntests/test_dir/grid/0551:\n\ntests/test_dir/grid/0552:\n\ntests/test_dir/grid/0553:\n\ntests/test_dir/grid/0554:\n\ntests/test_dir/grid/0555:\n\ntests/test_dir/grid/0556:\n\ntests/test_dir/grid/0557:\n\ntests/test_dir/grid/0558:\n\ntests/test_dir/grid/0559:\n\ntests/test_dir/grid/0560:\n\ntests/test_dir/grid/0561:\n\ntests/test_dir/grid/0562:\n\ntests/test_dir/grid/0563:\n\ntests/test_dir/grid/0564:\n\ntests/test_dir/grid/0565:\n\ntests/test_dir/grid/0566:\n\ntests/test_dir/grid/0567:\n\ntests/test_dir/grid/0568:\n\ntests/test_dir/grid/0569:\n\ntests/test_dir/grid/0570:\n\ntests/test_dir/grid/0571:\n\ntests/test_dir/grid/0572:\n\ntests/test_dir/grid/0573:\n\ntests/test_dir/grid/0574:\n\ntests/test_dir/grid/0575:\n\ntests/test_dir/grid/0576:\n\ntests/test_dir/grid/0577:\n\ntests/test_dir/grid/0578:\n\ntests/test_dir/grid/0579:\n\ntests/test_dir/grid/0580:\n\ntests/test_dir/grid/0581:\n\ntests/test_dir/grid/0582:\n\ntests/test_dir/grid/0583:\n\ntests/test_dir/grid/0584:\n\ntests/test_dir/grid/0585:\n\ntests/test_dir/grid/0586:\n\ntests/test_dir/grid/0587:\n\ntests/test_dir/grid/0588:\n\ntests/test_dir/grid/0589:\n\ntests/test_dir/grid/0590:\n\ntests/test_dir/grid/0591:\n\ntests/test_dir/grid/0592:\n\ntests/test_dir/grid/0593:\n\ntests/test_dir/grid/0594:\n\ntests/test_dir/grid/0595:\n\ntests/test_dir/grid/0596:\n\ntests/test_dir/grid/0597:\n\ntests/test_dir/grid/0598:\n\ntests/test_dir/grid/0599:\n\ntests/test_dir/grid/0600:\n\ntests/test_dir/grid/0601:\n\ntests/test_dir/grid/0602:\n\ntests/test_dir/grid/0603:\n\ntests/test_dir/grid/0604:\n\ntests/test_dir/grid/0605:\n\ntests/test_dir/grid/0606:\n\ntests/test_dir/grid/0607:\n\ntests/test_dir/grid/0608:\n\ntests/test_dir/grid/0609:\n\ntests/test_dir/grid/0610:\n\ntests/test_dir/grid/0611:\n\ntests/test_dir/grid/0612:\n\ntests/test_dir/grid/0613:\n\ntests/test_dir/grid/0614:\n\ntests/test_dir/grid/0615:\n\ntests/test_dir/grid/0616:\n\ntests/test_dir/grid/0617:\n\ntests/test_dir/grid/0618:\n\ntests/test_dir/grid/0619:\n\ntests/test_dir/grid/0620:\n\ntests/test_dir/grid/0621:\n\ntests/test_dir/grid/0622:\n\ntests/test_dir/grid/0623:\n\ntests/test_dir/grid/0624:\n\ntests/test_dir/grid/0625:\n\ntests/test_dir/grid/0626:\n\ntests/test_dir/grid/0627:\n\ntests/test_dir/grid/0628:\n\ntests/test_dir/grid/0629:\n\ntests/test_dir/grid/0630:\n\ntests/test_dir/grid/0631:\n\ntests/test_dir/grid/0632:\n\ntests/test_dir/grid/0633:\n\ntests/test_dir/grid/0634:\n\ntests/test_dir/grid/0635:\n\ntests/test_dir/grid/0636:\n\ntests/test_dir/grid/0637:\n\ntests/test_dir/grid/0638:\n\ntests/test_dir/grid/0639:\n\ntests/test_dir/grid/0640:\n\ntests/test_dir/grid/0641:\n\ntests/test_dir/grid/0642:\n\ntests/test_dir/grid/0643:\n\ntests/test_dir/grid/0644:\n\ntests/test_dir/grid/0645:\n\ntests/test_dir/grid/0646:\n\ntests/test_dir/grid/0647:\n\ntests/test_dir/grid/0648:\n\ntests/test_dir/grid/0649:\n\ntests/test_dir/grid/0650:\n\ntests/test_dir/grid/0651:\n\ntests/test_dir/grid/0652:\n\ntests/test_dir/grid/0653:\n\ntests/test_dir/grid/0654:\n\ntests/test_dir/grid/0655:\n\ntests/test_dir/grid/0656:\n\ntests/test_dir/grid/0657:\n\ntests/test_dir/grid/0658:\n\ntests/test_dir/grid/0659:\n\ntests/test_dir/grid/0660:\n\ntests/test_dir/grid/0661:\n\ntests/test_dir/grid/0662:\n\ntests/test_dir/grid/0663:\n\ntests/test_dir/grid/0664:\n\ntests/test_dir/grid/0665:\n\ntests/test_dir/grid/0666:\n\ntests/test_dir/grid/0667:\n\ntests/test_dir/grid/0668:\n\ntests/test_dir/grid/0669:\n\ntests/test_dir/grid/0670:\n\ntests/test_dir/grid/0671:\n\ntests/test_dir/grid/0672:\n\ntests/test_dir/grid/0673:\n\ntests/test_dir/grid/0674:\n\ntests/test_dir/grid/0675:\n\ntests/test_dir/grid/0676:\n\ntests/test_dir/grid/0677:\n\ntests/test_dir/grid/0678:\n\ntests/test_dir/grid/0679:\n\ntests/test_dir/grid/0680:\n\ntests/test_dir/grid/0681:\n\ntests/test_dir/grid/0682:\n\ntests/test_dir/grid/0683:\n\ntests/test_dir/grid/0684:\n\ntests/test_dir/grid/0685:\n\ntests/test_dir/grid/0686:\n\ntests/test_dir/grid/0687:\n\ntests/test_dir/grid/0688:\n\ntests/test_dir/grid/0689:\n\ntests/test_dir/grid/0690:\n\ntests/test_dir/grid/0691:\n\ntests/test_dir/grid/0692:\n\ntests/test_dir/grid/0693:\n\ntests/test_dir/grid/0694:\n\ntests/test_dir/grid/0695:\n\ntests/test_dir/grid/0696:\n\ntests/test_dir/grid/0697:\n\ntests/test_dir/grid/0698:\n\ntests/test_dir/grid/0699:\n\ntests/test_dir/grid/0700:\n\ntests/test_dir/grid/0701:\n\ntests/test_dir/grid/0702:\n\ntests/test_dir/grid/0703:\n\ntests/test_dir/grid/0704:\n\ntests/test_dir/grid/0705:\n\ntests/test_dir/grid/0706:\n\ntests/test_dir/grid/0707:\n\ntests/test_dir/grid/0708:\n\ntests/test_dir/grid/0709:\n\ntests/test_dir/grid/0710:\n\ntests/test_dir/grid/0711:\n\ntests/test_dir/grid/0712:\n\ntests/test_dir/grid/0713:\n\ntests/test_dir/grid/0714:\n\ntests/test_dir/grid/0715:\n\ntests/test_dir/grid/0716:\n\ntests/test_dir/grid/0717:\n\ntests/test_dir/grid/0718:\n\ntests/test_dir/grid/0719:\n\ntests/test_dir/grid/0720:\n\ntests/test_dir/grid/0721:\n\ntests/test_dir/grid/0722:\n\ntests/test_dir/grid/0723:\n\ntests/test_dir/grid/0724:\n\ntests/test_dir/grid/0725:\n\ntests/test_dir/grid/0726:\n\ntests/test_dir/grid/0727:\n\ntests/test_dir/grid/0728:\n\ntests/test_dir/grid/0729:\n\ntests/test_dir/grid/0730:\n\ntests/test_dir/grid/0731:\n\ntests/test_dir/grid/0732:\n\ntests/test_dir/grid/0733:\n\ntests/test_dir/grid/0734:\n\ntests/test_dir/grid/0735:\n\ntests/test_dir/grid/0736:\n\ntests/test_dir/grid/0737:\n\ntests/test_dir/grid/0738:\n\ntests/test_dir/grid/0739:\n\ntests/test_dir/grid/0740:\n\ntests/test_dir/grid/0741:\n\ntests/test_dir/grid/0742:\n\ntests/test_dir/grid/0743:\n\ntests/test_dir/grid/0744:\n\ntests/test_dir/grid/0745:\n\ntests/test_dir/grid/0746:\n\ntests/test_dir/grid/0747:\n\ntests/test_dir/grid/0748:\n\ntests/test_dir/grid/0749:\n\ntests/test_dir/grid/0750:\n\ntests/test_dir/grid/0751:\n\ntests/test_dir/grid/0752:\n\ntests/test_dir/grid/0753:\n\ntests/test_dir/grid/0754:\n\ntests/test_dir/grid/0755:\n\ntests/test_dir/grid/0756:\n\ntests/test_dir/grid/0757:\n\ntests/test_dir/grid/0758:\n\ntests/test_dir/grid/0759:\n\ntests/test_dir/grid/0760:\n\ntests/test_dir/grid/0761:\n\ntests/test_dir/grid/0762:\n\ntests/test_dir/grid/0763:\n\ntests/test_dir/grid/0764:\n\ntests/test_dir/grid/0765:\n\ntests/test_dir/grid/0766:\n\ntests/test_dir/grid/0767:\n\ntests/test_dir/grid/0768:\n\ntests/test_dir/grid/0769:\n\ntests/test_dir/grid/0770:\n\ntests/test_dir/grid/0771:\n\ntests/test_dir/grid/0772:\n\ntests/test_dir/grid/0773:\n\ntests/test_dir/grid/0774:\n\ntests/test_dir/grid/0775:\n\ntests/test_dir/grid/0776:\n\ntests/test_dir/grid/0777:\n\ntests/test_dir/grid/0778:\n\ntests/test_dir/grid/0779:\n\ntests/test_dir/grid/0780:\n\ntests/test_dir/grid/0781:\n\ntests/test_dir/grid/0782:\n\ntests/test_dir/grid/0783:\n\ntests/test_dir/grid/0784:\n\ntests/test_dir/grid/0785:\n\ntests/test_dir/grid/0786:\n\ntests/test_dir/grid/0787:\n\ntests/test_dir/grid/0788:\n\ntests/test_dir/grid/0789:\n\ntests/test_dir/grid/0790:\n\ntests/test_dir/grid/0791:\n\ntests/test_dir/grid/0792:\n\ntests/test_dir/grid/0793:\n\ntests/test_dir/grid/0794:\n\ntests/test_dir/grid/0795:\n\ntests/test_dir/grid/0796:\n\ntests/test_dir/grid/0797:\n\ntests/test_dir/grid/0798:\n\ntests/test_dir/grid/0799:\n\ntests/test_dir/grid/0800:\n\ntests/test_dir/grid/0801:\n\ntests/test_dir/grid/0802:\n\ntests/test_dir/grid/0803:\n\ntests/test_dir/grid/0804:\n\ntests/test_dir/grid/0805:\n\ntests/test_dir/grid/0806:\n\ntests/test_dir/grid/0807:\n\ntests/test_dir/grid/0808:\n\ntests/test_dir/grid/0809:\n\ntests/test_dir/grid/0810:\n\ntests/test_dir/grid/0811:\n\ntests/test_dir/grid/0812:\n\ntests/test_dir/grid/0813:\n\ntests/test_dir/grid/0814:\n\ntests/test_dir/grid/0815:\n\ntests/test_dir/grid/0816:\n\ntests/test_dir/grid/0817:\n\ntests/test_dir/grid/0818:\n\ntests/test_dir/grid/0819:\n\ntests/test_dir/grid/0820:\n\ntests/test_dir/grid/0821:\n\ntests/test_dir/grid/0822:\n\ntests/test_dir/grid/0823:\n\ntests/test_dir/grid/0824:\n\ntests/test_dir/grid/0825:\n\ntests/test_dir/grid/0826:\n\ntests/test_dir/grid/0827:\n\ntests/test_dir/grid/0828:\n\ntests/test_dir/grid/0829:\n\ntests/test_dir/grid/0830:\n\ntests/test_dir/grid/0831:\n\ntests/test_dir/grid/0832:\n\ntests/test_dir/grid/0833:\n\ntests/test_dir/grid/0834:\n\ntests/test_dir/grid/0835:\n\ntests/test_dir/grid/0836:\n\ntests/test_dir/grid/0837:\n\ntests/test_dir/grid/0838:\n\ntests/test_dir/grid/0839:\n\ntests/test_dir/grid/0840:\n\ntests/test_dir/grid/0841:\n\ntests/test_dir/grid/0842:\n\ntests/test_dir/grid/0843:\n\ntests/test_dir/grid/0844:\n\ntests/test_dir/grid/0845:\n\ntests/test_dir/grid/0846:\n\ntests/test_dir/grid/0847:\n\ntests/test_dir/grid/0848:\n\ntests/test_dir/grid/0849:\n\ntests/test_dir/grid/0850:\n\ntests/test_dir/grid/0851:\n\ntests/test_dir/grid/0852:\n\ntests/test_dir/grid/0853:\n\ntests/test_dir/grid/0854:\n\ntests/test_dir/grid/0855:\n\ntests/test_dir/grid/0856:\n\ntests/test_dir/grid/0857:\n\ntests/test_dir/grid/0858:\n\ntests/test_dir/grid/0859:\n\ntests/test_dir/grid/0860:\n\ntests/test_dir/grid/0861:\n\ntests/test_dir/grid/0862:\n\ntests/test_dir/grid/0863:\n\ntests/test_dir/grid/0864:\n\ntests/test_dir/grid/0865:\n\ntests/test_dir/grid/0866:\n\ntests/test_dir/grid/0867:\n\ntests/test_dir/grid/0868:\n\ntests/test_dir/grid/0869:\n\ntests/test_dir/grid/0870:\n\ntests/test_dir/grid/0871:\n\ntests/test_dir/grid/0872:\n\ntests/test_dir/grid/0873:\n\ntests/test_dir/grid/0874:\n\ntests/test_dir/grid/0875:\n\ntests/test_dir/grid/0876:\n\ntests/test_dir/grid/0877:\n\ntests/test_dir/grid/0878:\n\ntests/test_dir/grid/0879:\n\ntests/test_dir/grid/0880:\n\ntests/test_dir/grid/0881:\n\ntests/test_dir/grid/0882:\n\ntests/test_dir/grid/0883:\n\ntests/test_dir/grid/0884:\n\ntests/test_dir/grid/0885:\n\ntests/test_dir/grid/0886:\n\ntests/test_dir/grid/0887:\n\ntests/test_dir/grid/0888:\n\ntests/test_dir/grid/0889:\n\ntests/test_dir/grid/0890:\n\ntests/test_dir/grid/0891:\n\ntests/test_dir/grid/0892:\n\ntests/test_dir/grid/0893:\n\ntests/test_dir/grid/0894:\n\ntests/test_dir/grid/0895:\n\ntests/test_dir/grid/0896:\n\ntests/test_dir/grid/0897:\n\ntests/test_dir/grid/0898:\n\ntests/test_dir/grid/0899:\n\ntests/test_dir/grid/0900:\n\ntests/test_dir/grid/0901:\n\ntests/test_dir/grid/0902:\n\ntests/test_dir/grid/0903:\n\ntests/test_dir/grid/0904:\n\ntests/test_dir/grid/0905:\n\ntests/test_dir/grid/0906:\n\ntests/test_dir/grid/0907:\n\ntests/test_dir/grid/0908:\n\ntests/test_dir/grid/0909:\n\ntests/test_dir/grid/0910:\n\ntests/test_dir/grid/0911:\n\ntests/test_dir/grid/0912:\n\ntests/test_dir/grid/0913:\n\ntests/test_dir/grid/0914:\n\ntests/test_dir/grid/0915:\n\ntests/test_dir/grid/0916:\n\ntests/test_dir/grid/0917:\n\ntests/test_dir/grid/0918:\n\ntests/test_dir/grid/0919:\n\ntests/test_dir/grid/0920:\n\ntests/test_dir/grid/0921:\n\ntests/test_dir/grid/0922:\n\ntests/test_dir/grid/0923:\n\ntests/test_dir/grid/0924:\n\ntests/test_dir/grid/0925:\n\ntests/test_dir/grid/0926:\n\ntests/test_dir/grid/0927:\n\ntests/test_dir/grid/0928:\n\ntests/test_dir/grid/0929:\n\ntests/test_dir/grid/0930:\n\ntests/test_dir/grid/0931:\n\ntests/test_dir/grid/0932:\n\ntests/test_dir/grid/0933:\n\ntests/test_dir/grid/0934:\n\ntests/test_dir/grid/0935:\n\ntests/test_dir/grid/0936:\n\ntests/test_dir/grid/0937:\n\ntests/test_dir/grid/0938:\n\ntests/test_dir/grid/0939:\n\ntests/test_dir/grid/0940:\n\ntests/test_dir/grid/0941:\n\ntests/test_dir/grid/0942:\n\ntests/test_dir/grid/0943:\n\ntests/test_dir/grid/0944:\n\ntests/test_dir/grid/0945:\n\ntests/test_dir/grid/0946:\n\ntests/test_dir/grid/0947:\n\ntests/test_dir/grid/0948:\n\ntests/test_dir/grid/0949:\n\ntests/test_dir/grid/0950:\n\ntests/test_dir/grid/0951:\n\ntests/test_dir/grid/0952:\n\ntests/test_dir/grid/0953:\n\ntests/test_dir/grid/0954:\n\ntests/test_dir/grid/0955:\n\ntests/test_dir/grid/0956:\n\ntests/test_dir/grid/0957:\n\ntests/test_dir/grid/0958:\n\ntests/test_dir/grid/0959:\n\ntests/test_dir/grid/0960:\n\ntests/test_dir/grid/0961:\n\ntests/test_dir/grid/0962:\n\ntests/test_dir/grid/0963:\n\ntests/test_dir/grid/0964:\n\ntests/test_dir/grid/0965:\n\ntests/test_dir/grid/0966:\n\ntests/test_dir/grid/0967:\n\ntests/test_dir/grid/0968:\n\ntests/test_dir/grid/0969:\n\ntests/test_dir/grid/0970:\n\ntests/test_dir/grid/0971:\n\ntests/test_dir/grid/0972:\n\ntests/test_dir/grid/0973:\n\ntests/test_dir/grid/0974:\n\ntests/test_dir/grid/0975:\n\ntests/test_dir/grid/0976:\n\ntests/test_dir/grid/0977:\n\ntests/test_dir/grid/0978:\n\ntests/test_dir/grid/0979:\n\ntests/test_dir/grid/0980:\n\ntests/test_dir/grid/0981:\n\ntests/test_dir/grid/0982:\n\ntests/test_dir/grid/0983:\n\ntests/test_dir/grid/0984:\n\ntests/test_dir/grid/0985:\n\ntests/test_dir/grid/0986:\n\ntests/test_dir/grid/0987:\n\ntests/test_dir/grid/0988:\n\ntests/test_dir/grid/0989:\n\ntests/test_dir/grid/0990:\n\ntests/test_dir/grid/0991:\n\ntests/test_dir/grid/0992:\n\ntests/test_dir/grid/0993:\n\ntests/test_dir/grid/0994:\n\ntests/test_dir/grid/0995:\n\ntests/test_dir/grid/0996:\n\ntests/test_dir/grid/0997:\n\ntests/test_dir/grid/0998:\n\ntests/test_dir/grid/0999:\n\ntests/test_dir/grid/1000:\n\ntests/test_dir/group:\nfile\n\ntests/test_dir/icons:\nc++.cpp\nc.c\ncss.css\nfile\ngo.go\nhtml.html\njava.java\njavascript.js\nman.1\nmarked.md\nphp.php\npython.py\nruby.rb\nrust.rs\nshell.sh\nunknown.unknown\n\ntests/test_dir/perms:\nfile\nfile2\n\ntests/test_dir/size:\n1B\n1K\n1M\n1337\n\ntests/test_dir/specials:\n\ntests/test_dir/symlinks:\ndir\nfile\n' lorem ipsum'\nsymlink -> file\nsymlink2 -> symlink\nsymlink3 -> dir\nsymlink4 -> pipitek\n\ntests/test_dir/symlinks/dir:\n\ntests/test_dir/time:\n1d\n1h\n1m\n1s\n1y\nepoch\n"
  },
  {
    "path": "tests/ptests/ptest_97958c59351ef010.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --recurse \""
  },
  {
    "path": "tests/ptests/ptest_98d345bf337daf3f.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_98d345bf337daf3f.stdout",
    "content": "tests/test_dir\n├── git\n├── grid\n├── group\n├── icons\n├── perms\n├── size\n├── specials\n├── symlinks\n└── time\n"
  },
  {
    "path": "tests/ptests/ptest_98d345bf337daf3f.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T --level 1\""
  },
  {
    "path": "tests/ptests/ptest_98e04e3185e9174c.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_98e04e3185e9174c.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_98e04e3185e9174c.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -m \""
  },
  {
    "path": "tests/ptests/ptest_992337433f8c6594.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_992337433f8c6594.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_992337433f8c6594.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -U \""
  },
  {
    "path": "tests/ptests/ptest_9ad652110670db05.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_9ad652110670db05.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_9ad652110670db05.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort Extension\""
  },
  {
    "path": "tests/ptests/ptest_9b2a49fcb2a74cc7.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_9b2a49fcb2a74cc7.stdout",
    "content": "git  grid  group  icons  perms  size  specials  symlinks  time\n"
  },
  {
    "path": "tests/ptests/ptest_9b2a49fcb2a74cc7.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -w 200\""
  },
  {
    "path": "tests/ptests/ptest_9c1d803a17fd05c9.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_9c1d803a17fd05c9.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_9c1d803a17fd05c9.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort Filename\""
  },
  {
    "path": "tests/ptests/ptest_9d319b2ce5ecd989.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_9d319b2ce5ecd989.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_9d319b2ce5ecd989.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort ext\""
  },
  {
    "path": "tests/ptests/ptest_9ece18efb453f48d.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_9ece18efb453f48d.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_9ece18efb453f48d.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -M \""
  },
  {
    "path": "tests/ptests/ptest_a139598e95d06a4b.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_a139598e95d06a4b.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_a139598e95d06a4b.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -D \""
  },
  {
    "path": "tests/ptests/ptest_a689ab7558716dda.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_a689ab7558716dda.stdout",
    "content": "\u001b]8;;file://[CWD]/tests/test_dir/git\u001b/git\u001b]8;;\u001b/\n\u001b]8;;file://[CWD]/tests/test_dir/grid\u001b/grid\u001b]8;;\u001b/\n\u001b]8;;file://[CWD]/tests/test_dir/group\u001b/group\u001b]8;;\u001b/\n\u001b]8;;file://[CWD]/tests/test_dir/icons\u001b/icons\u001b]8;;\u001b/\n\u001b]8;;file://[CWD]/tests/test_dir/perms\u001b/perms\u001b]8;;\u001b/\n\u001b]8;;file://[CWD]/tests/test_dir/size\u001b/size\u001b]8;;\u001b/\n\u001b]8;;file://[CWD]/tests/test_dir/specials\u001b/specials\u001b]8;;\u001b/\n\u001b]8;;file://[CWD]/tests/test_dir/symlinks\u001b/symlinks\u001b]8;;\u001b/\n\u001b]8;;file://[CWD]/tests/test_dir/time\u001b/time\u001b]8;;\u001b/\n"
  },
  {
    "path": "tests/ptests/ptest_a689ab7558716dda.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --hyperlink \""
  },
  {
    "path": "tests/ptests/ptest_a6bbf53a066c588e.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_a6bbf53a066c588e.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_a6bbf53a066c588e.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -A \""
  },
  {
    "path": "tests/ptests/ptest_a71aaa46984bd23.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_a71aaa46984bd23.stdout",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_a71aaa46984bd23.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -f \""
  },
  {
    "path": "tests/ptests/ptest_a78bf581d9095079.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_a78bf581d9095079.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_a78bf581d9095079.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -F auto\""
  },
  {
    "path": "tests/ptests/ptest_a82ad7ec2e961f84.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_a82ad7ec2e961f84.stdout",
    "content": "eza - A modern, maintained replacement for ls\nv0.22.0 [+git] (pre-release debug build!)\nhttps://github.com/eza-community/eza\n"
  },
  {
    "path": "tests/ptests/ptest_a82ad7ec2e961f84.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -v \""
  },
  {
    "path": "tests/ptests/ptest_a8c541050a307891.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_a8c541050a307891.stdout",
    "content": "time\nsymlinks\nspecials\nsize\nperms\nicons\ngroup\ngrid\ngit\n"
  },
  {
    "path": "tests/ptests/ptest_a8c541050a307891.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --reverse \""
  },
  {
    "path": "tests/ptests/ptest_aba07307b0f70090.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_aba07307b0f70090.stdout",
    "content": "git    size\ngrid   specials\ngroup  symlinks\nicons  time\nperms\n"
  },
  {
    "path": "tests/ptests/ptest_aba07307b0f70090.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -w 15\""
  },
  {
    "path": "tests/ptests/ptest_abc83ec759ddab6.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_abc83ec759ddab6.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\n"
  },
  {
    "path": "tests/ptests/ptest_abc83ec759ddab6.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort date\""
  },
  {
    "path": "tests/ptests/ptest_add56bbfa6f842d3.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_add56bbfa6f842d3.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_add56bbfa6f842d3.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -1 \""
  },
  {
    "path": "tests/ptests/ptest_af29d370729835d8.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_af29d370729835d8.stdout",
    "content": "eza - A modern, maintained replacement for ls\nv0.22.0 [+git] (pre-release debug build!)\nhttps://github.com/eza-community/eza\n"
  },
  {
    "path": "tests/ptests/ptest_af29d370729835d8.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --version \""
  },
  {
    "path": "tests/ptests/ptest_b1cc7b6966ce28b3.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_b1cc7b6966ce28b3.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_b1cc7b6966ce28b3.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s Extension\""
  },
  {
    "path": "tests/ptests/ptest_b20ec649e4099d19.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_b20ec649e4099d19.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_b20ec649e4099d19.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --time-style relative\""
  },
  {
    "path": "tests/ptests/ptest_b4bb07ce512e09ba.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_b4bb07ce512e09ba.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_b4bb07ce512e09ba.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --no-filesize \""
  },
  {
    "path": "tests/ptests/ptest_b86c3dd42089b8ae.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_b86c3dd42089b8ae.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_b86c3dd42089b8ae.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --inode \""
  },
  {
    "path": "tests/ptests/ptest_b8bfd122ac3a6a7f.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_b8bfd122ac3a6a7f.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_b8bfd122ac3a6a7f.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort extension\""
  },
  {
    "path": "tests/ptests/ptest_b9480d5b12bc2158.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_b9480d5b12bc2158.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_b9480d5b12bc2158.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --created \""
  },
  {
    "path": "tests/ptests/ptest_bb087081fad71387.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_bb087081fad71387.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_bb087081fad71387.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --no-permissions \""
  },
  {
    "path": "tests/ptests/ptest_bbfc26a93fbe15a7.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_bbfc26a93fbe15a7.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\n"
  },
  {
    "path": "tests/ptests/ptest_bbfc26a93fbe15a7.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s date\""
  },
  {
    "path": "tests/ptests/ptest_bc0980c681a1bf6e.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_bc0980c681a1bf6e.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_bc0980c681a1bf6e.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -b \""
  },
  {
    "path": "tests/ptests/ptest_bc3ef3722b915c0a.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_bc3ef3722b915c0a.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\n"
  },
  {
    "path": "tests/ptests/ptest_bc3ef3722b915c0a.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort inode\""
  },
  {
    "path": "tests/ptests/ptest_bda5e8cec0adaa3d.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_bda5e8cec0adaa3d.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_bda5e8cec0adaa3d.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --context \""
  },
  {
    "path": "tests/ptests/ptest_c0b6a5f5211e052e.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_c0b6a5f5211e052e.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_c0b6a5f5211e052e.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s ext\""
  },
  {
    "path": "tests/ptests/ptest_c15429df79ff8a02.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_c15429df79ff8a02.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_c15429df79ff8a02.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --time modified\""
  },
  {
    "path": "tests/ptests/ptest_c320d2ec8a647bec.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_c320d2ec8a647bec.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_c320d2ec8a647bec.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --header \""
  },
  {
    "path": "tests/ptests/ptest_c5a06187ebc81e63.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_c5a06187ebc81e63.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_c5a06187ebc81e63.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --binary \""
  },
  {
    "path": "tests/ptests/ptest_caa4e824b02fa569.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_caa4e824b02fa569.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\n"
  },
  {
    "path": "tests/ptests/ptest_caa4e824b02fa569.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s modified\""
  },
  {
    "path": "tests/ptests/ptest_cb765650e293bae4.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_cb765650e293bae4.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_cb765650e293bae4.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --time-style long-iso\""
  },
  {
    "path": "tests/ptests/ptest_cf65adc4fe95ba6.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_cf65adc4fe95ba6.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_cf65adc4fe95ba6.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -g \""
  },
  {
    "path": "tests/ptests/ptest_d1571a37ac82a799.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_d1571a37ac82a799.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_d1571a37ac82a799.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --almost-all \""
  },
  {
    "path": "tests/ptests/ptest_d604d143ec99b7fa.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_d604d143ec99b7fa.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_d604d143ec99b7fa.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --total-size \""
  },
  {
    "path": "tests/ptests/ptest_d7c710df474a3770.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_d7c710df474a3770.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_d7c710df474a3770.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --colour auto\""
  },
  {
    "path": "tests/ptests/ptest_dbc0c8e8c3f9b147.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_dbc0c8e8c3f9b147.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_dbc0c8e8c3f9b147.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -G \""
  },
  {
    "path": "tests/ptests/ptest_dc6b5f21bb23c27.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_dc6b5f21bb23c27.stdout",
    "content": "tests/test_dir\n├── git\n│   ├── 001\n│   ├── 002\n│   ├── 003\n│   ├── 004\n│   ├── 005\n│   ├── 006\n│   ├── 007\n│   ├── 008\n│   ├── 009\n│   └── 010\n├── grid\n│   ├── 0001\n│   ├── 0002\n│   ├── 0003\n│   ├── 0004\n│   ├── 0005\n│   ├── 0006\n│   ├── 0007\n│   ├── 0008\n│   ├── 0009\n│   ├── 0010\n│   ├── 0011\n│   ├── 0012\n│   ├── 0013\n│   ├── 0014\n│   ├── 0015\n│   ├── 0016\n│   ├── 0017\n│   ├── 0018\n│   ├── 0019\n│   ├── 0020\n│   ├── 0021\n│   ├── 0022\n│   ├── 0023\n│   ├── 0024\n│   ├── 0025\n│   ├── 0026\n│   ├── 0027\n│   ├── 0028\n│   ├── 0029\n│   ├── 0030\n│   ├── 0031\n│   ├── 0032\n│   ├── 0033\n│   ├── 0034\n│   ├── 0035\n│   ├── 0036\n│   ├── 0037\n│   ├── 0038\n│   ├── 0039\n│   ├── 0040\n│   ├── 0041\n│   ├── 0042\n│   ├── 0043\n│   ├── 0044\n│   ├── 0045\n│   ├── 0046\n│   ├── 0047\n│   ├── 0048\n│   ├── 0049\n│   ├── 0050\n│   ├── 0051\n│   ├── 0052\n│   ├── 0053\n│   ├── 0054\n│   ├── 0055\n│   ├── 0056\n│   ├── 0057\n│   ├── 0058\n│   ├── 0059\n│   ├── 0060\n│   ├── 0061\n│   ├── 0062\n│   ├── 0063\n│   ├── 0064\n│   ├── 0065\n│   ├── 0066\n│   ├── 0067\n│   ├── 0068\n│   ├── 0069\n│   ├── 0070\n│   ├── 0071\n│   ├── 0072\n│   ├── 0073\n│   ├── 0074\n│   ├── 0075\n│   ├── 0076\n│   ├── 0077\n│   ├── 0078\n│   ├── 0079\n│   ├── 0080\n│   ├── 0081\n│   ├── 0082\n│   ├── 0083\n│   ├── 0084\n│   ├── 0085\n│   ├── 0086\n│   ├── 0087\n│   ├── 0088\n│   ├── 0089\n│   ├── 0090\n│   ├── 0091\n│   ├── 0092\n│   ├── 0093\n│   ├── 0094\n│   ├── 0095\n│   ├── 0096\n│   ├── 0097\n│   ├── 0098\n│   ├── 0099\n│   ├── 0100\n│   ├── 0101\n│   ├── 0102\n│   ├── 0103\n│   ├── 0104\n│   ├── 0105\n│   ├── 0106\n│   ├── 0107\n│   ├── 0108\n│   ├── 0109\n│   ├── 0110\n│   ├── 0111\n│   ├── 0112\n│   ├── 0113\n│   ├── 0114\n│   ├── 0115\n│   ├── 0116\n│   ├── 0117\n│   ├── 0118\n│   ├── 0119\n│   ├── 0120\n│   ├── 0121\n│   ├── 0122\n│   ├── 0123\n│   ├── 0124\n│   ├── 0125\n│   ├── 0126\n│   ├── 0127\n│   ├── 0128\n│   ├── 0129\n│   ├── 0130\n│   ├── 0131\n│   ├── 0132\n│   ├── 0133\n│   ├── 0134\n│   ├── 0135\n│   ├── 0136\n│   ├── 0137\n│   ├── 0138\n│   ├── 0139\n│   ├── 0140\n│   ├── 0141\n│   ├── 0142\n│   ├── 0143\n│   ├── 0144\n│   ├── 0145\n│   ├── 0146\n│   ├── 0147\n│   ├── 0148\n│   ├── 0149\n│   ├── 0150\n│   ├── 0151\n│   ├── 0152\n│   ├── 0153\n│   ├── 0154\n│   ├── 0155\n│   ├── 0156\n│   ├── 0157\n│   ├── 0158\n│   ├── 0159\n│   ├── 0160\n│   ├── 0161\n│   ├── 0162\n│   ├── 0163\n│   ├── 0164\n│   ├── 0165\n│   ├── 0166\n│   ├── 0167\n│   ├── 0168\n│   ├── 0169\n│   ├── 0170\n│   ├── 0171\n│   ├── 0172\n│   ├── 0173\n│   ├── 0174\n│   ├── 0175\n│   ├── 0176\n│   ├── 0177\n│   ├── 0178\n│   ├── 0179\n│   ├── 0180\n│   ├── 0181\n│   ├── 0182\n│   ├── 0183\n│   ├── 0184\n│   ├── 0185\n│   ├── 0186\n│   ├── 0187\n│   ├── 0188\n│   ├── 0189\n│   ├── 0190\n│   ├── 0191\n│   ├── 0192\n│   ├── 0193\n│   ├── 0194\n│   ├── 0195\n│   ├── 0196\n│   ├── 0197\n│   ├── 0198\n│   ├── 0199\n│   ├── 0200\n│   ├── 0201\n│   ├── 0202\n│   ├── 0203\n│   ├── 0204\n│   ├── 0205\n│   ├── 0206\n│   ├── 0207\n│   ├── 0208\n│   ├── 0209\n│   ├── 0210\n│   ├── 0211\n│   ├── 0212\n│   ├── 0213\n│   ├── 0214\n│   ├── 0215\n│   ├── 0216\n│   ├── 0217\n│   ├── 0218\n│   ├── 0219\n│   ├── 0220\n│   ├── 0221\n│   ├── 0222\n│   ├── 0223\n│   ├── 0224\n│   ├── 0225\n│   ├── 0226\n│   ├── 0227\n│   ├── 0228\n│   ├── 0229\n│   ├── 0230\n│   ├── 0231\n│   ├── 0232\n│   ├── 0233\n│   ├── 0234\n│   ├── 0235\n│   ├── 0236\n│   ├── 0237\n│   ├── 0238\n│   ├── 0239\n│   ├── 0240\n│   ├── 0241\n│   ├── 0242\n│   ├── 0243\n│   ├── 0244\n│   ├── 0245\n│   ├── 0246\n│   ├── 0247\n│   ├── 0248\n│   ├── 0249\n│   ├── 0250\n│   ├── 0251\n│   ├── 0252\n│   ├── 0253\n│   ├── 0254\n│   ├── 0255\n│   ├── 0256\n│   ├── 0257\n│   ├── 0258\n│   ├── 0259\n│   ├── 0260\n│   ├── 0261\n│   ├── 0262\n│   ├── 0263\n│   ├── 0264\n│   ├── 0265\n│   ├── 0266\n│   ├── 0267\n│   ├── 0268\n│   ├── 0269\n│   ├── 0270\n│   ├── 0271\n│   ├── 0272\n│   ├── 0273\n│   ├── 0274\n│   ├── 0275\n│   ├── 0276\n│   ├── 0277\n│   ├── 0278\n│   ├── 0279\n│   ├── 0280\n│   ├── 0281\n│   ├── 0282\n│   ├── 0283\n│   ├── 0284\n│   ├── 0285\n│   ├── 0286\n│   ├── 0287\n│   ├── 0288\n│   ├── 0289\n│   ├── 0290\n│   ├── 0291\n│   ├── 0292\n│   ├── 0293\n│   ├── 0294\n│   ├── 0295\n│   ├── 0296\n│   ├── 0297\n│   ├── 0298\n│   ├── 0299\n│   ├── 0300\n│   ├── 0301\n│   ├── 0302\n│   ├── 0303\n│   ├── 0304\n│   ├── 0305\n│   ├── 0306\n│   ├── 0307\n│   ├── 0308\n│   ├── 0309\n│   ├── 0310\n│   ├── 0311\n│   ├── 0312\n│   ├── 0313\n│   ├── 0314\n│   ├── 0315\n│   ├── 0316\n│   ├── 0317\n│   ├── 0318\n│   ├── 0319\n│   ├── 0320\n│   ├── 0321\n│   ├── 0322\n│   ├── 0323\n│   ├── 0324\n│   ├── 0325\n│   ├── 0326\n│   ├── 0327\n│   ├── 0328\n│   ├── 0329\n│   ├── 0330\n│   ├── 0331\n│   ├── 0332\n│   ├── 0333\n│   ├── 0334\n│   ├── 0335\n│   ├── 0336\n│   ├── 0337\n│   ├── 0338\n│   ├── 0339\n│   ├── 0340\n│   ├── 0341\n│   ├── 0342\n│   ├── 0343\n│   ├── 0344\n│   ├── 0345\n│   ├── 0346\n│   ├── 0347\n│   ├── 0348\n│   ├── 0349\n│   ├── 0350\n│   ├── 0351\n│   ├── 0352\n│   ├── 0353\n│   ├── 0354\n│   ├── 0355\n│   ├── 0356\n│   ├── 0357\n│   ├── 0358\n│   ├── 0359\n│   ├── 0360\n│   ├── 0361\n│   ├── 0362\n│   ├── 0363\n│   ├── 0364\n│   ├── 0365\n│   ├── 0366\n│   ├── 0367\n│   ├── 0368\n│   ├── 0369\n│   ├── 0370\n│   ├── 0371\n│   ├── 0372\n│   ├── 0373\n│   ├── 0374\n│   ├── 0375\n│   ├── 0376\n│   ├── 0377\n│   ├── 0378\n│   ├── 0379\n│   ├── 0380\n│   ├── 0381\n│   ├── 0382\n│   ├── 0383\n│   ├── 0384\n│   ├── 0385\n│   ├── 0386\n│   ├── 0387\n│   ├── 0388\n│   ├── 0389\n│   ├── 0390\n│   ├── 0391\n│   ├── 0392\n│   ├── 0393\n│   ├── 0394\n│   ├── 0395\n│   ├── 0396\n│   ├── 0397\n│   ├── 0398\n│   ├── 0399\n│   ├── 0400\n│   ├── 0401\n│   ├── 0402\n│   ├── 0403\n│   ├── 0404\n│   ├── 0405\n│   ├── 0406\n│   ├── 0407\n│   ├── 0408\n│   ├── 0409\n│   ├── 0410\n│   ├── 0411\n│   ├── 0412\n│   ├── 0413\n│   ├── 0414\n│   ├── 0415\n│   ├── 0416\n│   ├── 0417\n│   ├── 0418\n│   ├── 0419\n│   ├── 0420\n│   ├── 0421\n│   ├── 0422\n│   ├── 0423\n│   ├── 0424\n│   ├── 0425\n│   ├── 0426\n│   ├── 0427\n│   ├── 0428\n│   ├── 0429\n│   ├── 0430\n│   ├── 0431\n│   ├── 0432\n│   ├── 0433\n│   ├── 0434\n│   ├── 0435\n│   ├── 0436\n│   ├── 0437\n│   ├── 0438\n│   ├── 0439\n│   ├── 0440\n│   ├── 0441\n│   ├── 0442\n│   ├── 0443\n│   ├── 0444\n│   ├── 0445\n│   ├── 0446\n│   ├── 0447\n│   ├── 0448\n│   ├── 0449\n│   ├── 0450\n│   ├── 0451\n│   ├── 0452\n│   ├── 0453\n│   ├── 0454\n│   ├── 0455\n│   ├── 0456\n│   ├── 0457\n│   ├── 0458\n│   ├── 0459\n│   ├── 0460\n│   ├── 0461\n│   ├── 0462\n│   ├── 0463\n│   ├── 0464\n│   ├── 0465\n│   ├── 0466\n│   ├── 0467\n│   ├── 0468\n│   ├── 0469\n│   ├── 0470\n│   ├── 0471\n│   ├── 0472\n│   ├── 0473\n│   ├── 0474\n│   ├── 0475\n│   ├── 0476\n│   ├── 0477\n│   ├── 0478\n│   ├── 0479\n│   ├── 0480\n│   ├── 0481\n│   ├── 0482\n│   ├── 0483\n│   ├── 0484\n│   ├── 0485\n│   ├── 0486\n│   ├── 0487\n│   ├── 0488\n│   ├── 0489\n│   ├── 0490\n│   ├── 0491\n│   ├── 0492\n│   ├── 0493\n│   ├── 0494\n│   ├── 0495\n│   ├── 0496\n│   ├── 0497\n│   ├── 0498\n│   ├── 0499\n│   ├── 0500\n│   ├── 0501\n│   ├── 0502\n│   ├── 0503\n│   ├── 0504\n│   ├── 0505\n│   ├── 0506\n│   ├── 0507\n│   ├── 0508\n│   ├── 0509\n│   ├── 0510\n│   ├── 0511\n│   ├── 0512\n│   ├── 0513\n│   ├── 0514\n│   ├── 0515\n│   ├── 0516\n│   ├── 0517\n│   ├── 0518\n│   ├── 0519\n│   ├── 0520\n│   ├── 0521\n│   ├── 0522\n│   ├── 0523\n│   ├── 0524\n│   ├── 0525\n│   ├── 0526\n│   ├── 0527\n│   ├── 0528\n│   ├── 0529\n│   ├── 0530\n│   ├── 0531\n│   ├── 0532\n│   ├── 0533\n│   ├── 0534\n│   ├── 0535\n│   ├── 0536\n│   ├── 0537\n│   ├── 0538\n│   ├── 0539\n│   ├── 0540\n│   ├── 0541\n│   ├── 0542\n│   ├── 0543\n│   ├── 0544\n│   ├── 0545\n│   ├── 0546\n│   ├── 0547\n│   ├── 0548\n│   ├── 0549\n│   ├── 0550\n│   ├── 0551\n│   ├── 0552\n│   ├── 0553\n│   ├── 0554\n│   ├── 0555\n│   ├── 0556\n│   ├── 0557\n│   ├── 0558\n│   ├── 0559\n│   ├── 0560\n│   ├── 0561\n│   ├── 0562\n│   ├── 0563\n│   ├── 0564\n│   ├── 0565\n│   ├── 0566\n│   ├── 0567\n│   ├── 0568\n│   ├── 0569\n│   ├── 0570\n│   ├── 0571\n│   ├── 0572\n│   ├── 0573\n│   ├── 0574\n│   ├── 0575\n│   ├── 0576\n│   ├── 0577\n│   ├── 0578\n│   ├── 0579\n│   ├── 0580\n│   ├── 0581\n│   ├── 0582\n│   ├── 0583\n│   ├── 0584\n│   ├── 0585\n│   ├── 0586\n│   ├── 0587\n│   ├── 0588\n│   ├── 0589\n│   ├── 0590\n│   ├── 0591\n│   ├── 0592\n│   ├── 0593\n│   ├── 0594\n│   ├── 0595\n│   ├── 0596\n│   ├── 0597\n│   ├── 0598\n│   ├── 0599\n│   ├── 0600\n│   ├── 0601\n│   ├── 0602\n│   ├── 0603\n│   ├── 0604\n│   ├── 0605\n│   ├── 0606\n│   ├── 0607\n│   ├── 0608\n│   ├── 0609\n│   ├── 0610\n│   ├── 0611\n│   ├── 0612\n│   ├── 0613\n│   ├── 0614\n│   ├── 0615\n│   ├── 0616\n│   ├── 0617\n│   ├── 0618\n│   ├── 0619\n│   ├── 0620\n│   ├── 0621\n│   ├── 0622\n│   ├── 0623\n│   ├── 0624\n│   ├── 0625\n│   ├── 0626\n│   ├── 0627\n│   ├── 0628\n│   ├── 0629\n│   ├── 0630\n│   ├── 0631\n│   ├── 0632\n│   ├── 0633\n│   ├── 0634\n│   ├── 0635\n│   ├── 0636\n│   ├── 0637\n│   ├── 0638\n│   ├── 0639\n│   ├── 0640\n│   ├── 0641\n│   ├── 0642\n│   ├── 0643\n│   ├── 0644\n│   ├── 0645\n│   ├── 0646\n│   ├── 0647\n│   ├── 0648\n│   ├── 0649\n│   ├── 0650\n│   ├── 0651\n│   ├── 0652\n│   ├── 0653\n│   ├── 0654\n│   ├── 0655\n│   ├── 0656\n│   ├── 0657\n│   ├── 0658\n│   ├── 0659\n│   ├── 0660\n│   ├── 0661\n│   ├── 0662\n│   ├── 0663\n│   ├── 0664\n│   ├── 0665\n│   ├── 0666\n│   ├── 0667\n│   ├── 0668\n│   ├── 0669\n│   ├── 0670\n│   ├── 0671\n│   ├── 0672\n│   ├── 0673\n│   ├── 0674\n│   ├── 0675\n│   ├── 0676\n│   ├── 0677\n│   ├── 0678\n│   ├── 0679\n│   ├── 0680\n│   ├── 0681\n│   ├── 0682\n│   ├── 0683\n│   ├── 0684\n│   ├── 0685\n│   ├── 0686\n│   ├── 0687\n│   ├── 0688\n│   ├── 0689\n│   ├── 0690\n│   ├── 0691\n│   ├── 0692\n│   ├── 0693\n│   ├── 0694\n│   ├── 0695\n│   ├── 0696\n│   ├── 0697\n│   ├── 0698\n│   ├── 0699\n│   ├── 0700\n│   ├── 0701\n│   ├── 0702\n│   ├── 0703\n│   ├── 0704\n│   ├── 0705\n│   ├── 0706\n│   ├── 0707\n│   ├── 0708\n│   ├── 0709\n│   ├── 0710\n│   ├── 0711\n│   ├── 0712\n│   ├── 0713\n│   ├── 0714\n│   ├── 0715\n│   ├── 0716\n│   ├── 0717\n│   ├── 0718\n│   ├── 0719\n│   ├── 0720\n│   ├── 0721\n│   ├── 0722\n│   ├── 0723\n│   ├── 0724\n│   ├── 0725\n│   ├── 0726\n│   ├── 0727\n│   ├── 0728\n│   ├── 0729\n│   ├── 0730\n│   ├── 0731\n│   ├── 0732\n│   ├── 0733\n│   ├── 0734\n│   ├── 0735\n│   ├── 0736\n│   ├── 0737\n│   ├── 0738\n│   ├── 0739\n│   ├── 0740\n│   ├── 0741\n│   ├── 0742\n│   ├── 0743\n│   ├── 0744\n│   ├── 0745\n│   ├── 0746\n│   ├── 0747\n│   ├── 0748\n│   ├── 0749\n│   ├── 0750\n│   ├── 0751\n│   ├── 0752\n│   ├── 0753\n│   ├── 0754\n│   ├── 0755\n│   ├── 0756\n│   ├── 0757\n│   ├── 0758\n│   ├── 0759\n│   ├── 0760\n│   ├── 0761\n│   ├── 0762\n│   ├── 0763\n│   ├── 0764\n│   ├── 0765\n│   ├── 0766\n│   ├── 0767\n│   ├── 0768\n│   ├── 0769\n│   ├── 0770\n│   ├── 0771\n│   ├── 0772\n│   ├── 0773\n│   ├── 0774\n│   ├── 0775\n│   ├── 0776\n│   ├── 0777\n│   ├── 0778\n│   ├── 0779\n│   ├── 0780\n│   ├── 0781\n│   ├── 0782\n│   ├── 0783\n│   ├── 0784\n│   ├── 0785\n│   ├── 0786\n│   ├── 0787\n│   ├── 0788\n│   ├── 0789\n│   ├── 0790\n│   ├── 0791\n│   ├── 0792\n│   ├── 0793\n│   ├── 0794\n│   ├── 0795\n│   ├── 0796\n│   ├── 0797\n│   ├── 0798\n│   ├── 0799\n│   ├── 0800\n│   ├── 0801\n│   ├── 0802\n│   ├── 0803\n│   ├── 0804\n│   ├── 0805\n│   ├── 0806\n│   ├── 0807\n│   ├── 0808\n│   ├── 0809\n│   ├── 0810\n│   ├── 0811\n│   ├── 0812\n│   ├── 0813\n│   ├── 0814\n│   ├── 0815\n│   ├── 0816\n│   ├── 0817\n│   ├── 0818\n│   ├── 0819\n│   ├── 0820\n│   ├── 0821\n│   ├── 0822\n│   ├── 0823\n│   ├── 0824\n│   ├── 0825\n│   ├── 0826\n│   ├── 0827\n│   ├── 0828\n│   ├── 0829\n│   ├── 0830\n│   ├── 0831\n│   ├── 0832\n│   ├── 0833\n│   ├── 0834\n│   ├── 0835\n│   ├── 0836\n│   ├── 0837\n│   ├── 0838\n│   ├── 0839\n│   ├── 0840\n│   ├── 0841\n│   ├── 0842\n│   ├── 0843\n│   ├── 0844\n│   ├── 0845\n│   ├── 0846\n│   ├── 0847\n│   ├── 0848\n│   ├── 0849\n│   ├── 0850\n│   ├── 0851\n│   ├── 0852\n│   ├── 0853\n│   ├── 0854\n│   ├── 0855\n│   ├── 0856\n│   ├── 0857\n│   ├── 0858\n│   ├── 0859\n│   ├── 0860\n│   ├── 0861\n│   ├── 0862\n│   ├── 0863\n│   ├── 0864\n│   ├── 0865\n│   ├── 0866\n│   ├── 0867\n│   ├── 0868\n│   ├── 0869\n│   ├── 0870\n│   ├── 0871\n│   ├── 0872\n│   ├── 0873\n│   ├── 0874\n│   ├── 0875\n│   ├── 0876\n│   ├── 0877\n│   ├── 0878\n│   ├── 0879\n│   ├── 0880\n│   ├── 0881\n│   ├── 0882\n│   ├── 0883\n│   ├── 0884\n│   ├── 0885\n│   ├── 0886\n│   ├── 0887\n│   ├── 0888\n│   ├── 0889\n│   ├── 0890\n│   ├── 0891\n│   ├── 0892\n│   ├── 0893\n│   ├── 0894\n│   ├── 0895\n│   ├── 0896\n│   ├── 0897\n│   ├── 0898\n│   ├── 0899\n│   ├── 0900\n│   ├── 0901\n│   ├── 0902\n│   ├── 0903\n│   ├── 0904\n│   ├── 0905\n│   ├── 0906\n│   ├── 0907\n│   ├── 0908\n│   ├── 0909\n│   ├── 0910\n│   ├── 0911\n│   ├── 0912\n│   ├── 0913\n│   ├── 0914\n│   ├── 0915\n│   ├── 0916\n│   ├── 0917\n│   ├── 0918\n│   ├── 0919\n│   ├── 0920\n│   ├── 0921\n│   ├── 0922\n│   ├── 0923\n│   ├── 0924\n│   ├── 0925\n│   ├── 0926\n│   ├── 0927\n│   ├── 0928\n│   ├── 0929\n│   ├── 0930\n│   ├── 0931\n│   ├── 0932\n│   ├── 0933\n│   ├── 0934\n│   ├── 0935\n│   ├── 0936\n│   ├── 0937\n│   ├── 0938\n│   ├── 0939\n│   ├── 0940\n│   ├── 0941\n│   ├── 0942\n│   ├── 0943\n│   ├── 0944\n│   ├── 0945\n│   ├── 0946\n│   ├── 0947\n│   ├── 0948\n│   ├── 0949\n│   ├── 0950\n│   ├── 0951\n│   ├── 0952\n│   ├── 0953\n│   ├── 0954\n│   ├── 0955\n│   ├── 0956\n│   ├── 0957\n│   ├── 0958\n│   ├── 0959\n│   ├── 0960\n│   ├── 0961\n│   ├── 0962\n│   ├── 0963\n│   ├── 0964\n│   ├── 0965\n│   ├── 0966\n│   ├── 0967\n│   ├── 0968\n│   ├── 0969\n│   ├── 0970\n│   ├── 0971\n│   ├── 0972\n│   ├── 0973\n│   ├── 0974\n│   ├── 0975\n│   ├── 0976\n│   ├── 0977\n│   ├── 0978\n│   ├── 0979\n│   ├── 0980\n│   ├── 0981\n│   ├── 0982\n│   ├── 0983\n│   ├── 0984\n│   ├── 0985\n│   ├── 0986\n│   ├── 0987\n│   ├── 0988\n│   ├── 0989\n│   ├── 0990\n│   ├── 0991\n│   ├── 0992\n│   ├── 0993\n│   ├── 0994\n│   ├── 0995\n│   ├── 0996\n│   ├── 0997\n│   ├── 0998\n│   ├── 0999\n│   ├── 1000\n│   ├── file_000\n│   ├── file_001\n│   ├── file_002\n│   ├── file_003\n│   ├── file_004\n│   ├── file_005\n│   ├── file_006\n│   ├── file_007\n│   ├── file_008\n│   ├── file_009\n│   ├── file_010\n│   ├── file_011\n│   ├── file_012\n│   ├── file_013\n│   ├── file_014\n│   ├── file_015\n│   ├── file_016\n│   ├── file_017\n│   ├── file_018\n│   ├── file_019\n│   ├── file_020\n│   ├── file_021\n│   ├── file_022\n│   ├── file_023\n│   ├── file_024\n│   ├── file_025\n│   ├── file_026\n│   ├── file_027\n│   ├── file_028\n│   ├── file_029\n│   ├── file_030\n│   ├── file_031\n│   ├── file_032\n│   ├── file_033\n│   ├── file_034\n│   ├── file_035\n│   ├── file_036\n│   ├── file_037\n│   ├── file_038\n│   ├── file_039\n│   ├── file_040\n│   ├── file_041\n│   ├── file_042\n│   ├── file_043\n│   ├── file_044\n│   ├── file_045\n│   ├── file_046\n│   ├── file_047\n│   ├── file_048\n│   ├── file_049\n│   ├── file_050\n│   ├── file_051\n│   ├── file_052\n│   ├── file_053\n│   ├── file_054\n│   ├── file_055\n│   ├── file_056\n│   ├── file_057\n│   ├── file_058\n│   ├── file_059\n│   ├── file_060\n│   ├── file_061\n│   ├── file_062\n│   ├── file_063\n│   ├── file_064\n│   ├── file_065\n│   ├── file_066\n│   ├── file_067\n│   ├── file_068\n│   ├── file_069\n│   ├── file_070\n│   ├── file_071\n│   ├── file_072\n│   ├── file_073\n│   ├── file_074\n│   ├── file_075\n│   ├── file_076\n│   ├── file_077\n│   ├── file_078\n│   ├── file_079\n│   ├── file_080\n│   ├── file_081\n│   ├── file_082\n│   ├── file_083\n│   ├── file_084\n│   ├── file_085\n│   ├── file_086\n│   ├── file_087\n│   ├── file_088\n│   ├── file_089\n│   ├── file_090\n│   ├── file_091\n│   ├── file_092\n│   ├── file_093\n│   ├── file_094\n│   ├── file_095\n│   ├── file_096\n│   ├── file_097\n│   ├── file_098\n│   ├── file_099\n│   ├── file_100\n│   ├── file_101\n│   ├── file_102\n│   ├── file_103\n│   ├── file_104\n│   ├── file_105\n│   ├── file_106\n│   ├── file_107\n│   ├── file_108\n│   ├── file_109\n│   ├── file_110\n│   ├── file_111\n│   ├── file_112\n│   ├── file_113\n│   ├── file_114\n│   ├── file_115\n│   ├── file_116\n│   ├── file_117\n│   ├── file_118\n│   ├── file_119\n│   ├── file_120\n│   ├── file_121\n│   ├── file_122\n│   ├── file_123\n│   ├── file_124\n│   ├── file_125\n│   ├── file_126\n│   ├── file_127\n│   ├── file_128\n│   ├── file_129\n│   ├── file_130\n│   ├── file_131\n│   ├── file_132\n│   ├── file_133\n│   ├── file_134\n│   ├── file_135\n│   ├── file_136\n│   ├── file_137\n│   ├── file_138\n│   ├── file_139\n│   ├── file_140\n│   ├── file_141\n│   ├── file_142\n│   ├── file_143\n│   ├── file_144\n│   ├── file_145\n│   ├── file_146\n│   ├── file_147\n│   ├── file_148\n│   ├── file_149\n│   ├── file_150\n│   ├── file_151\n│   ├── file_152\n│   ├── file_153\n│   ├── file_154\n│   ├── file_155\n│   ├── file_156\n│   ├── file_157\n│   ├── file_158\n│   ├── file_159\n│   ├── file_160\n│   ├── file_161\n│   ├── file_162\n│   ├── file_163\n│   ├── file_164\n│   ├── file_165\n│   ├── file_166\n│   ├── file_167\n│   ├── file_168\n│   ├── file_169\n│   ├── file_170\n│   ├── file_171\n│   ├── file_172\n│   ├── file_173\n│   ├── file_174\n│   ├── file_175\n│   ├── file_176\n│   ├── file_177\n│   ├── file_178\n│   ├── file_179\n│   ├── file_180\n│   ├── file_181\n│   ├── file_182\n│   ├── file_183\n│   ├── file_184\n│   ├── file_185\n│   ├── file_186\n│   ├── file_187\n│   ├── file_188\n│   ├── file_189\n│   ├── file_190\n│   ├── file_191\n│   ├── file_192\n│   ├── file_193\n│   ├── file_194\n│   ├── file_195\n│   ├── file_196\n│   ├── file_197\n│   ├── file_198\n│   ├── file_199\n│   ├── file_200\n│   ├── file_201\n│   ├── file_202\n│   ├── file_203\n│   ├── file_204\n│   ├── file_205\n│   ├── file_206\n│   ├── file_207\n│   ├── file_208\n│   ├── file_209\n│   ├── file_210\n│   ├── file_211\n│   ├── file_212\n│   ├── file_213\n│   ├── file_214\n│   ├── file_215\n│   ├── file_216\n│   ├── file_217\n│   ├── file_218\n│   ├── file_219\n│   ├── file_220\n│   ├── file_221\n│   ├── file_222\n│   ├── file_223\n│   ├── file_224\n│   ├── file_225\n│   ├── file_226\n│   ├── file_227\n│   ├── file_228\n│   ├── file_229\n│   ├── file_230\n│   ├── file_231\n│   ├── file_232\n│   ├── file_233\n│   ├── file_234\n│   ├── file_235\n│   ├── file_236\n│   ├── file_237\n│   ├── file_238\n│   ├── file_239\n│   ├── file_240\n│   ├── file_241\n│   ├── file_242\n│   ├── file_243\n│   ├── file_244\n│   ├── file_245\n│   ├── file_246\n│   ├── file_247\n│   ├── file_248\n│   ├── file_249\n│   ├── file_250\n│   ├── file_251\n│   ├── file_252\n│   ├── file_253\n│   ├── file_254\n│   ├── file_255\n│   ├── file_256\n│   ├── file_257\n│   ├── file_258\n│   ├── file_259\n│   ├── file_260\n│   ├── file_261\n│   ├── file_262\n│   ├── file_263\n│   ├── file_264\n│   ├── file_265\n│   ├── file_266\n│   ├── file_267\n│   ├── file_268\n│   ├── file_269\n│   ├── file_270\n│   ├── file_271\n│   ├── file_272\n│   ├── file_273\n│   ├── file_274\n│   ├── file_275\n│   ├── file_276\n│   ├── file_277\n│   ├── file_278\n│   ├── file_279\n│   ├── file_280\n│   ├── file_281\n│   ├── file_282\n│   ├── file_283\n│   ├── file_284\n│   ├── file_285\n│   ├── file_286\n│   ├── file_287\n│   ├── file_288\n│   ├── file_289\n│   ├── file_290\n│   ├── file_291\n│   ├── file_292\n│   ├── file_293\n│   ├── file_294\n│   ├── file_295\n│   ├── file_296\n│   ├── file_297\n│   ├── file_298\n│   ├── file_299\n│   ├── file_300\n│   ├── file_301\n│   ├── file_302\n│   ├── file_303\n│   ├── file_304\n│   ├── file_305\n│   ├── file_306\n│   ├── file_307\n│   ├── file_308\n│   ├── file_309\n│   ├── file_310\n│   ├── file_311\n│   ├── file_312\n│   ├── file_313\n│   ├── file_314\n│   ├── file_315\n│   ├── file_316\n│   ├── file_317\n│   ├── file_318\n│   ├── file_319\n│   ├── file_320\n│   ├── file_321\n│   ├── file_322\n│   ├── file_323\n│   ├── file_324\n│   ├── file_325\n│   ├── file_326\n│   ├── file_327\n│   ├── file_328\n│   ├── file_329\n│   ├── file_330\n│   ├── file_331\n│   ├── file_332\n│   ├── file_333\n│   ├── file_334\n│   ├── file_335\n│   ├── file_336\n│   ├── file_337\n│   ├── file_338\n│   ├── file_339\n│   ├── file_340\n│   ├── file_341\n│   ├── file_342\n│   ├── file_343\n│   ├── file_344\n│   ├── file_345\n│   ├── file_346\n│   ├── file_347\n│   ├── file_348\n│   ├── file_349\n│   ├── file_350\n│   ├── file_351\n│   ├── file_352\n│   ├── file_353\n│   ├── file_354\n│   ├── file_355\n│   ├── file_356\n│   ├── file_357\n│   ├── file_358\n│   ├── file_359\n│   ├── file_360\n│   ├── file_361\n│   ├── file_362\n│   ├── file_363\n│   ├── file_364\n│   ├── file_365\n│   ├── file_366\n│   ├── file_367\n│   ├── file_368\n│   ├── file_369\n│   ├── file_370\n│   ├── file_371\n│   ├── file_372\n│   ├── file_373\n│   ├── file_374\n│   ├── file_375\n│   ├── file_376\n│   ├── file_377\n│   ├── file_378\n│   ├── file_379\n│   ├── file_380\n│   ├── file_381\n│   ├── file_382\n│   ├── file_383\n│   ├── file_384\n│   ├── file_385\n│   ├── file_386\n│   ├── file_387\n│   ├── file_388\n│   ├── file_389\n│   ├── file_390\n│   ├── file_391\n│   ├── file_392\n│   ├── file_393\n│   ├── file_394\n│   ├── file_395\n│   ├── file_396\n│   ├── file_397\n│   ├── file_398\n│   ├── file_399\n│   ├── file_400\n│   ├── file_401\n│   ├── file_402\n│   ├── file_403\n│   ├── file_404\n│   ├── file_405\n│   ├── file_406\n│   ├── file_407\n│   ├── file_408\n│   ├── file_409\n│   ├── file_410\n│   ├── file_411\n│   ├── file_412\n│   ├── file_413\n│   ├── file_414\n│   ├── file_415\n│   ├── file_416\n│   ├── file_417\n│   ├── file_418\n│   ├── file_419\n│   ├── file_420\n│   ├── file_421\n│   ├── file_422\n│   ├── file_423\n│   ├── file_424\n│   ├── file_425\n│   ├── file_426\n│   ├── file_427\n│   ├── file_428\n│   ├── file_429\n│   ├── file_430\n│   ├── file_431\n│   ├── file_432\n│   ├── file_433\n│   ├── file_434\n│   ├── file_435\n│   ├── file_436\n│   ├── file_437\n│   ├── file_438\n│   ├── file_439\n│   ├── file_440\n│   ├── file_441\n│   ├── file_442\n│   ├── file_443\n│   ├── file_444\n│   ├── file_445\n│   ├── file_446\n│   ├── file_447\n│   ├── file_448\n│   ├── file_449\n│   ├── file_450\n│   ├── file_451\n│   ├── file_452\n│   ├── file_453\n│   ├── file_454\n│   ├── file_455\n│   ├── file_456\n│   ├── file_457\n│   ├── file_458\n│   ├── file_459\n│   ├── file_460\n│   ├── file_461\n│   ├── file_462\n│   ├── file_463\n│   ├── file_464\n│   ├── file_465\n│   ├── file_466\n│   ├── file_467\n│   ├── file_468\n│   ├── file_469\n│   ├── file_470\n│   ├── file_471\n│   ├── file_472\n│   ├── file_473\n│   ├── file_474\n│   ├── file_475\n│   ├── file_476\n│   ├── file_477\n│   ├── file_478\n│   ├── file_479\n│   ├── file_480\n│   ├── file_481\n│   ├── file_482\n│   ├── file_483\n│   ├── file_484\n│   ├── file_485\n│   ├── file_486\n│   ├── file_487\n│   ├── file_488\n│   ├── file_489\n│   ├── file_490\n│   ├── file_491\n│   ├── file_492\n│   ├── file_493\n│   ├── file_494\n│   ├── file_495\n│   ├── file_496\n│   ├── file_497\n│   ├── file_498\n│   ├── file_499\n│   ├── file_500\n│   ├── file_501\n│   ├── file_502\n│   ├── file_503\n│   ├── file_504\n│   ├── file_505\n│   ├── file_506\n│   ├── file_507\n│   ├── file_508\n│   ├── file_509\n│   ├── file_510\n│   ├── file_511\n│   ├── file_512\n│   ├── file_513\n│   ├── file_514\n│   ├── file_515\n│   ├── file_516\n│   ├── file_517\n│   ├── file_518\n│   ├── file_519\n│   ├── file_520\n│   ├── file_521\n│   ├── file_522\n│   ├── file_523\n│   ├── file_524\n│   ├── file_525\n│   ├── file_526\n│   ├── file_527\n│   ├── file_528\n│   ├── file_529\n│   ├── file_530\n│   ├── file_531\n│   ├── file_532\n│   ├── file_533\n│   ├── file_534\n│   ├── file_535\n│   ├── file_536\n│   ├── file_537\n│   ├── file_538\n│   ├── file_539\n│   ├── file_540\n│   ├── file_541\n│   ├── file_542\n│   ├── file_543\n│   ├── file_544\n│   ├── file_545\n│   ├── file_546\n│   ├── file_547\n│   ├── file_548\n│   ├── file_549\n│   ├── file_550\n│   ├── file_551\n│   ├── file_552\n│   ├── file_553\n│   ├── file_554\n│   ├── file_555\n│   ├── file_556\n│   ├── file_557\n│   ├── file_558\n│   ├── file_559\n│   ├── file_560\n│   ├── file_561\n│   ├── file_562\n│   ├── file_563\n│   ├── file_564\n│   ├── file_565\n│   ├── file_566\n│   ├── file_567\n│   ├── file_568\n│   ├── file_569\n│   ├── file_570\n│   ├── file_571\n│   ├── file_572\n│   ├── file_573\n│   ├── file_574\n│   ├── file_575\n│   ├── file_576\n│   ├── file_577\n│   ├── file_578\n│   ├── file_579\n│   ├── file_580\n│   ├── file_581\n│   ├── file_582\n│   ├── file_583\n│   ├── file_584\n│   ├── file_585\n│   ├── file_586\n│   ├── file_587\n│   ├── file_588\n│   ├── file_589\n│   ├── file_590\n│   ├── file_591\n│   ├── file_592\n│   ├── file_593\n│   ├── file_594\n│   ├── file_595\n│   ├── file_596\n│   ├── file_597\n│   ├── file_598\n│   ├── file_599\n│   ├── file_600\n│   ├── file_601\n│   ├── file_602\n│   ├── file_603\n│   ├── file_604\n│   ├── file_605\n│   ├── file_606\n│   ├── file_607\n│   ├── file_608\n│   ├── file_609\n│   ├── file_610\n│   ├── file_611\n│   ├── file_612\n│   ├── file_613\n│   ├── file_614\n│   ├── file_615\n│   ├── file_616\n│   ├── file_617\n│   ├── file_618\n│   ├── file_619\n│   ├── file_620\n│   ├── file_621\n│   ├── file_622\n│   ├── file_623\n│   ├── file_624\n│   ├── file_625\n│   ├── file_626\n│   ├── file_627\n│   ├── file_628\n│   ├── file_629\n│   ├── file_630\n│   ├── file_631\n│   ├── file_632\n│   ├── file_633\n│   ├── file_634\n│   ├── file_635\n│   ├── file_636\n│   ├── file_637\n│   ├── file_638\n│   ├── file_639\n│   ├── file_640\n│   ├── file_641\n│   ├── file_642\n│   ├── file_643\n│   ├── file_644\n│   ├── file_645\n│   ├── file_646\n│   ├── file_647\n│   ├── file_648\n│   ├── file_649\n│   ├── file_650\n│   ├── file_651\n│   ├── file_652\n│   ├── file_653\n│   ├── file_654\n│   ├── file_655\n│   ├── file_656\n│   ├── file_657\n│   ├── file_658\n│   ├── file_659\n│   ├── file_660\n│   ├── file_661\n│   ├── file_662\n│   ├── file_663\n│   ├── file_664\n│   ├── file_665\n│   ├── file_666\n│   ├── file_667\n│   ├── file_668\n│   ├── file_669\n│   ├── file_670\n│   ├── file_671\n│   ├── file_672\n│   ├── file_673\n│   ├── file_674\n│   ├── file_675\n│   ├── file_676\n│   ├── file_677\n│   ├── file_678\n│   ├── file_679\n│   ├── file_680\n│   ├── file_681\n│   ├── file_682\n│   ├── file_683\n│   ├── file_684\n│   ├── file_685\n│   ├── file_686\n│   ├── file_687\n│   ├── file_688\n│   ├── file_689\n│   ├── file_690\n│   ├── file_691\n│   ├── file_692\n│   ├── file_693\n│   ├── file_694\n│   ├── file_695\n│   ├── file_696\n│   ├── file_697\n│   ├── file_698\n│   ├── file_699\n│   ├── file_700\n│   ├── file_701\n│   ├── file_702\n│   ├── file_703\n│   ├── file_704\n│   ├── file_705\n│   ├── file_706\n│   ├── file_707\n│   ├── file_708\n│   ├── file_709\n│   ├── file_710\n│   ├── file_711\n│   ├── file_712\n│   ├── file_713\n│   ├── file_714\n│   ├── file_715\n│   ├── file_716\n│   ├── file_717\n│   ├── file_718\n│   ├── file_719\n│   ├── file_720\n│   ├── file_721\n│   ├── file_722\n│   ├── file_723\n│   ├── file_724\n│   ├── file_725\n│   ├── file_726\n│   ├── file_727\n│   ├── file_728\n│   ├── file_729\n│   ├── file_730\n│   ├── file_731\n│   ├── file_732\n│   ├── file_733\n│   ├── file_734\n│   ├── file_735\n│   ├── file_736\n│   ├── file_737\n│   ├── file_738\n│   ├── file_739\n│   ├── file_740\n│   ├── file_741\n│   ├── file_742\n│   ├── file_743\n│   ├── file_744\n│   ├── file_745\n│   ├── file_746\n│   ├── file_747\n│   ├── file_748\n│   ├── file_749\n│   ├── file_750\n│   ├── file_751\n│   ├── file_752\n│   ├── file_753\n│   ├── file_754\n│   ├── file_755\n│   ├── file_756\n│   ├── file_757\n│   ├── file_758\n│   ├── file_759\n│   ├── file_760\n│   ├── file_761\n│   ├── file_762\n│   ├── file_763\n│   ├── file_764\n│   ├── file_765\n│   ├── file_766\n│   ├── file_767\n│   ├── file_768\n│   ├── file_769\n│   ├── file_770\n│   ├── file_771\n│   ├── file_772\n│   ├── file_773\n│   ├── file_774\n│   ├── file_775\n│   ├── file_776\n│   ├── file_777\n│   ├── file_778\n│   ├── file_779\n│   ├── file_780\n│   ├── file_781\n│   ├── file_782\n│   ├── file_783\n│   ├── file_784\n│   ├── file_785\n│   ├── file_786\n│   ├── file_787\n│   ├── file_788\n│   ├── file_789\n│   ├── file_790\n│   ├── file_791\n│   ├── file_792\n│   ├── file_793\n│   ├── file_794\n│   ├── file_795\n│   ├── file_796\n│   ├── file_797\n│   ├── file_798\n│   ├── file_799\n│   ├── file_800\n│   ├── file_801\n│   ├── file_802\n│   ├── file_803\n│   ├── file_804\n│   ├── file_805\n│   ├── file_806\n│   ├── file_807\n│   ├── file_808\n│   ├── file_809\n│   ├── file_810\n│   ├── file_811\n│   ├── file_812\n│   ├── file_813\n│   ├── file_814\n│   ├── file_815\n│   ├── file_816\n│   ├── file_817\n│   ├── file_818\n│   ├── file_819\n│   ├── file_820\n│   ├── file_821\n│   ├── file_822\n│   ├── file_823\n│   ├── file_824\n│   ├── file_825\n│   ├── file_826\n│   ├── file_827\n│   ├── file_828\n│   ├── file_829\n│   ├── file_830\n│   ├── file_831\n│   ├── file_832\n│   ├── file_833\n│   ├── file_834\n│   ├── file_835\n│   ├── file_836\n│   ├── file_837\n│   ├── file_838\n│   ├── file_839\n│   ├── file_840\n│   ├── file_841\n│   ├── file_842\n│   ├── file_843\n│   ├── file_844\n│   ├── file_845\n│   ├── file_846\n│   ├── file_847\n│   ├── file_848\n│   ├── file_849\n│   ├── file_850\n│   ├── file_851\n│   ├── file_852\n│   ├── file_853\n│   ├── file_854\n│   ├── file_855\n│   ├── file_856\n│   ├── file_857\n│   ├── file_858\n│   ├── file_859\n│   ├── file_860\n│   ├── file_861\n│   ├── file_862\n│   ├── file_863\n│   ├── file_864\n│   ├── file_865\n│   ├── file_866\n│   ├── file_867\n│   ├── file_868\n│   ├── file_869\n│   ├── file_870\n│   ├── file_871\n│   ├── file_872\n│   ├── file_873\n│   ├── file_874\n│   ├── file_875\n│   ├── file_876\n│   ├── file_877\n│   ├── file_878\n│   ├── file_879\n│   ├── file_880\n│   ├── file_881\n│   ├── file_882\n│   ├── file_883\n│   ├── file_884\n│   ├── file_885\n│   ├── file_886\n│   ├── file_887\n│   ├── file_888\n│   ├── file_889\n│   ├── file_890\n│   ├── file_891\n│   ├── file_892\n│   ├── file_893\n│   ├── file_894\n│   ├── file_895\n│   ├── file_896\n│   ├── file_897\n│   ├── file_898\n│   ├── file_899\n│   ├── file_900\n│   ├── file_901\n│   ├── file_902\n│   ├── file_903\n│   ├── file_904\n│   ├── file_905\n│   ├── file_906\n│   ├── file_907\n│   ├── file_908\n│   ├── file_909\n│   ├── file_910\n│   ├── file_911\n│   ├── file_912\n│   ├── file_913\n│   ├── file_914\n│   ├── file_915\n│   ├── file_916\n│   ├── file_917\n│   ├── file_918\n│   ├── file_919\n│   ├── file_920\n│   ├── file_921\n│   ├── file_922\n│   ├── file_923\n│   ├── file_924\n│   ├── file_925\n│   ├── file_926\n│   ├── file_927\n│   ├── file_928\n│   ├── file_929\n│   ├── file_930\n│   ├── file_931\n│   ├── file_932\n│   ├── file_933\n│   ├── file_934\n│   ├── file_935\n│   ├── file_936\n│   ├── file_937\n│   ├── file_938\n│   ├── file_939\n│   ├── file_940\n│   ├── file_941\n│   ├── file_942\n│   ├── file_943\n│   ├── file_944\n│   ├── file_945\n│   ├── file_946\n│   ├── file_947\n│   ├── file_948\n│   ├── file_949\n│   ├── file_950\n│   ├── file_951\n│   ├── file_952\n│   ├── file_953\n│   ├── file_954\n│   ├── file_955\n│   ├── file_956\n│   ├── file_957\n│   ├── file_958\n│   ├── file_959\n│   ├── file_960\n│   ├── file_961\n│   ├── file_962\n│   ├── file_963\n│   ├── file_964\n│   ├── file_965\n│   ├── file_966\n│   ├── file_967\n│   ├── file_968\n│   ├── file_969\n│   ├── file_970\n│   ├── file_971\n│   ├── file_972\n│   ├── file_973\n│   ├── file_974\n│   ├── file_975\n│   ├── file_976\n│   ├── file_977\n│   ├── file_978\n│   ├── file_979\n│   ├── file_980\n│   ├── file_981\n│   ├── file_982\n│   ├── file_983\n│   ├── file_984\n│   ├── file_985\n│   ├── file_986\n│   ├── file_987\n│   ├── file_988\n│   ├── file_989\n│   ├── file_990\n│   ├── file_991\n│   ├── file_992\n│   ├── file_993\n│   ├── file_994\n│   ├── file_995\n│   ├── file_996\n│   ├── file_997\n│   ├── file_998\n│   └── file_999\n├── group\n│   └── file\n├── icons\n│   ├── c++.cpp\n│   ├── c.c\n│   ├── css.css\n│   ├── file\n│   ├── go.go\n│   ├── html.html\n│   ├── java.java\n│   ├── javascript.js\n│   ├── man.1\n│   ├── marked.md\n│   ├── php.php\n│   ├── python.py\n│   ├── ruby.rb\n│   ├── rust.rs\n│   ├── shell.sh\n│   └── unknown.unknown\n├── perms\n│   ├── file\n│   └── file2\n├── size\n│   ├── 1B\n│   ├── 1K\n│   ├── 1M\n│   └── 1337\n├── specials\n├── symlinks\n│   ├── dir\n│   ├── file\n│   ├── ' lorem ipsum'\n│   ├── symlink -> file\n│   ├── symlink2 -> symlink\n│   ├── symlink3 -> dir\n│   └── symlink4 -> pipitek\n└── time\n    ├── 1d\n    ├── 1h\n    ├── 1m\n    ├── 1s\n    ├── 1y\n    └── epoch\n"
  },
  {
    "path": "tests/ptests/ptest_dc6b5f21bb23c27.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T --level 2\""
  },
  {
    "path": "tests/ptests/ptest_ddcc15459b874630.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_ddcc15459b874630.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_ddcc15459b874630.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -o \""
  },
  {
    "path": "tests/ptests/ptest_ded586a10b97281e.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_ded586a10b97281e.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_ded586a10b97281e.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --icons auto\""
  },
  {
    "path": "tests/ptests/ptest_e4cf2a922377bee.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_e4cf2a922377bee.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_e4cf2a922377bee.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --long \""
  },
  {
    "path": "tests/ptests/ptest_ee83bc6dc4504743.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_ee83bc6dc4504743.stdout",
    "content": "git    icons  specials\ngrid   perms  symlinks\ngroup  size   time\n"
  },
  {
    "path": "tests/ptests/ptest_ee83bc6dc4504743.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -w 30\""
  },
  {
    "path": "tests/ptests/ptest_f21d9a563d3e0f10.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_f21d9a563d3e0f10.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_f21d9a563d3e0f10.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --smart-group \""
  },
  {
    "path": "tests/ptests/ptest_f261ab10a0ea20f.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_f261ab10a0ea20f.stdout",
    "content": "tests/test_dir\n├── git\n│   ├── 001\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 002\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 003\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 004\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 005\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 006\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 007\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 008\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   ├── 009\n│   │   ├── file_000\n│   │   ├── file_001\n│   │   ├── file_002\n│   │   ├── file_003\n│   │   ├── file_004\n│   │   ├── file_005\n│   │   ├── file_006\n│   │   ├── file_007\n│   │   ├── file_008\n│   │   └── file_009\n│   └── 010\n│       ├── file_000\n│       ├── file_001\n│       ├── file_002\n│       ├── file_003\n│       ├── file_004\n│       ├── file_005\n│       ├── file_006\n│       ├── file_007\n│       ├── file_008\n│       └── file_009\n├── grid\n│   ├── 0001\n│   ├── 0002\n│   ├── 0003\n│   ├── 0004\n│   ├── 0005\n│   ├── 0006\n│   ├── 0007\n│   ├── 0008\n│   ├── 0009\n│   ├── 0010\n│   ├── 0011\n│   ├── 0012\n│   ├── 0013\n│   ├── 0014\n│   ├── 0015\n│   ├── 0016\n│   ├── 0017\n│   ├── 0018\n│   ├── 0019\n│   ├── 0020\n│   ├── 0021\n│   ├── 0022\n│   ├── 0023\n│   ├── 0024\n│   ├── 0025\n│   ├── 0026\n│   ├── 0027\n│   ├── 0028\n│   ├── 0029\n│   ├── 0030\n│   ├── 0031\n│   ├── 0032\n│   ├── 0033\n│   ├── 0034\n│   ├── 0035\n│   ├── 0036\n│   ├── 0037\n│   ├── 0038\n│   ├── 0039\n│   ├── 0040\n│   ├── 0041\n│   ├── 0042\n│   ├── 0043\n│   ├── 0044\n│   ├── 0045\n│   ├── 0046\n│   ├── 0047\n│   ├── 0048\n│   ├── 0049\n│   ├── 0050\n│   ├── 0051\n│   ├── 0052\n│   ├── 0053\n│   ├── 0054\n│   ├── 0055\n│   ├── 0056\n│   ├── 0057\n│   ├── 0058\n│   ├── 0059\n│   ├── 0060\n│   ├── 0061\n│   ├── 0062\n│   ├── 0063\n│   ├── 0064\n│   ├── 0065\n│   ├── 0066\n│   ├── 0067\n│   ├── 0068\n│   ├── 0069\n│   ├── 0070\n│   ├── 0071\n│   ├── 0072\n│   ├── 0073\n│   ├── 0074\n│   ├── 0075\n│   ├── 0076\n│   ├── 0077\n│   ├── 0078\n│   ├── 0079\n│   ├── 0080\n│   ├── 0081\n│   ├── 0082\n│   ├── 0083\n│   ├── 0084\n│   ├── 0085\n│   ├── 0086\n│   ├── 0087\n│   ├── 0088\n│   ├── 0089\n│   ├── 0090\n│   ├── 0091\n│   ├── 0092\n│   ├── 0093\n│   ├── 0094\n│   ├── 0095\n│   ├── 0096\n│   ├── 0097\n│   ├── 0098\n│   ├── 0099\n│   ├── 0100\n│   ├── 0101\n│   ├── 0102\n│   ├── 0103\n│   ├── 0104\n│   ├── 0105\n│   ├── 0106\n│   ├── 0107\n│   ├── 0108\n│   ├── 0109\n│   ├── 0110\n│   ├── 0111\n│   ├── 0112\n│   ├── 0113\n│   ├── 0114\n│   ├── 0115\n│   ├── 0116\n│   ├── 0117\n│   ├── 0118\n│   ├── 0119\n│   ├── 0120\n│   ├── 0121\n│   ├── 0122\n│   ├── 0123\n│   ├── 0124\n│   ├── 0125\n│   ├── 0126\n│   ├── 0127\n│   ├── 0128\n│   ├── 0129\n│   ├── 0130\n│   ├── 0131\n│   ├── 0132\n│   ├── 0133\n│   ├── 0134\n│   ├── 0135\n│   ├── 0136\n│   ├── 0137\n│   ├── 0138\n│   ├── 0139\n│   ├── 0140\n│   ├── 0141\n│   ├── 0142\n│   ├── 0143\n│   ├── 0144\n│   ├── 0145\n│   ├── 0146\n│   ├── 0147\n│   ├── 0148\n│   ├── 0149\n│   ├── 0150\n│   ├── 0151\n│   ├── 0152\n│   ├── 0153\n│   ├── 0154\n│   ├── 0155\n│   ├── 0156\n│   ├── 0157\n│   ├── 0158\n│   ├── 0159\n│   ├── 0160\n│   ├── 0161\n│   ├── 0162\n│   ├── 0163\n│   ├── 0164\n│   ├── 0165\n│   ├── 0166\n│   ├── 0167\n│   ├── 0168\n│   ├── 0169\n│   ├── 0170\n│   ├── 0171\n│   ├── 0172\n│   ├── 0173\n│   ├── 0174\n│   ├── 0175\n│   ├── 0176\n│   ├── 0177\n│   ├── 0178\n│   ├── 0179\n│   ├── 0180\n│   ├── 0181\n│   ├── 0182\n│   ├── 0183\n│   ├── 0184\n│   ├── 0185\n│   ├── 0186\n│   ├── 0187\n│   ├── 0188\n│   ├── 0189\n│   ├── 0190\n│   ├── 0191\n│   ├── 0192\n│   ├── 0193\n│   ├── 0194\n│   ├── 0195\n│   ├── 0196\n│   ├── 0197\n│   ├── 0198\n│   ├── 0199\n│   ├── 0200\n│   ├── 0201\n│   ├── 0202\n│   ├── 0203\n│   ├── 0204\n│   ├── 0205\n│   ├── 0206\n│   ├── 0207\n│   ├── 0208\n│   ├── 0209\n│   ├── 0210\n│   ├── 0211\n│   ├── 0212\n│   ├── 0213\n│   ├── 0214\n│   ├── 0215\n│   ├── 0216\n│   ├── 0217\n│   ├── 0218\n│   ├── 0219\n│   ├── 0220\n│   ├── 0221\n│   ├── 0222\n│   ├── 0223\n│   ├── 0224\n│   ├── 0225\n│   ├── 0226\n│   ├── 0227\n│   ├── 0228\n│   ├── 0229\n│   ├── 0230\n│   ├── 0231\n│   ├── 0232\n│   ├── 0233\n│   ├── 0234\n│   ├── 0235\n│   ├── 0236\n│   ├── 0237\n│   ├── 0238\n│   ├── 0239\n│   ├── 0240\n│   ├── 0241\n│   ├── 0242\n│   ├── 0243\n│   ├── 0244\n│   ├── 0245\n│   ├── 0246\n│   ├── 0247\n│   ├── 0248\n│   ├── 0249\n│   ├── 0250\n│   ├── 0251\n│   ├── 0252\n│   ├── 0253\n│   ├── 0254\n│   ├── 0255\n│   ├── 0256\n│   ├── 0257\n│   ├── 0258\n│   ├── 0259\n│   ├── 0260\n│   ├── 0261\n│   ├── 0262\n│   ├── 0263\n│   ├── 0264\n│   ├── 0265\n│   ├── 0266\n│   ├── 0267\n│   ├── 0268\n│   ├── 0269\n│   ├── 0270\n│   ├── 0271\n│   ├── 0272\n│   ├── 0273\n│   ├── 0274\n│   ├── 0275\n│   ├── 0276\n│   ├── 0277\n│   ├── 0278\n│   ├── 0279\n│   ├── 0280\n│   ├── 0281\n│   ├── 0282\n│   ├── 0283\n│   ├── 0284\n│   ├── 0285\n│   ├── 0286\n│   ├── 0287\n│   ├── 0288\n│   ├── 0289\n│   ├── 0290\n│   ├── 0291\n│   ├── 0292\n│   ├── 0293\n│   ├── 0294\n│   ├── 0295\n│   ├── 0296\n│   ├── 0297\n│   ├── 0298\n│   ├── 0299\n│   ├── 0300\n│   ├── 0301\n│   ├── 0302\n│   ├── 0303\n│   ├── 0304\n│   ├── 0305\n│   ├── 0306\n│   ├── 0307\n│   ├── 0308\n│   ├── 0309\n│   ├── 0310\n│   ├── 0311\n│   ├── 0312\n│   ├── 0313\n│   ├── 0314\n│   ├── 0315\n│   ├── 0316\n│   ├── 0317\n│   ├── 0318\n│   ├── 0319\n│   ├── 0320\n│   ├── 0321\n│   ├── 0322\n│   ├── 0323\n│   ├── 0324\n│   ├── 0325\n│   ├── 0326\n│   ├── 0327\n│   ├── 0328\n│   ├── 0329\n│   ├── 0330\n│   ├── 0331\n│   ├── 0332\n│   ├── 0333\n│   ├── 0334\n│   ├── 0335\n│   ├── 0336\n│   ├── 0337\n│   ├── 0338\n│   ├── 0339\n│   ├── 0340\n│   ├── 0341\n│   ├── 0342\n│   ├── 0343\n│   ├── 0344\n│   ├── 0345\n│   ├── 0346\n│   ├── 0347\n│   ├── 0348\n│   ├── 0349\n│   ├── 0350\n│   ├── 0351\n│   ├── 0352\n│   ├── 0353\n│   ├── 0354\n│   ├── 0355\n│   ├── 0356\n│   ├── 0357\n│   ├── 0358\n│   ├── 0359\n│   ├── 0360\n│   ├── 0361\n│   ├── 0362\n│   ├── 0363\n│   ├── 0364\n│   ├── 0365\n│   ├── 0366\n│   ├── 0367\n│   ├── 0368\n│   ├── 0369\n│   ├── 0370\n│   ├── 0371\n│   ├── 0372\n│   ├── 0373\n│   ├── 0374\n│   ├── 0375\n│   ├── 0376\n│   ├── 0377\n│   ├── 0378\n│   ├── 0379\n│   ├── 0380\n│   ├── 0381\n│   ├── 0382\n│   ├── 0383\n│   ├── 0384\n│   ├── 0385\n│   ├── 0386\n│   ├── 0387\n│   ├── 0388\n│   ├── 0389\n│   ├── 0390\n│   ├── 0391\n│   ├── 0392\n│   ├── 0393\n│   ├── 0394\n│   ├── 0395\n│   ├── 0396\n│   ├── 0397\n│   ├── 0398\n│   ├── 0399\n│   ├── 0400\n│   ├── 0401\n│   ├── 0402\n│   ├── 0403\n│   ├── 0404\n│   ├── 0405\n│   ├── 0406\n│   ├── 0407\n│   ├── 0408\n│   ├── 0409\n│   ├── 0410\n│   ├── 0411\n│   ├── 0412\n│   ├── 0413\n│   ├── 0414\n│   ├── 0415\n│   ├── 0416\n│   ├── 0417\n│   ├── 0418\n│   ├── 0419\n│   ├── 0420\n│   ├── 0421\n│   ├── 0422\n│   ├── 0423\n│   ├── 0424\n│   ├── 0425\n│   ├── 0426\n│   ├── 0427\n│   ├── 0428\n│   ├── 0429\n│   ├── 0430\n│   ├── 0431\n│   ├── 0432\n│   ├── 0433\n│   ├── 0434\n│   ├── 0435\n│   ├── 0436\n│   ├── 0437\n│   ├── 0438\n│   ├── 0439\n│   ├── 0440\n│   ├── 0441\n│   ├── 0442\n│   ├── 0443\n│   ├── 0444\n│   ├── 0445\n│   ├── 0446\n│   ├── 0447\n│   ├── 0448\n│   ├── 0449\n│   ├── 0450\n│   ├── 0451\n│   ├── 0452\n│   ├── 0453\n│   ├── 0454\n│   ├── 0455\n│   ├── 0456\n│   ├── 0457\n│   ├── 0458\n│   ├── 0459\n│   ├── 0460\n│   ├── 0461\n│   ├── 0462\n│   ├── 0463\n│   ├── 0464\n│   ├── 0465\n│   ├── 0466\n│   ├── 0467\n│   ├── 0468\n│   ├── 0469\n│   ├── 0470\n│   ├── 0471\n│   ├── 0472\n│   ├── 0473\n│   ├── 0474\n│   ├── 0475\n│   ├── 0476\n│   ├── 0477\n│   ├── 0478\n│   ├── 0479\n│   ├── 0480\n│   ├── 0481\n│   ├── 0482\n│   ├── 0483\n│   ├── 0484\n│   ├── 0485\n│   ├── 0486\n│   ├── 0487\n│   ├── 0488\n│   ├── 0489\n│   ├── 0490\n│   ├── 0491\n│   ├── 0492\n│   ├── 0493\n│   ├── 0494\n│   ├── 0495\n│   ├── 0496\n│   ├── 0497\n│   ├── 0498\n│   ├── 0499\n│   ├── 0500\n│   ├── 0501\n│   ├── 0502\n│   ├── 0503\n│   ├── 0504\n│   ├── 0505\n│   ├── 0506\n│   ├── 0507\n│   ├── 0508\n│   ├── 0509\n│   ├── 0510\n│   ├── 0511\n│   ├── 0512\n│   ├── 0513\n│   ├── 0514\n│   ├── 0515\n│   ├── 0516\n│   ├── 0517\n│   ├── 0518\n│   ├── 0519\n│   ├── 0520\n│   ├── 0521\n│   ├── 0522\n│   ├── 0523\n│   ├── 0524\n│   ├── 0525\n│   ├── 0526\n│   ├── 0527\n│   ├── 0528\n│   ├── 0529\n│   ├── 0530\n│   ├── 0531\n│   ├── 0532\n│   ├── 0533\n│   ├── 0534\n│   ├── 0535\n│   ├── 0536\n│   ├── 0537\n│   ├── 0538\n│   ├── 0539\n│   ├── 0540\n│   ├── 0541\n│   ├── 0542\n│   ├── 0543\n│   ├── 0544\n│   ├── 0545\n│   ├── 0546\n│   ├── 0547\n│   ├── 0548\n│   ├── 0549\n│   ├── 0550\n│   ├── 0551\n│   ├── 0552\n│   ├── 0553\n│   ├── 0554\n│   ├── 0555\n│   ├── 0556\n│   ├── 0557\n│   ├── 0558\n│   ├── 0559\n│   ├── 0560\n│   ├── 0561\n│   ├── 0562\n│   ├── 0563\n│   ├── 0564\n│   ├── 0565\n│   ├── 0566\n│   ├── 0567\n│   ├── 0568\n│   ├── 0569\n│   ├── 0570\n│   ├── 0571\n│   ├── 0572\n│   ├── 0573\n│   ├── 0574\n│   ├── 0575\n│   ├── 0576\n│   ├── 0577\n│   ├── 0578\n│   ├── 0579\n│   ├── 0580\n│   ├── 0581\n│   ├── 0582\n│   ├── 0583\n│   ├── 0584\n│   ├── 0585\n│   ├── 0586\n│   ├── 0587\n│   ├── 0588\n│   ├── 0589\n│   ├── 0590\n│   ├── 0591\n│   ├── 0592\n│   ├── 0593\n│   ├── 0594\n│   ├── 0595\n│   ├── 0596\n│   ├── 0597\n│   ├── 0598\n│   ├── 0599\n│   ├── 0600\n│   ├── 0601\n│   ├── 0602\n│   ├── 0603\n│   ├── 0604\n│   ├── 0605\n│   ├── 0606\n│   ├── 0607\n│   ├── 0608\n│   ├── 0609\n│   ├── 0610\n│   ├── 0611\n│   ├── 0612\n│   ├── 0613\n│   ├── 0614\n│   ├── 0615\n│   ├── 0616\n│   ├── 0617\n│   ├── 0618\n│   ├── 0619\n│   ├── 0620\n│   ├── 0621\n│   ├── 0622\n│   ├── 0623\n│   ├── 0624\n│   ├── 0625\n│   ├── 0626\n│   ├── 0627\n│   ├── 0628\n│   ├── 0629\n│   ├── 0630\n│   ├── 0631\n│   ├── 0632\n│   ├── 0633\n│   ├── 0634\n│   ├── 0635\n│   ├── 0636\n│   ├── 0637\n│   ├── 0638\n│   ├── 0639\n│   ├── 0640\n│   ├── 0641\n│   ├── 0642\n│   ├── 0643\n│   ├── 0644\n│   ├── 0645\n│   ├── 0646\n│   ├── 0647\n│   ├── 0648\n│   ├── 0649\n│   ├── 0650\n│   ├── 0651\n│   ├── 0652\n│   ├── 0653\n│   ├── 0654\n│   ├── 0655\n│   ├── 0656\n│   ├── 0657\n│   ├── 0658\n│   ├── 0659\n│   ├── 0660\n│   ├── 0661\n│   ├── 0662\n│   ├── 0663\n│   ├── 0664\n│   ├── 0665\n│   ├── 0666\n│   ├── 0667\n│   ├── 0668\n│   ├── 0669\n│   ├── 0670\n│   ├── 0671\n│   ├── 0672\n│   ├── 0673\n│   ├── 0674\n│   ├── 0675\n│   ├── 0676\n│   ├── 0677\n│   ├── 0678\n│   ├── 0679\n│   ├── 0680\n│   ├── 0681\n│   ├── 0682\n│   ├── 0683\n│   ├── 0684\n│   ├── 0685\n│   ├── 0686\n│   ├── 0687\n│   ├── 0688\n│   ├── 0689\n│   ├── 0690\n│   ├── 0691\n│   ├── 0692\n│   ├── 0693\n│   ├── 0694\n│   ├── 0695\n│   ├── 0696\n│   ├── 0697\n│   ├── 0698\n│   ├── 0699\n│   ├── 0700\n│   ├── 0701\n│   ├── 0702\n│   ├── 0703\n│   ├── 0704\n│   ├── 0705\n│   ├── 0706\n│   ├── 0707\n│   ├── 0708\n│   ├── 0709\n│   ├── 0710\n│   ├── 0711\n│   ├── 0712\n│   ├── 0713\n│   ├── 0714\n│   ├── 0715\n│   ├── 0716\n│   ├── 0717\n│   ├── 0718\n│   ├── 0719\n│   ├── 0720\n│   ├── 0721\n│   ├── 0722\n│   ├── 0723\n│   ├── 0724\n│   ├── 0725\n│   ├── 0726\n│   ├── 0727\n│   ├── 0728\n│   ├── 0729\n│   ├── 0730\n│   ├── 0731\n│   ├── 0732\n│   ├── 0733\n│   ├── 0734\n│   ├── 0735\n│   ├── 0736\n│   ├── 0737\n│   ├── 0738\n│   ├── 0739\n│   ├── 0740\n│   ├── 0741\n│   ├── 0742\n│   ├── 0743\n│   ├── 0744\n│   ├── 0745\n│   ├── 0746\n│   ├── 0747\n│   ├── 0748\n│   ├── 0749\n│   ├── 0750\n│   ├── 0751\n│   ├── 0752\n│   ├── 0753\n│   ├── 0754\n│   ├── 0755\n│   ├── 0756\n│   ├── 0757\n│   ├── 0758\n│   ├── 0759\n│   ├── 0760\n│   ├── 0761\n│   ├── 0762\n│   ├── 0763\n│   ├── 0764\n│   ├── 0765\n│   ├── 0766\n│   ├── 0767\n│   ├── 0768\n│   ├── 0769\n│   ├── 0770\n│   ├── 0771\n│   ├── 0772\n│   ├── 0773\n│   ├── 0774\n│   ├── 0775\n│   ├── 0776\n│   ├── 0777\n│   ├── 0778\n│   ├── 0779\n│   ├── 0780\n│   ├── 0781\n│   ├── 0782\n│   ├── 0783\n│   ├── 0784\n│   ├── 0785\n│   ├── 0786\n│   ├── 0787\n│   ├── 0788\n│   ├── 0789\n│   ├── 0790\n│   ├── 0791\n│   ├── 0792\n│   ├── 0793\n│   ├── 0794\n│   ├── 0795\n│   ├── 0796\n│   ├── 0797\n│   ├── 0798\n│   ├── 0799\n│   ├── 0800\n│   ├── 0801\n│   ├── 0802\n│   ├── 0803\n│   ├── 0804\n│   ├── 0805\n│   ├── 0806\n│   ├── 0807\n│   ├── 0808\n│   ├── 0809\n│   ├── 0810\n│   ├── 0811\n│   ├── 0812\n│   ├── 0813\n│   ├── 0814\n│   ├── 0815\n│   ├── 0816\n│   ├── 0817\n│   ├── 0818\n│   ├── 0819\n│   ├── 0820\n│   ├── 0821\n│   ├── 0822\n│   ├── 0823\n│   ├── 0824\n│   ├── 0825\n│   ├── 0826\n│   ├── 0827\n│   ├── 0828\n│   ├── 0829\n│   ├── 0830\n│   ├── 0831\n│   ├── 0832\n│   ├── 0833\n│   ├── 0834\n│   ├── 0835\n│   ├── 0836\n│   ├── 0837\n│   ├── 0838\n│   ├── 0839\n│   ├── 0840\n│   ├── 0841\n│   ├── 0842\n│   ├── 0843\n│   ├── 0844\n│   ├── 0845\n│   ├── 0846\n│   ├── 0847\n│   ├── 0848\n│   ├── 0849\n│   ├── 0850\n│   ├── 0851\n│   ├── 0852\n│   ├── 0853\n│   ├── 0854\n│   ├── 0855\n│   ├── 0856\n│   ├── 0857\n│   ├── 0858\n│   ├── 0859\n│   ├── 0860\n│   ├── 0861\n│   ├── 0862\n│   ├── 0863\n│   ├── 0864\n│   ├── 0865\n│   ├── 0866\n│   ├── 0867\n│   ├── 0868\n│   ├── 0869\n│   ├── 0870\n│   ├── 0871\n│   ├── 0872\n│   ├── 0873\n│   ├── 0874\n│   ├── 0875\n│   ├── 0876\n│   ├── 0877\n│   ├── 0878\n│   ├── 0879\n│   ├── 0880\n│   ├── 0881\n│   ├── 0882\n│   ├── 0883\n│   ├── 0884\n│   ├── 0885\n│   ├── 0886\n│   ├── 0887\n│   ├── 0888\n│   ├── 0889\n│   ├── 0890\n│   ├── 0891\n│   ├── 0892\n│   ├── 0893\n│   ├── 0894\n│   ├── 0895\n│   ├── 0896\n│   ├── 0897\n│   ├── 0898\n│   ├── 0899\n│   ├── 0900\n│   ├── 0901\n│   ├── 0902\n│   ├── 0903\n│   ├── 0904\n│   ├── 0905\n│   ├── 0906\n│   ├── 0907\n│   ├── 0908\n│   ├── 0909\n│   ├── 0910\n│   ├── 0911\n│   ├── 0912\n│   ├── 0913\n│   ├── 0914\n│   ├── 0915\n│   ├── 0916\n│   ├── 0917\n│   ├── 0918\n│   ├── 0919\n│   ├── 0920\n│   ├── 0921\n│   ├── 0922\n│   ├── 0923\n│   ├── 0924\n│   ├── 0925\n│   ├── 0926\n│   ├── 0927\n│   ├── 0928\n│   ├── 0929\n│   ├── 0930\n│   ├── 0931\n│   ├── 0932\n│   ├── 0933\n│   ├── 0934\n│   ├── 0935\n│   ├── 0936\n│   ├── 0937\n│   ├── 0938\n│   ├── 0939\n│   ├── 0940\n│   ├── 0941\n│   ├── 0942\n│   ├── 0943\n│   ├── 0944\n│   ├── 0945\n│   ├── 0946\n│   ├── 0947\n│   ├── 0948\n│   ├── 0949\n│   ├── 0950\n│   ├── 0951\n│   ├── 0952\n│   ├── 0953\n│   ├── 0954\n│   ├── 0955\n│   ├── 0956\n│   ├── 0957\n│   ├── 0958\n│   ├── 0959\n│   ├── 0960\n│   ├── 0961\n│   ├── 0962\n│   ├── 0963\n│   ├── 0964\n│   ├── 0965\n│   ├── 0966\n│   ├── 0967\n│   ├── 0968\n│   ├── 0969\n│   ├── 0970\n│   ├── 0971\n│   ├── 0972\n│   ├── 0973\n│   ├── 0974\n│   ├── 0975\n│   ├── 0976\n│   ├── 0977\n│   ├── 0978\n│   ├── 0979\n│   ├── 0980\n│   ├── 0981\n│   ├── 0982\n│   ├── 0983\n│   ├── 0984\n│   ├── 0985\n│   ├── 0986\n│   ├── 0987\n│   ├── 0988\n│   ├── 0989\n│   ├── 0990\n│   ├── 0991\n│   ├── 0992\n│   ├── 0993\n│   ├── 0994\n│   ├── 0995\n│   ├── 0996\n│   ├── 0997\n│   ├── 0998\n│   ├── 0999\n│   ├── 1000\n│   ├── file_000\n│   ├── file_001\n│   ├── file_002\n│   ├── file_003\n│   ├── file_004\n│   ├── file_005\n│   ├── file_006\n│   ├── file_007\n│   ├── file_008\n│   ├── file_009\n│   ├── file_010\n│   ├── file_011\n│   ├── file_012\n│   ├── file_013\n│   ├── file_014\n│   ├── file_015\n│   ├── file_016\n│   ├── file_017\n│   ├── file_018\n│   ├── file_019\n│   ├── file_020\n│   ├── file_021\n│   ├── file_022\n│   ├── file_023\n│   ├── file_024\n│   ├── file_025\n│   ├── file_026\n│   ├── file_027\n│   ├── file_028\n│   ├── file_029\n│   ├── file_030\n│   ├── file_031\n│   ├── file_032\n│   ├── file_033\n│   ├── file_034\n│   ├── file_035\n│   ├── file_036\n│   ├── file_037\n│   ├── file_038\n│   ├── file_039\n│   ├── file_040\n│   ├── file_041\n│   ├── file_042\n│   ├── file_043\n│   ├── file_044\n│   ├── file_045\n│   ├── file_046\n│   ├── file_047\n│   ├── file_048\n│   ├── file_049\n│   ├── file_050\n│   ├── file_051\n│   ├── file_052\n│   ├── file_053\n│   ├── file_054\n│   ├── file_055\n│   ├── file_056\n│   ├── file_057\n│   ├── file_058\n│   ├── file_059\n│   ├── file_060\n│   ├── file_061\n│   ├── file_062\n│   ├── file_063\n│   ├── file_064\n│   ├── file_065\n│   ├── file_066\n│   ├── file_067\n│   ├── file_068\n│   ├── file_069\n│   ├── file_070\n│   ├── file_071\n│   ├── file_072\n│   ├── file_073\n│   ├── file_074\n│   ├── file_075\n│   ├── file_076\n│   ├── file_077\n│   ├── file_078\n│   ├── file_079\n│   ├── file_080\n│   ├── file_081\n│   ├── file_082\n│   ├── file_083\n│   ├── file_084\n│   ├── file_085\n│   ├── file_086\n│   ├── file_087\n│   ├── file_088\n│   ├── file_089\n│   ├── file_090\n│   ├── file_091\n│   ├── file_092\n│   ├── file_093\n│   ├── file_094\n│   ├── file_095\n│   ├── file_096\n│   ├── file_097\n│   ├── file_098\n│   ├── file_099\n│   ├── file_100\n│   ├── file_101\n│   ├── file_102\n│   ├── file_103\n│   ├── file_104\n│   ├── file_105\n│   ├── file_106\n│   ├── file_107\n│   ├── file_108\n│   ├── file_109\n│   ├── file_110\n│   ├── file_111\n│   ├── file_112\n│   ├── file_113\n│   ├── file_114\n│   ├── file_115\n│   ├── file_116\n│   ├── file_117\n│   ├── file_118\n│   ├── file_119\n│   ├── file_120\n│   ├── file_121\n│   ├── file_122\n│   ├── file_123\n│   ├── file_124\n│   ├── file_125\n│   ├── file_126\n│   ├── file_127\n│   ├── file_128\n│   ├── file_129\n│   ├── file_130\n│   ├── file_131\n│   ├── file_132\n│   ├── file_133\n│   ├── file_134\n│   ├── file_135\n│   ├── file_136\n│   ├── file_137\n│   ├── file_138\n│   ├── file_139\n│   ├── file_140\n│   ├── file_141\n│   ├── file_142\n│   ├── file_143\n│   ├── file_144\n│   ├── file_145\n│   ├── file_146\n│   ├── file_147\n│   ├── file_148\n│   ├── file_149\n│   ├── file_150\n│   ├── file_151\n│   ├── file_152\n│   ├── file_153\n│   ├── file_154\n│   ├── file_155\n│   ├── file_156\n│   ├── file_157\n│   ├── file_158\n│   ├── file_159\n│   ├── file_160\n│   ├── file_161\n│   ├── file_162\n│   ├── file_163\n│   ├── file_164\n│   ├── file_165\n│   ├── file_166\n│   ├── file_167\n│   ├── file_168\n│   ├── file_169\n│   ├── file_170\n│   ├── file_171\n│   ├── file_172\n│   ├── file_173\n│   ├── file_174\n│   ├── file_175\n│   ├── file_176\n│   ├── file_177\n│   ├── file_178\n│   ├── file_179\n│   ├── file_180\n│   ├── file_181\n│   ├── file_182\n│   ├── file_183\n│   ├── file_184\n│   ├── file_185\n│   ├── file_186\n│   ├── file_187\n│   ├── file_188\n│   ├── file_189\n│   ├── file_190\n│   ├── file_191\n│   ├── file_192\n│   ├── file_193\n│   ├── file_194\n│   ├── file_195\n│   ├── file_196\n│   ├── file_197\n│   ├── file_198\n│   ├── file_199\n│   ├── file_200\n│   ├── file_201\n│   ├── file_202\n│   ├── file_203\n│   ├── file_204\n│   ├── file_205\n│   ├── file_206\n│   ├── file_207\n│   ├── file_208\n│   ├── file_209\n│   ├── file_210\n│   ├── file_211\n│   ├── file_212\n│   ├── file_213\n│   ├── file_214\n│   ├── file_215\n│   ├── file_216\n│   ├── file_217\n│   ├── file_218\n│   ├── file_219\n│   ├── file_220\n│   ├── file_221\n│   ├── file_222\n│   ├── file_223\n│   ├── file_224\n│   ├── file_225\n│   ├── file_226\n│   ├── file_227\n│   ├── file_228\n│   ├── file_229\n│   ├── file_230\n│   ├── file_231\n│   ├── file_232\n│   ├── file_233\n│   ├── file_234\n│   ├── file_235\n│   ├── file_236\n│   ├── file_237\n│   ├── file_238\n│   ├── file_239\n│   ├── file_240\n│   ├── file_241\n│   ├── file_242\n│   ├── file_243\n│   ├── file_244\n│   ├── file_245\n│   ├── file_246\n│   ├── file_247\n│   ├── file_248\n│   ├── file_249\n│   ├── file_250\n│   ├── file_251\n│   ├── file_252\n│   ├── file_253\n│   ├── file_254\n│   ├── file_255\n│   ├── file_256\n│   ├── file_257\n│   ├── file_258\n│   ├── file_259\n│   ├── file_260\n│   ├── file_261\n│   ├── file_262\n│   ├── file_263\n│   ├── file_264\n│   ├── file_265\n│   ├── file_266\n│   ├── file_267\n│   ├── file_268\n│   ├── file_269\n│   ├── file_270\n│   ├── file_271\n│   ├── file_272\n│   ├── file_273\n│   ├── file_274\n│   ├── file_275\n│   ├── file_276\n│   ├── file_277\n│   ├── file_278\n│   ├── file_279\n│   ├── file_280\n│   ├── file_281\n│   ├── file_282\n│   ├── file_283\n│   ├── file_284\n│   ├── file_285\n│   ├── file_286\n│   ├── file_287\n│   ├── file_288\n│   ├── file_289\n│   ├── file_290\n│   ├── file_291\n│   ├── file_292\n│   ├── file_293\n│   ├── file_294\n│   ├── file_295\n│   ├── file_296\n│   ├── file_297\n│   ├── file_298\n│   ├── file_299\n│   ├── file_300\n│   ├── file_301\n│   ├── file_302\n│   ├── file_303\n│   ├── file_304\n│   ├── file_305\n│   ├── file_306\n│   ├── file_307\n│   ├── file_308\n│   ├── file_309\n│   ├── file_310\n│   ├── file_311\n│   ├── file_312\n│   ├── file_313\n│   ├── file_314\n│   ├── file_315\n│   ├── file_316\n│   ├── file_317\n│   ├── file_318\n│   ├── file_319\n│   ├── file_320\n│   ├── file_321\n│   ├── file_322\n│   ├── file_323\n│   ├── file_324\n│   ├── file_325\n│   ├── file_326\n│   ├── file_327\n│   ├── file_328\n│   ├── file_329\n│   ├── file_330\n│   ├── file_331\n│   ├── file_332\n│   ├── file_333\n│   ├── file_334\n│   ├── file_335\n│   ├── file_336\n│   ├── file_337\n│   ├── file_338\n│   ├── file_339\n│   ├── file_340\n│   ├── file_341\n│   ├── file_342\n│   ├── file_343\n│   ├── file_344\n│   ├── file_345\n│   ├── file_346\n│   ├── file_347\n│   ├── file_348\n│   ├── file_349\n│   ├── file_350\n│   ├── file_351\n│   ├── file_352\n│   ├── file_353\n│   ├── file_354\n│   ├── file_355\n│   ├── file_356\n│   ├── file_357\n│   ├── file_358\n│   ├── file_359\n│   ├── file_360\n│   ├── file_361\n│   ├── file_362\n│   ├── file_363\n│   ├── file_364\n│   ├── file_365\n│   ├── file_366\n│   ├── file_367\n│   ├── file_368\n│   ├── file_369\n│   ├── file_370\n│   ├── file_371\n│   ├── file_372\n│   ├── file_373\n│   ├── file_374\n│   ├── file_375\n│   ├── file_376\n│   ├── file_377\n│   ├── file_378\n│   ├── file_379\n│   ├── file_380\n│   ├── file_381\n│   ├── file_382\n│   ├── file_383\n│   ├── file_384\n│   ├── file_385\n│   ├── file_386\n│   ├── file_387\n│   ├── file_388\n│   ├── file_389\n│   ├── file_390\n│   ├── file_391\n│   ├── file_392\n│   ├── file_393\n│   ├── file_394\n│   ├── file_395\n│   ├── file_396\n│   ├── file_397\n│   ├── file_398\n│   ├── file_399\n│   ├── file_400\n│   ├── file_401\n│   ├── file_402\n│   ├── file_403\n│   ├── file_404\n│   ├── file_405\n│   ├── file_406\n│   ├── file_407\n│   ├── file_408\n│   ├── file_409\n│   ├── file_410\n│   ├── file_411\n│   ├── file_412\n│   ├── file_413\n│   ├── file_414\n│   ├── file_415\n│   ├── file_416\n│   ├── file_417\n│   ├── file_418\n│   ├── file_419\n│   ├── file_420\n│   ├── file_421\n│   ├── file_422\n│   ├── file_423\n│   ├── file_424\n│   ├── file_425\n│   ├── file_426\n│   ├── file_427\n│   ├── file_428\n│   ├── file_429\n│   ├── file_430\n│   ├── file_431\n│   ├── file_432\n│   ├── file_433\n│   ├── file_434\n│   ├── file_435\n│   ├── file_436\n│   ├── file_437\n│   ├── file_438\n│   ├── file_439\n│   ├── file_440\n│   ├── file_441\n│   ├── file_442\n│   ├── file_443\n│   ├── file_444\n│   ├── file_445\n│   ├── file_446\n│   ├── file_447\n│   ├── file_448\n│   ├── file_449\n│   ├── file_450\n│   ├── file_451\n│   ├── file_452\n│   ├── file_453\n│   ├── file_454\n│   ├── file_455\n│   ├── file_456\n│   ├── file_457\n│   ├── file_458\n│   ├── file_459\n│   ├── file_460\n│   ├── file_461\n│   ├── file_462\n│   ├── file_463\n│   ├── file_464\n│   ├── file_465\n│   ├── file_466\n│   ├── file_467\n│   ├── file_468\n│   ├── file_469\n│   ├── file_470\n│   ├── file_471\n│   ├── file_472\n│   ├── file_473\n│   ├── file_474\n│   ├── file_475\n│   ├── file_476\n│   ├── file_477\n│   ├── file_478\n│   ├── file_479\n│   ├── file_480\n│   ├── file_481\n│   ├── file_482\n│   ├── file_483\n│   ├── file_484\n│   ├── file_485\n│   ├── file_486\n│   ├── file_487\n│   ├── file_488\n│   ├── file_489\n│   ├── file_490\n│   ├── file_491\n│   ├── file_492\n│   ├── file_493\n│   ├── file_494\n│   ├── file_495\n│   ├── file_496\n│   ├── file_497\n│   ├── file_498\n│   ├── file_499\n│   ├── file_500\n│   ├── file_501\n│   ├── file_502\n│   ├── file_503\n│   ├── file_504\n│   ├── file_505\n│   ├── file_506\n│   ├── file_507\n│   ├── file_508\n│   ├── file_509\n│   ├── file_510\n│   ├── file_511\n│   ├── file_512\n│   ├── file_513\n│   ├── file_514\n│   ├── file_515\n│   ├── file_516\n│   ├── file_517\n│   ├── file_518\n│   ├── file_519\n│   ├── file_520\n│   ├── file_521\n│   ├── file_522\n│   ├── file_523\n│   ├── file_524\n│   ├── file_525\n│   ├── file_526\n│   ├── file_527\n│   ├── file_528\n│   ├── file_529\n│   ├── file_530\n│   ├── file_531\n│   ├── file_532\n│   ├── file_533\n│   ├── file_534\n│   ├── file_535\n│   ├── file_536\n│   ├── file_537\n│   ├── file_538\n│   ├── file_539\n│   ├── file_540\n│   ├── file_541\n│   ├── file_542\n│   ├── file_543\n│   ├── file_544\n│   ├── file_545\n│   ├── file_546\n│   ├── file_547\n│   ├── file_548\n│   ├── file_549\n│   ├── file_550\n│   ├── file_551\n│   ├── file_552\n│   ├── file_553\n│   ├── file_554\n│   ├── file_555\n│   ├── file_556\n│   ├── file_557\n│   ├── file_558\n│   ├── file_559\n│   ├── file_560\n│   ├── file_561\n│   ├── file_562\n│   ├── file_563\n│   ├── file_564\n│   ├── file_565\n│   ├── file_566\n│   ├── file_567\n│   ├── file_568\n│   ├── file_569\n│   ├── file_570\n│   ├── file_571\n│   ├── file_572\n│   ├── file_573\n│   ├── file_574\n│   ├── file_575\n│   ├── file_576\n│   ├── file_577\n│   ├── file_578\n│   ├── file_579\n│   ├── file_580\n│   ├── file_581\n│   ├── file_582\n│   ├── file_583\n│   ├── file_584\n│   ├── file_585\n│   ├── file_586\n│   ├── file_587\n│   ├── file_588\n│   ├── file_589\n│   ├── file_590\n│   ├── file_591\n│   ├── file_592\n│   ├── file_593\n│   ├── file_594\n│   ├── file_595\n│   ├── file_596\n│   ├── file_597\n│   ├── file_598\n│   ├── file_599\n│   ├── file_600\n│   ├── file_601\n│   ├── file_602\n│   ├── file_603\n│   ├── file_604\n│   ├── file_605\n│   ├── file_606\n│   ├── file_607\n│   ├── file_608\n│   ├── file_609\n│   ├── file_610\n│   ├── file_611\n│   ├── file_612\n│   ├── file_613\n│   ├── file_614\n│   ├── file_615\n│   ├── file_616\n│   ├── file_617\n│   ├── file_618\n│   ├── file_619\n│   ├── file_620\n│   ├── file_621\n│   ├── file_622\n│   ├── file_623\n│   ├── file_624\n│   ├── file_625\n│   ├── file_626\n│   ├── file_627\n│   ├── file_628\n│   ├── file_629\n│   ├── file_630\n│   ├── file_631\n│   ├── file_632\n│   ├── file_633\n│   ├── file_634\n│   ├── file_635\n│   ├── file_636\n│   ├── file_637\n│   ├── file_638\n│   ├── file_639\n│   ├── file_640\n│   ├── file_641\n│   ├── file_642\n│   ├── file_643\n│   ├── file_644\n│   ├── file_645\n│   ├── file_646\n│   ├── file_647\n│   ├── file_648\n│   ├── file_649\n│   ├── file_650\n│   ├── file_651\n│   ├── file_652\n│   ├── file_653\n│   ├── file_654\n│   ├── file_655\n│   ├── file_656\n│   ├── file_657\n│   ├── file_658\n│   ├── file_659\n│   ├── file_660\n│   ├── file_661\n│   ├── file_662\n│   ├── file_663\n│   ├── file_664\n│   ├── file_665\n│   ├── file_666\n│   ├── file_667\n│   ├── file_668\n│   ├── file_669\n│   ├── file_670\n│   ├── file_671\n│   ├── file_672\n│   ├── file_673\n│   ├── file_674\n│   ├── file_675\n│   ├── file_676\n│   ├── file_677\n│   ├── file_678\n│   ├── file_679\n│   ├── file_680\n│   ├── file_681\n│   ├── file_682\n│   ├── file_683\n│   ├── file_684\n│   ├── file_685\n│   ├── file_686\n│   ├── file_687\n│   ├── file_688\n│   ├── file_689\n│   ├── file_690\n│   ├── file_691\n│   ├── file_692\n│   ├── file_693\n│   ├── file_694\n│   ├── file_695\n│   ├── file_696\n│   ├── file_697\n│   ├── file_698\n│   ├── file_699\n│   ├── file_700\n│   ├── file_701\n│   ├── file_702\n│   ├── file_703\n│   ├── file_704\n│   ├── file_705\n│   ├── file_706\n│   ├── file_707\n│   ├── file_708\n│   ├── file_709\n│   ├── file_710\n│   ├── file_711\n│   ├── file_712\n│   ├── file_713\n│   ├── file_714\n│   ├── file_715\n│   ├── file_716\n│   ├── file_717\n│   ├── file_718\n│   ├── file_719\n│   ├── file_720\n│   ├── file_721\n│   ├── file_722\n│   ├── file_723\n│   ├── file_724\n│   ├── file_725\n│   ├── file_726\n│   ├── file_727\n│   ├── file_728\n│   ├── file_729\n│   ├── file_730\n│   ├── file_731\n│   ├── file_732\n│   ├── file_733\n│   ├── file_734\n│   ├── file_735\n│   ├── file_736\n│   ├── file_737\n│   ├── file_738\n│   ├── file_739\n│   ├── file_740\n│   ├── file_741\n│   ├── file_742\n│   ├── file_743\n│   ├── file_744\n│   ├── file_745\n│   ├── file_746\n│   ├── file_747\n│   ├── file_748\n│   ├── file_749\n│   ├── file_750\n│   ├── file_751\n│   ├── file_752\n│   ├── file_753\n│   ├── file_754\n│   ├── file_755\n│   ├── file_756\n│   ├── file_757\n│   ├── file_758\n│   ├── file_759\n│   ├── file_760\n│   ├── file_761\n│   ├── file_762\n│   ├── file_763\n│   ├── file_764\n│   ├── file_765\n│   ├── file_766\n│   ├── file_767\n│   ├── file_768\n│   ├── file_769\n│   ├── file_770\n│   ├── file_771\n│   ├── file_772\n│   ├── file_773\n│   ├── file_774\n│   ├── file_775\n│   ├── file_776\n│   ├── file_777\n│   ├── file_778\n│   ├── file_779\n│   ├── file_780\n│   ├── file_781\n│   ├── file_782\n│   ├── file_783\n│   ├── file_784\n│   ├── file_785\n│   ├── file_786\n│   ├── file_787\n│   ├── file_788\n│   ├── file_789\n│   ├── file_790\n│   ├── file_791\n│   ├── file_792\n│   ├── file_793\n│   ├── file_794\n│   ├── file_795\n│   ├── file_796\n│   ├── file_797\n│   ├── file_798\n│   ├── file_799\n│   ├── file_800\n│   ├── file_801\n│   ├── file_802\n│   ├── file_803\n│   ├── file_804\n│   ├── file_805\n│   ├── file_806\n│   ├── file_807\n│   ├── file_808\n│   ├── file_809\n│   ├── file_810\n│   ├── file_811\n│   ├── file_812\n│   ├── file_813\n│   ├── file_814\n│   ├── file_815\n│   ├── file_816\n│   ├── file_817\n│   ├── file_818\n│   ├── file_819\n│   ├── file_820\n│   ├── file_821\n│   ├── file_822\n│   ├── file_823\n│   ├── file_824\n│   ├── file_825\n│   ├── file_826\n│   ├── file_827\n│   ├── file_828\n│   ├── file_829\n│   ├── file_830\n│   ├── file_831\n│   ├── file_832\n│   ├── file_833\n│   ├── file_834\n│   ├── file_835\n│   ├── file_836\n│   ├── file_837\n│   ├── file_838\n│   ├── file_839\n│   ├── file_840\n│   ├── file_841\n│   ├── file_842\n│   ├── file_843\n│   ├── file_844\n│   ├── file_845\n│   ├── file_846\n│   ├── file_847\n│   ├── file_848\n│   ├── file_849\n│   ├── file_850\n│   ├── file_851\n│   ├── file_852\n│   ├── file_853\n│   ├── file_854\n│   ├── file_855\n│   ├── file_856\n│   ├── file_857\n│   ├── file_858\n│   ├── file_859\n│   ├── file_860\n│   ├── file_861\n│   ├── file_862\n│   ├── file_863\n│   ├── file_864\n│   ├── file_865\n│   ├── file_866\n│   ├── file_867\n│   ├── file_868\n│   ├── file_869\n│   ├── file_870\n│   ├── file_871\n│   ├── file_872\n│   ├── file_873\n│   ├── file_874\n│   ├── file_875\n│   ├── file_876\n│   ├── file_877\n│   ├── file_878\n│   ├── file_879\n│   ├── file_880\n│   ├── file_881\n│   ├── file_882\n│   ├── file_883\n│   ├── file_884\n│   ├── file_885\n│   ├── file_886\n│   ├── file_887\n│   ├── file_888\n│   ├── file_889\n│   ├── file_890\n│   ├── file_891\n│   ├── file_892\n│   ├── file_893\n│   ├── file_894\n│   ├── file_895\n│   ├── file_896\n│   ├── file_897\n│   ├── file_898\n│   ├── file_899\n│   ├── file_900\n│   ├── file_901\n│   ├── file_902\n│   ├── file_903\n│   ├── file_904\n│   ├── file_905\n│   ├── file_906\n│   ├── file_907\n│   ├── file_908\n│   ├── file_909\n│   ├── file_910\n│   ├── file_911\n│   ├── file_912\n│   ├── file_913\n│   ├── file_914\n│   ├── file_915\n│   ├── file_916\n│   ├── file_917\n│   ├── file_918\n│   ├── file_919\n│   ├── file_920\n│   ├── file_921\n│   ├── file_922\n│   ├── file_923\n│   ├── file_924\n│   ├── file_925\n│   ├── file_926\n│   ├── file_927\n│   ├── file_928\n│   ├── file_929\n│   ├── file_930\n│   ├── file_931\n│   ├── file_932\n│   ├── file_933\n│   ├── file_934\n│   ├── file_935\n│   ├── file_936\n│   ├── file_937\n│   ├── file_938\n│   ├── file_939\n│   ├── file_940\n│   ├── file_941\n│   ├── file_942\n│   ├── file_943\n│   ├── file_944\n│   ├── file_945\n│   ├── file_946\n│   ├── file_947\n│   ├── file_948\n│   ├── file_949\n│   ├── file_950\n│   ├── file_951\n│   ├── file_952\n│   ├── file_953\n│   ├── file_954\n│   ├── file_955\n│   ├── file_956\n│   ├── file_957\n│   ├── file_958\n│   ├── file_959\n│   ├── file_960\n│   ├── file_961\n│   ├── file_962\n│   ├── file_963\n│   ├── file_964\n│   ├── file_965\n│   ├── file_966\n│   ├── file_967\n│   ├── file_968\n│   ├── file_969\n│   ├── file_970\n│   ├── file_971\n│   ├── file_972\n│   ├── file_973\n│   ├── file_974\n│   ├── file_975\n│   ├── file_976\n│   ├── file_977\n│   ├── file_978\n│   ├── file_979\n│   ├── file_980\n│   ├── file_981\n│   ├── file_982\n│   ├── file_983\n│   ├── file_984\n│   ├── file_985\n│   ├── file_986\n│   ├── file_987\n│   ├── file_988\n│   ├── file_989\n│   ├── file_990\n│   ├── file_991\n│   ├── file_992\n│   ├── file_993\n│   ├── file_994\n│   ├── file_995\n│   ├── file_996\n│   ├── file_997\n│   ├── file_998\n│   └── file_999\n├── group\n│   └── file\n├── icons\n│   ├── c++.cpp\n│   ├── c.c\n│   ├── css.css\n│   ├── file\n│   ├── go.go\n│   ├── html.html\n│   ├── java.java\n│   ├── javascript.js\n│   ├── man.1\n│   ├── marked.md\n│   ├── php.php\n│   ├── python.py\n│   ├── ruby.rb\n│   ├── rust.rs\n│   ├── shell.sh\n│   └── unknown.unknown\n├── perms\n│   ├── file\n│   └── file2\n├── size\n│   ├── 1B\n│   ├── 1K\n│   ├── 1M\n│   └── 1337\n├── specials\n├── symlinks\n│   ├── dir\n│   ├── file\n│   ├── ' lorem ipsum'\n│   ├── symlink -> file\n│   ├── symlink2 -> symlink\n│   ├── symlink3 -> dir\n│   └── symlink4 -> pipitek\n└── time\n    ├── 1d\n    ├── 1h\n    ├── 1m\n    ├── 1s\n    ├── 1y\n    └── epoch\n"
  },
  {
    "path": "tests/ptests/ptest_f261ab10a0ea20f.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -T \""
  },
  {
    "path": "tests/ptests/ptest_f2ea3bfaf96e639.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_f2ea3bfaf96e639.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_f2ea3bfaf96e639.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -h \""
  },
  {
    "path": "tests/ptests/ptest_f33fd54762597c23.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_f33fd54762597c23.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_f33fd54762597c23.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --across \""
  },
  {
    "path": "tests/ptests/ptest_f641eabbfb35f76f.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_f641eabbfb35f76f.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 time\n"
  },
  {
    "path": "tests/ptests/ptest_f641eabbfb35f76f.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l --sort Name\""
  },
  {
    "path": "tests/ptests/ptest_f79a790e130be075.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_f79a790e130be075.stdout",
    "content": "git\ngrid\ngroup\nicons\nperms\nsize\nspecials\nsymlinks\ntime\n"
  },
  {
    "path": "tests/ptests/ptest_f79a790e130be075.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -H \""
  },
  {
    "path": "tests/ptests/ptest_f90d48e69d70b41.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_f90d48e69d70b41.stdout",
    "content": "[CWD]/tests/test_dir/git\n[CWD]/tests/test_dir/grid\n[CWD]/tests/test_dir/group\n[CWD]/tests/test_dir/icons\n[CWD]/tests/test_dir/perms\n[CWD]/tests/test_dir/size\n[CWD]/tests/test_dir/specials\n[CWD]/tests/test_dir/symlinks\n[CWD]/tests/test_dir/time\n"
  },
  {
    "path": "tests/ptests/ptest_f90d48e69d70b41.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir --absolute on\""
  },
  {
    "path": "tests/ptests/ptest_ffbdb9af2de10fa.stderr",
    "content": ""
  },
  {
    "path": "tests/ptests/ptest_ffbdb9af2de10fa.stdout",
    "content": "drwxr-xr-x - nixbld  1 Jan  1970 specials\ndrwxr-xr-x - nixbld  1 Jan  1970 group\ndrwxr-xr-x - nixbld  1 Jan  1970 perms\ndrwxr-xr-x - nixbld  1 Jan  1970 size\ndrwxr-xr-x - nixbld  1 Jan  1970 time\ndrwxr-xr-x - nixbld  1 Jan  1970 symlinks\ndrwxr-xr-x - nixbld  1 Jan  1970 git\ndrwxr-xr-x - nixbld  1 Jan  1970 icons\ndrwxr-xr-x - nixbld  1 Jan  1970 grid\n"
  },
  {
    "path": "tests/ptests/ptest_ffbdb9af2de10fa.toml",
    "content": "bin.name = \"eza\"\nargs = \"tests/test_dir -l -s size\""
  }
]