[
  {
    "path": ".envrc",
    "content": "use flake\n"
  },
  {
    "path": ".gitattributes",
    "content": "*.1 linguist-vendored\n*.sh linguist-vendored\n*.zsh linguist-vendored\n*.bash linguist-vendored\n*.fish linguist-vendored\n*.adoc linguist-vendored\n*.nix linguist-vendored\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: cargo\n    directory: /\n    schedule:\n      interval: weekly\n    groups:\n      dependencies:\n        patterns:\n          - \"*\""
  },
  {
    "path": ".github/workflows/BuildAndTest.yml",
    "content": "name: Run Tests\n\non: [ push, pull_request ]\n\nenv:\n  CARGO_TERM_COLOR: always\n\njobs:\n  build_and_test:\n    name: Build and Test\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 1\n\n      - name: Build and test\n        run: |\n          cargo build --verbose\n          cargo test --verbose\n          cargo clippy --verbose\n\n      - name: Check Cargo.lock\n        run: |\n          git diff --exit-code -- Cargo.lock\n          if [ $? -ne 0 ]; then\n            echo \"Cargo.lock was modified. Please commit the changes.\"\n            exit 1\n          fi"
  },
  {
    "path": ".github/workflows/Publish.yml",
    "content": "name: Publish\n\non:\n  push:\n    tags:\n      - '*'\n\nenv:\n  CARGO_TERM_COLOR: always\n\njobs:\n  release:\n    name: Release\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v3\n        with:\n          token: ${{secrets.GH_PAT}}\n          fetch-depth: 0\n\n      - name: Build and Test\n        run: |\n          cargo build --verbose\n          cargo test --verbose\n\n      - name: Check Cargo.lock\n        run: |\n          git diff --exit-code -- Cargo.lock\n          if [ $? -ne 0 ]; then\n            echo \"Cargo.lock was modified. Please commit the changes.\"\n            exit 1\n          fi\n\n      - name: Publish to crates.io\n        env:\n          CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO_TOKEN }}\n        run: |\n          cargo login $CARGO_REGISTRY_TOKEN\n          cargo publish\n\n      - name: Get release notes\n        id: release_notes\n        run: |\n          TAG_NAME=${{ github.ref_name }}\n          RELEASE_NOTES=$(awk '/'\"^## $TAG_NAME\"'/{flag=1;next}/##/{flag=0}flag' CHANGELOG.md)\n          RELEASE_NOTES=\"${RELEASE_NOTES//'%'/'%25'}\"\n          RELEASE_NOTES=\"${RELEASE_NOTES//$'\\n'/'%0A'}\"\n          RELEASE_NOTES=\"${RELEASE_NOTES//$'\\r'/'%0D'}\"\n          echo \"::set-output name=notes::$RELEASE_NOTES\"\n\n      - name: Create GitHub Release\n        uses: ncipollo/release-action@v1\n        with:\n          artifacts: \"none\"\n          token: ${{ secrets.GH_PAT }}\n          tag: ${{ github.ref }}\n          name: ${{ github.ref_name }}\n          body: ${{ steps.release_notes.outputs.notes }}\n\n      - name: Bump minor version and update CHANGELOG\n        run: |\n          BRANCH_NAME=\"main\" \n          \n          # Fetch the branch\n          git fetch origin $BRANCH_NAME\n          \n          # Switch to the branch that triggered the workflow\n          git checkout \"$BRANCH_NAME\"\n          \n          # Bump minor version and reset patch version in Cargo.toml\n          VERSION_LINE=$(grep \"^version\" ./Cargo.toml | head -1)\n          VERSION=$(echo $VERSION_LINE | grep -oP '\\d+\\.\\d+\\.\\d+')\n          MAJOR_VERSION=$(echo $VERSION | awk -F'.' '{print $1}')\n          MINOR_VERSION=$(echo $VERSION | awk -F'.' '{print $2}')\n          BUMPED_MINOR_VERSION=$((MINOR_VERSION + 1))\n          BUMPED_VERSION=\"$MAJOR_VERSION.$BUMPED_MINOR_VERSION.0\"\n          BUMPED_VERSION_LINE=$(echo $VERSION_LINE | sed \"s/$VERSION/$BUMPED_VERSION/\")\n          sed -i \"s/$VERSION_LINE/$BUMPED_VERSION_LINE/\" ./Cargo.toml\n          \n          # Update cargo.lock\n          cargo build\n          \n          # Add new entry to CHANGELOG.md\n          NEW_CHANGELOG_ENTRY=\"## $BUMPED_VERSION\\n\\n\"\n          sed -i \"/^# Changelog/a\\\\\n          $NEW_CHANGELOG_ENTRY\\\\\n          \" CHANGELOG.md\n          \n          # Commit and push changes\n          git config user.name '${{ github.actor }}'\n          git config user.email '${{ github.actor }}@users.noreply.github.com'\n          git add .\n          git commit -m \"Bump version and update CHANGELOG\"\n          git push"
  },
  {
    "path": ".github/workflows/ReleaseStaticBinaries.yml",
    "content": "name: Release static binaries\n\non:\n  release:\n    types: [published]\n\npermissions:\n  contents: write\n\njobs:\n  release-binaries:\n    name: Release ${{ matrix.os }}\n    runs-on: ${{ matrix.os }}\n    strategy:\n      matrix:\n        include:\n          - os: ubuntu-latest\n            target: x86_64-unknown-linux-musl\n          - os: ubuntu-latest\n            target: aarch64-unknown-linux-musl\n          - os: macos-latest\n            target: x86_64-apple-darwin\n          - os: macos-latest\n            target: aarch64-apple-darwin\n          - os: windows-latest\n            target: x86_64-pc-windows-msvc\n\n    steps:\n      - uses: actions/checkout@v3\n      - uses: taiki-e/upload-rust-binary-action@v1\n        with:\n          bin: tspin\n          target: ${{ matrix.target }}\n          archive: tailspin-$target\n          token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# Generated by Cargo\n# will have compiled files and executables\ndebug/\ntarget/\n\n# These are backup files generated by rustfmt\n**/*.rs.bk\n\n# MSVC Windows builds of rustc generate these, which store debugging information\n*.pdb\n\n.direnv/\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n## Unreleased\n\n### Added\n\n- Highlight `HEAD`, `CONNECT`, and `OPTIONS` HTTP methods by\n  default ([#261](https://github.com/bensadeh/tailspin/pull/261), thanks @g0l4!)\n- Add builtin keyword highlighting for `undefined`, `NULL`, `nil`, `NIL`, `NaN`, `FALSE`, and `TRUE`\n- File truncation detection in follow mode\n- Support for parentheses in URL paths (e.g. Wikipedia-style URLs) with balanced parenthesis detection\n- Clear error message for `--exec` on Windows instead of a generic\n  failure ([#232](https://github.com/bensadeh/tailspin/issues/232))\n\n### Fixed\n\n- Fix zombie processes when using `--exec` by properly waiting on the child process after it exits\n- Surface the actual error when the stream processor fails during initial read, instead of a generic channel-receive\n  error\n- Gracefully handle broken pipe (e.g. `tspin | head`) instead of panicking\n- `--follow` not working on certain filesystems (NFS, FUSE, Docker bind mounts, etc.) by replacing `linemux` with a\n  polling-based file reader ([#240](https://github.com/bensadeh/tailspin/issues/240))\n- Crash when reading files with non-UTF-8 content ([#31](https://github.com/bensadeh/tailspin/issues/31))\n- URLs wrapped in parentheses or single quotes incorrectly including surrounding delimiters in the highlight\n- Files with symlinks in their path could not be opened\n  consistently ([#244](https://github.com/bensadeh/tailspin/issues/244), [#134](https://github.com/bensadeh/tailspin/issues/134))\n- Quoted regions now highlight correctly while preserving inner\n  highlights ([#171](https://github.com/bensadeh/tailspin/issues/171))\n\n### Crate\n\n- Differentiate between Regexp Errors and Aho-Corasick Errors\n- Feature-gate CLI dependencies (`tokio`, `clap`, `rayon`, etc.) so library consumers can use\n  `default-features = false` to avoid compiling them\n\n### Changed\n\n- Builtin keyword highlighting of `true` changed from red to green\n\n### Performance\n\n- Use SIMD-accelerated `memchr` for newline detection in buffered reader\n- Cache ANSI escape sequence finders using `LazyLock` statics instead of recreating per call\n- Reduced string allocations across highlighters by replacing `format!()` with `write!()`, eliminating per-match\n  allocations, and increasing pre-allocation buffers\n\n### Build\n\n- Enable LTO, single codegen unit, and `strip = true` for release builds\n- Trimmed and modernized dependencies: replaced `async-trait` with native async traits, `miette` with `anyhow`,\n  `ctrlc` with tokio signals; removed `uuid`\n\n## 5.5.0\n\n- Fixed a bug where the IPv6 highlighter would swallow parts of a matched, but invalid IPv6 address\n- Improved Unix path regex to include more valid paths\n- Use aho-corasick for keyword highlighting for better performance\n- Disabled Unicode support in builtin regexes for better performance\n- Updated default colors for the JSON highlighter\n\n## 5.4.5\n\n- Fixed a bug where newlines were filtered away when reading from stdin\n\n## 5.4.4\n\n- Add support for custom pager command in windows\n- Fixed a bug where custom pager command would incorrectly take precedence over the presenter mode\n\n## 5.4.3\n\n- Prioritize custom regex patterns over other highlighters\n- IPv4 highlighter now only highlights valid IPv4 addresses\n\n## 5.4.2\n\n- Fixed a bug where the `--follow` would prevent the pager from starting\n\n## 5.4.1\n\n- Add support for both `--print` and `--follow` flags\n- Fixed a bug where EOF signal would not be set causing `tailspin` to pick up newline entries after program has been run\n\n## 5.4.0\n\n- Use `UUID` as temp file suffix instead of number\n- Added colors to the help screen\n- Merge all the `--words-red`, `--words-green`, etc. flags into a single `--highlight [COLOR]:[WORDS]` flag\n- Renamed `--no-builtin-keywords` to `--disable-builtin-keywords`\n- Added a `--pager` flag to override the default pager in addition to the env variable\n- Fixed a bug where `--listen-command` would never run the pager\n- Renamed `--listen-command` to `--exec`\n\n## 5.3.0\n\n- Enabled parallel processing of lines from `stdin`\n- Fixed a bug where large log file would open before highlighting had been applied\n\n## 5.2.1\n\n- Use `stdin().is_terminal()` instead of `nix` crate to check if `stdin` is a terminal\n\n## 5.2.0\n\n### CLI\n\n- Give a warning if user is trying to read from file while also piping to `stdin`\n- Extract End Of File (EOF) signaling logic\n- Fixed a bug where io errors would silently be ignored\n\n### Crate\n\n- Better grouping of submodules\n- Add rustdoc to all public types\n- Simplify error handling by only returning the first regexp error\n\n## 5.1.0\n\n- Merged the `inlet_manifold` crate back into `tailspin` (`tailspin` is now the name of both the cli and the crate)\n- Changed the `apply` trait to return `Cow<'a, str>` instead of `String`\n- Removed the `start-at-end` flag\n\n## 5.0.0\n\nThis is a relatively small update with one breaking change, namely the removal of the ability to watch folders. It's\nnever fun to remove features from `tailspin` that users enjoy and use, however as the tool grows, it has become more\nimportant for me to focus on the core functionality of `tailspin` which is highlighting.\n\nI hope that I've made `tailspin` modular and extensible so that user are able to script and extend `tailspin` to\nalleviate this change.\n\nOn a lighter note, I've added support for custom pagers. This means that you can now use `tailspin` with your favorite\npager, for example `ov` or `minus`.\n\n### New features:\n\n- Added support for using custom pagers\n\n### Bugfixes:\n\n- Fixed a bug in the config parser where it would fall back on looking for the theme in `~/tailspin/theme.toml`\n  instead of `~/.config/tailspin/theme.toml` if `XDG_CONFIG_HOME` is unset\n- Fixed a bug where `tailspin` would crash reading files with one line\n\n### Under the hood:\n\n- Use `PathBuf` instead of String for file paths\n- Updated shell completion commands names\n- Added `miette` for prettier error messages\n- Removed unnecessary use of `Box`\n- Bump Rust edition to 2024\n\n### Breaking changes:\n\n- Removed support for watching folders\n\n## 4.0.0\n\n### Overview\n\nThis release contains several new feature and breaking changes. From a user perspective, the most notable change is the\naddition of a `JSON` highlighter. From a developer's perspective, the highlighting engine powering `tailspin` has been\ndecoupled and extracted into a separate library called [`manifold`](https://github.com/bensadeh/manifold).\n\n`manifold` will still be used internally by `tailspin`, but it will also be available as a standalone library for other\nprojects to use.\n\n### New features:\n\n- Added support for handling lines which are valid `JSON`. `tailspin` will recognize if the line is a valid JSON object\n  and highlight it accordingly.\n- Added date and time highlighter for formats like `DD/MM/YYYY`\n\n### Breaking changes:\n\n- `tailspin` will now look for `theme.toml` instead of `config.toml` for the configuration file\n- Enabling and disabling highlight groups is now done from the command line instead of in the toml file\n- Removed the `border` from the style from the keyword styling. Instead, the border will be enabled implicitly by\n  setting a background color for the keyword.\n- Removed date highlighting for formats like `Aug 14` and `Sun Dec 14` etc. (Can be re-enabled by adding a custom\n  regex highlighter)\n- One highlighting group for both date and time\n\n## 3.0.2\n\n- Add completion hint so shells understand they can complete with file names (Thanks @alerque !)\n\n## 3.0.1\n\n- Improve parsing of very large log files\n\n## 3.0.0\n\n### Overview\n\nIn November 2023, `tailspin` had 240 stars and was only available to downloads on Crates.io and Debian. At the time of\nwriting this, it sits at over 4k stars and is available on most major Linux distributions, macOS and Windows.\n\nI am glad to see that `tailspin` has been useful to so many people.\n\nFor version `3.0.0` there are both new features and breaking changes.\n\n### New features:\n\n- `UUID` highlighter now highlights numbers and letters in individual styling\n- Process highlighter has updated default styling and matches processes with parenthesis\n- Added a new highlighter 32-bit and 64-bit pointers (e.g. `0x7f8c8c0c0c0c`)\n- Added a `IPv6` highlighter (e.g. `2001:0db8:85a3:0000:0000:8a2e:0370:7334`)\n- Dates formatted as `yyyy/mm/dd` and `Day Month DD` are now highlighted\n\n### Breaking changes:\n\n##### Renamed `--follow-command` to `--listen-command`\n\nThe `--follow-command` flag has been renamed to `--listen-command` to avoid confusion with the `--tail` flag.\n\n##### Removed `--bucket-size` flag\n\nThe `--bucket-size` flag has been removed. The bucket size was ultimately an implementation detail that should be set\nby the program itself.\n\n##### Removed `shorten-to` flag option for dates and times\n\nThe `shorten-to` option for dates and times has been removed. The option, set in `config.toml`, let the user shorten the\ndate and time to a configurable token.\n\nIn order to keep up with the growth of `tailspin`, I've decided to focus on the core of what `tailspin` is doing, namely\nhighlighting. This meant that I had to remove some features that were not directly related to highlighting.\n\nApologizes for removing this feature and to those who are using it.\n\n## 2.4.0\n\n- Added a regexp highlighter with support for one capture group\n- Changed the behavior of processing lines from `stdin` to be sequential for better stability\n\n## 2.3.0\n\n- `tailspin` now uses multiple threads to process lines in parallel\n- Added `--bucket-size` flag to configure the number of lines to process in parallel\n- Changed `-t,--tail` flag to `-e,--start-at-end` to avoid confusion with `tail -f`\n\n## 2.2.0\n\n- Added flags for setting simple highlights on the fly, for example: (`tspin --words-red popcorn,movie`)\n- Properly flatten and merge keywords to improve regex performance\n- Binaries are now added to the GitHub Release (Thanks @ecarrara and @supleed2)\n- Added `HEAD` HTTP method to the REST keywords (Thanks @mkogan1)\n- Fixed a bug where the message `Failed to open file with less: Exit code 0` would show after exiting `less`\n\n## 2.1.0\n\n- Fixed a bug where opening empty files would hang forever\n- Look for config file in `USERPROFILE` and `$HOME` instead of just `$HOME`\n- Added flags for disabling builtin keywords\n- Process names with dashes are now highlighted properly\n- Better error messages when `less` is not found\n\n## 2.0.0\n\n- Changed the binary name from `spin` to `tspin`\n\nThis is a symbolic release to settle on a new binary name with fewer conflicts. Both `tailspin` and `spin` already exist\nas binaries in different systems and distributions. `tspin` is a short and unique name that is unlikely to conflict with\nother binaries.\n\n## 1.6.1\n\n- Fixed a bug where the `--print` flag would occasionally cause a panic\n\n## 1.6.0\n\n- Added new highlight group under Keywords highlighter: HTTP methods\n- Added option for adding a border to keywords highlighter\n- Disable highlights with `disable` for all highlight groups except Keywords\n- Simplified the configuration file format\n- Date and time can be configured to be hidden\n\n## 1.5.1\n\n- Update man pages\n\n## 1.5.0 - 16.09.23\n\n- Errors are now printed to `stderr` instead of `stdout`\n- Date highlighter now supports different highlights for date and time segment\n- Added Key Value highlighter\n- Added unix process highlighter\n\n## 1.4.0 - 12.08.23\n\n- Added `-t`/`--tail` flag to start reading from the end of a file.\n- Fixed a bug where opening a folder would include hidden files\n- Improved initial output when watching folders\n- Improved output when trying to open a file or folder which doesn't exist\n\n## 1.3.0 - 31.07.23\n\n- Added support for tailing folders\n- Changed behavior: `tailspin` will now print to `stdout` by default if used in a pipe. For\n  example: `echo \"hello null\" | spin`\n  will output a syntax highlighted \"hello null\" directly to `stdout` instead of via the pager less. The change will make\n  it easier to use tailspin in scripting and piping.\n- The `--tail-command` flag has been renamed to `--follow-command`\n\n## 1.2.1 - 26.07.23\n\n- Run `less` with environment variable `LESSSECURE=1`\n\n## 1.2.0 - 26.07.23\n\n- Added a `--tail-command` flag to allow for continuous tailing the output of a specified command\n- Added a `-p` / `--print` flag to print the output directly to `stdout`\n- Added `man` pages\n- Added shell completions for `bash`, `zsh` and `fish`\n\n## 1.1.0 - 24.07.23\n\n**Core**\n\n- `less` now starts with the `--ignore-case` and `--RAW-CONTROL-CHARS` flags\n- Added support for reading from `stdin`\n- Added a `--version` flag\n\n## 1.0.0 - 11.07.23\n\n**Core**\n\n- `tailspin` has been rewritten in Rust\n\n**Theming**\n\n- All highlight groups are now customizable\n\n## 0.1.1 - 27.02.23\n\n**Bugfixes**\n\n- Fixed a bug that would occasionally lead to temp files not being cleaned up\n\n**Dependencies**\n\n- Bump Go from 1.19 to 1.20\n- Bump bubbletea from 0.22.0 to 0.23.2\n- Bump golang.org/x/text from 0.3.7 to 0.3.8\n- Bump github.com/spf13/cobra from 1.5.0 to 1.6.1\n\n## 0.1.0 - 25.09.22\n\n**Initial release**\n\n`tailspin` is a command line utility for viewing and `tail`-ing log files\n"
  },
  {
    "path": "Cargo.toml",
    "content": "[package]\nname = \"tailspin\"\nversion = \"6.0.0\"\nedition = \"2024\"\nauthors = [\"Ben Sadeh\"]\ndescription = \"A log file highlighter\"\nrepository = \"https://github.com/bensadeh/tailspin\"\nkeywords = [\"log\", \"syntax-highlighting\", \"tail\", \"less\"]\nlicense = \"MIT\"\nrust-version = \"1.93\"\n\n[[bin]]\npath = \"src/main.rs\"\nname = \"tspin\"\nrequired-features = [\"cli\"]\n\n[features]\ndefault = [\"cli\"]\ncli = [\n    \"dep:anyhow\",\n    \"dep:clap\",\n    \"dep:clap_complete\",\n    \"dep:rayon\",\n    \"dep:shell-words\",\n    \"dep:shellexpand\",\n    \"dep:tempfile\",\n    \"dep:tokio\",\n    \"dep:toml\",\n]\n\n[profile.release]\nlto = \"fat\"\ncodegen-units = 1\nstrip = true\n\n[dependencies]\naho-corasick = \"1.1.4\"\nanyhow = { version = \"1.0.102\", optional = true }\nclap = { version = \"4.5.60\", features = [\"derive\", \"env\", \"wrap_help\"], optional = true }\nclap_complete = { version = \"4.5.66\", optional = true }\nmemchr = \"2.8.0\"\nnu-ansi-term = \"0.50.3\"\nrayon = { version = \"1.11.0\", optional = true }\nregex = \"1.12.2\"\nserde = { version = \"1.0.228\", features = [\"derive\"] }\nserde_json = { version = \"1.0.149\", features = [\"preserve_order\"] }\nshell-words = { version = \"1.1.1\", optional = true }\nshellexpand = { version = \"3.1.2\", optional = true }\ntempfile = { version = \"3.27.0\", optional = true }\nthiserror = \"2.0.18\"\ntokio = { version = \"1.50.0\", features = [\"fs\", \"io-std\", \"io-util\", \"macros\", \"process\", \"rt\", \"signal\", \"sync\", \"time\"], optional = true }\ntoml = { version = \"1.0.3\", optional = true }\n\n[dev-dependencies]\ncriterion = \"0.8.2\"\n\n[[bench]]\nname = \"highlighters\"\nharness = false\n\n[[bench]]\nname = \"no_match\"\nharness = false\n"
  },
  {
    "path": "LICENCE",
    "content": "MIT License\n\nCopyright (c) 2022 Ben Sadeh\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <img src=\"assets/tailspin.png\" width=\"230\"/>\n</p>\n\n#                                                                                                                                                                                                                                                                                                                                                                  \n\n<p align=\"center\">\nA log file highlighter\n</p>\n\n<p align=\"center\">\n  <img src=\"assets/main.png\" width=\"700\"/>\n</p>\n\n### Features\n\n- 🪵 View (or `tail`) any log file of any format\n- 🍰 No setup or config required\n- 🌈 Highlights numbers, dates, IP-addresses, UUIDs, URLs and more\n- ⚙️ All highlight groups are customizable\n- 🧬 Easy to integrate with other commands\n- 📦 Also available as a [crate](https://docs.rs/tailspin)\n\n#\n\n### Table of Contents\n\n* [Overview](#overview)\n* [Usage](#usage)\n* [Installing](#installing)\n* [Highlight Groups](#highlight-groups)\n* [Customizing Highlight Groups](#customizing-highlight-groups)\n* [Working with `stdin` and `stdout`](#working-with-stdin-and-stdout)\n* [Using the pager `less`](#using-the-pager-less)\n* [Settings](#settings)\n\n***\n\n## Overview\n\n`tailspin` works by reading through a log file line by line, running a series of regexes\nagainst each line. The regexes recognize patterns you expect to find in a logfile, like dates, numbers, severity\nkeywords and more.\n\n`tailspin` does not make any assumptions on the format or position of the items it wants to highlight. For this reason,\nit requires no configuration and the highlighting will work consistently across different logfiles.\n\n## Usage\n\nThe binary name for `tailspin` is `tspin`.\n\n```console\n# Read from file and view in `less`\ntspin application.log\n\n# Pipe something into `tspin` and print to stdout\necho \"hello null\" | tspin\n\n# Read from stdin and print to stdout\nkubectl logs [pod_name] --follow | tspin\n\n# Run the provided command and view the output in `less`\ntspin --exec='kubectl logs -f pod_name'\n``` \n\n## Installing\n\n<details>\n<summary>Expand to view</summary>\n\n### Package Managers\n\n```console\n# Homebrew\nbrew install tailspin\n\n# Cargo\ncargo install tailspin\n\n# Archlinux\npacman -S tailspin\n\n# Nix\nnix-shell -p tailspin\n\n# NetBSD\npkgin install tailspin\n\n# FreeBSD\npkg install tailspin\n\n# Windows\nscoop install tailspin\n```\n\n### From Source\n\n```console\ncargo install --path .\n```\n\nBinary will be placed in `~/.cargo/bin`, make sure you add the folder to your `PATH` environment variable.\n\n> [!IMPORTANT]\n> When building from source, make sure that you are using the latest version\n> of [`less`](http://greenwoodsoftware.com/less/).\n\n</details>\n\n## Highlight Groups\n\n### Dates\n\n<p align=\"center\">\n  <img src=\"assets/examples/dates.png\" width=\"600\"/>\n</p>\n\n### Keywords\n\n<p align=\"center\">\n  <img src=\"assets/examples/keywords.png\" width=\"600\"/>\n</p>\n\n### URLs\n\n<p align=\"center\">\n  <img src=\"assets/examples/urls.png\" width=\"600\"/>\n</p>\n\n### Numbers\n\n<p align=\"center\">\n  <img src=\"assets/examples/numbers.png\" width=\"600\"/>\n</p>\n\n### IP Addresses\n\n<p align=\"center\">\n  <img src=\"assets/examples/ip.png\" width=\"600\"/>\n</p>\n\n### Quotes\n\n<p align=\"center\">\n  <img src=\"assets/examples/quotes.png\" width=\"600\"/>\n</p>\n\n### Unix file paths\n\n<p align=\"center\">\n  <img src=\"assets/examples/paths.png\" width=\"600\"/>\n</p>\n\n### HTTP methods\n\n<p align=\"center\">\n  <img src=\"assets/examples/http.png\" width=\"600\"/>\n</p>\n\n### UUIDs\n\n<p align=\"center\">\n  <img src=\"assets/examples/uuids.png\" width=\"600\"/>\n</p>\n\n### Key-value pairs\n\n<p align=\"center\">\n  <img src=\"assets/examples/kv.png\" width=\"600\"/>\n</p>\n\n### Pointer addresses\n\n<p align=\"center\">\n  <img src=\"assets/examples/pointers.png\" width=\"600\"/>\n</p>\n\n### Unix processes\n\n<p align=\"center\">\n  <img src=\"assets/examples/processes.png\" width=\"600\"/>\n</p>\n\n## Customizing Highlight Groups\n\n### Overview\n\nCreate a `theme.toml` in `~/.config/tailspin` to customize highlight groups.\n\nStyles have the following shape:\n\n```toml\nstyle = { fg = \"color\", bg = \"color\", italic = false, bold = false, underline = false }\n```\n\nTo edit the different highlight groups, include them in your `theme.toml` file. For example, to edit the `date`\nhighlight group, add the following to your `theme.toml`:\n\n```toml\n[date]\nstyle = { fg = \"green\" }\n```\n\nExpand the section below to see the default config for the highlight groups:\n\n<details>\n<summary>Default highlight groups settings</summary>\n\n```toml\n[dates]\ndate = { fg = \"magenta\" }\ntime = { fg = \"blue\" }\nzone = { fg = \"red\" }\nseparator = { faint = true }\n\n[[keywords]]\nwords = ['null', 'true', 'false']\nstyle = { fg = \"red\", italic = true }\n\n[[keywords]]\nwords = ['GET']\nstyle = { fg = \"black\", bg = \"green\" }\n\n[urls]\nhttp = { fg = \"red\", faint = true }\nhttps = { fg = \"green\", faint = true }\nhost = { fg = \"blue\", faint = true }\npath = { fg = \"blue\" }\nquery_params_key = { fg = \"magenta\" }\nquery_params_value = { fg = \"cyan\" }\nsymbols = { fg = \"red\" }\n\n[numbers]\nstyle = { fg = \"cyan\" }\n\n[ip_addresses]\nnumber = { fg = \"blue\", italic = true }\nletter = { fg = \"magenta\", italic = true }\nseparator = { fg = \"red\" }\n\n[quotes]\nstyle = { fg = \"yellow\" }\ntoken = '\"'\n\n[paths]\nsegment = { fg = \"green\", italic = true }\nseparator = { fg = \"yellow\" }\n\n[uuids]\nnumber = { fg = \"blue\", italic = true }\nletter = { fg = \"magenta\", italic = true }\nseparator = { fg = \"red\" }\n\n[pointers]\nnumber = { fg = \"blue\", italic = true }\nletter = { fg = \"magenta\", italic = true }\nseparator = { fg = \"red\" }\n\n[key_value_pairs]\nkey = { faint = true }\nseparator = { fg = \"white\" }\n\n[processes]\nname = { fg = \"green\" }\nseparator = { fg = \"red\" }\nid = { fg = \"yellow\" }\n\n[json]\nkey = { fg = \"yellow\" }\nquote_token = { fg = \"yellow\", faint = true }\ncurly_bracket = { faint = true }\nsquare_bracket = { faint = true }\ncomma = { faint = true }\ncolon = { faint = true }\n```\n\n</details>\n\n### Disabling Highlight Groups\n\nTo individually disable or enable highlight groups, use the `--enable` and `--disable` flags:\n\n```console\n# Enable only the url highlight group, disable the rest\ntspin application.log --enable=url\n\n# Disable the numbers highlight group, keep the rest\ntspin application.log --disable=numbers\n```\n\n### Adding Keywords via theme.toml\n\nTo add custom keywords, either include them in the list of keywords or add new entries:\n\n```toml\n[[keywords]]\nwords = ['MyCustomKeyword']\nstyle = { fg = \"green\" }\n\n[[keywords]]\nwords = ['null', 'true', 'false']\nstyle = { fg = \"red\", italic = true }\n```\n\n### Adding Keywords from the command line\n\nSometimes it is more convenient to add highlight groups on the fly without having to edit a TOML. To add highlights from\nthe command line, use the `--highlight` flag followed by a comma separated list of words to be highlighted.\n\nFor example:\n\n```console\ntspin --highlight=red:error,fail --highlight=green:success,ok\n```\n\n<p align=\"center\">\n  <img src=\"assets/examples/otf.png\" width=\"800\"/>\n</p>\n\n### Custom regex highlighters\n\nWhen you need more control over the highlighting, you can use the regex highlighter. This highlighter allows you to\nspecify a regex and a style to be applied to the matched text.\n\nIt supports one capture group `()`. When found, it will apply the style to the captured text.\n\n```toml\n[[regexes]]\nregex = 'Started (.*)\\.'\nstyle = { fg = \"red\" }\n```\n\n## Working with `stdin` and `stdout`\n\n### Default behavior with pipes\n\nBy default, `tailspin` will open a file in the pager `less`. However, if you pipe something into `tailspin`, it will\nprint the highlighted output directly to `stdout`. This is similar to running `tspin [file] --print`.\n\nTo let `tailspin` highlight the logs of different commands, you can pipe the output of those commands into `tailspin`\nlike so:\n\n```console\njournalctl -f | tspin\ncat /var/log/syslog | tspin\nkubectl logs -f pod_name | tspin\n```\n\n### Capturing the output of a command and viewing it in `less`\n\nTo capture the output of a command and view it in `less`, use the `--exec` flag:\n\n```console\ntspin --exec 'kubectl logs -f pod_name'\n```\n\nThis will run the command `kubectl logs -f pod_name` in the background and pipe the output to `tailspin`. The output\nwill be displayed in `less`, allowing you to navigate and search through the logs.\n\n## Using the pager `less`\n\n### Overview\n\n`tailspin` uses `less` as its pager to view the highlighted log files. You can get more info on `less` via the **man**\ncommand (`man less`) or by hitting the <kbd>h</kbd> button to access the help screen.\n\n### Navigating\n\nNavigating within `less` uses a set of keybindings that may be familiar to users of `vim` or other `vi`-like\neditors. Here's a brief overview of the most useful navigation commands:\n\n- <kbd>j</kbd>/<kbd>k</kbd>: Scroll one line up / down\n- <kbd>d</kbd>/<kbd>u</kbd>: Scroll one half-page up / down\n- <kbd>g</kbd>/<kbd>G</kbd>: Go to the top / bottom of the file\n\n### Follow mode\n\nWhen you run `tailspin` with the `-f` or `--follow` flag, it will scroll to the bottom and print new lines to the screen\nas they're added to the file.\n\nTo stop following the file, interrupt with <kbd>Ctrl + C</kbd>. This will stop the tailing, but keep the\nfile open, allowing you to review the existing content.\n\nTo resume following the file from within `less`, press <kbd>Shift + F</kbd>.\n\n### Search\n\nUse <kbd>/</kbd> followed by your search query. For example, `/ERROR` finds the first occurrence of\n**ERROR**.\n\nAfter the search, <kbd>n</kbd> finds the next instance, and <kbd>N</kbd> finds the previous instance.\n\n### Filtering\n\n`less` allows filtering lines by a keyword, using <kbd>&</kbd> followed by the pattern. For instance, `&ERROR` shows\nonly lines with **ERROR**.\n\nTo only show lines containing either `ERROR` or `WARN`, use a regular expression: `&\\(ERROR\\|WARN\\)`.\n\nTo clear the filter, use <kbd>&</kbd> with no pattern.\n\n### Custom pagers\n\nSet the `TAILSPIN_PAGER` environment variable to override the default pager.\nThe command must include the string **[FILE]** which will be replaced with the file path internally.\n\nFor example:\n\n```console\nTAILSPIN_PAGER=\"ov -f [FILE]\" tspin example-logs/example1\n```\n\n## Settings\n\n```console\n-f, --follow                     Follow the contents of the file\n-p, --print                      Print the output to stdout\n-e, --exec='[CMD]'               Run command and view the output in a pager\n                                 (e.g. `tspin --exec 'kubectl logs -f pod_name'`)\n    --config-path=[PATH]         Use the configuration file from the provided path\n    --pager=[CUSTOM_PAGER]       Set a custom pager\n                                 (e.g. `--pager=\"ov -f [FILE]\"`)\n    --highlight=[COLOR]:[WORDS]  Highlight the provided comma-separated words in the specified color\n                                 (e.g. `--highlight red:ERROR,WARNING`)\n    --enable=[HIGHLIGHT_GROUP]   Enable one or more highlight groups, disabling the rest\n                                 (e.g. `--enable=keywords,urls`)\n    --disable=[HIGHLIGHT_GROUP]  Disable one or more highlight groups, enabling the rest\n                                 (e.g. `--disable=keywords,urls`)\n    --disable-builtin-keywords   Disable the highlighting of booleans, nulls, log severities and common REST verbs\n```\n\n\n"
  },
  {
    "path": "benches/highlighters.rs",
    "content": "use criterion::{Criterion, criterion_group, criterion_main};\nuse std::hint::black_box;\nuse tailspin::Highlighter;\nuse tailspin::config::*;\nuse tailspin::style::{Color, Style};\n\nconst LOG_LINE: &str = r#\"2025-03-07T14:32:01.123Z INFO  [server::handler] GET https://api.example.com/v2/users?status=active&limit=100 from 192.168.1.42/24 via fe80::1 ptr=0x7f4a2c00b340 pid=worker[1234] uuid=550e8400-e29b-41d4-a716-446655440000 key=value path=/var/log/app/server.log count=42 \"request completed\" null true {\"status\": 200}\"#;\n\nfn bench_individual_highlighters(c: &mut Criterion) {\n    let mut group = c.benchmark_group(\"highlighters\");\n\n    group.bench_function(\"json\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_json_highlighter(JsonConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"json_match\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_json_highlighter(JsonConfig::default());\n            builder.build().unwrap()\n        };\n        let json_input = r#\"{\"status\": 200, \"message\": \"OK\", \"data\": [1, 2, 3]}\"#;\n        b.iter(|| h.apply(black_box(json_input)));\n    });\n\n    group.bench_function(\"date_time\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_date_time_highlighters(DateTimeConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"url\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_url_highlighter(UrlConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"ip_v4\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_ip_v4_highlighter(IpV4Config::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"ip_v6\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_ip_v6_highlighter(IpV6Config::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"uuid\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_uuid_highlighter(UuidConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"pointer\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_pointer_highlighter(PointerConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"unix_path\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_unix_path_highlighter(UnixPathConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"unix_process\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_unix_process_highlighter(UnixProcessConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"key_value\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_key_value_highlighter(KeyValueConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"number\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_number_highlighter(NumberConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"quote\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_quote_highlighter(QuotesConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"keyword\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_keyword_highlighter(vec![\n                KeywordConfig {\n                    words: vec![\n                        \"ERROR\".into(),\n                        \"WARN\".into(),\n                        \"INFO\".into(),\n                        \"DEBUG\".into(),\n                        \"TRACE\".into(),\n                    ],\n                    style: Style::new().fg(Color::Red),\n                },\n                KeywordConfig {\n                    words: vec![\"GET\".into(), \"POST\".into(), \"PUT\".into(), \"DELETE\".into()],\n                    style: Style::new().fg(Color::Green),\n                },\n                KeywordConfig {\n                    words: vec![\"null\".into(), \"false\".into(), \"true\".into()],\n                    style: Style::new().fg(Color::Yellow),\n                },\n            ]);\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.finish();\n}\n\ncriterion_group!(benches, bench_individual_highlighters);\ncriterion_main!(benches);\n"
  },
  {
    "path": "benches/no_match.rs",
    "content": "use criterion::{Criterion, criterion_group, criterion_main};\nuse std::hint::black_box;\nuse tailspin::Highlighter;\nuse tailspin::config::*;\nuse tailspin::style::{Color, Style};\n\nconst LOG_LINE: &str = r#\"INFO  [server::handler] next request - Loss exceeded max. threshold - status n/a - re-run completed 200 OK user=admin \"all good\"\"#;\n\nfn bench_no_match(c: &mut Criterion) {\n    let mut group = c.benchmark_group(\"no_match\");\n\n    group.bench_function(\"json\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_json_highlighter(JsonConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"date_time\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_date_time_highlighters(DateTimeConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"url\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_url_highlighter(UrlConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"ip_v4\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_ip_v4_highlighter(IpV4Config::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"ip_v6\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_ip_v6_highlighter(IpV6Config::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"uuid\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_uuid_highlighter(UuidConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"pointer\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_pointer_highlighter(PointerConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"unix_path\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_unix_path_highlighter(UnixPathConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"unix_process\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_unix_process_highlighter(UnixProcessConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"key_value\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_key_value_highlighter(KeyValueConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"number\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_number_highlighter(NumberConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"quote\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_quote_highlighter(QuotesConfig::default());\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"regex\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_regex_highlighter(RegexConfig {\n                regex: r\"FOOBAR_\\d+\".into(),\n                style: Style::new().fg(Color::Red),\n            });\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.bench_function(\"keyword\", |b| {\n        let h = {\n            let mut builder = Highlighter::builder();\n            builder.with_keyword_highlighter(vec![\n                KeywordConfig {\n                    words: vec![\n                        \"ERROR\".into(),\n                        \"WARN\".into(),\n                        \"INFO\".into(),\n                        \"DEBUG\".into(),\n                        \"TRACE\".into(),\n                    ],\n                    style: Style::new().fg(Color::Red),\n                },\n                KeywordConfig {\n                    words: vec![\"GET\".into(), \"POST\".into(), \"PUT\".into(), \"DELETE\".into()],\n                    style: Style::new().fg(Color::Green),\n                },\n                KeywordConfig {\n                    words: vec![\"null\".into(), \"false\".into(), \"true\".into()],\n                    style: Style::new().fg(Color::Yellow),\n                },\n            ]);\n            builder.build().unwrap()\n        };\n        b.iter(|| h.apply(black_box(LOG_LINE)));\n    });\n\n    group.finish();\n}\n\ncriterion_group!(benches, bench_no_match);\ncriterion_main!(benches);\n"
  },
  {
    "path": "completions/tspin.bash",
    "content": "_tspin() {\n    local i cur prev opts cmd\n    COMPREPLY=()\n    if [[ \"${BASH_VERSINFO[0]}\" -ge 4 ]]; then\n        cur=\"$2\"\n    else\n        cur=\"${COMP_WORDS[COMP_CWORD]}\"\n    fi\n    prev=\"$3\"\n    cmd=\"\"\n    opts=\"\"\n\n    for i in \"${COMP_WORDS[@]:0:COMP_CWORD}\"\n    do\n        case \"${cmd},${i}\" in\n            \",$1\")\n                cmd=\"tspin\"\n                ;;\n            *)\n                ;;\n        esac\n    done\n\n    case \"${cmd}\" in\n        tspin)\n            opts=\"-f -p -e -h -V --follow --print --config-path --exec --highlight --enable --disable --disable-builtin-keywords --pager --generate-bash-completions --generate-fish-completions --generate-zsh-completions --help --version [FILE]\"\n            if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then\n                COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n                return 0\n            fi\n            case \"${prev}\" in\n                --config-path)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --exec)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                -e)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --highlight)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                --enable)\n                    COMPREPLY=($(compgen -W \"numbers urls pointers dates paths quotes key-value-pairs uuids ip-addresses processes json\" -- \"${cur}\"))\n                    return 0\n                    ;;\n                --disable)\n                    COMPREPLY=($(compgen -W \"numbers urls pointers dates paths quotes key-value-pairs uuids ip-addresses processes json\" -- \"${cur}\"))\n                    return 0\n                    ;;\n                --pager)\n                    COMPREPLY=($(compgen -f \"${cur}\"))\n                    return 0\n                    ;;\n                *)\n                    COMPREPLY=()\n                    ;;\n            esac\n            COMPREPLY=( $(compgen -W \"${opts}\" -- \"${cur}\") )\n            return 0\n            ;;\n    esac\n}\n\nif [[ \"${BASH_VERSINFO[0]}\" -eq 4 && \"${BASH_VERSINFO[1]}\" -ge 4 || \"${BASH_VERSINFO[0]}\" -gt 4 ]]; then\n    complete -F _tspin -o nosort -o bashdefault -o default tspin\nelse\n    complete -F _tspin -o bashdefault -o default tspin\nfi\n"
  },
  {
    "path": "completions/tspin.fish",
    "content": "complete -c tspin -l config-path -d 'Provide a custom path to a configuration file' -r -F\ncomplete -c tspin -s e -l exec -d 'Run command and view the output in a pager' -r\ncomplete -c tspin -l highlight -d 'Highlights in the form color:word1,word2' -r\ncomplete -c tspin -l enable -d 'Enable specific highlighters' -r -f -a \"numbers\\t''\nurls\\t''\npointers\\t''\ndates\\t''\npaths\\t''\nquotes\\t''\nkey-value-pairs\\t''\nuuids\\t''\nip-addresses\\t''\nprocesses\\t''\njson\\t''\"\ncomplete -c tspin -l disable -d 'Disable specific highlighters' -r -f -a \"numbers\\t''\nurls\\t''\npointers\\t''\ndates\\t''\npaths\\t''\nquotes\\t''\nkey-value-pairs\\t''\nuuids\\t''\nip-addresses\\t''\nprocesses\\t''\njson\\t''\"\ncomplete -c tspin -l pager -d 'Override the default pager command used by tspin. (e.g. `--pager=\"ov -f [FILE]\"`)' -r\ncomplete -c tspin -s f -l follow -d 'Follow the contents of a file'\ncomplete -c tspin -s p -l print -d 'Print the output to stdout'\ncomplete -c tspin -l disable-builtin-keywords -d 'Disable the highlighting of all builtin keyword groups (booleans, nulls, log severities and common REST verbs)'\ncomplete -c tspin -l generate-bash-completions -d 'Print bash completions to stdout'\ncomplete -c tspin -l generate-fish-completions -d 'Print fish completions to stdout'\ncomplete -c tspin -l generate-zsh-completions -d 'Print zsh completions to stdout'\ncomplete -c tspin -s h -l help -d 'Print help (see more with \\'--help\\')'\ncomplete -c tspin -s V -l version -d 'Print version'\n"
  },
  {
    "path": "completions/tspin.zsh",
    "content": "#compdef tspin\n\nautoload -U is-at-least\n\n_tspin() {\n    typeset -A opt_args\n    typeset -a _arguments_options\n    local ret=1\n\n    if is-at-least 5.2; then\n        _arguments_options=(-s -S -C)\n    else\n        _arguments_options=(-s -C)\n    fi\n\n    local context curcontext=\"$curcontext\" state line\n    _arguments \"${_arguments_options[@]}\" : \\\n'--config-path=[Provide a custom path to a configuration file]:CONFIG_PATH:_files' \\\n'-e+[Run command and view the output in a pager]:EXEC:_default' \\\n'--exec=[Run command and view the output in a pager]:EXEC:_default' \\\n'*--highlight=[Highlights in the form color\\:word1,word2]:COLOR_WORD:_default' \\\n'*--enable=[Enable specific highlighters]:ENABLED_HIGHLIGHTERS:(numbers urls pointers dates paths quotes key-value-pairs uuids ip-addresses processes json)' \\\n'*--disable=[Disable specific highlighters]:DISABLED_HIGHLIGHTERS:(numbers urls pointers dates paths quotes key-value-pairs uuids ip-addresses processes json)' \\\n'--pager=[Override the default pager command used by tspin. (e.g. \\`--pager=\"ov -f \\[FILE\\]\"\\`)]:PAGER:_default' \\\n'-f[Follow the contents of a file]' \\\n'--follow[Follow the contents of a file]' \\\n'-p[Print the output to stdout]' \\\n'--print[Print the output to stdout]' \\\n'--disable-builtin-keywords[Disable the highlighting of all builtin keyword groups (booleans, nulls, log severities and common REST verbs)]' \\\n'--generate-bash-completions[Print bash completions to stdout]' \\\n'--generate-fish-completions[Print fish completions to stdout]' \\\n'--generate-zsh-completions[Print zsh completions to stdout]' \\\n'-h[Print help (see more with '\\''--help'\\'')]' \\\n'--help[Print help (see more with '\\''--help'\\'')]' \\\n'-V[Print version]' \\\n'--version[Print version]' \\\n'::FILE -- Filepath:_files' \\\n&& ret=0\n}\n\n(( $+functions[_tspin_commands] )) ||\n_tspin_commands() {\n    local commands; commands=()\n    _describe -t commands 'tspin commands' commands \"$@\"\n}\n\nif [ \"$funcstack[1]\" = \"_tspin\" ]; then\n    _tspin \"$@\"\nelse\n    compdef _tspin tspin\nfi\n"
  },
  {
    "path": "config.toml",
    "content": "[pointer]\nnumber = { fg = \"green\" }\nletter = { fg = \"blue\" }\nseparator = { fg = \"red\" }\nseparator_token = \"a\"\nx = { fg = \"red\" }\n\n[[regexps]]\nregex = 'Started (.*)\\.'\nstyle = { fg = \"red\" }\n\n[[regexps]]\nregex = 'Stopped .*'\nstyle = { fg = \"magenta\" }\n"
  },
  {
    "path": "example-logs/example1",
    "content": "Aug 14 00:30:00 abc-MBP newsyslog[79597]: logfile turned over\nSun Aug 14 08:23:55.927 INFO  Ignoring non-dps events while not in monitoring period/ Ignoring DPS event while in monitoring period\nSun Aug 14 09:50:18.749 WARN  Could not set property APPLE80211_REGKEY_AWDL_MAC_ADDRESS_IN_USE to 1\nSun Aug 14 10:51:19.239 DEBUG [fcfff715-82cc-400d-88b4-56f25b5a5239:networkName:BSSID:]\nSun Aug 14 10:51:19.251 ERROR Usb Host Notification Error Apple80211Set: Device power is off seqNum 16 Total 4 chg 1 en0\nSun Aug 14 10:51:19.272 INFO  _handleLinkEvent: WiFi is not powered. Resetting state variables.\nSun Aug 14 10:51:19.316 DEBUG Usb Host Notification Error Apple80211Set: Device power is off seqNum 17 Total 4 chg 1 en0\nSun Aug 14 10:51:22.602 DEBUG sharingd (542) is not entitled for com.apple.wifi.join_history, will not allow request\n\nJan 02 21:14:54 innodellix (udev-worker)[1]: Started Accounts Service.\nJan 02 21:14:54 innodellix systemd[1]: Started Rule-based Manager for Device Events and Files.\nJan 02 21:14:54 innodellix systemd[1]: Stopped libvirtd-config.service: Deactivated successfully.\nJan 02 21:14:54 innodellix systemd[1]: Finished Libvirt Virtual Machine Management Daemon - configuration.\nJan 02 21:14:54 innodellix systemd[1]: suid-sgid-wrappers.service: Deactivated successfully.\nJan 02 21:14:54 innodellix systemd[1]: Finished Create SUID/SGID Wrappers.\nJan 02 21:14:54 innodellix systemd[1]: Started Cleanup of Snapper Snapshots.\n\n# Date and Time\n07:46:34                       Data backup created\n10:51:19.251                   Event logged\n2023/10/02 11:47:39:850        Task completed\n2022-09-09 11:48:34,534        Last login attempt failed\n2022-09-22T07:46:34.171800155Z Event logged for debugging purposes\n\n# IP\nSuspicious activity detected from IP:  10.0.0.123\nConnected to server at IP address:     192.168.0.1\nNo connection with remote host:        172.16.0.254\nRequest received from client IP:       2001:db8:0:0:0:ff00:42:8329\nMultiple failed login attempts:        2001:db8::ff00:42:8329\n\n# Ip v 6\nLog 2001:0db8:85a3:0000:0000:8a2e:0370:7334 asdf\nLog 2001:db8:85a3::8a2e:370:7334 asdf\nLog 2001:db8:85a3::8a2e:192.0.2.33 asdf\nLog fe80::7a31:c1ff:fe02:bc33 asdf\nLog [2001:db8:85a3::8a2e:370:7334]:8080 asdf\nLog 2001:db8::1234:5678 asdf\nLog fe80::1ff:fe23:4567:890a%eth0 asdf\n\n# Pointers\nError occurred at memory address 0x8c2a0aeb\nReceived data from 0x25f4a93b, processing now\nKernel module loaded at address 0xd7b3b2f446e2c21b\nFailed to read data from address 0x96dc1ac2a6db0b40\nCopying data from 0x7f6a2c21 to 0x706a2c21\n\n# Numbers\nDuration: 42 seconds\nHigh CPU usage detected: 95%\nValue must be between 1 and 10, received: 15\nRecords created: 1000\nCalculation result: 3.14159\n\n# URL\nhttp://example.com/path/to/resource?param1=value1&param2=value2\nhttp://api.example.com/v2/resources?search=keyword&page=1\nhttps://api.example.org/api/v1/users?name=JohnDoe\nhttps://www.openai.com/docs/api?apikey=abc123\nhttps://api.example.org/v1/users/123/edit?param=true&flag=false\n\n# HTTP Methods\nUser with IP 192.168.1.105 initiated a GET request for /about/us\nA POST request by 192.168.1.106 to /api/create-account failed\nReceived a PUT operation on /api/v1/users/update-profile\nDuring routine checks at 14:13:40, a PATCH request was detected\nUnauthorized DELETE attempt on /api/v2/data/secure by user\n\n# UUID\nUser logged in, user ID:     5f7d1bce-81ab-4a87-af78-9a37f26c58b1\nInvalid request:             9f5f25be-6b08-4aeb-a10a-023b86581b1f\nDatabase connection failed:  3e169d8f-c971-4e6b-8ff3-90ac2c912e6c\nTask completed successfully: d8f40210-7ef4-4d2a-b482-25e8b3a9eae8\nProcessing request:          2a54e369-12f7-4ec2-9dc1-685e05b9017a\n\n# Unix file paths\nFailed to open directory:   /usr/local/bin/\nFile successfully created:  /var/log/application.log\nReading configuration file: /etc/nginx/nginx.conf\nFile not found:             ~/project/user/documents/report.pdf\nProcessing file:            ~/discovery/alfa/project/src/main.js\n\n# Keywords\n[INFO ] Task completed. Status: true (result: null)\n[WARN ] Invalid input received (isValid: false)\n[ERROR] Connection failed: null (isConnected: false)\n[TRACE] Configuration loaded: true (version: N/A, env: null)\n[DEBUG] Invalid request: {active: true, age: null}\n\n# Quotes\nRequest made to sync data with our partner \"Acme Corp's\" servers.\nCache miss detected, fetching fresh copy from \"Main Server\".\nUser \"Alice\" logged out. All associated sessions cleared.\nPurchase for item \"Red Bicycle\" was successful. Thank you!\nConfiguration file \"PrimaryConfig\" loaded. Starting operations.\nProcessing new order for customer \"JohnDoe\". Stand by.\n\n# Key-value pairs\nts=08:11:36 caller=module_service.go:59 module=table-manager\nts=08:11:36 caller=module_service.go:59 module=ingester-querier\nts=08:11:36 caller=lifecycler.go:530 msg=\"file path is empty\"\nts=2022-09-22 caller=ring.go:275 msg=\"ring doesn't exist\"\nts=2022-09-21 caller=client.go:247 msg=\"value is nil\"\n\n# Processes\nkernel[0]: Page fault at address 0xabcdef\nmysqld[789]: Connected from 127.0.0.1\ndocker[654]: Container abcdefgh started successfully\nssh-d[222]: Accepted publickey for root from 192.168.1.20\ncron[101]: Running scheduled job ID 23456\n\n# JSON\n{\"timestamp\": \"2022-09-22T08:11:36.171800155Z\", \"message\": \"Task completed\", \"status\": \"success\"}\n{\"timestamp\": \"2022-09-22T08:11:36.171800155Z\", \"message\": \"Connection failed\", \"status\": \"error\"}\n{\"timestamp\": \"2022-09-22T08:11:36.171800155Z\", \"message\": \"Invalid input received\", \"status\": \"warning\"}\n{\"timestamp\": \"2022-09-22T08:11:36.171800155Z\", \"message\": \"Configuration loaded\", \"status\": \"info\"}\n{\"timestamp\": \"2022-09-22T08:11:36.171800155Z\", \"message\": \"Invalid request\", \"status\": \"debug\"}\n"
  },
  {
    "path": "example-logs/example2",
    "content": "2022-09-09 11:44:54,508 [Worker-2: Loading available Gradle versions] INFO  o.e.b.c.i.u.g.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read.\n2022-09-09 11:47:47,193 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-parent/2.7.3/spring-boot-starter-parent-2.7.3.pom\n2022-09-09 11:47:47,783 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-parent/2.7.3/spring-boot-starter-parent-2.7.3.pom\n2022-09-09 11:47:47,993 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-dependencies/2.7.3/spring-boot-dependencies-2.7.3.pom\n2022-09-09 11:47:48,618 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-dependencies/2.7.3/spring-boot-dependencies-2.7.3.pom\n2022-09-09 11:47:49,563 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-bom/1.6.4/kotlinx-coroutines-bom-1.6.4.pom\n2022-09-09 11:47:49,779 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-bom/1.6.4/kotlinx-coroutines-bom-1.6.4.pom\n2022-09-09 11:47:50,041 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/io/micrometer/micrometer-bom/1.9.3/micrometer-bom-1.9.3.pom\n2022-09-09 11:47:50,272 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/io/micrometer/micrometer-bom/1.9.3/micrometer-bom-1.9.3.pom\n2022-09-09 11:47:50,650 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/io/rest-assured/rest-assured-bom/4.5.1/rest-assured-bom-4.5.1.pom\n2022-09-09 11:47:50,881 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/io/rest-assured/rest-assured-bom/4.5.1/rest-assured-bom-4.5.1.pom\n2022-09-09 11:47:51,101 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-bom/2021.2.2/spring-data-bom-2021.2.2.pom\n2022-09-09 11:47:51,351 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-bom/2021.2.2/spring-data-bom-2021.2.2.pom\n2022-09-09 11:47:51,598 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-bom/5.7.3/spring-security-bom-5.7.3.pom\n2022-09-09 11:47:51,876 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-bom/5.7.3/spring-security-bom-5.7.3.pom\n2022-09-09 11:47:53,118 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-maven-plugin/2.7.3/spring-boot-maven-plugin-2.7.3.pom\n2022-09-09 11:47:53,467 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-maven-plugin/2.7.3/spring-boot-maven-plugin-2.7.3.pom\n2022-09-09 11:47:53,657 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-maven-plugin/2.7.3/spring-boot-maven-plugin-2.7.3.jar\n2022-09-09 11:47:54,222 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-maven-plugin/2.7.3/spring-boot-maven-plugin-2.7.3.jar\n2022-09-09 11:47:57,130 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.l.LifecycleMappingFactory - Using org.eclipse.m2e.jdt.JarLifecycleMapping lifecycle mapping for MavenProject: com.desuperior:dsmeta:0.0.1-SNAPSHOT @ C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\pom.xml.\n2022-09-09 11:47:57,339 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-data-jpa/2.7.3/spring-boot-starter-data-jpa-2.7.3.pom\n2022-09-09 11:47:57,550 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-data-jpa/2.7.3/spring-boot-starter-data-jpa-2.7.3.pom\n2022-09-09 11:47:57,755 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-aop/2.7.3/spring-boot-starter-aop-2.7.3.pom\n2022-09-09 11:47:57,972 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-aop/2.7.3/spring-boot-starter-aop-2.7.3.pom\n2022-09-09 11:47:58,176 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter/2.7.3/spring-boot-starter-2.7.3.pom\n2022-09-09 11:47:58,422 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter/2.7.3/spring-boot-starter-2.7.3.pom\n2022-09-09 11:47:58,633 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/2.7.3/spring-boot-2.7.3.pom\n2022-09-09 11:47:58,855 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/2.7.3/spring-boot-2.7.3.pom\n2022-09-09 11:47:59,161 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-autoconfigure/2.7.3/spring-boot-autoconfigure-2.7.3.pom\n2022-09-09 11:47:59,372 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-autoconfigure/2.7.3/spring-boot-autoconfigure-2.7.3.pom\n2022-09-09 11:47:59,574 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.7.3/spring-boot-starter-logging-2.7.3.pom\n2022-09-09 11:47:59,782 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.7.3/spring-boot-starter-logging-2.7.3.pom\n2022-09-09 11:48:00,216 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-jdbc/2.7.3/spring-boot-starter-jdbc-2.7.3.pom\n2022-09-09 11:48:00,426 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-jdbc/2.7.3/spring-boot-starter-jdbc-2.7.3.pom\n2022-09-09 11:48:00,641 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/5.3.22/spring-jdbc-5.3.22.pom\n2022-09-09 11:48:00,874 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/5.3.22/spring-jdbc-5.3.22.pom\n2022-09-09 11:48:01,091 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-tx/5.3.22/spring-tx-5.3.22.pom\n2022-09-09 11:48:01,339 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-tx/5.3.22/spring-tx-5.3.22.pom\n2022-09-09 11:48:01,612 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/hibernate/hibernate-core/5.6.10.Final/hibernate-core-5.6.10.Final.pom\n2022-09-09 11:48:01,827 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/hibernate/hibernate-core/5.6.10.Final/hibernate-core-5.6.10.Final.pom\n2022-09-09 11:48:02,086 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.12.13/byte-buddy-1.12.13.pom\n2022-09-09 11:48:02,310 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.12.13/byte-buddy-1.12.13.pom\n2022-09-09 11:48:02,538 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.12.13/byte-buddy-parent-1.12.13.pom\n2022-09-09 11:48:02,777 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.12.13/byte-buddy-parent-1.12.13.pom\n2022-09-09 11:48:03,294 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-jpa/2.7.2/spring-data-jpa-2.7.2.pom\n2022-09-09 11:48:03,528 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-jpa/2.7.2/spring-data-jpa-2.7.2.pom\n2022-09-09 11:48:03,741 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/build/spring-data-parent/2.7.2/spring-data-parent-2.7.2.pom\n2022-09-09 11:48:03,967 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/build/spring-data-parent/2.7.2/spring-data-parent-2.7.2.pom\n2022-09-09 11:48:04,170 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/build/spring-data-build/2.7.2/spring-data-build-2.7.2.pom\n2022-09-09 11:48:04,408 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/build/spring-data-build/2.7.2/spring-data-build-2.7.2.pom\n2022-09-09 11:48:04,619 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/testcontainers/testcontainers-bom/1.17.3/testcontainers-bom-1.17.3.pom\n2022-09-09 11:48:04,863 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/testcontainers/testcontainers-bom/1.17.3/testcontainers-bom-1.17.3.pom\n2022-09-09 11:48:05,086 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-bom/1.6.3/kotlinx-coroutines-bom-1.6.3.pom\n2022-09-09 11:48:05,300 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-bom/1.6.3/kotlinx-coroutines-bom-1.6.3.pom\n2022-09-09 11:48:05,635 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-commons/2.7.2/spring-data-commons-2.7.2.pom\n2022-09-09 11:48:05,847 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-commons/2.7.2/spring-data-commons-2.7.2.pom\n2022-09-09 11:48:06,048 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-orm/5.3.22/spring-orm-5.3.22.pom\n2022-09-09 11:48:06,288 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-orm/5.3.22/spring-orm-5.3.22.pom\n2022-09-09 11:48:06,497 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-aspects/5.3.22/spring-aspects-5.3.22.pom\n2022-09-09 11:48:06,719 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-aspects/5.3.22/spring-aspects-5.3.22.pom\n2022-09-09 11:48:06,924 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-security/2.7.3/spring-boot-starter-security-2.7.3.pom\n2022-09-09 11:48:07,167 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-security/2.7.3/spring-boot-starter-security-2.7.3.pom\n2022-09-09 11:48:07,380 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-config/5.7.3/spring-security-config-5.7.3.pom\n2022-09-09 11:48:07,624 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-config/5.7.3/spring-security-config-5.7.3.pom\n2022-09-09 11:48:07,834 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-core/5.7.3/spring-security-core-5.7.3.pom\n2022-09-09 11:48:08,072 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-core/5.7.3/spring-security-core-5.7.3.pom\n2022-09-09 11:48:08,275 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-crypto/5.7.3/spring-security-crypto-5.7.3.pom\n2022-09-09 11:48:08,513 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-crypto/5.7.3/spring-security-crypto-5.7.3.pom\n2022-09-09 11:48:08,712 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-web/5.7.3/spring-security-web-5.7.3.pom\n2022-09-09 11:48:08,946 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-web/5.7.3/spring-security-web-5.7.3.pom\n2022-09-09 11:48:09,174 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.7.3/spring-boot-starter-web-2.7.3.pom\n2022-09-09 11:48:09,429 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.7.3/spring-boot-starter-web-2.7.3.pom\n2022-09-09 11:48:09,641 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-json/2.7.3/spring-boot-starter-json-2.7.3.pom\n2022-09-09 11:48:09,853 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-json/2.7.3/spring-boot-starter-json-2.7.3.pom\n2022-09-09 11:48:10,183 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-tomcat/2.7.3/spring-boot-starter-tomcat-2.7.3.pom\n2022-09-09 11:48:10,431 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-tomcat/2.7.3/spring-boot-starter-tomcat-2.7.3.pom\n2022-09-09 11:48:10,720 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/com/h2database/h2/2.1.214/h2-2.1.214.pom\n2022-09-09 11:48:10,939 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/com/h2database/h2/2.1.214/h2-2.1.214.pom\n2022-09-09 11:48:11,145 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-test/2.7.3/spring-boot-starter-test-2.7.3.pom\n2022-09-09 11:48:11,361 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-test/2.7.3/spring-boot-starter-test-2.7.3.pom\n2022-09-09 11:48:11,560 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test/2.7.3/spring-boot-test-2.7.3.pom\n2022-09-09 11:48:11,778 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test/2.7.3/spring-boot-test-2.7.3.pom\n2022-09-09 11:48:11,973 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test-autoconfigure/2.7.3/spring-boot-test-autoconfigure-2.7.3.pom\n2022-09-09 11:48:12,187 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test-autoconfigure/2.7.3/spring-boot-test-autoconfigure-2.7.3.pom\n2022-09-09 11:48:12,678 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.12.13/byte-buddy-agent-1.12.13.pom\n2022-09-09 11:48:12,897 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.12.13/byte-buddy-agent-1.12.13.pom\n2022-09-09 11:48:13,235 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-test/5.7.3/spring-security-test-5.7.3.pom\n2022-09-09 11:48:13,487 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-test/5.7.3/spring-security-test-5.7.3.pom\n2022-09-09 11:48:13,792 [AetherRepositoryConnector-repo.maven.apache.org-0-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-aop/2.7.3/spring-boot-starter-aop-2.7.3.jar\n2022-09-09 11:48:13,971 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-jdbc/2.7.3/spring-boot-starter-jdbc-2.7.3.jar\n2022-09-09 11:48:13,989 [AetherRepositoryConnector-repo.maven.apache.org-0-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/hibernate/hibernate-core/5.6.10.Final/hibernate-core-5.6.10.Final.jar\n2022-09-09 11:48:14,014 [AetherRepositoryConnector-repo.maven.apache.org-0-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-data-jpa/2.7.3/spring-boot-starter-data-jpa-2.7.3.jar\n2022-09-09 11:48:14,210 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/5.3.22/spring-jdbc-5.3.22.jar\n2022-09-09 11:48:14,392 [AetherRepositoryConnector-repo.maven.apache.org-0-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-aop/2.7.3/spring-boot-starter-aop-2.7.3.jar\n2022-09-09 11:48:14,595 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-jdbc/2.7.3/spring-boot-starter-jdbc-2.7.3.jar\n2022-09-09 11:48:14,658 [AetherRepositoryConnector-repo.maven.apache.org-0-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-data-jpa/2.7.3/spring-boot-starter-data-jpa-2.7.3.jar\n2022-09-09 11:48:16,378 [AetherRepositoryConnector-repo.maven.apache.org-0-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.12.13/byte-buddy-1.12.13.jar\n2022-09-09 11:48:16,598 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-jpa/2.7.2/spring-data-jpa-2.7.2.jar\n2022-09-09 11:48:16,609 [AetherRepositoryConnector-repo.maven.apache.org-0-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-commons/2.7.2/spring-data-commons-2.7.2.jar\n2022-09-09 11:48:16,895 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/5.3.22/spring-jdbc-5.3.22.jar\n2022-09-09 11:48:17,562 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-orm/5.3.22/spring-orm-5.3.22.jar\n2022-09-09 11:48:18,106 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-jpa/2.7.2/spring-data-jpa-2.7.2.jar\n2022-09-09 11:48:19,250 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-tx/5.3.22/spring-tx-5.3.22.jar\n2022-09-09 11:48:19,257 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-orm/5.3.22/spring-orm-5.3.22.jar\n2022-09-09 11:48:21,209 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-aspects/5.3.22/spring-aspects-5.3.22.jar\n2022-09-09 11:48:22,224 [AetherRepositoryConnector-repo.maven.apache.org-0-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-commons/2.7.2/spring-data-commons-2.7.2.jar\n2022-09-09 11:48:22,551 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-tx/5.3.22/spring-tx-5.3.22.jar\n2022-09-09 11:48:22,667 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-aspects/5.3.22/spring-aspects-5.3.22.jar\n2022-09-09 11:48:23,193 [AetherRepositoryConnector-repo.maven.apache.org-0-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-security/2.7.3/spring-boot-starter-security-2.7.3.jar\n2022-09-09 11:48:23,560 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter/2.7.3/spring-boot-starter-2.7.3.jar\n2022-09-09 11:48:23,696 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/2.7.3/spring-boot-2.7.3.jar\n2022-09-09 11:48:24,154 [AetherRepositoryConnector-repo.maven.apache.org-0-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-security/2.7.3/spring-boot-starter-security-2.7.3.jar\n2022-09-09 11:48:24,546 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter/2.7.3/spring-boot-starter-2.7.3.jar\n2022-09-09 11:48:25,411 [AetherRepositoryConnector-repo.maven.apache.org-0-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-autoconfigure/2.7.3/spring-boot-autoconfigure-2.7.3.jar\n2022-09-09 11:48:25,848 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.7.3/spring-boot-starter-logging-2.7.3.jar\n2022-09-09 11:48:26,701 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.7.3/spring-boot-starter-logging-2.7.3.jar\n2022-09-09 11:48:27,321 [AetherRepositoryConnector-repo.maven.apache.org-0-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.12.13/byte-buddy-1.12.13.jar\n2022-09-09 11:48:27,718 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-config/5.7.3/spring-security-config-5.7.3.jar\n2022-09-09 11:48:28,118 [AetherRepositoryConnector-repo.maven.apache.org-0-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-web/5.7.3/spring-security-web-5.7.3.jar\n2022-09-09 11:48:28,348 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/2.7.3/spring-boot-2.7.3.jar\n2022-09-09 11:48:29,426 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.7.3/spring-boot-starter-web-2.7.3.jar\n2022-09-09 11:48:30,605 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.7.3/spring-boot-starter-web-2.7.3.jar\n2022-09-09 11:48:30,725 [AetherRepositoryConnector-repo.maven.apache.org-0-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-autoconfigure/2.7.3/spring-boot-autoconfigure-2.7.3.jar\n2022-09-09 11:48:31,812 [AetherRepositoryConnector-repo.maven.apache.org-0-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-web/5.7.3/spring-security-web-5.7.3.jar\n2022-09-09 11:48:32,061 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-json/2.7.3/spring-boot-starter-json-2.7.3.jar\n2022-09-09 11:48:32,078 [AetherRepositoryConnector-repo.maven.apache.org-0-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-tomcat/2.7.3/spring-boot-starter-tomcat-2.7.3.jar\n2022-09-09 11:48:32,078 [AetherRepositoryConnector-repo.maven.apache.org-0-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/com/h2database/h2/2.1.214/h2-2.1.214.jar\n2022-09-09 11:48:32,665 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-config/5.7.3/spring-security-config-5.7.3.jar\n2022-09-09 11:48:32,774 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-json/2.7.3/spring-boot-starter-json-2.7.3.jar\n2022-09-09 11:48:32,799 [AetherRepositoryConnector-repo.maven.apache.org-0-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/hibernate/hibernate-core/5.6.10.Final/hibernate-core-5.6.10.Final.jar\n2022-09-09 11:48:32,805 [AetherRepositoryConnector-repo.maven.apache.org-0-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-tomcat/2.7.3/spring-boot-starter-tomcat-2.7.3.jar\n2022-09-09 11:48:33,228 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-test/2.7.3/spring-boot-starter-test-2.7.3.jar\n2022-09-09 11:48:33,277 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test/2.7.3/spring-boot-test-2.7.3.jar\n2022-09-09 11:48:33,318 [AetherRepositoryConnector-repo.maven.apache.org-0-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test-autoconfigure/2.7.3/spring-boot-test-autoconfigure-2.7.3.jar\n2022-09-09 11:48:33,318 [AetherRepositoryConnector-repo.maven.apache.org-0-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.12.13/byte-buddy-agent-1.12.13.jar\n2022-09-09 11:48:33,784 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-test/2.7.3/spring-boot-starter-test-2.7.3.jar\n2022-09-09 11:48:33,964 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test/2.7.3/spring-boot-test-2.7.3.jar\n2022-09-09 11:48:34,128 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-test/5.7.3/spring-security-test-5.7.3.jar\n2022-09-09 11:48:34,152 [AetherRepositoryConnector-repo.maven.apache.org-0-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/com/h2database/h2/2.1.214/h2-2.1.214.jar\n2022-09-09 11:48:34,153 [AetherRepositoryConnector-repo.maven.apache.org-0-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.12.13/byte-buddy-agent-1.12.13.jar\n2022-09-09 11:48:34,162 [AetherRepositoryConnector-repo.maven.apache.org-0-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test-autoconfigure/2.7.3/spring-boot-test-autoconfigure-2.7.3.jar\n2022-09-09 11:48:34,312 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-core/5.7.3/spring-security-core-5.7.3.jar\n2022-09-09 11:48:34,473 [AetherRepositoryConnector-repo.maven.apache.org-0-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-crypto/5.7.3/spring-security-crypto-5.7.3.jar\n2022-09-09 11:48:34,534 [AetherRepositoryConnector-repo.maven.apache.org-0-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-test/5.7.3/spring-security-test-5.7.3.jar\n2022-09-09 11:48:34,702 [AetherRepositoryConnector-repo.maven.apache.org-0-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-core/5.7.3/spring-security-core-5.7.3.jar\n2022-09-09 11:48:34,893 [AetherRepositoryConnector-repo.maven.apache.org-0-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-crypto/5.7.3/spring-security-crypto-5.7.3.jar\n2022-09-09 11:48:35,096 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.l.LifecycleMappingFactory - Using org.eclipse.m2e.jdt.JarLifecycleMapping lifecycle mapping for MavenProject: com.desuperior:dsmeta:0.0.1-SNAPSHOT @ C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\pom.xml.\n2022-09-09 11:48:39,751 [Worker-3: Importing Maven projects] INFO  o.e.m.j.i.AbstractJavaProjectConfigurator - Adding source folder /backend/src/main/java\n2022-09-09 11:48:39,752 [Worker-3: Importing Maven projects] INFO  o.e.m.j.i.AbstractJavaProjectConfigurator - Adding resource folder /backend/src/main/resources\n2022-09-09 11:48:39,759 [Worker-3: Importing Maven projects] INFO  o.e.m.j.i.AbstractJavaProjectConfigurator - Adding resource folder /backend/src/main/resources\n2022-09-09 11:48:39,768 [Worker-3: Importing Maven projects] INFO  o.e.m.j.i.AbstractJavaProjectConfigurator - Adding source folder /backend/src/test/java\n2022-09-09 11:48:41,569 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-data-jpa/2.7.3/spring-boot-starter-data-jpa-2.7.3-sources.jar\n2022-09-09 11:48:41,963 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-data-jpa/2.7.3/spring-boot-starter-data-jpa-2.7.3-sources.jar\n2022-09-09 11:48:41,973 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-data-jpa:2.7.3\n2022-09-09 11:48:42,763 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-aop/2.7.3/spring-boot-starter-aop-2.7.3-sources.jar\n2022-09-09 11:48:43,152 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-aop/2.7.3/spring-boot-starter-aop-2.7.3-sources.jar\n2022-09-09 11:48:43,156 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-aop:2.7.3\n2022-09-09 11:48:43,920 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-jdbc/2.7.3/spring-boot-starter-jdbc-2.7.3-sources.jar\n2022-09-09 11:48:44,300 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-jdbc/2.7.3/spring-boot-starter-jdbc-2.7.3-sources.jar\n2022-09-09 11:48:44,312 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-jdbc:2.7.3\n2022-09-09 11:48:45,022 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/5.3.22/spring-jdbc-5.3.22-sources.jar\n2022-09-09 11:48:45,315 [Worker-3: Importing Maven projects] INFO  o.e.m.c.i.p.ProjectConfigurationManager - Imported and configured 1 project(s) in 60 sec\n2022-09-09 11:48:46,029 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/5.3.22/spring-jdbc-5.3.22-sources.jar\n2022-09-09 11:48:46,045 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-jdbc:5.3.22\n2022-09-09 11:48:46,667 [Worker-12: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:48:46,667 [Worker-12: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:48:46,673 [Worker-12: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-09 11:48:46,696 [Worker-12: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-09 11:48:46,701 [Worker-12: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:48:46,701 [Worker-12: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:48:46,701 [Worker-12: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-09 11:48:46,815 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/hibernate/hibernate-core/5.6.10.Final/hibernate-core-5.6.10.Final-sources.jar\n2022-09-09 11:48:52,452 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/hibernate/hibernate-core/5.6.10.Final/hibernate-core-5.6.10.Final-sources.jar\n2022-09-09 11:48:52,461 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.hibernate:hibernate-core:5.6.10.Final\n2022-09-09 11:48:53,230 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.12.13/byte-buddy-1.12.13-sources.jar\n2022-09-09 11:48:55,694 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.12.13/byte-buddy-1.12.13-sources.jar\n2022-09-09 11:48:55,715 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for net.bytebuddy:byte-buddy:1.12.13\n2022-09-09 11:48:56,481 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-jpa/2.7.2/spring-data-jpa-2.7.2-sources.jar\n2022-09-09 11:48:57,363 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-jpa/2.7.2/spring-data-jpa-2.7.2-sources.jar\n2022-09-09 11:48:57,374 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.data:spring-data-jpa:2.7.2\n2022-09-09 11:48:58,089 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-commons/2.7.2/spring-data-commons-2.7.2-sources.jar\n2022-09-09 11:48:59,639 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-commons/2.7.2/spring-data-commons-2.7.2-sources.jar\n2022-09-09 11:48:59,663 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.data:spring-data-commons:2.7.2\n2022-09-09 11:49:00,486 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-orm/5.3.22/spring-orm-5.3.22-sources.jar\n2022-09-09 11:49:01,318 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-orm/5.3.22/spring-orm-5.3.22-sources.jar\n2022-09-09 11:49:01,323 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-orm:5.3.22\n2022-09-09 11:49:02,134 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-context/5.3.22/spring-context-5.3.22-sources.jar\n2022-09-09 11:49:05,545 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-context/5.3.22/spring-context-5.3.22-sources.jar\n2022-09-09 11:49:05,558 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-context:5.3.22\n2022-09-09 11:49:06,316 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-tx/5.3.22/spring-tx-5.3.22-sources.jar\n2022-09-09 11:49:07,332 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-tx/5.3.22/spring-tx-5.3.22-sources.jar\n2022-09-09 11:49:07,343 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-tx:5.3.22\n2022-09-09 11:49:08,055 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-beans/5.3.22/spring-beans-5.3.22-sources.jar\n2022-09-09 11:49:09,246 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-beans/5.3.22/spring-beans-5.3.22-sources.jar\n2022-09-09 11:49:09,261 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-beans:5.3.22\n2022-09-09 11:49:10,033 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-aspects/5.3.22/spring-aspects-5.3.22-sources.jar\n2022-09-09 11:49:10,446 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-aspects/5.3.22/spring-aspects-5.3.22-sources.jar\n2022-09-09 11:49:10,449 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-aspects:5.3.22\n2022-09-09 11:49:11,267 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-security/2.7.3/spring-boot-starter-security-2.7.3-sources.jar\n2022-09-09 11:49:11,675 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-security/2.7.3/spring-boot-starter-security-2.7.3-sources.jar\n2022-09-09 11:49:11,697 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-security:2.7.3\n2022-09-09 11:49:12,586 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter/2.7.3/spring-boot-starter-2.7.3-sources.jar\n2022-09-09 11:49:13,018 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter/2.7.3/spring-boot-starter-2.7.3-sources.jar\n2022-09-09 11:49:13,022 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter:2.7.3\n2022-09-09 11:49:13,935 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/2.7.3/spring-boot-2.7.3-sources.jar\n2022-09-09 11:49:16,496 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/2.7.3/spring-boot-2.7.3-sources.jar\n2022-09-09 11:49:16,504 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot:2.7.3\n2022-09-09 11:49:17,305 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-autoconfigure/2.7.3/spring-boot-autoconfigure-2.7.3-sources.jar\n2022-09-09 11:49:18,911 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-autoconfigure/2.7.3/spring-boot-autoconfigure-2.7.3-sources.jar\n2022-09-09 11:49:18,921 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-autoconfigure:2.7.3\n2022-09-09 11:49:19,706 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.7.3/spring-boot-starter-logging-2.7.3-sources.jar\n2022-09-09 11:49:20,098 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.7.3/spring-boot-starter-logging-2.7.3-sources.jar\n2022-09-09 11:49:20,105 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-logging:2.7.3\n2022-09-09 11:49:20,822 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-aop/5.3.22/spring-aop-5.3.22-sources.jar\n2022-09-09 11:49:21,863 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-aop/5.3.22/spring-aop-5.3.22-sources.jar\n2022-09-09 11:49:21,890 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-aop:5.3.22\n2022-09-09 11:49:22,648 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-config/5.7.3/spring-security-config-5.7.3-sources.jar\n2022-09-09 11:49:24,151 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-config/5.7.3/spring-security-config-5.7.3-sources.jar\n2022-09-09 11:49:24,156 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.security:spring-security-config:5.7.3\n2022-09-09 11:49:24,943 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-web/5.7.3/spring-security-web-5.7.3-sources.jar\n2022-09-09 11:49:26,236 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-web/5.7.3/spring-security-web-5.7.3-sources.jar\n2022-09-09 11:49:26,257 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.security:spring-security-web:5.7.3\n2022-09-09 11:49:27,047 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-expression/5.3.22/spring-expression-5.3.22-sources.jar\n2022-09-09 11:49:27,929 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-expression/5.3.22/spring-expression-5.3.22-sources.jar\n2022-09-09 11:49:27,940 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-expression:5.3.22\n2022-09-09 11:49:28,708 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.7.3/spring-boot-starter-web-2.7.3-sources.jar\n2022-09-09 11:49:29,103 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.7.3/spring-boot-starter-web-2.7.3-sources.jar\n2022-09-09 11:49:29,118 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-web:2.7.3\n2022-09-09 11:49:29,852 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-json/2.7.3/spring-boot-starter-json-2.7.3-sources.jar\n2022-09-09 11:49:30,211 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-json/2.7.3/spring-boot-starter-json-2.7.3-sources.jar\n2022-09-09 11:49:30,219 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-json:2.7.3\n2022-09-09 11:49:30,950 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-tomcat/2.7.3/spring-boot-starter-tomcat-2.7.3-sources.jar\n2022-09-09 11:49:31,331 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-tomcat/2.7.3/spring-boot-starter-tomcat-2.7.3-sources.jar\n2022-09-09 11:49:31,347 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-tomcat:2.7.3\n2022-09-09 11:49:32,118 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-core/9.0.65/tomcat-embed-core-9.0.65-sources.jar\n2022-09-09 11:49:37,923 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-core/9.0.65/tomcat-embed-core-9.0.65-sources.jar\n2022-09-09 11:49:37,947 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.apache.tomcat.embed:tomcat-embed-core:9.0.65\n2022-09-09 11:49:38,908 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-el/9.0.65/tomcat-embed-el-9.0.65-sources.jar\n2022-09-09 11:49:40,073 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-el/9.0.65/tomcat-embed-el-9.0.65-sources.jar\n2022-09-09 11:49:40,089 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.apache.tomcat.embed:tomcat-embed-el:9.0.65\n2022-09-09 11:49:40,842 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.65/tomcat-embed-websocket-9.0.65-sources.jar\n2022-09-09 11:49:41,880 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.65/tomcat-embed-websocket-9.0.65-sources.jar\n2022-09-09 11:49:41,904 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.apache.tomcat.embed:tomcat-embed-websocket:9.0.65\n2022-09-09 11:49:42,734 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-web/5.3.22/spring-web-5.3.22-sources.jar\n2022-09-09 11:49:45,234 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-web/5.3.22/spring-web-5.3.22-sources.jar\n2022-09-09 11:49:45,242 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-web:5.3.22\n2022-09-09 11:49:45,926 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-webmvc/5.3.22/spring-webmvc-5.3.22-sources.jar\n2022-09-09 11:49:47,978 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-webmvc/5.3.22/spring-webmvc-5.3.22-sources.jar\n2022-09-09 11:49:47,985 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-webmvc:5.3.22\n2022-09-09 11:49:48,917 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/com/h2database/h2/2.1.214/h2-2.1.214-sources.jar\n2022-09-09 11:49:54,501 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/com/h2database/h2/2.1.214/h2-2.1.214-sources.jar\n2022-09-09 11:49:54,509 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for com.h2database:h2:2.1.214\n2022-09-09 11:49:55,501 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-test/2.7.3/spring-boot-starter-test-2.7.3-sources.jar\n2022-09-09 11:49:56,076 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-test/2.7.3/spring-boot-starter-test-2.7.3-sources.jar\n2022-09-09 11:49:56,100 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-test:2.7.3\n2022-09-09 11:49:56,988 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test/2.7.3/spring-boot-test-2.7.3-sources.jar\n2022-09-09 11:49:57,740 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test/2.7.3/spring-boot-test-2.7.3-sources.jar\n2022-09-09 11:49:57,748 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-test:2.7.3\n2022-09-09 11:49:58,552 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test-autoconfigure/2.7.3/spring-boot-test-autoconfigure-2.7.3-sources.jar\n2022-09-09 11:49:59,566 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test-autoconfigure/2.7.3/spring-boot-test-autoconfigure-2.7.3-sources.jar\n2022-09-09 11:49:59,590 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-test-autoconfigure:2.7.3\n2022-09-09 11:50:00,476 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.12.13/byte-buddy-agent-1.12.13-sources.jar\n2022-09-09 11:50:01,596 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.12.13/byte-buddy-agent-1.12.13-sources.jar\n2022-09-09 11:50:01,605 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for net.bytebuddy:byte-buddy-agent:1.12.13\n2022-09-09 11:50:02,466 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/skyscreamer/jsonassert/1.5.1/jsonassert-1.5.1-sources.jar\n2022-09-09 11:50:02,883 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/skyscreamer/jsonassert/1.5.1/jsonassert-1.5.1-sources.jar\n2022-09-09 11:50:02,896 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.skyscreamer:jsonassert:1.5.1\n2022-09-09 11:50:03,740 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-core/5.3.22/spring-core-5.3.22-sources.jar\n2022-09-09 11:50:05,908 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-core/5.3.22/spring-core-5.3.22-sources.jar\n2022-09-09 11:50:05,922 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-core:5.3.22\n2022-09-09 11:50:06,937 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-jcl/5.3.22/spring-jcl-5.3.22-sources.jar\n2022-09-09 11:50:07,328 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-jcl/5.3.22/spring-jcl-5.3.22-sources.jar\n2022-09-09 11:50:07,331 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-jcl:5.3.22\n2022-09-09 11:50:08,053 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-test/5.3.22/spring-test-5.3.22-sources.jar\n2022-09-09 11:50:09,182 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-test/5.3.22/spring-test-5.3.22-sources.jar\n2022-09-09 11:50:09,195 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-test:5.3.22\n2022-09-09 11:50:10,006 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-test/5.7.3/spring-security-test-5.7.3-sources.jar\n2022-09-09 11:50:10,479 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-test/5.7.3/spring-security-test-5.7.3-sources.jar\n2022-09-09 11:50:10,503 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.security:spring-security-test:5.7.3\n2022-09-09 11:50:11,345 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-core/5.7.3/spring-security-core-5.7.3-sources.jar\n2022-09-09 11:50:12,728 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-core/5.7.3/spring-security-core-5.7.3-sources.jar\n2022-09-09 11:50:12,736 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.security:spring-security-core:5.7.3\n2022-09-09 11:50:13,629 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-crypto/5.7.3/spring-security-crypto-5.7.3-sources.jar\n2022-09-09 11:50:14,166 [Worker-11: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-crypto/5.7.3/spring-security-crypto-5.7.3-sources.jar\n2022-09-09 11:50:14,179 [Worker-11: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.security:spring-security-crypto:5.7.3\n2022-09-09 11:50:14,580 [Worker-3: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:50:14,580 [Worker-3: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:50:14,582 [Worker-3: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-09 11:50:14,583 [Worker-3: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-09 11:50:14,585 [Worker-3: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:50:14,585 [Worker-3: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:50:14,585 [Worker-3: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-09 11:52:27,499 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-dependencies/2.7.1/spring-boot-dependencies-2.7.1.pom\n2022-09-09 11:52:28,131 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-dependencies/2.7.1/spring-boot-dependencies-2.7.1.pom\n2022-09-09 11:52:28,426 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/io/micrometer/micrometer-bom/1.9.1/micrometer-bom-1.9.1.pom\n2022-09-09 11:52:28,657 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/io/micrometer/micrometer-bom/1.9.1/micrometer-bom-1.9.1.pom\n2022-09-09 11:52:28,871 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/io/netty/netty-bom/4.1.78.Final/netty-bom-4.1.78.Final.pom\n2022-09-09 11:52:29,114 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/io/netty/netty-bom/4.1.78.Final/netty-bom-4.1.78.Final.pom\n2022-09-09 11:52:29,343 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/io/projectreactor/reactor-bom/2020.0.20/reactor-bom-2020.0.20.pom\n2022-09-09 11:52:29,618 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/io/projectreactor/reactor-bom/2020.0.20/reactor-bom-2020.0.20.pom\n2022-09-09 11:52:29,846 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-bom/2021.2.1/spring-data-bom-2021.2.1.pom\n2022-09-09 11:52:30,112 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-bom/2021.2.1/spring-data-bom-2021.2.1.pom\n2022-09-09 11:52:30,319 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-framework-bom/5.3.21/spring-framework-bom-5.3.21.pom\n2022-09-09 11:52:30,565 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-framework-bom/5.3.21/spring-framework-bom-5.3.21.pom\n2022-09-09 11:52:30,779 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/integration/spring-integration-bom/5.5.13/spring-integration-bom-5.5.13.pom\n2022-09-09 11:52:31,044 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/integration/spring-integration-bom/5.5.13/spring-integration-bom-5.5.13.pom\n2022-09-09 11:52:31,259 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-bom/5.7.2/spring-security-bom-5.7.2.pom\n2022-09-09 11:52:31,511 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-bom/5.7.2/spring-security-bom-5.7.2.pom\n2022-09-09 11:52:32,373 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-maven-plugin/2.7.1/spring-boot-maven-plugin-2.7.1.pom\n2022-09-09 11:52:32,765 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-maven-plugin/2.7.1/spring-boot-maven-plugin-2.7.1.pom\n2022-09-09 11:52:32,963 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-maven-plugin/2.7.1/spring-boot-maven-plugin-2.7.1.jar\n2022-09-09 11:52:33,571 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-maven-plugin/2.7.1/spring-boot-maven-plugin-2.7.1.jar\n2022-09-09 11:52:33,718 [Worker-11: Building] INFO  o.e.m.c.i.l.LifecycleMappingFactory - Using org.eclipse.m2e.jdt.JarLifecycleMapping lifecycle mapping for MavenProject: com.desuperior:dsmeta:0.0.1-SNAPSHOT @ C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\pom.xml.\n2022-09-09 11:52:33,917 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-data-jpa/2.7.1/spring-boot-starter-data-jpa-2.7.1.pom\n2022-09-09 11:52:34,194 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-data-jpa/2.7.1/spring-boot-starter-data-jpa-2.7.1.pom\n2022-09-09 11:52:34,422 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-aop/2.7.1/spring-boot-starter-aop-2.7.1.pom\n2022-09-09 11:52:34,661 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-aop/2.7.1/spring-boot-starter-aop-2.7.1.pom\n2022-09-09 11:52:34,885 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter/2.7.1/spring-boot-starter-2.7.1.pom\n2022-09-09 11:52:35,150 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter/2.7.1/spring-boot-starter-2.7.1.pom\n2022-09-09 11:52:35,370 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/2.7.1/spring-boot-2.7.1.pom\n2022-09-09 11:52:35,623 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/2.7.1/spring-boot-2.7.1.pom\n2022-09-09 11:52:35,842 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-core/5.3.21/spring-core-5.3.21.pom\n2022-09-09 11:52:36,114 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-core/5.3.21/spring-core-5.3.21.pom\n2022-09-09 11:52:36,324 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-jcl/5.3.21/spring-jcl-5.3.21.pom\n2022-09-09 11:52:36,574 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-jcl/5.3.21/spring-jcl-5.3.21.pom\n2022-09-09 11:52:36,785 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-context/5.3.21/spring-context-5.3.21.pom\n2022-09-09 11:52:37,049 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-context/5.3.21/spring-context-5.3.21.pom\n2022-09-09 11:52:37,263 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-aop/5.3.21/spring-aop-5.3.21.pom\n2022-09-09 11:52:37,518 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-aop/5.3.21/spring-aop-5.3.21.pom\n2022-09-09 11:52:37,736 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-beans/5.3.21/spring-beans-5.3.21.pom\n2022-09-09 11:52:38,003 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-beans/5.3.21/spring-beans-5.3.21.pom\n2022-09-09 11:52:38,219 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-expression/5.3.21/spring-expression-5.3.21.pom\n2022-09-09 11:52:38,475 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-expression/5.3.21/spring-expression-5.3.21.pom\n2022-09-09 11:52:38,692 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-autoconfigure/2.7.1/spring-boot-autoconfigure-2.7.1.pom\n2022-09-09 11:52:38,962 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-autoconfigure/2.7.1/spring-boot-autoconfigure-2.7.1.pom\n2022-09-09 11:52:39,178 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.7.1/spring-boot-starter-logging-2.7.1.pom\n2022-09-09 11:52:39,438 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.7.1/spring-boot-starter-logging-2.7.1.pom\n2022-09-09 11:52:39,672 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-jdbc/2.7.1/spring-boot-starter-jdbc-2.7.1.pom\n2022-09-09 11:52:39,932 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-jdbc/2.7.1/spring-boot-starter-jdbc-2.7.1.pom\n2022-09-09 11:52:40,143 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/5.3.21/spring-jdbc-5.3.21.pom\n2022-09-09 11:52:40,392 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/5.3.21/spring-jdbc-5.3.21.pom\n2022-09-09 11:52:40,612 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-tx/5.3.21/spring-tx-5.3.21.pom\n2022-09-09 11:52:40,877 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-tx/5.3.21/spring-tx-5.3.21.pom\n2022-09-09 11:52:41,136 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.12.11/byte-buddy-1.12.11.pom\n2022-09-09 11:52:41,369 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.12.11/byte-buddy-1.12.11.pom\n2022-09-09 11:52:41,577 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.12.11/byte-buddy-parent-1.12.11.pom\n2022-09-09 11:52:41,834 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-parent/1.12.11/byte-buddy-parent-1.12.11.pom\n2022-09-09 11:52:42,056 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-jpa/2.7.1/spring-data-jpa-2.7.1.pom\n2022-09-09 11:52:42,304 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-jpa/2.7.1/spring-data-jpa-2.7.1.pom\n2022-09-09 11:52:42,518 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/build/spring-data-parent/2.7.1/spring-data-parent-2.7.1.pom\n2022-09-09 11:52:42,790 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/build/spring-data-parent/2.7.1/spring-data-parent-2.7.1.pom\n2022-09-09 11:52:42,999 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/build/spring-data-build/2.7.1/spring-data-build-2.7.1.pom\n2022-09-09 11:52:43,240 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/build/spring-data-build/2.7.1/spring-data-build-2.7.1.pom\n2022-09-09 11:52:43,457 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/testcontainers/testcontainers-bom/1.17.2/testcontainers-bom-1.17.2.pom\n2022-09-09 11:52:43,712 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/testcontainers/testcontainers-bom/1.17.2/testcontainers-bom-1.17.2.pom\n2022-09-09 11:52:43,928 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-bom/1.6.2/kotlinx-coroutines-bom-1.6.2.pom\n2022-09-09 11:52:44,146 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-bom/1.6.2/kotlinx-coroutines-bom-1.6.2.pom\n2022-09-09 11:52:44,345 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-commons/2.7.1/spring-data-commons-2.7.1.pom\n2022-09-09 11:52:44,569 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-commons/2.7.1/spring-data-commons-2.7.1.pom\n2022-09-09 11:52:44,775 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-orm/5.3.21/spring-orm-5.3.21.pom\n2022-09-09 11:52:45,005 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-orm/5.3.21/spring-orm-5.3.21.pom\n2022-09-09 11:52:45,207 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-aspects/5.3.21/spring-aspects-5.3.21.pom\n2022-09-09 11:52:45,429 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-aspects/5.3.21/spring-aspects-5.3.21.pom\n2022-09-09 11:52:45,628 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-security/2.7.1/spring-boot-starter-security-2.7.1.pom\n2022-09-09 11:52:45,857 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-security/2.7.1/spring-boot-starter-security-2.7.1.pom\n2022-09-09 11:52:46,076 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-config/5.7.2/spring-security-config-5.7.2.pom\n2022-09-09 11:52:46,338 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-config/5.7.2/spring-security-config-5.7.2.pom\n2022-09-09 11:52:46,554 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-core/5.7.2/spring-security-core-5.7.2.pom\n2022-09-09 11:52:46,821 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-core/5.7.2/spring-security-core-5.7.2.pom\n2022-09-09 11:52:47,040 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-crypto/5.7.2/spring-security-crypto-5.7.2.pom\n2022-09-09 11:52:47,307 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-crypto/5.7.2/spring-security-crypto-5.7.2.pom\n2022-09-09 11:52:47,510 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-web/5.7.2/spring-security-web-5.7.2.pom\n2022-09-09 11:52:47,736 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-web/5.7.2/spring-security-web-5.7.2.pom\n2022-09-09 11:52:47,949 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-web/5.3.21/spring-web-5.3.21.pom\n2022-09-09 11:52:48,197 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-web/5.3.21/spring-web-5.3.21.pom\n2022-09-09 11:52:48,416 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.7.1/spring-boot-starter-web-2.7.1.pom\n2022-09-09 11:52:48,667 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.7.1/spring-boot-starter-web-2.7.1.pom\n2022-09-09 11:52:48,871 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-json/2.7.1/spring-boot-starter-json-2.7.1.pom\n2022-09-09 11:52:49,127 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-json/2.7.1/spring-boot-starter-json-2.7.1.pom\n2022-09-09 11:52:49,355 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-tomcat/2.7.1/spring-boot-starter-tomcat-2.7.1.pom\n2022-09-09 11:52:49,620 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-tomcat/2.7.1/spring-boot-starter-tomcat-2.7.1.pom\n2022-09-09 11:52:49,827 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-core/9.0.64/tomcat-embed-core-9.0.64.pom\n2022-09-09 11:52:50,085 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-core/9.0.64/tomcat-embed-core-9.0.64.pom\n2022-09-09 11:52:50,290 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-el/9.0.64/tomcat-embed-el-9.0.64.pom\n2022-09-09 11:52:50,541 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-el/9.0.64/tomcat-embed-el-9.0.64.pom\n2022-09-09 11:52:50,746 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.64/tomcat-embed-websocket-9.0.64.pom\n2022-09-09 11:52:51,048 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.64/tomcat-embed-websocket-9.0.64.pom\n2022-09-09 11:52:51,249 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-webmvc/5.3.21/spring-webmvc-5.3.21.pom\n2022-09-09 11:52:51,500 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-webmvc/5.3.21/spring-webmvc-5.3.21.pom\n2022-09-09 11:52:51,721 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-test/2.7.1/spring-boot-starter-test-2.7.1.pom\n2022-09-09 11:52:51,970 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-test/2.7.1/spring-boot-starter-test-2.7.1.pom\n2022-09-09 11:52:52,182 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test/2.7.1/spring-boot-test-2.7.1.pom\n2022-09-09 11:52:52,455 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test/2.7.1/spring-boot-test-2.7.1.pom\n2022-09-09 11:52:52,677 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test-autoconfigure/2.7.1/spring-boot-test-autoconfigure-2.7.1.pom\n2022-09-09 11:52:52,937 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test-autoconfigure/2.7.1/spring-boot-test-autoconfigure-2.7.1.pom\n2022-09-09 11:52:53,172 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.12.11/byte-buddy-agent-1.12.11.pom\n2022-09-09 11:52:53,423 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.12.11/byte-buddy-agent-1.12.11.pom\n2022-09-09 11:52:53,672 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-test/5.3.21/spring-test-5.3.21.pom\n2022-09-09 11:52:53,924 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-test/5.3.21/spring-test-5.3.21.pom\n2022-09-09 11:52:54,155 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-test/5.7.2/spring-security-test-5.7.2.pom\n2022-09-09 11:52:54,412 [Worker-11: Building] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-test/5.7.2/spring-security-test-5.7.2.pom\n2022-09-09 11:52:54,648 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-aop/2.7.1/spring-boot-starter-aop-2.7.1.jar\n2022-09-09 11:52:54,837 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-data-jpa/2.7.1/spring-boot-starter-data-jpa-2.7.1.jar\n2022-09-09 11:52:54,840 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-jdbc/2.7.1/spring-boot-starter-jdbc-2.7.1.jar\n2022-09-09 11:52:54,853 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/5.3.21/spring-jdbc-5.3.21.jar\n2022-09-09 11:52:55,223 [AetherRepositoryConnector-repo.maven.apache.org-1-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.12.11/byte-buddy-1.12.11.jar\n2022-09-09 11:52:55,252 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-aop/2.7.1/spring-boot-starter-aop-2.7.1.jar\n2022-09-09 11:52:55,429 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-jdbc/2.7.1/spring-boot-starter-jdbc-2.7.1.jar\n2022-09-09 11:52:55,431 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-data-jpa/2.7.1/spring-boot-starter-data-jpa-2.7.1.jar\n2022-09-09 11:52:57,095 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-jpa/2.7.1/spring-data-jpa-2.7.1.jar\n2022-09-09 11:52:57,110 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-orm/5.3.21/spring-orm-5.3.21.jar\n2022-09-09 11:52:57,110 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-commons/2.7.1/spring-data-commons-2.7.1.jar\n2022-09-09 11:52:57,142 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/5.3.21/spring-jdbc-5.3.21.jar\n2022-09-09 11:52:58,189 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-context/5.3.21/spring-context-5.3.21.jar\n2022-09-09 11:52:58,732 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-orm/5.3.21/spring-orm-5.3.21.jar\n2022-09-09 11:52:58,840 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-jpa/2.7.1/spring-data-jpa-2.7.1.jar\n2022-09-09 11:52:59,937 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-tx/5.3.21/spring-tx-5.3.21.jar\n2022-09-09 11:53:00,128 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-beans/5.3.21/spring-beans-5.3.21.jar\n2022-09-09 11:53:02,640 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-commons/2.7.1/spring-data-commons-2.7.1.jar\n2022-09-09 11:53:03,384 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-tx/5.3.21/spring-tx-5.3.21.jar\n2022-09-09 11:53:03,706 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-aspects/5.3.21/spring-aspects-5.3.21.jar\n2022-09-09 11:53:03,799 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-security/2.7.1/spring-boot-starter-security-2.7.1.jar\n2022-09-09 11:53:03,814 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-beans/5.3.21/spring-beans-5.3.21.jar\n2022-09-09 11:53:03,818 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-context/5.3.21/spring-context-5.3.21.jar\n2022-09-09 11:53:04,010 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter/2.7.1/spring-boot-starter-2.7.1.jar\n2022-09-09 11:53:04,208 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/2.7.1/spring-boot-2.7.1.jar\n2022-09-09 11:53:04,212 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-security/2.7.1/spring-boot-starter-security-2.7.1.jar\n2022-09-09 11:53:04,212 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-aspects/5.3.21/spring-aspects-5.3.21.jar\n2022-09-09 11:53:04,212 [AetherRepositoryConnector-repo.maven.apache.org-1-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.12.11/byte-buddy-1.12.11.jar\n2022-09-09 11:53:04,857 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.7.1/spring-boot-starter-logging-2.7.1.jar\n2022-09-09 11:53:04,857 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-autoconfigure/2.7.1/spring-boot-autoconfigure-2.7.1.jar\n2022-09-09 11:53:04,857 [AetherRepositoryConnector-repo.maven.apache.org-1-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-aop/5.3.21/spring-aop-5.3.21.jar\n2022-09-09 11:53:04,865 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter/2.7.1/spring-boot-starter-2.7.1.jar\n2022-09-09 11:53:05,462 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-config/5.7.2/spring-security-config-5.7.2.jar\n2022-09-09 11:53:05,618 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.7.1/spring-boot-starter-logging-2.7.1.jar\n2022-09-09 11:53:05,645 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/2.7.1/spring-boot-2.7.1.jar\n2022-09-09 11:53:06,018 [AetherRepositoryConnector-repo.maven.apache.org-1-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-aop/5.3.21/spring-aop-5.3.21.jar\n2022-09-09 11:53:06,186 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-web/5.7.2/spring-security-web-5.7.2.jar\n2022-09-09 11:53:06,218 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-expression/5.3.21/spring-expression-5.3.21.jar\n2022-09-09 11:53:06,617 [AetherRepositoryConnector-repo.maven.apache.org-1-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.7.1/spring-boot-starter-web-2.7.1.jar\n2022-09-09 11:53:07,188 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-autoconfigure/2.7.1/spring-boot-autoconfigure-2.7.1.jar\n2022-09-09 11:53:07,188 [AetherRepositoryConnector-repo.maven.apache.org-1-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.7.1/spring-boot-starter-web-2.7.1.jar\n2022-09-09 11:53:07,188 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-expression/5.3.21/spring-expression-5.3.21.jar\n2022-09-09 11:53:07,383 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-json/2.7.1/spring-boot-starter-json-2.7.1.jar\n2022-09-09 11:53:07,392 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-core/9.0.64/tomcat-embed-core-9.0.64.jar\n2022-09-09 11:53:07,995 [AetherRepositoryConnector-repo.maven.apache.org-1-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-tomcat/2.7.1/spring-boot-starter-tomcat-2.7.1.jar\n2022-09-09 11:53:08,009 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-json/2.7.1/spring-boot-starter-json-2.7.1.jar\n2022-09-09 11:53:08,009 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-config/5.7.2/spring-security-config-5.7.2.jar\n2022-09-09 11:53:08,011 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-web/5.7.2/spring-security-web-5.7.2.jar\n2022-09-09 11:53:08,670 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.64/tomcat-embed-websocket-9.0.64.jar\n2022-09-09 11:53:08,670 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-web/5.3.21/spring-web-5.3.21.jar\n2022-09-09 11:53:08,670 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-el/9.0.64/tomcat-embed-el-9.0.64.jar\n2022-09-09 11:53:08,720 [AetherRepositoryConnector-repo.maven.apache.org-1-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-tomcat/2.7.1/spring-boot-starter-tomcat-2.7.1.jar\n2022-09-09 11:53:09,313 [AetherRepositoryConnector-repo.maven.apache.org-1-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-webmvc/5.3.21/spring-webmvc-5.3.21.jar\n2022-09-09 11:53:09,738 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.64/tomcat-embed-websocket-9.0.64.jar\n2022-09-09 11:53:09,745 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-el/9.0.64/tomcat-embed-el-9.0.64.jar\n2022-09-09 11:53:10,498 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-test/2.7.1/spring-boot-starter-test-2.7.1.jar\n2022-09-09 11:53:10,498 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test/2.7.1/spring-boot-test-2.7.1.jar\n2022-09-09 11:53:10,828 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-core/9.0.64/tomcat-embed-core-9.0.64.jar\n2022-09-09 11:53:10,828 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-test/2.7.1/spring-boot-starter-test-2.7.1.jar\n2022-09-09 11:53:10,985 [AetherRepositoryConnector-repo.maven.apache.org-1-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-webmvc/5.3.21/spring-webmvc-5.3.21.jar\n2022-09-09 11:53:11,034 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test/2.7.1/spring-boot-test-2.7.1.jar\n2022-09-09 11:53:11,149 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test-autoconfigure/2.7.1/spring-boot-test-autoconfigure-2.7.1.jar\n2022-09-09 11:53:11,172 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-web/5.3.21/spring-web-5.3.21.jar\n2022-09-09 11:53:11,217 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.12.11/byte-buddy-agent-1.12.11.jar\n2022-09-09 11:53:11,306 [AetherRepositoryConnector-repo.maven.apache.org-1-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-core/5.3.21/spring-core-5.3.21.jar\n2022-09-09 11:53:11,687 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-test/5.3.21/spring-test-5.3.21.jar\n2022-09-09 11:53:11,687 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-jcl/5.3.21/spring-jcl-5.3.21.jar\n2022-09-09 11:53:11,901 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test-autoconfigure/2.7.1/spring-boot-test-autoconfigure-2.7.1.jar\n2022-09-09 11:53:11,941 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.12.11/byte-buddy-agent-1.12.11.jar\n2022-09-09 11:53:12,407 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-test/5.7.2/spring-security-test-5.7.2.jar\n2022-09-09 11:53:12,476 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-core/5.7.2/spring-security-core-5.7.2.jar\n2022-09-09 11:53:12,479 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-jcl/5.3.21/spring-jcl-5.3.21.jar\n2022-09-09 11:53:12,622 [AetherRepositoryConnector-repo.maven.apache.org-1-4] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-core/5.3.21/spring-core-5.3.21.jar\n2022-09-09 11:53:12,634 [AetherRepositoryConnector-repo.maven.apache.org-1-2] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-test/5.3.21/spring-test-5.3.21.jar\n2022-09-09 11:53:12,847 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-crypto/5.7.2/spring-security-crypto-5.7.2.jar\n2022-09-09 11:53:12,892 [AetherRepositoryConnector-repo.maven.apache.org-1-3] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-test/5.7.2/spring-security-test-5.7.2.jar\n2022-09-09 11:53:13,090 [AetherRepositoryConnector-repo.maven.apache.org-1-1] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-core/5.7.2/spring-security-core-5.7.2.jar\n2022-09-09 11:53:13,241 [AetherRepositoryConnector-repo.maven.apache.org-1-0] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-crypto/5.7.2/spring-security-crypto-5.7.2.jar\n2022-09-09 11:53:13,474 [Worker-11: Building] INFO  o.e.m.c.i.l.LifecycleMappingFactory - Using org.eclipse.m2e.jdt.JarLifecycleMapping lifecycle mapping for MavenProject: com.desuperior:dsmeta:0.0.1-SNAPSHOT @ C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\pom.xml.\n2022-09-09 11:53:14,328 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:53:14,328 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:53:14,331 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-09 11:53:14,332 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-09 11:53:14,335 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:53:14,335 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:53:14,335 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-09 11:53:16,020 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:53:16,020 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:53:16,028 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-09 11:53:16,041 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-09 11:53:16,043 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:53:16,043 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:53:16,044 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-09 11:53:16,057 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-data-jpa/2.7.1/spring-boot-starter-data-jpa-2.7.1-sources.jar\n2022-09-09 11:53:16,403 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-data-jpa/2.7.1/spring-boot-starter-data-jpa-2.7.1-sources.jar\n2022-09-09 11:53:16,406 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-data-jpa:2.7.1\n2022-09-09 11:53:17,192 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-aop/2.7.1/spring-boot-starter-aop-2.7.1-sources.jar\n2022-09-09 11:53:17,595 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-aop/2.7.1/spring-boot-starter-aop-2.7.1-sources.jar\n2022-09-09 11:53:17,617 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-aop:2.7.1\n2022-09-09 11:53:18,441 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-jdbc/2.7.1/spring-boot-starter-jdbc-2.7.1-sources.jar\n2022-09-09 11:53:18,849 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-jdbc/2.7.1/spring-boot-starter-jdbc-2.7.1-sources.jar\n2022-09-09 11:53:18,856 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-jdbc:2.7.1\n2022-09-09 11:53:19,550 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/5.3.21/spring-jdbc-5.3.21-sources.jar\n2022-09-09 11:53:20,669 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-jdbc/5.3.21/spring-jdbc-5.3.21-sources.jar\n2022-09-09 11:53:20,684 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-jdbc:5.3.21\n2022-09-09 11:53:21,464 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.12.11/byte-buddy-1.12.11-sources.jar\n2022-09-09 11:53:22,860 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.12.11/byte-buddy-1.12.11-sources.jar\n2022-09-09 11:53:22,867 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for net.bytebuddy:byte-buddy:1.12.11\n2022-09-09 11:53:23,613 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-jpa/2.7.1/spring-data-jpa-2.7.1-sources.jar\n2022-09-09 11:53:24,608 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-jpa/2.7.1/spring-data-jpa-2.7.1-sources.jar\n2022-09-09 11:53:24,611 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.data:spring-data-jpa:2.7.1\n2022-09-09 11:53:25,439 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-commons/2.7.1/spring-data-commons-2.7.1-sources.jar\n2022-09-09 11:53:26,813 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-commons/2.7.1/spring-data-commons-2.7.1-sources.jar\n2022-09-09 11:53:26,821 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.data:spring-data-commons:2.7.1\n2022-09-09 11:53:27,604 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-orm/5.3.21/spring-orm-5.3.21-sources.jar\n2022-09-09 11:53:28,455 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-orm/5.3.21/spring-orm-5.3.21-sources.jar\n2022-09-09 11:53:28,478 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-orm:5.3.21\n2022-09-09 11:53:29,265 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-context/5.3.21/spring-context-5.3.21-sources.jar\n2022-09-09 11:53:30,652 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-context/5.3.21/spring-context-5.3.21-sources.jar\n2022-09-09 11:53:30,654 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-context:5.3.21\n2022-09-09 11:53:31,431 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-tx/5.3.21/spring-tx-5.3.21-sources.jar\n2022-09-09 11:53:32,446 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-tx/5.3.21/spring-tx-5.3.21-sources.jar\n2022-09-09 11:53:32,472 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-tx:5.3.21\n2022-09-09 11:53:33,265 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-beans/5.3.21/spring-beans-5.3.21-sources.jar\n2022-09-09 11:53:34,540 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-beans/5.3.21/spring-beans-5.3.21-sources.jar\n2022-09-09 11:53:34,551 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-beans:5.3.21\n2022-09-09 11:53:35,269 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-aspects/5.3.21/spring-aspects-5.3.21-sources.jar\n2022-09-09 11:53:35,665 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-aspects/5.3.21/spring-aspects-5.3.21-sources.jar\n2022-09-09 11:53:35,673 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-aspects:5.3.21\n2022-09-09 11:53:36,469 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-security/2.7.1/spring-boot-starter-security-2.7.1-sources.jar\n2022-09-09 11:53:36,881 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-security/2.7.1/spring-boot-starter-security-2.7.1-sources.jar\n2022-09-09 11:53:36,904 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-security:2.7.1\n2022-09-09 11:53:37,655 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter/2.7.1/spring-boot-starter-2.7.1-sources.jar\n2022-09-09 11:53:38,018 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter/2.7.1/spring-boot-starter-2.7.1-sources.jar\n2022-09-09 11:53:38,042 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter:2.7.1\n2022-09-09 11:53:38,760 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/2.7.1/spring-boot-2.7.1-sources.jar\n2022-09-09 11:53:40,070 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot/2.7.1/spring-boot-2.7.1-sources.jar\n2022-09-09 11:53:40,074 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot:2.7.1\n2022-09-09 11:53:40,871 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-autoconfigure/2.7.1/spring-boot-autoconfigure-2.7.1-sources.jar\n2022-09-09 11:53:42,268 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-autoconfigure/2.7.1/spring-boot-autoconfigure-2.7.1-sources.jar\n2022-09-09 11:53:42,276 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-autoconfigure:2.7.1\n2022-09-09 11:53:42,978 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.7.1/spring-boot-starter-logging-2.7.1-sources.jar\n2022-09-09 11:53:43,343 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.7.1/spring-boot-starter-logging-2.7.1-sources.jar\n2022-09-09 11:53:43,355 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-logging:2.7.1\n2022-09-09 11:53:44,129 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-aop/5.3.21/spring-aop-5.3.21-sources.jar\n2022-09-09 11:53:45,154 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-aop/5.3.21/spring-aop-5.3.21-sources.jar\n2022-09-09 11:53:45,159 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-aop:5.3.21\n2022-09-09 11:53:45,949 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-config/5.7.2/spring-security-config-5.7.2-sources.jar\n2022-09-09 11:53:49,173 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-config/5.7.2/spring-security-config-5.7.2-sources.jar\n2022-09-09 11:53:49,176 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.security:spring-security-config:5.7.2\n2022-09-09 11:53:50,046 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-web/5.7.2/spring-security-web-5.7.2-sources.jar\n2022-09-09 11:53:51,425 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-web/5.7.2/spring-security-web-5.7.2-sources.jar\n2022-09-09 11:53:51,440 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.security:spring-security-web:5.7.2\n2022-09-09 11:53:52,252 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-expression/5.3.21/spring-expression-5.3.21-sources.jar\n2022-09-09 11:53:53,349 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-expression/5.3.21/spring-expression-5.3.21-sources.jar\n2022-09-09 11:53:53,357 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-expression:5.3.21\n2022-09-09 11:53:54,130 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.7.1/spring-boot-starter-web-2.7.1-sources.jar\n2022-09-09 11:53:54,567 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-web/2.7.1/spring-boot-starter-web-2.7.1-sources.jar\n2022-09-09 11:53:54,570 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-web:2.7.1\n2022-09-09 11:53:55,357 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-json/2.7.1/spring-boot-starter-json-2.7.1-sources.jar\n2022-09-09 11:53:55,768 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-json/2.7.1/spring-boot-starter-json-2.7.1-sources.jar\n2022-09-09 11:53:55,773 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-json:2.7.1\n2022-09-09 11:53:56,631 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-tomcat/2.7.1/spring-boot-starter-tomcat-2.7.1-sources.jar\n2022-09-09 11:53:57,063 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-tomcat/2.7.1/spring-boot-starter-tomcat-2.7.1-sources.jar\n2022-09-09 11:53:57,077 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-tomcat:2.7.1\n2022-09-09 11:53:57,887 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-core/9.0.64/tomcat-embed-core-9.0.64-sources.jar\n2022-09-09 11:54:01,371 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-core/9.0.64/tomcat-embed-core-9.0.64-sources.jar\n2022-09-09 11:54:01,389 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.apache.tomcat.embed:tomcat-embed-core:9.0.64\n2022-09-09 11:54:02,156 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-el/9.0.64/tomcat-embed-el-9.0.64-sources.jar\n2022-09-09 11:54:03,003 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-el/9.0.64/tomcat-embed-el-9.0.64-sources.jar\n2022-09-09 11:54:03,005 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.apache.tomcat.embed:tomcat-embed-el:9.0.64\n2022-09-09 11:54:03,732 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.64/tomcat-embed-websocket-9.0.64-sources.jar\n2022-09-09 11:54:04,562 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.64/tomcat-embed-websocket-9.0.64-sources.jar\n2022-09-09 11:54:04,577 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.apache.tomcat.embed:tomcat-embed-websocket:9.0.64\n2022-09-09 11:54:05,347 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-web/5.3.21/spring-web-5.3.21-sources.jar\n2022-09-09 11:54:07,054 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-web/5.3.21/spring-web-5.3.21-sources.jar\n2022-09-09 11:54:07,059 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-web:5.3.21\n2022-09-09 11:54:07,812 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-webmvc/5.3.21/spring-webmvc-5.3.21-sources.jar\n2022-09-09 11:54:09,909 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-webmvc/5.3.21/spring-webmvc-5.3.21-sources.jar\n2022-09-09 11:54:09,920 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-webmvc:5.3.21\n2022-09-09 11:54:10,674 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-test/2.7.1/spring-boot-starter-test-2.7.1-sources.jar\n2022-09-09 11:54:11,056 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-test/2.7.1/spring-boot-starter-test-2.7.1-sources.jar\n2022-09-09 11:54:11,059 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-starter-test:2.7.1\n2022-09-09 11:54:11,890 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test/2.7.1/spring-boot-test-2.7.1-sources.jar\n2022-09-09 11:54:12,745 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test/2.7.1/spring-boot-test-2.7.1-sources.jar\n2022-09-09 11:54:12,761 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-test:2.7.1\n2022-09-09 11:54:13,500 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test-autoconfigure/2.7.1/spring-boot-test-autoconfigure-2.7.1-sources.jar\n2022-09-09 11:54:14,335 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-test-autoconfigure/2.7.1/spring-boot-test-autoconfigure-2.7.1-sources.jar\n2022-09-09 11:54:14,344 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.boot:spring-boot-test-autoconfigure:2.7.1\n2022-09-09 11:54:15,209 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.12.11/byte-buddy-agent-1.12.11-sources.jar\n2022-09-09 11:54:16,145 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy-agent/1.12.11/byte-buddy-agent-1.12.11-sources.jar\n2022-09-09 11:54:16,156 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for net.bytebuddy:byte-buddy-agent:1.12.11\n2022-09-09 11:54:16,923 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-core/5.3.21/spring-core-5.3.21-sources.jar\n2022-09-09 11:54:18,976 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-core/5.3.21/spring-core-5.3.21-sources.jar\n2022-09-09 11:54:18,997 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-core:5.3.21\n2022-09-09 11:54:19,808 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-jcl/5.3.21/spring-jcl-5.3.21-sources.jar\n2022-09-09 11:54:20,194 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-jcl/5.3.21/spring-jcl-5.3.21-sources.jar\n2022-09-09 11:54:20,197 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-jcl:5.3.21\n2022-09-09 11:54:21,004 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/spring-test/5.3.21/spring-test-5.3.21-sources.jar\n2022-09-09 11:54:22,388 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/spring-test/5.3.21/spring-test-5.3.21-sources.jar\n2022-09-09 11:54:22,392 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework:spring-test:5.3.21\n2022-09-09 11:54:23,091 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-test/5.7.2/spring-security-test-5.7.2-sources.jar\n2022-09-09 11:54:23,526 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-test/5.7.2/spring-security-test-5.7.2-sources.jar\n2022-09-09 11:54:23,534 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.security:spring-security-test:5.7.2\n2022-09-09 11:54:24,339 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-core/5.7.2/spring-security-core-5.7.2-sources.jar\n2022-09-09 11:54:26,083 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-core/5.7.2/spring-security-core-5.7.2-sources.jar\n2022-09-09 11:54:26,105 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.security:spring-security-core:5.7.2\n2022-09-09 11:54:26,902 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloading https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-crypto/5.7.2/spring-security-crypto-5.7.2-sources.jar\n2022-09-09 11:54:27,514 [Worker-15: Download sources and javadoc] INFO  o.e.m.c.i.e.AbstractTransferListenerAdapter - Downloaded https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-crypto/5.7.2/spring-security-crypto-5.7.2-sources.jar\n2022-09-09 11:54:27,540 [Worker-15: Download sources and javadoc] INFO  o.e.m.j.internal.DownloadSourcesJob - Downloaded sources for org.springframework.security:spring-security-crypto:5.7.2\n2022-09-09 11:54:28,582 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:54:28,582 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:54:28,583 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-09 11:54:28,583 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-09 11:54:28,586 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:54:28,586 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:54:28,587 [Worker-16: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-09 11:56:48,449 [Worker-6: Building] INFO  o.e.m.c.i.l.LifecycleMappingFactory - Using org.eclipse.m2e.jdt.JarLifecycleMapping lifecycle mapping for MavenProject: com.desuperior:dsmeta:0.0.1-SNAPSHOT @ C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\pom.xml.\n2022-09-09 11:56:49,090 [Worker-6: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:56:49,091 [Worker-6: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:56:49,093 [Worker-6: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-09 11:56:49,093 [Worker-6: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-09 11:56:49,096 [Worker-6: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:56:49,096 [Worker-6: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:56:49,096 [Worker-6: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-09 11:57:10,667 [Worker-11: Updating Maven Project] INFO  o.e.m.c.i.p.ProjectConfigurationManager - Update started\n2022-09-09 11:57:10,953 [Worker-11: Updating Maven Project] INFO  o.e.m.c.i.l.LifecycleMappingFactory - Using org.eclipse.m2e.jdt.JarLifecycleMapping lifecycle mapping for MavenProject: com.desuperior:dsmeta:0.0.1-SNAPSHOT @ C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\pom.xml.\n2022-09-09 11:57:11,611 [Worker-11: Updating Maven Project] INFO  o.e.m.j.i.AbstractJavaProjectConfigurator - Adding source folder /backend/src/main/java\n2022-09-09 11:57:11,612 [Worker-11: Updating Maven Project] INFO  o.e.m.j.i.AbstractJavaProjectConfigurator - Adding resource folder /backend/src/main/resources\n2022-09-09 11:57:11,612 [Worker-11: Updating Maven Project] INFO  o.e.m.j.i.AbstractJavaProjectConfigurator - Adding resource folder /backend/src/main/resources\n2022-09-09 11:57:11,613 [Worker-11: Updating Maven Project] INFO  o.e.m.j.i.AbstractJavaProjectConfigurator - Adding source folder /backend/src/test/java\n2022-09-09 11:57:12,020 [Worker-11: Updating Maven Project] INFO  o.e.m.c.i.p.ProjectConfigurationManager - Update completed: 1 sec\n2022-09-09 11:57:12,610 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:57:12,610 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:57:12,611 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-09 11:57:12,628 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-09 11:57:12,633 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-09 11:57:12,633 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-09 11:57:12,634 [Worker-11: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 01:22:56,322 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:22:56,323 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:22:56,326 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:22:56,379 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-10 01:22:56,382 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:22:56,382 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:22:56,382 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 01:22:57,481 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:22:57,481 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:22:57,481 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-10 01:22:57,482 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-10 01:22:57,484 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:22:57,484 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:22:57,485 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 01:23:31,132 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:23:31,132 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:23:31,134 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:23:31,141 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-10 01:23:31,144 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:23:31,144 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:23:31,144 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 01:29:59,511 [Worker-32: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:29:59,511 [Worker-32: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:29:59,513 [Worker-32: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:29:59,523 [Worker-32: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-10 01:29:59,526 [Worker-32: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:29:59,526 [Worker-32: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:29:59,526 [Worker-32: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 01:36:17,116 [Worker-30: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:36:17,116 [Worker-30: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:36:17,118 [Worker-30: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:36:17,128 [Worker-30: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-10 01:36:17,130 [Worker-30: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:36:17,130 [Worker-30: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:36:17,130 [Worker-30: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 01:37:24,629 [Worker-33: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:37:24,629 [Worker-33: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:37:24,631 [Worker-33: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:37:24,641 [Worker-33: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-10 01:37:24,644 [Worker-33: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:37:24,644 [Worker-33: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:37:24,644 [Worker-33: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 01:41:34,124 [Worker-36: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:41:34,124 [Worker-36: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:41:34,126 [Worker-36: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:41:34,132 [Worker-36: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-10 01:41:34,134 [Worker-36: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:41:34,134 [Worker-36: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:41:34,134 [Worker-36: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 01:42:32,871 [Worker-39: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:42:32,872 [Worker-39: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:42:32,878 [Worker-39: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:42:32,885 [Worker-39: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-10 01:42:32,888 [Worker-39: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:42:32,889 [Worker-39: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:42:32,889 [Worker-39: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 01:47:12,525 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:47:12,525 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:47:12,525 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-10 01:47:12,526 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:47:12,531 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:47:12,531 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:47:12,531 [Worker-15: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 01:49:16,792 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:49:16,792 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:49:16,793 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 0 resource\n2022-09-10 01:49:16,794 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:49:16,803 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:49:16,803 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:49:16,803 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 01:53:31,455 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:53:31,456 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:53:31,457 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:53:31,469 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:53:31,472 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:53:31,473 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:53:31,473 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 01:54:57,554 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:54:57,554 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:54:57,556 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:54:57,570 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 01:54:57,573 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 01:54:57,574 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 01:54:57,574 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:00:11,919 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:00:11,919 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:00:11,921 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:00:11,932 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:00:11,936 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:00:11,936 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:00:11,936 [Worker-42: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:02:17,429 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:02:17,430 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:02:17,431 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:02:17,440 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:02:17,443 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:02:17,444 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:02:17,444 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:03:25,084 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:03:25,085 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:03:25,086 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:03:25,094 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:03:25,098 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:03:25,098 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:03:25,098 [Worker-51: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:04:16,011 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:04:16,011 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:04:16,012 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:04:16,020 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:04:16,023 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:04:16,023 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:04:16,023 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:05:01,520 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:05:01,521 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:05:01,523 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:05:01,532 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:05:01,535 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:05:01,535 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:05:01,535 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:05:05,121 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:05:05,121 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:05:05,123 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:05:05,131 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:05:05,134 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:05:05,134 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:05:05,134 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:14:39,649 [Worker-60: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:14:39,650 [Worker-60: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:14:39,651 [Worker-60: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:14:39,661 [Worker-60: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:14:39,664 [Worker-60: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:14:39,664 [Worker-60: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:14:39,664 [Worker-60: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:15:08,291 [Worker-59: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:15:08,291 [Worker-59: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:15:08,293 [Worker-59: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:15:08,303 [Worker-59: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:15:08,306 [Worker-59: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:15:08,306 [Worker-59: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:15:08,306 [Worker-59: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:16:21,128 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:16:21,128 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:16:21,130 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:16:21,140 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:16:21,143 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:16:21,143 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:16:21,143 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:16:24,283 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:16:24,283 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:16:24,284 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:16:24,292 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:16:24,294 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:16:24,295 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:16:24,295 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:19:59,904 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:19:59,904 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:19:59,906 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:19:59,915 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:19:59,918 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:19:59,918 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:19:59,919 [Worker-62: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:22:25,395 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:22:25,395 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:22:25,397 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:22:25,411 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:22:25,414 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:22:25,414 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:22:25,414 [Worker-47: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:23:33,550 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:23:33,551 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:23:33,552 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:23:33,568 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:23:33,571 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:23:33,571 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:23:33,571 [Worker-55: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:23:46,782 [Worker-59: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:23:46,782 [Worker-59: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:23:46,784 [Worker-59: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:23:46,792 [Worker-59: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:23:46,795 [Worker-59: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:23:46,795 [Worker-59: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:23:46,795 [Worker-59: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:26:00,785 [Worker-64: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:26:00,786 [Worker-64: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:26:00,788 [Worker-64: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:26:00,798 [Worker-64: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:26:00,800 [Worker-64: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:26:00,800 [Worker-64: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:26:00,800 [Worker-64: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:26:12,137 [Worker-66: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:26:12,137 [Worker-66: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:26:12,139 [Worker-66: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:26:12,150 [Worker-66: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n2022-09-10 02:26:12,154 [Worker-66: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:26:12,154 [Worker-66: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:26:12,154 [Worker-66: Launching backend - DsmetaApplication] INFO  o.e.m.c.i.embedder.EclipseLogger - skip non existing resourceDirectory C:\\Users\\User\\dev\\projetos_devsuperiorMetas\\dsmetas\\backend\\src\\test\\resources\n2022-09-10 02:37:29,742 [Worker-63: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered resources.\n2022-09-10 02:37:29,743 [Worker-63: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Using 'UTF-8' encoding to copy filtered properties files.\n2022-09-10 02:37:29,744 [Worker-63: Building] INFO  o.e.m.c.i.embedder.EclipseLogger - Copying 1 resource\n"
  },
  {
    "path": "example-logs/example3",
    "content": "2015-04-22 01:46:08.399 [http-bio-8880-exec-2439] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=E621EC9A3144227E7B9A35DF98F1A0CF, ExperienceId=5CEE0119-3B40-4C92-8E90-5D9E52E0DD12]-[order-funnel-instance:browser]-{\"EventName\":\"INITIAL_PRODUCT_OFFER\",\"SessionId\":\"E621EC9A3144227E7B9A35DF98F1A0CF\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"41694fc7-b6ff-4965-bcf3-5bf489b7a431\",\"Logger\":\"AuditController\",\"param_ipAddress\":\"184.166.70.190\",\"param_referer\":\"https://shop.equifax.com/orderfunnel/b6dea8aa-0bf2-44a8-a348-3de4849fe4bb/AB21051B-C677-4CDD-ABD7-47B990CC0A7B/?legacy=PSb15upd02_bplanr&campaign=BPLAN1795&product=PSb15upd02_bplanr&source=equifaxComplete%2FEquifax&mboxSession=1429666888006-441925&s_tnt=282656:1:0\",\"Offer\":\"AB21051B-C677-4CDD-ABD7-47B990CC0A7B\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667168398\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"US Four-Step Legacy Plus, Collect_Wallet_Data page, browser event -\\nInitial Product: BPLAN, Initial Offer: 4.95\",\"param_userAgent\":\"Mozilla/5.0 (iPad; CPU OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12D508 Safari/600.1.4\",\"Locale\":\"English (United States)\",\"EventType\":\"USER_INTERACTION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667168398\",\"Layer\":\"browser\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"param_cartDisplayedOffers\":\"[]\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"5CEE0119-3B40-4C92-8E90-5D9E52E0DD12\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:08.788 [http-bio-8880-exec-2439] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=E621EC9A3144227E7B9A35DF98F1A0CF, ExperienceId=5CEE0119-3B40-4C92-8E90-5D9E52E0DD12]-[order-funnel-instance:browser]-{\"EventName\":\"ORDER_FUNNEL_START\",\"SessionId\":\"E621EC9A3144227E7B9A35DF98F1A0CF\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"2fa606d3-fe5c-4856-b880-24ffbc7666f3\",\"Logger\":\"AuditController\",\"param_ipAddress\":\"184.166.70.190\",\"param_referer\":\"https://shop.equifax.com/orderfunnel/b6dea8aa-0bf2-44a8-a348-3de4849fe4bb/AB21051B-C677-4CDD-ABD7-47B990CC0A7B/?legacy=PSb15upd02_bplanr&campaign=BPLAN1795&product=PSb15upd02_bplanr&source=equifaxComplete%2FEquifax&mboxSession=1429666888006-441925&s_tnt=282656:1:0\",\"Offer\":\"AB21051B-C677-4CDD-ABD7-47B990CC0A7B\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667168787\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"US Four-Step Legacy Plus, step 0. Funnel instance:\\nb6dea8aa-0bf2-44a8-a348-3de4849fe4bb. Offer: AB21051B-C677-4CDD-ABD7-47B990CC0A7B\",\"param_userAgent\":\"Mozilla/5.0 (iPad; CPU OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12D508 Safari/600.1.4\",\"Locale\":\"English (United States)\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667168787\",\"Layer\":\"browser\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"5CEE0119-3B40-4C92-8E90-5D9E52E0DD12\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:23.886 [http-bio-8880-exec-2448] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=9B5CE1A1F9C6EABC088D045C572925C4, ExperienceId=09B2F40E-874D-4EC2-A8C9-DF696C28241B]-[order-funnel-instance:browser]-{\"EventName\":\"ORDER_FUNNEL_SSN_ON_BLUR\",\"SessionId\":\"9B5CE1A1F9C6EABC088D045C572925C4\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"37c14fcf-02aa-44ee-887d-dd7c725b12c7\",\"Logger\":\"AuditController\",\"param_ipAddress\":\"67.83.182.203\",\"param_referer\":\"https://shop.equifax.com/orderfunnel/7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b/E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56/?legacy=W14upd11_uplanr&campaign=UPLAN1995&product=W14upd11_uplanr&source=HomePage&mboxSession=1429666524218-314159&s_tnt=185050:1:0\",\"Offer\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667183885\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"US Four-Step Legacy Plus, Create Account page, browser event -  Focus\\nhas left the input-uid input field.\",\"param_userAgent\":\"Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; MAARJS; rv:11.0) like Gecko\",\"Locale\":\"English (United States)\",\"EventType\":\"USER_INTERACTION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667183886\",\"Layer\":\"browser\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"09B2F40E-874D-4EC2-A8C9-DF696C28241B\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:24.836 [http-bio-8880-exec-2427] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=E621EC9A3144227E7B9A35DF98F1A0CF, ExperienceId=5CEE0119-3B40-4C92-8E90-5D9E52E0DD12]-[workflow-service:rest-client]-{\"EventName\":\"BEGIN\",\"SessionId\":\"E621EC9A3144227E7B9A35DF98F1A0CF\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"65f6c056-8433-461b-a334-90103a4b0096\",\"Logger\":\"WorkflowRestClient\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667184824\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"workflow-service\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667184835\",\"Layer\":\"rest-client\",\"TransactionId\":\"0b441f8b-0ded-4070-8a69-c8931b5975c1\",\"Env\":\"PROD\",\"ConversationId\":\"START_ORDER_FUNNEL_LEGACY_PLUS - initial\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"5CEE0119-3B40-4C92-8E90-5D9E52E0DD12\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"184.166.70.190\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:24.836 [http-bio-8880-exec-2427] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=E621EC9A3144227E7B9A35DF98F1A0CF, ExperienceId=5CEE0119-3B40-4C92-8E90-5D9E52E0DD12]-[workflow-service:rest-client]-{\"EventName\":\"BEGIN\",\"SessionId\":\"E621EC9A3144227E7B9A35DF98F1A0CF\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"65f6c056-8433-461b-a334-90103a4b0096\",\"Logger\":\"WorkflowRestClient\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667184824\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"workflow-service\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667184836\",\"Layer\":\"rest-client\",\"TransactionId\":\"0b441f8b-0ded-4070-8a69-c8931b5975c1\",\"Env\":\"PROD\",\"ConversationId\":\"START_ORDER_FUNNEL_LEGACY_PLUS - initial\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"5CEE0119-3B40-4C92-8E90-5D9E52E0DD12\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"184.166.70.190\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:25.145 [http-bio-8880-exec-2427] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=E621EC9A3144227E7B9A35DF98F1A0CF, ExperienceId=5CEE0119-3B40-4C92-8E90-5D9E52E0DD12]-[workflow-service:rest-client]-{\"EventName\":\"BEGIN\",\"SessionId\":\"E621EC9A3144227E7B9A35DF98F1A0CF\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"65f6c056-8433-461b-a334-90103a4b0096\",\"Logger\":\"WorkflowRestClient\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667184824\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"workflow-service\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667185145\",\"Layer\":\"rest-client\",\"TransactionId\":\"0b441f8b-0ded-4070-8a69-c8931b5975c1\",\"Env\":\"PROD\",\"ConversationId\":\"START_ORDER_FUNNEL_LEGACY_PLUS - initial\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"5CEE0119-3B40-4C92-8E90-5D9E52E0DD12\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"184.166.70.190\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:25.151 [http-bio-8880-exec-2427] ERROR org.apache.velocity.runtime.log.Log4JLogChute-[SessionId=E621EC9A3144227E7B9A35DF98F1A0CF, ExperienceId=5CEE0119-3B40-4C92-8E90-5D9E52E0DD12]-[]-Left side ($Integer.parseInt($duration)) of '>' operation has null value at logTag[line 1, column 373]\n2015-04-22 01:46:25.152 [http-bio-8880-exec-2427] ERROR org.apache.velocity.runtime.log.Log4JLogChute-[SessionId=E621EC9A3144227E7B9A35DF98F1A0CF, ExperienceId=5CEE0119-3B40-4C92-8E90-5D9E52E0DD12]-[]-Left side ($Integer.parseInt($duration)) of '>' operation has null value at logTag[line 1, column 373]\n2015-04-22 01:46:25.155 [http-bio-8880-exec-2427] ERROR org.apache.velocity.runtime.log.Log4JLogChute-[SessionId=E621EC9A3144227E7B9A35DF98F1A0CF, ExperienceId=5CEE0119-3B40-4C92-8E90-5D9E52E0DD12]-[]-Left side ($Integer.parseInt($duration)) of '>' operation has null value at logTag[line 1, column 373]\n2015-04-22 01:46:25.157 [http-bio-8880-exec-2427] ERROR org.apache.velocity.runtime.log.Log4JLogChute-[SessionId=E621EC9A3144227E7B9A35DF98F1A0CF, ExperienceId=5CEE0119-3B40-4C92-8E90-5D9E52E0DD12]-[]-Left side ($Integer.parseInt($duration)) of '>' operation has null value at logTag[line 1, column 373]\n2015-04-22 01:46:25.158 [http-bio-8880-exec-2427] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=E621EC9A3144227E7B9A35DF98F1A0CF, ExperienceId=5CEE0119-3B40-4C92-8E90-5D9E52E0DD12]-[order-funnel:substrate]-{\"EventName\":\"ORDER_FUNNEL_PAGE_CHANGE\",\"SessionId\":\"E621EC9A3144227E7B9A35DF98F1A0CF\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"Web\",\"UserAgent\":\"Mozilla/5.0 (iPad; CPU OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12D508 Safari/600.1.4\",\"EventId\":\"8e5e3482-245a-4e53-9506-bf4e6d176e7d\",\"param_ChangeEndOrderContext\":\"<xml-fragment xmlns:ns=\\\"http://ns.equifax.com/workflow/operations/1.0\\\"><ns1:businessKey xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">efa74269-9777-4b49-8bc5-8a8fee2bce3e</ns1:businessKey><ns1:activeTaskName xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">Collect_Wallet_Data</ns1:activeTaskName><ns1:namespace xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">workflow</ns1:namespace><ns1:version xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">2.0</ns1:version><ns1:activeTaskId xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">5217128</ns1:activeTaskId><ns1:activeTaskAssignee xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">UI</ns1:activeTaskAssignee><ns1:correlationId xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">5217086</ns1:correlationId></xml-fragment>\",\"Logger\":\"OrderfunnelProcessController\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"param_CSC\":\"PSb15upd02\",\"param_InstanceGuid\":\"b6dea8aa-0bf2-44a8-a348-3de4849fe4bb\",\"param_ChangeEndStep\":\"Collect_Wallet_Data\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667185158\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"param_ChangeStartStep\":\"BEGIN\",\"Domain\":\"order-funnel\",\"Product\":\"AB21051B-C677-4CDD-ABD7-47B990CC0A7B\",\"Machine\":\"aptp2lc9a001\",\"param_Extrinsics\":\"{product=PSb15upd02_bplanr, EXPERIENCE_ID=5CEE0119-3B40-4C92-8E90-5D9E52E0DD12, source=equifaxComplete/Equifax, mboxSession=1429666888006-441925, campaign=BPLAN1795, s_tnt=282656:1:0#/personal-information, legacy=PSb15upd02_bplanr}\",\"param_LegacyParam\":\"PSb15upd02_bplanr\",\"param_TemplateName\":\"USLegacyPlusTemplate\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667185158\",\"Layer\":\"substrate\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"param_ChangeEndStatus\":\"WAITING\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"184.166.70.190\",\"param_ChangeStartOrderContext\":\"BEGIN\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:25.373 [http-bio-8880-exec-2422] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=E621EC9A3144227E7B9A35DF98F1A0CF, ExperienceId=5CEE0119-3B40-4C92-8E90-5D9E52E0DD12]-[order-funnel-instance:browser]-{\"EventName\":\"INITIAL_PRODUCT_OFFER\",\"SessionId\":\"E621EC9A3144227E7B9A35DF98F1A0CF\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"9a8d7342-369c-4dfa-b5ad-be8065028b6f\",\"Logger\":\"AuditController\",\"param_ipAddress\":\"184.166.70.190\",\"param_referer\":\"https://shop.equifax.com/orderfunnel/b6dea8aa-0bf2-44a8-a348-3de4849fe4bb/AB21051B-C677-4CDD-ABD7-47B990CC0A7B/?legacy=PSb15upd02_bplanr&campaign=BPLAN1795&product=PSb15upd02_bplanr&source=equifaxComplete%2FEquifax&mboxSession=1429666888006-441925&s_tnt=282656:1:0\",\"Offer\":\"AB21051B-C677-4CDD-ABD7-47B990CC0A7B\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667185373\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"US Four-Step Legacy Plus, Collect_Wallet_Data page, browser event -\\nInitial Product: BPLAN, Initial Offer: 4.95\",\"param_userAgent\":\"Mozilla/5.0 (iPad; CPU OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12D508 Safari/600.1.4\",\"Locale\":\"English (United States)\",\"EventType\":\"USER_INTERACTION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667185373\",\"Layer\":\"browser\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"param_cartDisplayedOffers\":\"[]\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"5CEE0119-3B40-4C92-8E90-5D9E52E0DD12\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:52.687 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=]-[aof-instance:substrate-service]-{\"EventName\":\"FIND_INSTANCE_BY_GUID\",\"SessionId\":\"A0A36888E9042D2E72A16E1DE4065F89\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"Service\",\"UserAgent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\",\"EventId\":\"dda90300-4640-4111-8750-efd01f184df7\",\"Logger\":\"OrdefunnelInstanceResolverImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667212687\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"aof-instance\",\"Product\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667212687\",\"Layer\":\"substrate-service\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"EndTime\":\"1429667212687\",\"RemoteAddress\":\"181.188.111.98\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:52.699 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"A0A36888E9042D2E72A16E1DE4065F89\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"abf2fb36-790f-476e-bbaa-bdb23d4072be\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667212688\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667212698\",\"Layer\":\"service-client\",\"TransactionId\":\"b1b64243-0c5a-47e5-9ca8-9f7a235637a2\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"181.188.111.98\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:52.699 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"A0A36888E9042D2E72A16E1DE4065F89\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"abf2fb36-790f-476e-bbaa-bdb23d4072be\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667212688\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667212699\",\"Layer\":\"service-client\",\"TransactionId\":\"b1b64243-0c5a-47e5-9ca8-9f7a235637a2\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"181.188.111.98\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:52.723 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"A0A36888E9042D2E72A16E1DE4065F89\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"abf2fb36-790f-476e-bbaa-bdb23d4072be\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667212688\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667212723\",\"Layer\":\"service-client\",\"TransactionId\":\"b1b64243-0c5a-47e5-9ca8-9f7a235637a2\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"181.188.111.98\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:52.725 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=]-[aof-instance:substrate-service]-{\"EventName\":\"FIND_INSTANCE_BY_GUID\",\"SessionId\":\"A0A36888E9042D2E72A16E1DE4065F89\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"Service\",\"UserAgent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\",\"EventId\":\"dda90300-4640-4111-8750-efd01f184df7\",\"Logger\":\"OrdefunnelInstanceResolverImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667212687\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"aof-instance\",\"Product\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667212724\",\"Layer\":\"substrate-service\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"EndTime\":\"1429667212724\",\"RemoteAddress\":\"181.188.111.98\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:52.729 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=]-[order-funnel:substrate]-{\"EventName\":\"ORDER_FUNNEL_START\",\"SessionId\":\"A0A36888E9042D2E72A16E1DE4065F89\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"Web\",\"param_FunnelInitContext\":\"guid: 7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b template: USLegacyPlusTemplate  lastUpdate: null\",\"UserAgent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\",\"EventId\":\"2966e501-f6cc-4b98-beba-b2fb04dfb439\",\"Logger\":\"OrderfunnelInstanceController\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"param_CSC\":\"W14upd11\",\"param_InstanceGuid\":\"7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667212728\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"order-funnel\",\"Product\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"Machine\":\"aptp2lc9a001\",\"param_Extrinsics\":\"{product=W14upd11_uplanr, EXPERIENCE_ID=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B, source=HomePage, mboxSession=1429667153917-16609, campaign=UPLAN1995, s_tnt=185050:1:0#/personal-information, legacy=W14upd11_uplanr}\",\"param_LegacyParam\":\"W14upd11_uplanr\",\"param_TemplateName\":\"USLegacyPlusTemplate\",\"param_PropositionUrl\":\"http://shop.equifax.com/orderfunnel/US/7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b/E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56/?legacy=W14upd11_uplanr&campaign=UPLAN1995&product=W14upd11_uplanr&source=HomePage&mboxSession=1429667153917-16609&s_tnt=185050:1:0#/personal-information\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667212728\",\"Layer\":\"substrate\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"181.188.111.98\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:54.009 [http-bio-8880-exec-2423] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"ba9fa2e7-55e4-49e8-b482-d3510f980531\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667213997\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667214008\",\"Layer\":\"service-client\",\"TransactionId\":\"6313cfbb-efa9-487d-8dd5-9c5bbc02c843\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:54.009 [http-bio-8880-exec-2423] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"ba9fa2e7-55e4-49e8-b482-d3510f980531\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667213997\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667214009\",\"Layer\":\"service-client\",\"TransactionId\":\"6313cfbb-efa9-487d-8dd5-9c5bbc02c843\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:54.035 [http-bio-8880-exec-2423] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"ba9fa2e7-55e4-49e8-b482-d3510f980531\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667213997\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667214034\",\"Layer\":\"service-client\",\"TransactionId\":\"6313cfbb-efa9-487d-8dd5-9c5bbc02c843\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:54.047 [http-bio-8880-exec-2423] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-management:service-client]-{\"EventName\":\"ORDER_MANAGEMENT_GET_PRODUCT_OFFER_SET\",\"SessionId\":\"unknown\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"9b18611f-a3fa-436f-9bad-6f4994b921ed\",\"Logger\":\"OrderManagementRestClientImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667214036\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-management\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"getProductOfferSet\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667214046\",\"Layer\":\"service-client\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:54.047 [http-bio-8880-exec-2423] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-management:service-client]-{\"EventName\":\"ORDER_MANAGEMENT_GET_PRODUCT_OFFER_SET\",\"SessionId\":\"unknown\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"9b18611f-a3fa-436f-9bad-6f4994b921ed\",\"Logger\":\"OrderManagementRestClientImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667214036\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-management\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"getProductOfferSet\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667214047\",\"Layer\":\"service-client\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:54.068 [http-bio-8880-exec-2423] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-management:service-client]-{\"EventName\":\"ORDER_MANAGEMENT_GET_PRODUCT_OFFER_SET\",\"SessionId\":\"unknown\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"9b18611f-a3fa-436f-9bad-6f4994b921ed\",\"Logger\":\"OrderManagementRestClientImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667214036\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-management\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"getProductOfferSet\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667214067\",\"Layer\":\"service-client\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:54.079 [http-bio-8880-exec-2423] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"ff7634e1-0922-427c-b399-9e73c9e9e594\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667214069\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667214079\",\"Layer\":\"service-client\",\"TransactionId\":\"445f1d8a-2bf9-4512-baaf-e6778d3337e9\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:54.080 [http-bio-8880-exec-2423] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"ff7634e1-0922-427c-b399-9e73c9e9e594\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667214069\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667214080\",\"Layer\":\"service-client\",\"TransactionId\":\"445f1d8a-2bf9-4512-baaf-e6778d3337e9\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:54.113 [http-bio-8880-exec-2423] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"ff7634e1-0922-427c-b399-9e73c9e9e594\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667214069\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667214113\",\"Layer\":\"service-client\",\"TransactionId\":\"445f1d8a-2bf9-4512-baaf-e6778d3337e9\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:54.125 [http-bio-8880-exec-2423] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-management:service-client]-{\"EventName\":\"ORDER_MANAGEMENT_GET_PRODUCT_OFFER_SET\",\"SessionId\":\"unknown\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"36ee3412-8f63-4eb6-9531-6f61d659a1ff\",\"Logger\":\"OrderManagementRestClientImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667214114\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-management\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"getProductOfferSet\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667214124\",\"Layer\":\"service-client\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:54.125 [http-bio-8880-exec-2423] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-management:service-client]-{\"EventName\":\"ORDER_MANAGEMENT_GET_PRODUCT_OFFER_SET\",\"SessionId\":\"unknown\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"36ee3412-8f63-4eb6-9531-6f61d659a1ff\",\"Logger\":\"OrderManagementRestClientImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667214114\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-management\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"getProductOfferSet\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667214125\",\"Layer\":\"service-client\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:54.157 [http-bio-8880-exec-2423] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-management:service-client]-{\"EventName\":\"ORDER_MANAGEMENT_GET_PRODUCT_OFFER_SET\",\"SessionId\":\"unknown\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"36ee3412-8f63-4eb6-9531-6f61d659a1ff\",\"Logger\":\"OrderManagementRestClientImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667214114\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-management\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"getProductOfferSet\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667214157\",\"Layer\":\"service-client\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:57.034 [http-bio-8880-exec-2452] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[workflow-service:rest-client]-{\"EventName\":\"BEGIN\",\"SessionId\":\"A0A36888E9042D2E72A16E1DE4065F89\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"7e7b4c74-a333-4a83-aecf-2d39a91b7da5\",\"Logger\":\"WorkflowRestClient\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667217023\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"workflow-service\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667217034\",\"Layer\":\"rest-client\",\"TransactionId\":\"8ac61172-c30a-4112-ac0b-b6d49cea311d\",\"Env\":\"PROD\",\"ConversationId\":\"START_ORDER_FUNNEL_LEGACY_PLUS - initial\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"181.188.111.98\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:57.036 [http-bio-8880-exec-2452] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[workflow-service:rest-client]-{\"EventName\":\"BEGIN\",\"SessionId\":\"A0A36888E9042D2E72A16E1DE4065F89\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"7e7b4c74-a333-4a83-aecf-2d39a91b7da5\",\"Logger\":\"WorkflowRestClient\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667217023\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"workflow-service\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667217034\",\"Layer\":\"rest-client\",\"TransactionId\":\"8ac61172-c30a-4112-ac0b-b6d49cea311d\",\"Env\":\"PROD\",\"ConversationId\":\"START_ORDER_FUNNEL_LEGACY_PLUS - initial\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"181.188.111.98\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:57.275 [http-bio-8880-exec-2452] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[workflow-service:rest-client]-{\"EventName\":\"BEGIN\",\"SessionId\":\"A0A36888E9042D2E72A16E1DE4065F89\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"7e7b4c74-a333-4a83-aecf-2d39a91b7da5\",\"Logger\":\"WorkflowRestClient\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667217023\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"workflow-service\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667217275\",\"Layer\":\"rest-client\",\"TransactionId\":\"8ac61172-c30a-4112-ac0b-b6d49cea311d\",\"Env\":\"PROD\",\"ConversationId\":\"START_ORDER_FUNNEL_LEGACY_PLUS - initial\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"181.188.111.98\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:57.281 [http-bio-8880-exec-2452] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-funnel:substrate]-{\"EventName\":\"ORDER_FUNNEL_PAGE_CHANGE\",\"SessionId\":\"A0A36888E9042D2E72A16E1DE4065F89\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"Web\",\"UserAgent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\",\"EventId\":\"5ad95d51-110b-46b3-a5bf-a4fefeb624a3\",\"param_ChangeEndOrderContext\":\"<xml-fragment xmlns:ns=\\\"http://ns.equifax.com/workflow/operations/1.0\\\"><ns1:businessKey xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">84a47e2e-e76b-41fd-a1e7-f43e2c0a4fb9</ns1:businessKey><ns1:activeTaskName xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">Collect_Wallet_Data</ns1:activeTaskName><ns1:namespace xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">workflow</ns1:namespace><ns1:version xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">2.0</ns1:version><ns1:activeTaskId xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">5217177</ns1:activeTaskId><ns1:activeTaskAssignee xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">UI</ns1:activeTaskAssignee><ns1:correlationId xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">5217135</ns1:correlationId></xml-fragment>\",\"Logger\":\"OrderfunnelProcessController\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"param_CSC\":\"W14upd11\",\"param_InstanceGuid\":\"7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b\",\"param_ChangeEndStep\":\"Collect_Wallet_Data\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667217281\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"param_ChangeStartStep\":\"BEGIN\",\"Domain\":\"order-funnel\",\"Product\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"Machine\":\"aptp2lc9a001\",\"param_Extrinsics\":\"{product=W14upd11_uplanr, EXPERIENCE_ID=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B, source=HomePage, mboxSession=1429667153917-16609, campaign=UPLAN1995, s_tnt=185050:1:0#/personal-information, legacy=W14upd11_uplanr}\",\"param_LegacyParam\":\"W14upd11_uplanr\",\"param_TemplateName\":\"USLegacyPlusTemplate\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667217281\",\"Layer\":\"substrate\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"param_ChangeEndStatus\":\"WAITING\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"181.188.111.98\",\"param_ChangeStartOrderContext\":\"BEGIN\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:57.867 [http-bio-8880-exec-2420] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-funnel-instance:browser]-{\"EventName\":\"ORDER_FUNNEL_START\",\"SessionId\":\"A0A36888E9042D2E72A16E1DE4065F89\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"e01d1f4a-8286-452e-84b4-4716b43dda29\",\"Logger\":\"AuditController\",\"param_ipAddress\":\"181.188.111.98\",\"param_referer\":\"https://shop.equifax.com/orderfunnel/7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b/E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56/?legacy=W14upd11_uplanr&campaign=UPLAN1995&product=W14upd11_uplanr&source=HomePage&mboxSession=1429667153917-16609&s_tnt=185050:1:0\",\"Offer\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667217866\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"US Four-Step Legacy Plus, step 0. Funnel instance:\\n7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b. Offer: E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"param_userAgent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\",\"Locale\":\"English (United States)\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667217866\",\"Layer\":\"browser\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:46:57.868 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=A0A36888E9042D2E72A16E1DE4065F89, ExperienceId=1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B]-[order-funnel-instance:browser]-{\"EventName\":\"INITIAL_PRODUCT_OFFER\",\"SessionId\":\"A0A36888E9042D2E72A16E1DE4065F89\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"c342aa0e-e4d5-4dc6-9f8f-a82b381f1148\",\"Logger\":\"AuditController\",\"param_ipAddress\":\"181.188.111.98\",\"param_referer\":\"https://shop.equifax.com/orderfunnel/7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b/E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56/?legacy=W14upd11_uplanr&campaign=UPLAN1995&product=W14upd11_uplanr&source=HomePage&mboxSession=1429667153917-16609&s_tnt=185050:1:0\",\"Offer\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667217868\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"US Four-Step Legacy Plus, Collect_Wallet_Data page, browser event -\\nInitial Product: UPLAN, Initial Offer: 19.95\",\"param_userAgent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\",\"Locale\":\"English (United States)\",\"EventType\":\"USER_INTERACTION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667217868\",\"Layer\":\"browser\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"param_cartDisplayedOffers\":\"[]\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"1C7A99BA-ABDD-4A4D-BD11-44EAAB548C0B\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:47:07.185 [http-bio-8880-exec-2437] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=2F9089F20D940E85422CC7F8AD338BE0, ExperienceId=]-[aof-instance:substrate-service]-{\"EventName\":\"FIND_INSTANCE_BY_GUID\",\"SessionId\":\"2F9089F20D940E85422CC7F8AD338BE0\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"Service\",\"UserAgent\":\"Wget/1.11.4\",\"EventId\":\"ffc5013e-305a-44df-802d-49afe989b28b\",\"Logger\":\"OrdefunnelInstanceResolverImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667227185\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"aof-instance\",\"Product\":\"C7B4477E-4CCB-41F2-AB14-4F6B76372412\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667227185\",\"Layer\":\"substrate-service\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"EndTime\":\"1429667227185\",\"RemoteAddress\":\"172.25.28.35\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:47:07.197 [http-bio-8880-exec-2437] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=2F9089F20D940E85422CC7F8AD338BE0, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"2F9089F20D940E85422CC7F8AD338BE0\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"ee2adfa5-8751-42c4-81ae-df72f2853d21\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667227185\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667227196\",\"Layer\":\"service-client\",\"TransactionId\":\"a400cfdb-333b-4687-b4e2-fcad0ac3f9a7\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"172.25.28.35\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:47:07.197 [http-bio-8880-exec-2437] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=2F9089F20D940E85422CC7F8AD338BE0, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"2F9089F20D940E85422CC7F8AD338BE0\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"ee2adfa5-8751-42c4-81ae-df72f2853d21\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667227185\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667227197\",\"Layer\":\"service-client\",\"TransactionId\":\"a400cfdb-333b-4687-b4e2-fcad0ac3f9a7\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"172.25.28.35\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:47:07.225 [http-bio-8880-exec-2437] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=2F9089F20D940E85422CC7F8AD338BE0, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"2F9089F20D940E85422CC7F8AD338BE0\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"ee2adfa5-8751-42c4-81ae-df72f2853d21\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667227185\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667227224\",\"Layer\":\"service-client\",\"TransactionId\":\"a400cfdb-333b-4687-b4e2-fcad0ac3f9a7\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"172.25.28.35\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:47:07.226 [http-bio-8880-exec-2437] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=2F9089F20D940E85422CC7F8AD338BE0, ExperienceId=]-[aof-instance:substrate-service]-{\"EventName\":\"FIND_INSTANCE_BY_GUID\",\"SessionId\":\"2F9089F20D940E85422CC7F8AD338BE0\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"Service\",\"UserAgent\":\"Wget/1.11.4\",\"EventId\":\"ffc5013e-305a-44df-802d-49afe989b28b\",\"Logger\":\"OrdefunnelInstanceResolverImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667227185\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"aof-instance\",\"Product\":\"C7B4477E-4CCB-41F2-AB14-4F6B76372412\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667227225\",\"Layer\":\"substrate-service\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"EndTime\":\"1429667227225\",\"RemoteAddress\":\"172.25.28.35\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:47:07.230 [http-bio-8880-exec-2437] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=2F9089F20D940E85422CC7F8AD338BE0, ExperienceId=]-[order-funnel:substrate]-{\"EventName\":\"ORDER_FUNNEL_START\",\"SessionId\":\"2F9089F20D940E85422CC7F8AD338BE0\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"Web\",\"param_FunnelInitContext\":\"guid: f1180768-373f-41ae-b42d-d0c81f0aeb39 template: USFourStepTemplate  lastUpdate: null\",\"UserAgent\":\"Wget/1.11.4\",\"EventId\":\"2dd641b0-027c-4bfd-ab9d-f5ba6630c6fb\",\"Logger\":\"OrderfunnelInstanceController\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"param_InstanceGuid\":\"f1180768-373f-41ae-b42d-d0c81f0aeb39\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667227229\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"order-funnel\",\"Product\":\"C7B4477E-4CCB-41F2-AB14-4F6B76372412\",\"Machine\":\"aptp2lc9a001\",\"param_Extrinsics\":\"{EXPERIENCE_ID=70A3636C-7DA0-47AC-81ED-78D308B8B7F2}\",\"param_TemplateName\":\"USFourStepTemplate\",\"param_PropositionUrl\":\"http://aptp2lc9a001.app.c9.equifax.com:8880/orderfunnel/US/f1180768-373f-41ae-b42d-d0c81f0aeb39/C7B4477E-4CCB-41F2-AB14-4F6B76372412/\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667227229\",\"Layer\":\"substrate\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"172.25.28.35\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:07.318 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=DDDE230A48A3E17C3649D68936F97FDB, ExperienceId=]-[aof-instance:substrate-service]-{\"EventName\":\"FIND_INSTANCE_BY_GUID\",\"SessionId\":\"DDDE230A48A3E17C3649D68936F97FDB\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"Service\",\"UserAgent\":\"Wget/1.11.4\",\"EventId\":\"a74a3760-168f-4c96-ac48-74a08d6b75d8\",\"Logger\":\"OrdefunnelInstanceResolverImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667287317\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"aof-instance\",\"Product\":\"C7B4477E-4CCB-41F2-AB14-4F6B76372412\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667287317\",\"Layer\":\"substrate-service\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"EndTime\":\"1429667287317\",\"RemoteAddress\":\"172.25.28.35\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:07.329 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=DDDE230A48A3E17C3649D68936F97FDB, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"DDDE230A48A3E17C3649D68936F97FDB\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"a34f0262-90f8-4d54-96ab-02fa1b6a8e8b\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667287318\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667287329\",\"Layer\":\"service-client\",\"TransactionId\":\"9010d943-e6b4-49b1-9e0a-1df8326d6be0\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"172.25.28.35\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:07.330 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=DDDE230A48A3E17C3649D68936F97FDB, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"DDDE230A48A3E17C3649D68936F97FDB\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"a34f0262-90f8-4d54-96ab-02fa1b6a8e8b\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667287318\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667287329\",\"Layer\":\"service-client\",\"TransactionId\":\"9010d943-e6b4-49b1-9e0a-1df8326d6be0\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"172.25.28.35\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:07.357 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=DDDE230A48A3E17C3649D68936F97FDB, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"DDDE230A48A3E17C3649D68936F97FDB\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"a34f0262-90f8-4d54-96ab-02fa1b6a8e8b\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667287318\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667287357\",\"Layer\":\"service-client\",\"TransactionId\":\"9010d943-e6b4-49b1-9e0a-1df8326d6be0\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"172.25.28.35\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:07.358 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=DDDE230A48A3E17C3649D68936F97FDB, ExperienceId=]-[aof-instance:substrate-service]-{\"EventName\":\"FIND_INSTANCE_BY_GUID\",\"SessionId\":\"DDDE230A48A3E17C3649D68936F97FDB\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"Service\",\"UserAgent\":\"Wget/1.11.4\",\"EventId\":\"a74a3760-168f-4c96-ac48-74a08d6b75d8\",\"Logger\":\"OrdefunnelInstanceResolverImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667287317\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"aof-instance\",\"Product\":\"C7B4477E-4CCB-41F2-AB14-4F6B76372412\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667287358\",\"Layer\":\"substrate-service\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"EndTime\":\"1429667287358\",\"RemoteAddress\":\"172.25.28.35\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:07.362 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=DDDE230A48A3E17C3649D68936F97FDB, ExperienceId=]-[order-funnel:substrate]-{\"EventName\":\"ORDER_FUNNEL_START\",\"SessionId\":\"DDDE230A48A3E17C3649D68936F97FDB\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"Web\",\"param_FunnelInitContext\":\"guid: f1180768-373f-41ae-b42d-d0c81f0aeb39 template: USFourStepTemplate  lastUpdate: null\",\"UserAgent\":\"Wget/1.11.4\",\"EventId\":\"2a1f7041-d283-42e0-a4d2-6aeb435702d5\",\"Logger\":\"OrderfunnelInstanceController\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"param_InstanceGuid\":\"f1180768-373f-41ae-b42d-d0c81f0aeb39\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667287362\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"order-funnel\",\"Product\":\"C7B4477E-4CCB-41F2-AB14-4F6B76372412\",\"Machine\":\"aptp2lc9a001\",\"param_Extrinsics\":\"{EXPERIENCE_ID=C3998066-1648-40C3-A48E-3396FA4DD075}\",\"param_TemplateName\":\"USFourStepTemplate\",\"param_PropositionUrl\":\"http://aptp2lc9a001.app.c9.equifax.com:8880/orderfunnel/US/f1180768-373f-41ae-b42d-d0c81f0aeb39/C7B4477E-4CCB-41F2-AB14-4F6B76372412/\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667287362\",\"Layer\":\"substrate\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"172.25.28.35\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:54.985 [http-bio-8880-exec-2448] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=]-[aof-instance:substrate-service]-{\"EventName\":\"FIND_INSTANCE_BY_GUID\",\"SessionId\":\"943A59749B3AD868435411680B0B6F82\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"Service\",\"UserAgent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\",\"EventId\":\"41a7e8a4-198e-40c5-acc3-b5a87cbd0e94\",\"Logger\":\"OrdefunnelInstanceResolverImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667334984\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"aof-instance\",\"Product\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667334984\",\"Layer\":\"substrate-service\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"EndTime\":\"1429667334984\",\"RemoteAddress\":\"71.75.35.207\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:54.996 [http-bio-8880-exec-2448] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"943A59749B3AD868435411680B0B6F82\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"2eb09fea-2565-4cd2-abfe-f74e15183a3d\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667334985\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667334996\",\"Layer\":\"service-client\",\"TransactionId\":\"0de210e0-4891-4139-beba-46f18fa790ea\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"71.75.35.207\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:54.997 [http-bio-8880-exec-2448] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"943A59749B3AD868435411680B0B6F82\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"2eb09fea-2565-4cd2-abfe-f74e15183a3d\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667334985\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667334997\",\"Layer\":\"service-client\",\"TransactionId\":\"0de210e0-4891-4139-beba-46f18fa790ea\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"71.75.35.207\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.024 [http-bio-8880-exec-2448] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"943A59749B3AD868435411680B0B6F82\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"2eb09fea-2565-4cd2-abfe-f74e15183a3d\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667334985\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335023\",\"Layer\":\"service-client\",\"TransactionId\":\"0de210e0-4891-4139-beba-46f18fa790ea\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"71.75.35.207\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.024 [http-bio-8880-exec-2448] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=]-[aof-instance:substrate-service]-{\"EventName\":\"FIND_INSTANCE_BY_GUID\",\"SessionId\":\"943A59749B3AD868435411680B0B6F82\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"Service\",\"UserAgent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\",\"EventId\":\"41a7e8a4-198e-40c5-acc3-b5a87cbd0e94\",\"Logger\":\"OrdefunnelInstanceResolverImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667334984\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"aof-instance\",\"Product\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335024\",\"Layer\":\"substrate-service\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"EndTime\":\"1429667335024\",\"RemoteAddress\":\"71.75.35.207\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.028 [http-bio-8880-exec-2448] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=]-[order-funnel:substrate]-{\"EventName\":\"ORDER_FUNNEL_START\",\"SessionId\":\"943A59749B3AD868435411680B0B6F82\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"Web\",\"param_FunnelInitContext\":\"guid: 7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b template: USLegacyPlusTemplate  lastUpdate: null\",\"UserAgent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\",\"EventId\":\"43992979-6490-46bf-a5fd-54b2dbe9363f\",\"Logger\":\"OrderfunnelInstanceController\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"param_CSC\":\"W14upd11\",\"param_InstanceGuid\":\"7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667335028\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"order-funnel\",\"Product\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"Machine\":\"aptp2lc9a001\",\"param_Extrinsics\":\"{product=W14upd11_uplanr, EXPERIENCE_ID=DDBA4216-0128-450C-9F9F-39FD59D79BE4, source=HomePage, mboxSession=1429666112700-901115, campaign=UPLAN1995, s_tnt=185050:1:0#/personal-information, legacy=W14upd11_uplanr}\",\"param_LegacyParam\":\"W14upd11_uplanr\",\"param_TemplateName\":\"USLegacyPlusTemplate\",\"param_PropositionUrl\":\"http://shop.equifax.com/orderfunnel/US/7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b/E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56/?legacy=W14upd11_uplanr&campaign=UPLAN1995&product=W14upd11_uplanr&source=HomePage&mboxSession=1429666112700-901115&s_tnt=185050:1:0#/personal-information\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335028\",\"Layer\":\"substrate\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"71.75.35.207\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.400 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"13567e0a-5e3f-4108-9d9b-824e461ede78\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667335389\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335399\",\"Layer\":\"service-client\",\"TransactionId\":\"767504bc-f50b-4935-8c12-6e04a9130f83\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.400 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"13567e0a-5e3f-4108-9d9b-824e461ede78\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667335389\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335400\",\"Layer\":\"service-client\",\"TransactionId\":\"767504bc-f50b-4935-8c12-6e04a9130f83\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.425 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"13567e0a-5e3f-4108-9d9b-824e461ede78\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667335389\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335425\",\"Layer\":\"service-client\",\"TransactionId\":\"767504bc-f50b-4935-8c12-6e04a9130f83\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.437 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-management:service-client]-{\"EventName\":\"ORDER_MANAGEMENT_GET_PRODUCT_OFFER_SET\",\"SessionId\":\"unknown\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"ae962b10-2f8f-4338-9a2d-00f4e579f129\",\"Logger\":\"OrderManagementRestClientImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667335426\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-management\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"getProductOfferSet\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335436\",\"Layer\":\"service-client\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.437 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-management:service-client]-{\"EventName\":\"ORDER_MANAGEMENT_GET_PRODUCT_OFFER_SET\",\"SessionId\":\"unknown\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"ae962b10-2f8f-4338-9a2d-00f4e579f129\",\"Logger\":\"OrderManagementRestClientImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667335426\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-management\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"getProductOfferSet\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335437\",\"Layer\":\"service-client\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.459 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-management:service-client]-{\"EventName\":\"ORDER_MANAGEMENT_GET_PRODUCT_OFFER_SET\",\"SessionId\":\"unknown\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"ae962b10-2f8f-4338-9a2d-00f4e579f129\",\"Logger\":\"OrderManagementRestClientImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667335426\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-management\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"getProductOfferSet\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335458\",\"Layer\":\"service-client\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.477 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"3d492350-c8f7-48c0-bb35-5219b210a2ca\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667335461\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335477\",\"Layer\":\"service-client\",\"TransactionId\":\"10cd20d2-c879-4bd8-add6-26d5d20eb239\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.478 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"3d492350-c8f7-48c0-bb35-5219b210a2ca\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667335461\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335477\",\"Layer\":\"service-client\",\"TransactionId\":\"10cd20d2-c879-4bd8-add6-26d5d20eb239\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.510 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"3d492350-c8f7-48c0-bb35-5219b210a2ca\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667335461\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335509\",\"Layer\":\"service-client\",\"TransactionId\":\"10cd20d2-c879-4bd8-add6-26d5d20eb239\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.523 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-management:service-client]-{\"EventName\":\"ORDER_MANAGEMENT_GET_PRODUCT_OFFER_SET\",\"SessionId\":\"unknown\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"cbefce23-1307-44b1-b423-e8c3984ee271\",\"Logger\":\"OrderManagementRestClientImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667335511\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-management\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"getProductOfferSet\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335522\",\"Layer\":\"service-client\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.523 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-management:service-client]-{\"EventName\":\"ORDER_MANAGEMENT_GET_PRODUCT_OFFER_SET\",\"SessionId\":\"unknown\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"cbefce23-1307-44b1-b423-e8c3984ee271\",\"Logger\":\"OrderManagementRestClientImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667335511\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-management\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"getProductOfferSet\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335523\",\"Layer\":\"service-client\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:55.544 [http-bio-8880-exec-2450] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-management:service-client]-{\"EventName\":\"ORDER_MANAGEMENT_GET_PRODUCT_OFFER_SET\",\"SessionId\":\"unknown\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"cbefce23-1307-44b1-b423-e8c3984ee271\",\"Logger\":\"OrderManagementRestClientImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667335511\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-management\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"getProductOfferSet\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667335544\",\"Layer\":\"service-client\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:56.496 [http-bio-8880-exec-2447] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[workflow-service:rest-client]-{\"EventName\":\"BEGIN\",\"SessionId\":\"943A59749B3AD868435411680B0B6F82\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"c603b9c2-f477-40b3-99f6-ceb35dd2fd67\",\"Logger\":\"WorkflowRestClient\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667336485\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"workflow-service\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667336495\",\"Layer\":\"rest-client\",\"TransactionId\":\"22eae94f-e1f8-4c74-a8c6-629510cc11bc\",\"Env\":\"PROD\",\"ConversationId\":\"START_ORDER_FUNNEL_LEGACY_PLUS - initial\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"DDBA4216-0128-450C-9F9F-39FD59D79BE4\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"71.75.35.207\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:56.496 [http-bio-8880-exec-2447] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[workflow-service:rest-client]-{\"EventName\":\"BEGIN\",\"SessionId\":\"943A59749B3AD868435411680B0B6F82\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"c603b9c2-f477-40b3-99f6-ceb35dd2fd67\",\"Logger\":\"WorkflowRestClient\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667336485\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"workflow-service\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667336496\",\"Layer\":\"rest-client\",\"TransactionId\":\"22eae94f-e1f8-4c74-a8c6-629510cc11bc\",\"Env\":\"PROD\",\"ConversationId\":\"START_ORDER_FUNNEL_LEGACY_PLUS - initial\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"DDBA4216-0128-450C-9F9F-39FD59D79BE4\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"71.75.35.207\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:56.723 [http-bio-8880-exec-2447] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[workflow-service:rest-client]-{\"EventName\":\"BEGIN\",\"SessionId\":\"943A59749B3AD868435411680B0B6F82\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"c603b9c2-f477-40b3-99f6-ceb35dd2fd67\",\"Logger\":\"WorkflowRestClient\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667336485\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"workflow-service\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667336723\",\"Layer\":\"rest-client\",\"TransactionId\":\"22eae94f-e1f8-4c74-a8c6-629510cc11bc\",\"Env\":\"PROD\",\"ConversationId\":\"START_ORDER_FUNNEL_LEGACY_PLUS - initial\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"DDBA4216-0128-450C-9F9F-39FD59D79BE4\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"71.75.35.207\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:56.728 [http-bio-8880-exec-2447] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-funnel:substrate]-{\"EventName\":\"ORDER_FUNNEL_PAGE_CHANGE\",\"SessionId\":\"943A59749B3AD868435411680B0B6F82\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"Web\",\"UserAgent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\",\"EventId\":\"cc70983e-4658-49aa-b01b-68da04df9a4e\",\"param_ChangeEndOrderContext\":\"<xml-fragment xmlns:ns=\\\"http://ns.equifax.com/workflow/operations/1.0\\\"><ns1:businessKey xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">09c5bf4e-f336-4f15-b048-a20946230407</ns1:businessKey><ns1:activeTaskName xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">Collect_Wallet_Data</ns1:activeTaskName><ns1:namespace xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">workflow</ns1:namespace><ns1:version xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">2.0</ns1:version><ns1:activeTaskId xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">5217409</ns1:activeTaskId><ns1:activeTaskAssignee xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">UI</ns1:activeTaskAssignee><ns1:correlationId xmlns:ns1=\\\"http://ns.equifax.com/workflow/types/1.0\\\">5217367</ns1:correlationId></xml-fragment>\",\"Logger\":\"OrderfunnelProcessController\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"param_CSC\":\"W14upd11\",\"param_InstanceGuid\":\"7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b\",\"param_ChangeEndStep\":\"Collect_Wallet_Data\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667336728\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"param_ChangeStartStep\":\"BEGIN\",\"Domain\":\"order-funnel\",\"Product\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"Machine\":\"aptp2lc9a001\",\"param_Extrinsics\":\"{product=W14upd11_uplanr, EXPERIENCE_ID=DDBA4216-0128-450C-9F9F-39FD59D79BE4, source=HomePage, mboxSession=1429666112700-901115, campaign=UPLAN1995, s_tnt=185050:1:0#/personal-information, legacy=W14upd11_uplanr}\",\"param_LegacyParam\":\"W14upd11_uplanr\",\"param_TemplateName\":\"USLegacyPlusTemplate\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667336728\",\"Layer\":\"substrate\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"param_ChangeEndStatus\":\"WAITING\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"71.75.35.207\",\"param_ChangeStartOrderContext\":\"BEGIN\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:56.847 [http-bio-8880-exec-2448] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-funnel-instance:browser]-{\"EventName\":\"ORDER_FUNNEL_START\",\"SessionId\":\"943A59749B3AD868435411680B0B6F82\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"c3a67c10-f6d3-4ec8-9cd9-084472874677\",\"Logger\":\"AuditController\",\"param_ipAddress\":\"71.75.35.207\",\"param_referer\":\"https://shop.equifax.com/orderfunnel/7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b/E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56/?legacy=W14upd11_uplanr&campaign=UPLAN1995&product=W14upd11_uplanr&source=HomePage&mboxSession=1429666112700-901115&s_tnt=185050:1:0\",\"Offer\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667336846\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"US Four-Step Legacy Plus, step 0. Funnel instance:\\n7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b. Offer: E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"param_userAgent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\",\"Locale\":\"English (United States)\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667336847\",\"Layer\":\"browser\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"DDBA4216-0128-450C-9F9F-39FD59D79BE4\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:56.849 [http-bio-8880-exec-2446] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=943A59749B3AD868435411680B0B6F82, ExperienceId=DDBA4216-0128-450C-9F9F-39FD59D79BE4]-[order-funnel-instance:browser]-{\"EventName\":\"INITIAL_PRODUCT_OFFER\",\"SessionId\":\"943A59749B3AD868435411680B0B6F82\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"f93ac6c1-04ed-4ffa-98ab-809a50e2f9a5\",\"Logger\":\"AuditController\",\"param_ipAddress\":\"71.75.35.207\",\"param_referer\":\"https://shop.equifax.com/orderfunnel/7b5b72a0-a7cd-45e4-8008-cf4d3c08d61b/E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56/?legacy=W14upd11_uplanr&campaign=UPLAN1995&product=W14upd11_uplanr&source=HomePage&mboxSession=1429666112700-901115&s_tnt=185050:1:0\",\"Offer\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667336848\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"US Four-Step Legacy Plus, Collect_Wallet_Data page, browser event -\\nInitial Product: UPLAN, Initial Offer: 19.95\",\"param_userAgent\":\"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko\",\"Locale\":\"English (United States)\",\"EventType\":\"USER_INTERACTION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667336849\",\"Layer\":\"browser\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"param_cartDisplayedOffers\":\"[]\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"DDBA4216-0128-450C-9F9F-39FD59D79BE4\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:58.175 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=6F1CB2A4F61423F9EFCA412463A8F4B2, ExperienceId=]-[aof-instance:substrate-service]-{\"EventName\":\"FIND_INSTANCE_BY_GUID\",\"SessionId\":\"6F1CB2A4F61423F9EFCA412463A8F4B2\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"Service\",\"UserAgent\":\"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36\",\"EventId\":\"aff11b9f-2273-4072-b88a-298c68a371b6\",\"Logger\":\"OrdefunnelInstanceResolverImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667338174\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"aof-instance\",\"Product\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667338174\",\"Layer\":\"substrate-service\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"EndTime\":\"1429667338174\",\"RemoteAddress\":\"146.135.4.95\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:58.201 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=6F1CB2A4F61423F9EFCA412463A8F4B2, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"6F1CB2A4F61423F9EFCA412463A8F4B2\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"a13e9636-ca65-4da6-9f57-b4794c532878\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667338175\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667338186\",\"Layer\":\"service-client\",\"TransactionId\":\"58611d9f-bcc1-4dad-a3b9-e6119282dea7\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"146.135.4.95\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:58.201 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=6F1CB2A4F61423F9EFCA412463A8F4B2, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"6F1CB2A4F61423F9EFCA412463A8F4B2\",\"EventStatus\":\"IN_PROGRESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"a13e9636-ca65-4da6-9f57-b4794c532878\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667338175\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667338201\",\"Layer\":\"service-client\",\"TransactionId\":\"58611d9f-bcc1-4dad-a3b9-e6119282dea7\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"146.135.4.95\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:58.230 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=6F1CB2A4F61423F9EFCA412463A8F4B2, ExperienceId=]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"6F1CB2A4F61423F9EFCA412463A8F4B2\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"a13e9636-ca65-4da6-9f57-b4794c532878\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667338175\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Reason\":\"StratusRestXmlClientBase: onCall: Connect\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667338230\",\"Layer\":\"service-client\",\"TransactionId\":\"58611d9f-bcc1-4dad-a3b9-e6119282dea7\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"146.135.4.95\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:58.231 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=6F1CB2A4F61423F9EFCA412463A8F4B2, ExperienceId=]-[aof-instance:substrate-service]-{\"EventName\":\"FIND_INSTANCE_BY_GUID\",\"SessionId\":\"6F1CB2A4F61423F9EFCA412463A8F4B2\",\"EventStatus\":\"END_SUCCESS\",\"Brand\":\"EFX\",\"Channel\":\"Service\",\"UserAgent\":\"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36\",\"EventId\":\"aff11b9f-2273-4072-b88a-298c68a371b6\",\"Logger\":\"OrdefunnelInstanceResolverImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667338174\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"aof-instance\",\"Product\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"Machine\":\"aptp2lc9a001\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667338231\",\"Layer\":\"substrate-service\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"EndTime\":\"1429667338231\",\"RemoteAddress\":\"146.135.4.95\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:58.235 [http-bio-8880-exec-2451] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=6F1CB2A4F61423F9EFCA412463A8F4B2, ExperienceId=]-[order-funnel:substrate]-{\"EventName\":\"ORDER_FUNNEL_START\",\"SessionId\":\"6F1CB2A4F61423F9EFCA412463A8F4B2\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"Web\",\"param_FunnelInitContext\":\"guid: f1180768-373f-41ae-b42d-d0c81f0aeb39 template: USFourStepTemplate  lastUpdate: null\",\"UserAgent\":\"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36\",\"EventId\":\"946c914b-a7d4-45f8-9c6b-c43c90aa7965\",\"Logger\":\"OrderfunnelInstanceController\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"param_CSC\":\"W14upd11\",\"param_InstanceGuid\":\"f1180768-373f-41ae-b42d-d0c81f0aeb39\",\"AppName\":\"Orderfunnel\",\"StartTime\":\"1429667338235\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"US\",\"Domain\":\"order-funnel\",\"Product\":\"E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56\",\"Machine\":\"aptp2lc9a001\",\"param_Extrinsics\":\"{product=W14upd11_uplanr, EXPERIENCE_ID=E7A9D6E2-1A0B-4F3A-94E3-4138C2B77B65, source=HomePage, mboxSession=1429678125089-546863, campaign=UPLAN1995, s_tnt=185050:2:0#/personal-information, legacy=W14upd11_uplanr}\",\"param_LegacyParam\":\"W14upd11_uplanr\",\"param_TemplateName\":\"USFourStepTemplate\",\"param_PropositionUrl\":\"http://shop.equifax.com/orderfunnel/US/f1180768-373f-41ae-b42d-d0c81f0aeb39/E0FC0E93-20A3-4DE3-9EB2-22A44AB2CF56/?legacy=W14upd11_uplanr&campaign=UPLAN1995&product=W14upd11_uplanr&source=HomePage&mboxSession=1429678125089-546863&s_tnt=185050:2:0#/personal-information\",\"Locale\":\"en_US\",\"EventType\":\"ORDER_ENTRY\",\"UserId\":\"unknown\",\"ModuleName\":\"Orderfunnel\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667338235\",\"Layer\":\"substrate\",\"TransactionId\":\"unknown\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"146.135.4.95\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:58.484 [http-bio-8880-exec-2439] INFO  com.efx.pet.AUDIT_EVENT-[SessionId=6F1CB2A4F61423F9EFCA412463A8F4B2, ExperienceId=E7A9D6E2-1A0B-4F3A-94E3-4138C2B77B65]-[order-funnel-instance:service-client [ audit-client-error ]]-{\"EventName\":\"ORDER_FUNNEL_INSTANCE_CLIENT_FIND_ORDER_FUNNEL_INSTANCE_BY_GUID\",\"SessionId\":\"unknown\",\"EventStatus\":\"BEGIN\",\"Brand\":\"EFX\",\"Channel\":\"unknown\",\"UserAgent\":\"unknown\",\"EventId\":\"6a4c7fa2-e74e-47ab-ad83-1d25cc718eff\",\"Logger\":\"OrderFunnelInstanceServiceClientRestImpl\",\"Offer\":\"EFX\",\"EventLevel\":\"INFO\",\"Reseller\":\"EFX\",\"Jvm\":\"DEFAULT\",\"AppName\":\"unknown\",\"StartTime\":\"1429667338473\",\"Version\":\"1.0\",\"Partner\":\"EFX\",\"Tenant\":\"EFX\",\"Domain\":\"order-funnel-instance\",\"Product\":\"unknown\",\"Machine\":\"aptp2lc9a001\",\"Message\":\"findOrderFunnelInstanceByGuid\",\"Locale\":\"en_US\",\"EventType\":\"ADMINISTRATION\",\"UserId\":\"unknown\",\"ModuleName\":\"unknown\",\"EffectiveUserId\":\"unknown\",\"Timestamp\":\"1429667338483\",\"Layer\":\"service-client\",\"TransactionId\":\"5fc6d237-2492-4884-a3a6-deef80a2daf2\",\"Env\":\"PROD\",\"ConversationId\":\"unknown\",\"Division\":\"DOMAIN2\",\"ExperienceId\":\"unknown\",\"Namespace\":\"ORDERFUNNEL\",\"RemoteAddress\":\"unknown\",\"CustomerKey\":\"unknown\"}\n2015-04-22 01:48:58.484 [http-bio-8880-exec-2439] INFO  com.efx.pet.AUDIT_EVE"
  },
  {
    "path": "example-logs/example4",
    "content": "level=error ts=2022-09-22T07:46:34.171406833Z caller=main.go:129 msg=\"Starting Loki\" version=\"(version=, branch=, revision=)\"\nlevel=warn ts=2022-09-22T07:46:34.171800155Z caller=server.go:239 http=[::]:3100 grpc=[::]:9095 msg=\"server listening on addresses\"\nlevel=debug ts=2022-09-22T07:46:34.172389889Z caller=modules.go:504 msg=\"RulerStorage is not configured in single binary mode and will not be started.\"\nlevel=trace ts=2022-09-22T07:46:34.173343577Z caller=shipper_index_client.go:108 msg=\"starting boltdb shipper in 0 mode\"\nlevel=info ts=2022-09-22T07:46:34.173623411Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:46:34.177117984Z caller=modules.go:529 msg=\"RulerStorage is nil.  Not starting the ruler.\"\nlevel=info ts=2022-09-22T07:46:34.178200675Z caller=module_service.go:59 msg=initialising module=server\nlevel=info ts=2022-09-22T07:46:34.178280264Z caller=module_service.go:59 msg=initialising module=memberlist-kv\nlevel=info ts=2022-09-22T07:46:34.178365471Z caller=module_service.go:59 msg=initialising module=store\nlevel=info ts=2022-09-22T07:46:34.178778368Z caller=module_service.go:59 msg=initialising module=ingester\nlevel=info ts=2022-09-22T07:46:34.179028065Z caller=module_service.go:59 msg=initialising module=ring\nlevel=info ts=2022-09-22T07:46:34.179373831Z caller=ring.go:275 msg=\"ring doesn't exist in KV store yet\"\nlevel=info ts=2022-09-22T07:46:34.179500448Z caller=client.go:247 msg=\"value is nil\" key=collectors/ring index=1\nlevel=info ts=2022-09-22T07:46:34.179638941Z caller=module_service.go:59 msg=initialising module=table-manager\nlevel=info ts=2022-09-22T07:46:34.179966708Z caller=module_service.go:59 msg=initialising module=ingester-querier\nlevel=info ts=2022-09-22T07:46:34.179375742Z caller=lifecycler.go:530 msg=\"not loading tokens from file, tokens file path is empty\"\nlevel=info ts=2022-09-22T07:46:34.180325822Z caller=lifecycler.go:559 msg=\"instance not found in ring, adding with no tokens\" ring=ingester\nlevel=info ts=2022-09-22T07:46:34.180611947Z caller=table_manager.go:324 msg=\"synching tables\" expected_tables=62\nlevel=info ts=2022-09-22T07:46:34.18085029Z caller=lifecycler.go:406 msg=\"auto-joining cluster after timeout\" ring=ingester\nlevel=info ts=2022-09-22T07:46:34.181115582Z caller=module_service.go:59 msg=initialising module=distributor\nlevel=info ts=2022-09-22T07:46:34.181572591Z caller=loki.go:272 msg=\"Loki started\"\nlevel=info ts=2022-09-22T07:47:34.173832745Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:48:34.174045463Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:48:37.729496146Z caller=table_manager.go:324 msg=\"synching tables\" expected_tables=62\nlevel=info ts=2022-09-22T07:49:34.181855073Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:50:34.17982263Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:50:34.180242674Z caller=table_manager.go:324 msg=\"synching tables\" expected_tables=62\nlevel=info ts=2022-09-22T07:51:34.173650568Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:51:34.173685304Z caller=table_manager.go:208 msg=\"syncing tables\"\nlevel=info ts=2022-09-22T07:52:34.174253904Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:52:34.180731416Z caller=table_manager.go:324 msg=\"synching tables\" expected_tables=62\nlevel=info ts=2022-09-22T07:53:34.173927559Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:54:34.174196077Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:54:34.180682409Z caller=table_manager.go:324 msg=\"synching tables\" expected_tables=62\nlevel=info ts=2022-09-22T07:55:34.174247394Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:56:34.173888737Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:56:34.173927164Z caller=table_manager.go:208 msg=\"syncing tables\"\nlevel=info ts=2022-09-22T07:56:34.180396607Z caller=table_manager.go:324 msg=\"synching tables\" expected_tables=62\nlevel=info ts=2022-09-22T07:57:34.174140935Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:58:34.173649694Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T07:58:34.180400363Z caller=table_manager.go:324 msg=\"synching tables\" expected_tables=62\nlevel=info ts=2022-09-22T07:59:34.174673066Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T08:00:34.174146762Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T08:00:34.180633584Z caller=table_manager.go:324 msg=\"synching tables\" expected_tables=62\nlevel=info ts=2022-09-22T08:01:34.180379898Z caller=table_manager.go:208 msg=\"syncing tables\"\nlevel=info ts=2022-09-22T08:01:34.180406501Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T08:02:34.179299129Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T08:02:34.180722479Z caller=table_manager.go:324 msg=\"synching tables\" expected_tables=62\nlevel=info ts=2022-09-22T08:03:34.173747161Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T08:04:34.173688235Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T08:04:34.18118391Z caller=table_manager.go:324 msg=\"synching tables\" expected_tables=62\nlevel=info ts=2022-09-22T08:05:34.174073357Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T08:06:34.173948908Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T08:06:34.173946105Z caller=table_manager.go:208 msg=\"syncing tables\"\nlevel=info ts=2022-09-22T08:06:34.180438646Z caller=table_manager.go:324 msg=\"synching tables\" expected_tables=62\nlevel=info ts=2022-09-22T08:07:34.173754263Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T08:08:34.17419279Z caller=table_manager.go:171 msg=\"uploading tables\"\nlevel=info ts=2022-09-22T08:08:34.180660187Z caller=table_manager.go:324 msg=\"synching tables\" expected_tables=62\nlevel=info ts=2022-09-22T08:09:34.179718027Z caller=table_manager.go:171 msg=\"uploading tables\""
  },
  {
    "path": "example-logs/example5",
    "content": "2022-08-29 08:10:00 |  INFO | MessageMonitor: Outgoing message process already started for thread [4]\n2022-08-29 08:10:00 |  INFO | New ProcessId [c66a5398-2aa5-11ec-8631-0242ac110089] for user 123456\n2022-08-29 08:11:00 | TRACE | User 123456 has [0] new messages\n2022-08-29 08:11:00 | TRACE | Syncing tables and updating modules for user 123456\n2022-08-29 08:11:00 | DEBUG | Ping to 192.168.0.1 failed\n2022-08-29 08:11:00 | DEBUG | MessageMonitor: Checking outgoing messages on thread [5]\n2022-08-29 08:11:00 | DEBUG | MessageMonitor: Checking outgoing messages on thread [4]\n2022-08-29 08:11:00 | ERROR | MessageValidator: Could not parse message, input was null\n2022-08-29 08:11:01 | ERROR | Could not generate key, \"hasMoreResults\" was false\n2022-08-29 08:11:36 | TRACE | No new messages on queue 5\n2022-08-29 08:11:37 | TRACE | No new messages on queue 4\n2022-08-29 08:10:00 |  INFO | skip non existing resourceDirectory /var/logs\n2022-08-29 08:10:00 |  INFO | Using JarLifecycleMapping lifecycle mapping for Project\n2022-08-29 08:11:00 |  INFO | Using \"ASCII\" encoding to copy filtered resources\n2022-08-29 08:11:00 |  INFO | Using \"ASCII\" encoding to copy filtered properties files\n2022-08-29 08:11:00 | TRACE | User 123456 has [0] new messages\n2022-08-29 08:11:00 | TRACE | Syncing tables and updating modules for user 123456\n2022-08-29 08:11:00 |  WARN | ProcessId [c66a5398-2aa5-11ec-8631-0242ac110089] finished early\n2022-08-29 08:11:36 |  WARN | Fetching contact points for user 123456, but no contact points found\n2022-08-29 08:11:36 |  WARN | POST to https://www.google.com/search?field=value failed\n2022-08-29 08:11:00 | DEBUG | Using \"ASCII\" encoding to copy filtered resources\n2022-08-29 08:11:01 | DEBUG | Using \"ASCII\" encoding to copy filtered properties files\n2022-08-29 08:11:00 |  INFO | MessageMonitor: Outgoing message process already started for thread [6]\n2022-08-29 08:11:36 |  INFO | MessageMonitor: Outgoing message process already started for thread [7]\n2022-08-29 08:11:36 |  INFO | Copying 1 resource\n2022-08-29 08:11:37 |  INFO | Copying 1 resource"
  },
  {
    "path": "flake.nix",
    "content": "{\n  inputs = {\n    nixpkgs.url = \"github:nixos/nixpkgs/nixos-unstable\";\n    rust-overlay.url = \"github:oxalica/rust-overlay\";\n  };\n\n  outputs = { nixpkgs, rust-overlay, ... }:\n    let\n      system = \"x86_64-linux\";\n\n      pkgs = import nixpkgs {\n        inherit system;\n\n        overlays = [ rust-overlay.overlays.default ];\n      };\n\n      rust-toolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;\n    in\n    {\n      devShells.${system}.default = pkgs.mkShell {\n        packages = [ rust-toolchain ];\n      };\n    };\n}\n"
  },
  {
    "path": "man/tspin.1",
    "content": "'\\\" t\n.\\\"     Title: tspin\n.\\\"    Author: [see the \"AUTHOR(S)\" section]\n.\\\" Generator: Asciidoctor 2.0.23\n.\\\"      Date: 2025-06-08\n.\\\"    Manual: tailspin\n.\\\"    Source: tailspin 5.4.5\n.\\\"  Language: English\n.\\\"\n.TH \"TSPIN\" \"1\" \"2025-06-08\" \"tailspin 5.4.5\" \"tailspin\"\n.ie \\n(.g .ds Aq \\(aq\n.el       .ds Aq '\n.ss \\n[.ss] 0\n.nh\n.ad l\n.de URL\n\\fI\\\\$2\\fP <\\\\$1>\\\\$3\n..\n.als MTO URL\n.if \\n[.g] \\{\\\n.  mso www.tmac\n.  am URL\n.    ad l\n.  .\n.  am MTO\n.    ad l\n.  .\n.  LINKSTYLE blue R < >\n.\\}\n.SH \"NAME\"\ntspin \\- A log file highlighter\n.SH \"SYNOPSIS\"\n.sp\n\\fBtspin\\fP [\\fIOPTION\\fP]... [\\fIFILE\\fP]...\n.SH \"DESCRIPTION\"\n.sp\ntailspin is a command line tool that highlights log files.\n.SH \"OPTIONS\"\n.sp\n\\fI\\-f, \\-\\-follow\\fP\n.RS 4\nFollow (tail) the contents of the file.\nAlways true when using the \\fI\\-\\-follow\\-command\\fP flag.\n.RE\n.sp\n\\fI\\-p, \\-\\-print\\fP\n.RS 4\nPrint the output to stdout instead of viewing the contents in the pager \\fIless\\fP.\nAlways true if using stdin.\n.RE\n.sp\n\\fI\\-\\-config\\-path\\fP \\fBCONFIG_PATH\\fP\n.RS 4\nSpecify the path to a custom configuration file.\nDefaults to \\fBXDG_CONFIG_HOME/tailspin/theme.toml\\fP or \\fB~/.config/tailspin/theme.toml\\fP if not set.\n.RE\n.sp\n\\fI\\-e, \\-\\-exec\\fP \\fBCOMMAND\\fP\n.RS 4\nRun command and view the output in a pager.\nThe command traps the interrupt signal to allow for cancelling and resuming follow mode while inside \\fIless\\fP.\n.sp\n.B Example:\n.br\n.sp\n.if n .RS 4\n.nf\n.fam C\ntspin \\-\\-listen\\-command \\*(Aqkubectl logs \\-f pod_name\\*(Aq\n.fam\n.fi\n.if n .RE\n.RE\n.sp\n\\fI\\-\\-highlight\\fP \\fBCOLOR1\\fP:\\fIword1,word2,...\\fP \\fBCOLOR2\\fP:\\fIword3,word4,...\\fP\n.RS 4\nHighlight the provided comma\\-separated words in the specified color.\nPossible colors are red, green, yellow, blue, magenta, and cyan.\n.sp\n.B Example:\n.br\n.sp\n.if n .RS 4\n.nf\n.fam C\ntspin logfile.txt \\-\\-highlight red:error,fail \\-\\-highlight green:success,ok\n.fam\n.fi\n.if n .RE\n.RE\n.sp\n\\fI\\-\\-enable=[HIGHLIGHT_GROUP]\\fP\n.RS 4\nDisable all highlighting groups except the ones specified.\nComma separated list of groups.\nCannot be used with \\fB\\-\\-disable=[HIGHLIGHT_GROUP]\\fP.\n.RE\n.sp\n\\fI\\-\\-disable=[HIGHLIGHT_GROUP]\\fP\n.RS 4\nDisable the specified highlighting groups.\nComma separated list of groups.\nCannot be used with \\fB\\-\\-enable=[HIGHLIGHT_GROUP]\\fP.\n.RE\n.sp\n\\fI\\-\\-disable\\-builtin\\-keywords\\fP\n.RS 4\nDisables the highlighting of all builtin keyword groups (booleans, severity and REST).\n.RE\n.SH \"ENVIRONMENT VARIABLES\"\n.sp\n\\fBTAILSPIN_PAGER\\fP\n.RS 4\nSet the \\fITAILSPIN_PAGER\\fP environment variable to override the default pager.\nThe command must include the string \\fI[FILE]\\fP which will be replaced with the file path internally.\nFor example, \\fI\"ov \\-f [FILE]\"\\fP.\n.RE\n.SH \"SEE ALSO\"\n.sp\n\\fBless\\fP(1), \\fBtail\\fP(1)\n.SH \"ABOUT\"\n.sp\nBen Sadeh (github.com/bensadeh/tailspin)\n.sp\nReleased under the MIT License"
  },
  {
    "path": "rust-toolchain.toml",
    "content": "[toolchain]\nchannel = \"stable\"\ncomponents = [\"rust-src\", \"rust-analyzer\"]\n"
  },
  {
    "path": "rustfmt.toml",
    "content": "max_width = 120"
  },
  {
    "path": "src/cli/completions.rs",
    "content": "use crate::cli::Arguments;\nuse clap::{Command, CommandFactory};\nuse clap_complete::{Generator, Shell, generate};\nuse std::io;\nuse std::process::exit;\n\npub fn generate_shell_completions_and_exit_or_continue(cli: &Arguments) {\n    let mut cmd = Arguments::command();\n\n    if cli.generate_bash_completions {\n        print_completions(Shell::Bash, &mut cmd);\n        exit(0);\n    }\n\n    if cli.generate_fish_completions {\n        print_completions(Shell::Fish, &mut cmd);\n        exit(0);\n    }\n\n    if cli.generate_zsh_completions {\n        print_completions(Shell::Zsh, &mut cmd);\n        exit(0);\n    }\n}\n\nfn print_completions<G: Generator>(generator: G, cmd: &mut Command) {\n    generate(generator, cmd, cmd.get_name().to_string(), &mut io::stdout());\n}\n"
  },
  {
    "path": "src/cli/keywords.rs",
    "content": "use crate::cli::{Arguments, KeywordColor};\nuse tailspin::config::KeywordConfig;\nuse tailspin::style::{Color, Style};\n\npub fn get_keywords_from_cli(cli: &Arguments) -> Vec<KeywordConfig> {\n    cli.color_word\n        .iter()\n        .flat_map(|(color, words)| {\n            words.iter().map(move |word| KeywordConfig {\n                style: Style::new().fg(Color::from(*color)),\n                words: vec![word.clone()],\n            })\n        })\n        .collect()\n}\n\nimpl From<KeywordColor> for Color {\n    fn from(value: KeywordColor) -> Self {\n        match value {\n            KeywordColor::Red => Self::Red,\n            KeywordColor::Green => Self::Green,\n            KeywordColor::Yellow => Self::Yellow,\n            KeywordColor::Blue => Self::Blue,\n            KeywordColor::Magenta => Self::Magenta,\n            KeywordColor::Cyan => Self::Cyan,\n        }\n    }\n}\n"
  },
  {
    "path": "src/cli/mod.rs",
    "content": "mod completions;\nmod keywords;\nmod styles;\n\nuse crate::cli::completions::generate_shell_completions_and_exit_or_continue;\nuse crate::cli::keywords::get_keywords_from_cli;\nuse crate::cli::styles::get_styles;\nuse crate::config::{Source, Target, get_io_config};\nuse crate::highlighter_builder;\nuse crate::highlighter_builder::builtins::get_builtin_keywords;\nuse crate::highlighter_builder::groups;\nuse crate::theme::reader;\nuse anyhow::Result;\nuse clap::{Parser, ValueEnum};\nuse nu_ansi_term::Style;\nuse std::error::Error;\nuse std::io::{IsTerminal, stdin};\nuse std::path::PathBuf;\nuse tailspin::Highlighter;\n\n#[derive(Parser)]\n#[command(\n    name = \"tspin\",\n    version,\n    about,\n    author,\n    styles = get_styles(),\n    max_term_width = 105,\n)]\npub struct Arguments {\n    /// Filepath\n    #[clap(name = \"FILE\", value_hint = clap::ValueHint::FilePath)]\n    pub file_path: Option<PathBuf>,\n\n    /// Follow the contents of a file\n    #[clap(short = 'f', long = \"follow\")]\n    pub follow: bool,\n\n    /// Print the output to stdout\n    #[clap(short = 'p', long = \"print\")]\n    pub to_stdout: bool,\n\n    /// Provide a custom path to a configuration file\n    #[clap(long = \"config-path\")]\n    pub config_path: Option<PathBuf>,\n\n    /// Run command and view the output in a pager\n    #[clap(short = 'e', long = \"exec\")]\n    pub exec: Option<String>,\n\n    /// Highlights in the form color:word1,word2\n    ///\n    /// [possible values: red, green, yellow, blue, magenta, cyan]\n    #[arg(long = \"highlight\", value_parser = parse_highlight)]\n    pub color_word: Vec<(KeywordColor, Vec<String>)>,\n\n    /// Enable specific highlighters\n    #[clap(long = \"enable\", value_enum, use_value_delimiter = true)]\n    pub enabled_highlighters: Vec<HighlighterGroup>,\n\n    /// Disable specific highlighters\n    #[clap(long = \"disable\", value_enum, use_value_delimiter = true)]\n    pub disabled_highlighters: Vec<HighlighterGroup>,\n\n    /// Disable the highlighting of all builtin keyword groups (booleans, nulls, log severities and common REST verbs)\n    #[clap(long = \"disable-builtin-keywords\")]\n    pub disable_builtin_keywords: bool,\n\n    /// Override the default pager command used by tspin. (e.g. `--pager=\"ov -f [FILE]\"`)\n    #[clap(long = \"pager\", env = \"TAILSPIN_PAGER\")]\n    pub pager: Option<String>,\n\n    /// Print bash completions to stdout\n    #[clap(long = \"generate-bash-completions\", hide = true)]\n    pub generate_bash_completions: bool,\n\n    /// Print fish completions to stdout\n    #[clap(long = \"generate-fish-completions\", hide = true)]\n    pub generate_fish_completions: bool,\n\n    /// Print zsh completions to stdout\n    #[clap(long = \"generate-zsh-completions\", hide = true)]\n    pub generate_zsh_completions: bool,\n}\n\nfn parse_highlight(s: &str) -> Result<(KeywordColor, Vec<String>), Box<dyn Error + Send + Sync>> {\n    let (color_str, words_str) = s\n        .split_once(':')\n        .ok_or_else(|| format!(\"Expected format COLOR:word1,word2,... found `{}`\", s))?;\n\n    let color = KeywordColor::from_str(color_str, true)?;\n\n    let words = words_str.split(',').map(str::to_owned).collect();\n\n    Ok((color, words))\n}\n\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Hash)]\npub enum KeywordColor {\n    Red,\n    Green,\n    Yellow,\n    Blue,\n    Magenta,\n    Cyan,\n}\n\n#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]\npub enum HighlighterGroup {\n    Numbers,\n    Urls,\n    Pointers,\n    Dates,\n    Paths,\n    Quotes,\n    KeyValuePairs,\n    Uuids,\n    IpAddresses,\n    Processes,\n    Json,\n}\n\npub struct FullConfig {\n    pub source: Source,\n    pub target: Target,\n    pub highlighter: Highlighter,\n}\n\npub fn get_config() -> Result<FullConfig> {\n    let cli = Arguments::parse();\n\n    generate_shell_completions_and_exit_or_continue(&cli);\n\n    let std_in_has_no_data = stdin().is_terminal();\n    if cli.file_path.is_none() && cli.exec.is_none() && std_in_has_no_data {\n        let style = Style::new().fg(nu_ansi_term::Color::Cyan);\n        println!(\"Missing filename ({} for help)\", style.paint(\"tspin --help\"));\n\n        std::process::exit(0);\n    }\n\n    let io_config = get_io_config(&cli)?;\n    let highlighter_groups = groups::get_highlighter_groups(&cli.enabled_highlighters, &cli.disabled_highlighters)?;\n\n    let theme = reader::parse_theme(&cli.config_path)?;\n    let keywords_builtin = get_builtin_keywords(cli.disable_builtin_keywords);\n    let keywords_from_toml = theme.keywords.clone();\n    let keywords_from_cli = get_keywords_from_cli(&cli);\n\n    let keywords = vec![]\n        .into_iter()\n        .chain(keywords_builtin)\n        .chain(keywords_from_toml)\n        .chain(keywords_from_cli)\n        .collect();\n\n    let highlighter = highlighter_builder::get_highlighter(highlighter_groups, theme, keywords)?;\n\n    Ok(FullConfig {\n        source: io_config.source,\n        target: io_config.target,\n        highlighter,\n    })\n}\n\n#[test]\nfn verify_app() {\n    use clap::CommandFactory;\n    Arguments::command().debug_assert()\n}\n"
  },
  {
    "path": "src/cli/styles.rs",
    "content": "use clap::builder::{Styles, styling};\nuse styling::AnsiColor;\n\npub const fn get_styles() -> Styles {\n    Styles::styled()\n        .header(AnsiColor::Magenta.on_default().bold())\n        .usage(AnsiColor::Green.on_default().bold())\n        .literal(AnsiColor::Blue.on_default().bold())\n        .placeholder(AnsiColor::Yellow.on_default())\n}\n"
  },
  {
    "path": "src/config/mod.rs",
    "content": "use crate::cli::Arguments;\nuse nu_ansi_term::Color::{Magenta, Yellow};\nuse std::cmp::PartialEq;\nuse std::fs;\nuse std::io::{self, IsTerminal, stdin};\nuse std::path::PathBuf;\nuse thiserror::Error;\n\npub struct InputOutputConfig {\n    pub source: Source,\n    pub target: Target,\n}\n\n#[derive(Ord, PartialOrd, Eq, PartialEq)]\npub enum Source {\n    File(FileInfo),\n    Command(String),\n    Stdin,\n}\n\n#[derive(PartialEq, Eq, Ord, PartialOrd)]\npub struct FileInfo {\n    pub path: PathBuf,\n    pub terminate_after_first_read: bool,\n}\n\npub enum Target {\n    Less(LessOptions),\n    CustomPager(CustomPagerOptions),\n    Stdout,\n}\n\npub struct LessOptions {\n    pub follow: bool,\n}\n\npub struct CustomPagerOptions {\n    pub command: String,\n    pub args: Vec<String>,\n}\n\n#[derive(Debug, Error)]\npub enum ConfigError {\n    #[error(\"Missing filename ({} for help)\", Magenta.paint(\"tspin --help\").to_string())]\n    MissingFilename,\n\n    #[error(\"Cannot read from both file and {}\", Magenta.paint(\"--listen-command\").to_string())]\n    CannotReadBothFileAndListenCommand,\n\n    #[error(\"Could not determine input type\")]\n    CouldNotDetermineInputType,\n\n    #[error(\"{0}: No such file or directory\")]\n    NoSuchFileOrDirectory(String),\n\n    #[error(\"Path is not a file\")]\n    PathNotFile,\n\n    #[error(\"I/O Error: {0}\")]\n    Io(#[from] io::Error),\n\n    #[error(\"Could not parse custom pager command\")]\n    CouldNotParseCustomPagerCommand,\n}\n\npub fn get_io_config(args: &Arguments) -> Result<InputOutputConfig, ConfigError> {\n    let source = get_source(args)?;\n    let target = get_target(args, &source)?;\n\n    Ok(InputOutputConfig { source, target })\n}\n\nfn get_source(args: &Arguments) -> Result<Source, ConfigError> {\n    let std_in_has_data = !stdin().is_terminal();\n\n    if args.file_path.is_none() && !std_in_has_data && args.exec.is_none() {\n        return Err(ConfigError::MissingFilename);\n    }\n\n    if args.file_path.is_some() && args.exec.is_some() {\n        return Err(ConfigError::CannotReadBothFileAndListenCommand);\n    }\n\n    if let Some(path) = &args.file_path {\n        let terminate_after_first_read = args.to_stdout && !args.follow;\n        return process_path_input(path.into(), terminate_after_first_read);\n    }\n\n    if std_in_has_data {\n        return Ok(Source::Stdin);\n    }\n\n    if let Some(command) = &args.exec {\n        return Ok(Source::Command(command.clone()));\n    }\n\n    Err(ConfigError::CouldNotDetermineInputType)\n}\n\nfn get_target(args: &Arguments, input: &Source) -> Result<Target, ConfigError> {\n    if *input == Source::Stdin || args.to_stdout {\n        return Ok(Target::Stdout);\n    }\n\n    if let Some(command) = &args.pager {\n        let custom_pager_options = split_custom_pager_command(command)?;\n\n        return Ok(Target::CustomPager(custom_pager_options));\n    }\n\n    let follow_mode = if args.exec.is_some() { true } else { args.follow };\n\n    Ok(Target::Less(LessOptions { follow: follow_mode }))\n}\n\nfn split_custom_pager_command(raw_command: &str) -> Result<CustomPagerOptions, ConfigError> {\n    let raw_args = shell_words::split(raw_command).unwrap_or_default();\n\n    let (command, args) = match raw_args.split_first() {\n        Some((first, rest)) if !rest.is_empty() => (first.to_string(), rest.to_vec()),\n        Some(_) => return Err(ConfigError::CouldNotParseCustomPagerCommand), // Command without args\n        None => return Err(ConfigError::CouldNotParseCustomPagerCommand),    // Empty args\n    };\n\n    Ok(CustomPagerOptions { command, args })\n}\n\nfn process_path_input(path: PathBuf, terminate_after_first_read: bool) -> Result<Source, ConfigError> {\n    if !path.exists() {\n        let path_display = path.display().to_string();\n        let path_colored = Yellow.paint(path_display).to_string();\n\n        return Err(ConfigError::NoSuchFileOrDirectory(path_colored));\n    }\n\n    if !fs::metadata(&path)?.is_file() {\n        return Err(ConfigError::PathNotFile);\n    }\n\n    Ok(Source::File(FileInfo {\n        path,\n        terminate_after_first_read,\n    }))\n}\n"
  },
  {
    "path": "src/core/config.rs",
    "content": "use crate::style::{Color, Style};\n\n/// Configuration for highlighting numeric values.\n#[derive(Clone, Copy)]\npub struct NumberConfig {\n    /// Style applied to numbers.\n    pub style: Style,\n}\n\n/// Configuration for highlighting UUIDs.\n#[derive(Clone, Copy)]\npub struct UuidConfig {\n    /// Style applied to numeric characters.\n    pub number: Style,\n    /// Style applied to alphabetic characters.\n    pub letter: Style,\n    /// Style applied to dashes (`-`).\n    pub dash: Style,\n}\n\n/// Configuration for highlighting key-value pairs.\n#[derive(Clone, Copy)]\npub struct KeyValueConfig {\n    /// Style for the key portion.\n    pub key: Style,\n    /// Style for the separator between key and value.\n    pub separator: Style,\n}\n\n/// Configuration for highlighting date-time strings.\n#[derive(Clone, Copy)]\npub struct DateTimeConfig {\n    /// Style for dates.\n    pub date: Style,\n    /// Style for times.\n    pub time: Style,\n    /// Style for timezone indicators.\n    pub zone: Style,\n    /// Style for separators.\n    pub separator: Style,\n}\n\n/// Configuration for highlighting IPv4 addresses.\n#[derive(Clone, Copy)]\npub struct IpV4Config {\n    /// Style for numeric segments.\n    pub number: Style,\n    /// Style for dot separators (`.`).\n    pub separator: Style,\n}\n\n/// Configuration for highlighting IPv6 addresses.\n#[derive(Clone, Copy)]\npub struct IpV6Config {\n    /// Style for numeric characters.\n    pub number: Style,\n    /// Style for alphabetic characters.\n    pub letter: Style,\n    /// Style for colon separators (`:`).\n    pub separator: Style,\n}\n\n/// Configuration for highlighting URLs.\n#[derive(Clone, Copy)]\npub struct UrlConfig {\n    /// Style for \"http\" scheme.\n    pub http: Style,\n    /// Style for \"https\" scheme.\n    pub https: Style,\n    /// Style for the hostname.\n    pub host: Style,\n    /// Style for URL paths.\n    pub path: Style,\n    /// Style for query parameter keys.\n    pub query_params_key: Style,\n    /// Style for query parameter values.\n    pub query_params_value: Style,\n    /// Style for URL symbols (e.g., `/`, `:`, `?`).\n    pub symbols: Style,\n}\n\n/// Configuration for highlighting Unix file paths.\n#[derive(Clone, Copy)]\npub struct UnixPathConfig {\n    /// Style for path segments.\n    pub segment: Style,\n    /// Style for path separators (`/`).\n    pub separator: Style,\n}\n\n/// Configuration for highlighting memory pointers.\n#[derive(Clone, Copy)]\npub struct PointerConfig {\n    /// Style for numeric digits.\n    pub number: Style,\n    /// Style for alphabetic characters.\n    pub letter: Style,\n    /// Style for pointer separators.\n    pub separator: Style,\n    /// Token used to separate segments.\n    pub separator_token: char,\n    /// Style for the `x` character in pointers.\n    pub x: Style,\n}\n\n/// Configuration for highlighting Unix processes.\n#[derive(Clone, Copy)]\npub struct UnixProcessConfig {\n    /// Style for process name.\n    pub name: Style,\n    /// Style for process ID.\n    pub id: Style,\n    /// Style for surrounding brackets.\n    pub bracket: Style,\n}\n\n/// Configuration for highlighting JSON structures.\n#[derive(Clone, Copy)]\npub struct JsonConfig {\n    /// Style for JSON keys.\n    pub key: Style,\n    /// Style for quotation marks (`\"`).\n    pub quote_token: Style,\n    /// Style for curly brackets (`{}`).\n    pub curly_bracket: Style,\n    /// Style for square brackets (`[]`).\n    pub square_bracket: Style,\n    /// Style for commas (`,`).\n    pub comma: Style,\n    /// Style for colons (`:`).\n    pub colon: Style,\n}\n\n/// Configuration for highlighting quoted text.\n#[derive(Clone, Copy)]\npub struct QuotesConfig {\n    /// ASCII byte used as quote delimiter.\n    pub quotes_token: u8,\n    /// Style applied to quoted text.\n    pub style: Style,\n}\n\n/// Configuration for highlighting custom keywords.\n#[derive(PartialEq, Eq, Ord, PartialOrd, Debug, Clone)]\npub struct KeywordConfig {\n    /// List of keywords to highlight.\n    pub words: Vec<String>,\n    /// Style to apply to the keywords.\n    pub style: Style,\n}\n\n/// Configuration for highlighting custom regex patterns.\n#[derive(PartialEq, Eq, Ord, PartialOrd, Debug, Clone)]\npub struct RegexConfig {\n    /// Regex pattern for matching text.\n    pub regex: String,\n    /// Style applied to regex matches.\n    pub style: Style,\n}\n\nimpl Default for NumberConfig {\n    fn default() -> Self {\n        NumberConfig {\n            style: Style::new().fg(Color::Cyan),\n        }\n    }\n}\n\nimpl Default for UuidConfig {\n    fn default() -> Self {\n        UuidConfig {\n            number: Style::new().fg(Color::Blue).italic(),\n            letter: Style::new().fg(Color::Magenta).italic(),\n            dash: Style::new().fg(Color::Red),\n        }\n    }\n}\n\nimpl Default for KeyValueConfig {\n    fn default() -> Self {\n        KeyValueConfig {\n            key: Style::new().faint(),\n            separator: Style::new().fg(Color::White),\n        }\n    }\n}\n\nimpl Default for DateTimeConfig {\n    fn default() -> Self {\n        DateTimeConfig {\n            date: Style::new().fg(Color::Magenta),\n            time: Style::new().fg(Color::Blue),\n            zone: Style::new().fg(Color::Red),\n            separator: Style::new().faint(),\n        }\n    }\n}\n\nimpl Default for IpV4Config {\n    fn default() -> Self {\n        IpV4Config {\n            number: Style::new().fg(Color::Blue).italic(),\n            separator: Style::new().fg(Color::Red),\n        }\n    }\n}\n\nimpl Default for IpV6Config {\n    fn default() -> Self {\n        IpV6Config {\n            number: Style::new().fg(Color::Blue).italic(),\n            letter: Style::new().fg(Color::Magenta).italic(),\n            separator: Style::new().fg(Color::Red),\n        }\n    }\n}\n\nimpl Default for UrlConfig {\n    fn default() -> Self {\n        UrlConfig {\n            http: Style::new().fg(Color::Red).faint(),\n            https: Style::new().fg(Color::Green).faint(),\n            host: Style::new().fg(Color::Blue).faint(),\n            path: Style::new().fg(Color::Blue),\n            query_params_key: Style::new().fg(Color::Magenta),\n            query_params_value: Style::new().fg(Color::Cyan),\n            symbols: Style::new().fg(Color::Red),\n        }\n    }\n}\n\nimpl Default for UnixPathConfig {\n    fn default() -> Self {\n        UnixPathConfig {\n            segment: Style::new().fg(Color::Green),\n            separator: Style::new().fg(Color::Yellow),\n        }\n    }\n}\n\nimpl Default for PointerConfig {\n    fn default() -> Self {\n        PointerConfig {\n            number: Style::new().fg(Color::Blue).italic(),\n            letter: Style::new().fg(Color::Magenta).italic(),\n            separator: Style::new().faint(),\n            separator_token: '•',\n            x: Style::new().fg(Color::Red),\n        }\n    }\n}\n\nimpl Default for UnixProcessConfig {\n    fn default() -> Self {\n        UnixProcessConfig {\n            name: Style::new().fg(Color::Yellow),\n            id: Style::new().fg(Color::Cyan),\n            bracket: Style::new().fg(Color::Red),\n        }\n    }\n}\n\nimpl Default for JsonConfig {\n    fn default() -> Self {\n        JsonConfig {\n            key: Style::new().faint(),\n            quote_token: Style::new().faint(),\n            curly_bracket: Style::new().faint(),\n            square_bracket: Style::new().faint(),\n            comma: Style::new().faint(),\n            colon: Style::new().faint(),\n        }\n    }\n}\n\nimpl Default for QuotesConfig {\n    fn default() -> Self {\n        QuotesConfig {\n            quotes_token: b'\"',\n            style: Style::new().fg(Color::Yellow),\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighter.rs",
    "content": "use crate::core::config::*;\nuse crate::core::highlighters::StaticHighlight;\nuse crate::core::highlighters::date_dash::DateDashHighlighter;\nuse crate::core::highlighters::date_time::TimeHighlighter;\nuse crate::core::highlighters::ip_v4::IpV4Highlighter;\nuse crate::core::highlighters::ip_v6::IpV6Highlighter;\nuse crate::core::highlighters::json::JsonHighlighter;\nuse crate::core::highlighters::key_value::KeyValueHighlighter;\nuse crate::core::highlighters::keyword::KeywordHighlighter;\nuse crate::core::highlighters::number::NumberHighlighter;\nuse crate::core::highlighters::pointer::PointerHighlighter;\nuse crate::core::highlighters::quote::QuoteHighlighter;\nuse crate::core::highlighters::regex::RegexpHighlighter;\nuse crate::core::highlighters::unix_path::UnixPathHighlighter;\nuse crate::core::highlighters::unix_process::UnixProcessHighlighter;\nuse crate::core::highlighters::url::UrlHighlighter;\nuse crate::core::highlighters::uuid::UuidHighlighter;\nuse crate::core::utils::normalizer::normalize_keyword_configs;\nuse crate::core::utils::split_and_apply::apply_only_to_unhighlighted;\nuse std::borrow::Cow;\nuse thiserror::Error;\n\n/// A regex-based log highlighter.\n///\n/// `Highlighter` applies configured regex-based highlighters to text inputs,\n/// returning highlighted output with ANSI colors.\npub struct Highlighter {\n    highlighters: Vec<StaticHighlight>,\n}\n\npub trait Highlight: Sync + Send {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str>;\n}\n\n#[derive(Debug, Error)]\npub enum Error {\n    #[error(\"Regex error: {0}\")]\n    RegexError(String),\n\n    #[error(\"Pattern error: {0}\")]\n    PatternError(String),\n}\n\nimpl Highlighter {\n    const fn new() -> Self {\n        Highlighter {\n            highlighters: Vec::new(),\n        }\n    }\n\n    /// Creates a new [`HighlighterBuilder`] for configuring a [`Highlighter`].\n    pub const fn builder() -> HighlighterBuilder {\n        HighlighterBuilder {\n            highlighters: Vec::new(),\n            first_error: None,\n        }\n    }\n\n    fn with_highlighters(mut self, highlighters: Vec<StaticHighlight>) -> Self {\n        self.highlighters = highlighters;\n        self\n    }\n\n    /// Applies the configured highlights to the given input string.\n    pub fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        self.highlighters.iter().fold(Cow::Borrowed(input), |acc, highlighter| {\n            let result = if highlighter.needs_full_input() {\n                highlighter.apply(&acc)\n            } else {\n                apply_only_to_unhighlighted(&acc, highlighter)\n            };\n            match result {\n                Cow::Borrowed(_) => acc,\n                Cow::Owned(modified) => Cow::Owned(modified),\n            }\n        })\n    }\n}\n\nimpl Default for Highlighter {\n    /// Creates a default `Highlighter` with common patterns.\n    ///\n    /// This operation is expensive and should be done once and reused.\n    fn default() -> Self {\n        let mut builder = Highlighter::builder();\n\n        builder\n            .with_json_highlighter(JsonConfig::default())\n            .with_date_time_highlighters(DateTimeConfig::default())\n            .with_url_highlighter(UrlConfig::default())\n            .with_ip_v4_highlighter(IpV4Config::default())\n            .with_ip_v6_highlighter(IpV6Config::default())\n            .with_uuid_highlighter(UuidConfig::default())\n            .with_pointer_highlighter(PointerConfig::default())\n            .with_unix_path_highlighter(UnixPathConfig::default())\n            .with_unix_process_highlighter(UnixProcessConfig::default())\n            .with_key_value_highlighter(KeyValueConfig::default())\n            .with_number_highlighter(NumberConfig::default())\n            .with_quote_highlighter(QuotesConfig::default());\n\n        builder.build().expect(\"Default constructor should never fail\")\n    }\n}\n\n/// Builder for configuring a [`Highlighter`].\npub struct HighlighterBuilder {\n    highlighters: Vec<StaticHighlight>,\n    first_error: Option<Error>,\n}\n\nimpl HighlighterBuilder {\n    /// Adds a highlighter for numbers.\n    pub fn with_number_highlighter(&mut self, config: NumberConfig) -> &mut Self {\n        self.try_add_highlighter(NumberHighlighter::new(config).map(StaticHighlight::Number));\n        self\n    }\n\n    /// Adds a highlighter for UUIDs.\n    pub fn with_uuid_highlighter(&mut self, config: UuidConfig) -> &mut Self {\n        self.try_add_highlighter(UuidHighlighter::new(config).map(StaticHighlight::Uuid));\n        self\n    }\n\n    /// Adds a highlighter for Unix file paths.\n    pub fn with_unix_path_highlighter(&mut self, config: UnixPathConfig) -> &mut Self {\n        self.try_add_highlighter(UnixPathHighlighter::new(config).map(StaticHighlight::UnixPath));\n        self\n    }\n\n    /// Adds a highlighter for Unix processes.\n    pub fn with_unix_process_highlighter(&mut self, config: UnixProcessConfig) -> &mut Self {\n        self.try_add_highlighter(UnixProcessHighlighter::new(config).map(StaticHighlight::UnixProcess));\n        self\n    }\n\n    /// Adds a highlighter for key-value pairs.\n    pub fn with_key_value_highlighter(&mut self, config: KeyValueConfig) -> &mut Self {\n        self.try_add_highlighter(KeyValueHighlighter::new(config).map(StaticHighlight::KeyValue));\n        self\n    }\n\n    /// Adds highlighters for dates and times.\n    pub fn with_date_time_highlighters(&mut self, config: DateTimeConfig) -> &mut Self {\n        self.try_add_highlighter(TimeHighlighter::new(config).map(StaticHighlight::Time))\n            .try_add_highlighter(DateDashHighlighter::new(config).map(StaticHighlight::DateDash))\n    }\n\n    /// Adds a highlighter for IPv6 addresses.\n    pub fn with_ip_v6_highlighter(&mut self, config: IpV6Config) -> &mut Self {\n        self.try_add_highlighter(IpV6Highlighter::new(config).map(StaticHighlight::IpV6));\n        self\n    }\n\n    /// Adds a highlighter for IPv4 addresses.\n    pub fn with_ip_v4_highlighter(&mut self, config: IpV4Config) -> &mut Self {\n        self.try_add_highlighter(IpV4Highlighter::new(config).map(StaticHighlight::IpV4));\n        self\n    }\n\n    /// Adds a highlighter for URLs.\n    pub fn with_url_highlighter(&mut self, config: UrlConfig) -> &mut Self {\n        self.try_add_highlighter(UrlHighlighter::new(config).map(StaticHighlight::Url));\n        self\n    }\n\n    /// Adds a highlighter for memory pointers.\n    pub fn with_pointer_highlighter(&mut self, config: PointerConfig) -> &mut Self {\n        self.try_add_highlighter(PointerHighlighter::new(config).map(StaticHighlight::Pointer));\n        self\n    }\n\n    /// Adds a highlighter using a custom regex pattern.\n    pub fn with_regex_highlighter(&mut self, config: RegexConfig) -> &mut Self {\n        self.try_add_highlighter(RegexpHighlighter::new(config).map(StaticHighlight::Regexp));\n        self\n    }\n\n    /// Adds a highlighter for quoted text.\n    pub fn with_quote_highlighter(&mut self, config: QuotesConfig) -> &mut Self {\n        self.try_add_highlighter(Ok(StaticHighlight::Quote(QuoteHighlighter::new(config))));\n        self\n    }\n\n    /// Adds a highlighter for JSON structures.\n    pub fn with_json_highlighter(&mut self, config: JsonConfig) -> &mut Self {\n        self.try_add_highlighter(Ok(StaticHighlight::Json(JsonHighlighter::new(config))));\n        self\n    }\n\n    /// Adds keyword highlighters.\n    pub fn with_keyword_highlighter(&mut self, keyword_configs: Vec<KeywordConfig>) -> &mut Self {\n        let normalized_keyword_configs = normalize_keyword_configs(keyword_configs);\n\n        for keyword_config in normalized_keyword_configs {\n            if self.first_error.is_some() {\n                continue;\n            }\n\n            match KeywordHighlighter::new(keyword_config) {\n                Ok(h) => self.highlighters.push(StaticHighlight::Keyword(h)),\n                Err(e) => self.first_error = Some(Error::PatternError(e.to_string())),\n            }\n        }\n\n        self\n    }\n\n    /// Finalizes the builder and returns a configured [`Highlighter`].\n    pub fn build(self) -> Result<Highlighter, Error> {\n        if let Some(err) = self.first_error {\n            Err(err)\n        } else {\n            Ok(Highlighter::new().with_highlighters(self.highlighters))\n        }\n    }\n\n    fn try_add_highlighter(&mut self, highlighter: Result<StaticHighlight, regex::Error>) -> &mut Self {\n        if self.first_error.is_some() {\n            return self;\n        }\n\n        match highlighter {\n            Ok(h) => self.highlighters.push(h),\n            Err(e) => self.first_error = Some(Error::RegexError(e.to_string())),\n        }\n        self\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    fn number_then_quote_highlighter() -> Highlighter {\n        let mut builder = Highlighter::builder();\n        builder\n            .with_number_highlighter(NumberConfig {\n                style: Style::new().fg(Color::Cyan),\n            })\n            .with_quote_highlighter(QuotesConfig {\n                quotes_token: b'\"',\n                style: Style::new().fg(Color::Yellow),\n            });\n        builder.build().unwrap()\n    }\n\n    #[test]\n    fn test_quote_highlights_around_existing_number() {\n        let highlighter = number_then_quote_highlighter();\n\n        let input = r#\"count is \"value 42 here\" end\"#;\n        let expected = r#\"count is [yellow]\"value [cyan]42[reset][yellow] here\"[reset] end\"#;\n\n        let actual = highlighter.apply(input);\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_quote_with_no_highlights_inside() {\n        let highlighter = number_then_quote_highlighter();\n\n        let input = r#\"msg \"hello world\" end\"#;\n        let expected = r#\"msg [yellow]\"hello world\"[reset] end\"#;\n\n        let actual = highlighter.apply(input);\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_number_outside_quotes_unaffected() {\n        let highlighter = number_then_quote_highlighter();\n\n        let input = r#\"code 200 \"error\" end\"#;\n        let expected = r#\"code [cyan]200[reset] [yellow]\"error\"[reset] end\"#;\n\n        let actual = highlighter.apply(input);\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_multiple_numbers_inside_quotes() {\n        let highlighter = number_then_quote_highlighter();\n\n        let input = r#\"\"port 8080 and 443\"\"#;\n        let expected = r#\"[yellow]\"port [cyan]8080[reset][yellow] and [cyan]443[reset][yellow]\"[reset]\"#;\n\n        let actual = highlighter.apply(input);\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_multiple_quoted_segments() {\n        let highlighter = number_then_quote_highlighter();\n\n        let input = r#\"\"count 1\" and \"count 2\"\"#;\n        let expected =\n            r#\"[yellow]\"count [cyan]1[reset][yellow]\"[reset] and [yellow]\"count [cyan]2[reset][yellow]\"[reset]\"#;\n\n        let actual = highlighter.apply(input);\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_no_quotes_only_numbers() {\n        let highlighter = number_then_quote_highlighter();\n\n        let input = \"status 200 ok\";\n        let expected = \"status [cyan]200[reset] ok\";\n\n        let actual = highlighter.apply(input);\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/date_dash.rs",
    "content": "use crate::core::config::DateTimeConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse memchr::memchr2;\nuse regex::{Captures, Error, Regex, RegexBuilder};\nuse std::borrow::Cow;\n\npub struct DateDashHighlighter {\n    regex: Regex,\n    date: Painter,\n    separator: Painter,\n    idx: Idx,\n}\n\n#[derive(Copy, Clone)]\nstruct Idx {\n    // Branch A: YYYY sep first sep2 second\n    a_year: usize,\n    a_sep1: usize,\n    a_first: usize,\n    a_sep2: usize,\n    a_second: usize,\n\n    // Branch B: first sep second sep2 year\n    b_first: usize,\n    b_sep1: usize,\n    b_second: usize,\n    b_sep2: usize,\n    b_year: usize,\n}\n\nimpl DateDashHighlighter {\n    pub fn new(time_config: DateTimeConfig) -> Result<Self, Error> {\n        let pattern = r\"(?x)\n            # Branch A: YYYY-xx-xx\n            (?P<a_year> 19\\d{2} | 20\\d{2} )\n            (?P<a_sep1> [-/] )\n            (?P<a_first> 0[1-9] | [12]\\d | 3[01] )\n            (?P<a_sep2> [-/] )\n            (?P<a_second> 0[1-9] | [12]\\d | 3[01] )\n            |\n            # Branch B: xx-xx-YYYY\n            (?P<b_first> 0[1-9] | [12]\\d | 3[01] )\n            (?P<b_sep1>  [-/] )\n            (?P<b_second> 0[1-9] | [12]\\d | 3[01] )\n            (?P<b_sep2>  [-/] )\n            (?P<b_year>  19\\d{2} | 20\\d{2} )\n        \";\n\n        let regex = RegexBuilder::new(pattern).unicode(false).build()?;\n\n        // Resolve capture names → indices once.\n        let mut map = std::collections::HashMap::new();\n        for (i, name) in regex.capture_names().enumerate() {\n            if let Some(n) = name {\n                map.insert(n.to_string(), i);\n            }\n        }\n        let idx = Idx {\n            a_year: map[\"a_year\"],\n            a_sep1: map[\"a_sep1\"],\n            a_first: map[\"a_first\"],\n            a_sep2: map[\"a_sep2\"],\n            a_second: map[\"a_second\"],\n            b_first: map[\"b_first\"],\n            b_sep1: map[\"b_sep1\"],\n            b_second: map[\"b_second\"],\n            b_sep2: map[\"b_sep2\"],\n            b_year: map[\"b_year\"],\n        };\n\n        Ok(Self {\n            regex,\n            idx,\n            date: Painter::new(time_config.date.into()),\n            separator: Painter::new(time_config.separator.into()),\n        })\n    }\n\n    #[inline]\n    fn write_branch_a(&self, caps: &Captures<'_>, out: &mut String) {\n        // YYYY sep first sep2 second  → keep order (already year-first)\n        let y = caps.get(self.idx.a_year).unwrap().as_str();\n        let s1 = caps.get(self.idx.a_sep1).unwrap().as_str();\n        let f = caps.get(self.idx.a_first).unwrap().as_str();\n        let s2 = caps.get(self.idx.a_sep2).unwrap().as_str();\n        let s = caps.get(self.idx.a_second).unwrap().as_str();\n\n        self.date.paint(out, y);\n        self.separator.paint(out, s1);\n        self.date.paint(out, f);\n        self.separator.paint(out, s2);\n        self.date.paint(out, s);\n    }\n\n    #[inline]\n    fn write_branch_b(&self, caps: &Captures<'_>, out: &mut String) {\n        // first sep second sep2 YYYY  → normalize to year-first: YYYY sep1 first sep2 second\n        let f = caps.get(self.idx.b_first).unwrap().as_str();\n        let s1 = caps.get(self.idx.b_sep1).unwrap().as_str();\n        let s = caps.get(self.idx.b_second).unwrap().as_str();\n        let s2 = caps.get(self.idx.b_sep2).unwrap().as_str();\n        let y = caps.get(self.idx.b_year).unwrap().as_str();\n\n        self.date.paint(out, y);\n        self.separator.paint(out, s1);\n        self.date.paint(out, f);\n        self.separator.paint(out, s2);\n        self.date.paint(out, s);\n    }\n}\n\nimpl Highlight for DateDashHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        if memchr2(b'-', b'/', input.as_bytes()).is_none() {\n            return Cow::Borrowed(input);\n        }\n\n        let mut out: Option<String> = None;\n        let mut last = 0usize;\n\n        for caps in self.regex.captures_iter(input) {\n            let m = caps.get(0).unwrap();\n            let buf = out.get_or_insert_with(|| String::with_capacity(input.len() + 32));\n            buf.push_str(&input[last..m.start()]);\n\n            if caps.get(self.idx.a_year).is_some() {\n                self.write_branch_a(&caps, buf);\n            } else {\n                self.write_branch_b(&caps, buf);\n            }\n\n            last = m.end();\n        }\n\n        match out {\n            Some(mut buf) => {\n                buf.push_str(&input[last..]);\n                Cow::Owned(buf)\n            }\n            None => Cow::Borrowed(input),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_date_dash_highlighter() {\n        let config = DateTimeConfig {\n            date: Style::new().fg(Color::Magenta),\n            separator: Style::new().fg(Color::Blue),\n            ..DateTimeConfig::default()\n        };\n        let highlighter = DateDashHighlighter::new(config).unwrap();\n\n        let cases = vec![\n            (\n                \"2022-09-09\",\n                \"[magenta]2022[reset][blue]-[reset][magenta]09[reset][blue]-[reset][magenta]09[reset]\",\n            ),\n            (\n                \"2022/12/30\",\n                \"[magenta]2022[reset][blue]/[reset][magenta]12[reset][blue]/[reset][magenta]30[reset]\",\n            ),\n            (\n                \"09-09-2022\",\n                \"[magenta]2022[reset][blue]-[reset][magenta]09[reset][blue]-[reset][magenta]09[reset]\",\n            ),\n            (\n                \"09/09/2022\",\n                \"[magenta]2022[reset][blue]/[reset][magenta]09[reset][blue]/[reset][magenta]09[reset]\",\n            ),\n            (\"3022-09-09\", \"3022-09-09\"), // invalid year\n            (\"2022-19-39\", \"2022-19-39\"), // invalid month\n            (\"2022/19/39\", \"2022/19/39\"), // invalid month\n            (\"19/39/3023\", \"19/39/3023\"), // invalid year\n            (\"No dates here!\", \"No dates here!\"),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/date_time.rs",
    "content": "use crate::core::config::DateTimeConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse memchr::memchr;\nuse regex::{Captures, Error, Regex, RegexBuilder};\nuse std::borrow::Cow;\n\npub struct TimeHighlighter {\n    regex: Regex,\n    idx: Idx,\n    time: Painter,\n    zone: Painter,\n    separator: Painter,\n}\n\n#[derive(Copy, Clone)]\nstruct Idx {\n    t: usize,\n    hours: usize,\n    colon1: usize,\n    minutes: usize,\n    colon2: usize,\n    seconds: usize,\n    frac_sep: usize,\n    frac_digits: usize,\n    tz: usize,\n}\n\nimpl TimeHighlighter {\n    pub fn new(time_config: DateTimeConfig) -> Result<Self, Error> {\n        let pattern = r\"(?x)\n            (?P<T>[T\\s])?\n            (?P<hours>[01]?\\d|2[0-3])(?P<colon1>:)\n            (?P<minutes>[0-5]\\d)(?P<colon2>:)\n            (?P<seconds>[0-5]\\d)\n            (?P<frac_sep>[.,:])?(?P<frac_digits>\\d+)?\n            (?P<tz>Z)?\n        \";\n\n        let regex = RegexBuilder::new(pattern).unicode(false).build()?;\n\n        let mut name_to_idx = std::collections::HashMap::new();\n        for (i, name_opt) in regex.capture_names().enumerate() {\n            if let Some(name) = name_opt {\n                name_to_idx.insert(name.to_string(), i);\n            }\n        }\n        let idx = Idx {\n            t: name_to_idx[\"T\"],\n            hours: name_to_idx[\"hours\"],\n            colon1: name_to_idx[\"colon1\"],\n            minutes: name_to_idx[\"minutes\"],\n            colon2: name_to_idx[\"colon2\"],\n            seconds: name_to_idx[\"seconds\"],\n            frac_sep: name_to_idx[\"frac_sep\"],\n            frac_digits: name_to_idx[\"frac_digits\"],\n            tz: name_to_idx[\"tz\"],\n        };\n\n        Ok(Self {\n            regex,\n            idx,\n            time: Painter::new(time_config.time.into()),\n            zone: Painter::new(time_config.zone.into()),\n            separator: Painter::new(time_config.separator.into()),\n        })\n    }\n\n    #[inline]\n    fn write_part(buf: &mut String, caps: &Captures<'_>, i: usize, painter: &Painter) {\n        if let Some(m) = caps.get(i) {\n            painter.paint(buf, m.as_str());\n        }\n    }\n}\n\nimpl Highlight for TimeHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        if memchr(b':', input.as_bytes()).is_none() {\n            return Cow::Borrowed(input);\n        }\n\n        let mut out: Option<String> = None;\n        let mut last = 0usize;\n\n        for caps in self.regex.captures_iter(input) {\n            let m = caps.get(0).unwrap();\n            let buf = out.get_or_insert_with(|| String::with_capacity(input.len() + 32));\n            buf.push_str(&input[last..m.start()]);\n\n            Self::write_part(buf, &caps, self.idx.t, &self.zone);\n            Self::write_part(buf, &caps, self.idx.hours, &self.time);\n            Self::write_part(buf, &caps, self.idx.colon1, &self.separator);\n            Self::write_part(buf, &caps, self.idx.minutes, &self.time);\n            Self::write_part(buf, &caps, self.idx.colon2, &self.separator);\n            Self::write_part(buf, &caps, self.idx.seconds, &self.time);\n            Self::write_part(buf, &caps, self.idx.frac_sep, &self.separator);\n            Self::write_part(buf, &caps, self.idx.frac_digits, &self.time);\n            Self::write_part(buf, &caps, self.idx.tz, &self.zone);\n\n            last = m.end();\n        }\n\n        match out {\n            Some(mut buf) => {\n                buf.push_str(&input[last..]);\n                Cow::Owned(buf)\n            }\n            None => Cow::Borrowed(input),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::config::DateTimeConfig;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_time_highlighter() {\n        let config = DateTimeConfig {\n            date: Style::new(),\n            time: Style::new().fg(Color::Red),\n            zone: Style::new().fg(Color::Blue),\n            separator: Style::new().fg(Color::Yellow),\n        };\n        let highlighter = TimeHighlighter::new(config).unwrap();\n\n        let cases = vec![\n            (\n                \"07:46:34\",\n                \"[red]07[reset][yellow]:[reset][red]46[reset][yellow]:[reset][red]34[reset]\",\n            ),\n            (\n                \"10:51:19.251\",\n                \"[red]10[reset][yellow]:[reset][red]51[reset][yellow]:[reset][red]19[reset][yellow].[reset][red]251[reset]\",\n            ),\n            (\n                \"11:47:39:850\",\n                \"[red]11[reset][yellow]:[reset][red]47[reset][yellow]:[reset][red]39[reset][yellow]:[reset][red]850[reset]\",\n            ),\n            (\n                \"3:33:30\",\n                \"[red]3[reset][yellow]:[reset][red]33[reset][yellow]:[reset][red]30[reset]\",\n            ),\n            (\n                \"2022-09-09 11:48:34,534\",\n                \"2022-09-09[blue] [reset][red]11[reset][yellow]:[reset][red]48[reset][yellow]:[reset][red]34[reset][yellow],[reset][red]534[reset]\",\n            ),\n            (\n                \"2022-09-22T07:46:34.171800155Z\",\n                \"2022-09-22[blue]T[reset][red]07[reset][yellow]:[reset][red]46[reset][yellow]:[reset][red]34[reset][yellow].[reset][red]171800155[reset][blue]Z[reset]\",\n            ),\n            (\n                \"2024-09-14T07:57:30.659+02:00\",\n                \"2024-09-14[blue]T[reset][red]07[reset][yellow]:[reset][red]57[reset][yellow]:[reset][red]30[reset][yellow].[reset][red]659[reset]+02:00\",\n            ),\n            (\"No time here!\", \"No time here!\"),\n            (\"2001:db8::ff00:42:8329\", \"2001:db8::ff00:42:8329\"),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/ip_v4.rs",
    "content": "use super::RegexExt;\nuse crate::core::config::IpV4Config;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse memchr::memchr;\nuse regex::{Error, Regex, RegexBuilder};\nuse std::borrow::Cow;\n\npub struct IpV4Highlighter {\n    regex: Regex,\n    segment: Painter,\n    separator: Painter,\n}\n\nimpl IpV4Highlighter {\n    pub fn new(config: IpV4Config) -> Result<Self, Error> {\n        let pattern = r\"(?x)\\b\n            (?P<o1>\\d{1,3})\\.\n            (?P<o2>\\d{1,3})\\.\n            (?P<o3>\\d{1,3})\\.\n            (?P<o4>\\d{1,3})\n            (?:/(?P<mask>\\d{1,2}))?\n            \\b\";\n        let regex = RegexBuilder::new(pattern).unicode(false).build()?;\n\n        Ok(Self {\n            regex,\n            segment: Painter::new(config.number.into()),\n            separator: Painter::new(config.separator.into()),\n        })\n    }\n}\n\nimpl Highlight for IpV4Highlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        if memchr(b'.', input.as_bytes()).is_none() {\n            return Cow::Borrowed(input);\n        }\n\n        let names = [\"o1\", \"o2\", \"o3\", \"o4\"];\n\n        self.regex.replace_all_cow(input, |caps, buf| {\n            let valid_octets = names\n                .iter()\n                .all(|n| caps.name(n).unwrap().as_str().parse::<u8>().is_ok());\n            let valid_mask = caps\n                .name(\"mask\")\n                .map_or(true, |ms| ms.as_str().parse::<u8>().is_ok_and(|v| v <= 32));\n\n            if valid_octets && valid_mask {\n                for (i, &n) in names.iter().enumerate() {\n                    self.segment.paint(buf, caps.name(n).unwrap().as_str());\n                    if i < 3 {\n                        self.separator.paint(buf, \".\");\n                    }\n                }\n                if let Some(ms) = caps.name(\"mask\") {\n                    self.separator.paint(buf, \"/\");\n                    self.segment.paint(buf, ms.as_str());\n                }\n            } else {\n                buf.push_str(caps.get(0).unwrap().as_str());\n            }\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_ipv4_highlighter_valid() {\n        let h = IpV4Highlighter::new(IpV4Config {\n            number: Style::new().fg(Color::Blue),\n            separator: Style::new().fg(Color::Red),\n        })\n        .unwrap();\n\n        let cases = vec![\n            (\n                \"10.0.0.123\",\n                \"[blue]10[reset][red].[reset][blue]0[reset][red].[reset][blue]0[reset][red].[reset][blue]123[reset]\",\n            ),\n            (\n                \"192.168.0.1/24\",\n                \"[blue]192[reset][red].[reset][blue]168[reset][red].[reset][blue]0[reset][red].[reset][blue]1[reset][red]/[reset][blue]24[reset]\",\n            ),\n            (\n                \"0.0.0.0\",\n                \"[blue]0[reset][red].[reset][blue]0[reset][red].[reset][blue]0[reset][red].[reset][blue]0[reset]\",\n            ),\n        ];\n\n        for (input, expect) in cases {\n            let actual = h.apply(input);\n            assert_eq!(expect, actual.to_string().convert_escape_codes());\n        }\n    }\n\n    #[test]\n    fn test_ipv4_highlighter_invalid_octet_or_mask() {\n        let h = IpV4Highlighter::new(IpV4Config {\n            number: Style::new().fg(Color::Blue),\n            separator: Style::new().fg(Color::Red),\n        })\n        .unwrap();\n\n        let cases = vec![\n            // octet >255\n            (\"256.1.1.1\", \"256.1.1.1\"),\n            // octet >255\n            (\"999.999.999.999\", \"999.999.999.999\"),\n            // mask >32\n            (\"192.168.0.1/33\", \"192.168.0.1/33\"),\n            // partial (too few segments) shouldn’t match at all\n            (\"1.2.3\", \"1.2.3\"),\n        ];\n\n        for (input, expect) in cases {\n            let actual = h.apply(input);\n            assert_eq!(expect, actual);\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/ip_v6.rs",
    "content": "use super::RegexExt;\nuse crate::core::config::IpV6Config;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse memchr::memchr;\nuse regex::{Error, Regex, RegexBuilder};\nuse std::borrow::Cow;\nuse std::net::Ipv6Addr;\n\npub struct IpV6Highlighter {\n    regex: Regex,\n    number: Painter,\n    letter: Painter,\n    separator: Painter,\n}\n\nimpl IpV6Highlighter {\n    pub fn new(config: IpV6Config) -> Result<Self, Error> {\n        let pattern = r#\"([0-9a-fA-F:.]{3,})(?:(/)(\\d{1,3}))?\"#;\n        let regex = RegexBuilder::new(pattern).unicode(false).build()?;\n\n        Ok(Self {\n            regex,\n            number: Painter::new(config.number.into()),\n            letter: Painter::new(config.letter.into()),\n            separator: Painter::new(config.separator.into()),\n        })\n    }\n}\n\nimpl Highlight for IpV6Highlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        if memchr(b':', input.as_bytes()).is_none() {\n            return Cow::Borrowed(input);\n        }\n\n        self.regex.replace_all_cow(input, |caps, buf| {\n            if caps[1].parse::<Ipv6Addr>().is_ok() {\n                let addr = &caps[1];\n                for (i, c) in addr.char_indices() {\n                    let s = &addr[i..i + c.len_utf8()];\n                    let painter = match c {\n                        '0'..='9' => &self.number,\n                        'a'..='f' | 'A'..='F' => &self.letter,\n                        ':' | '.' => &self.separator,\n                        _ => {\n                            buf.push(c);\n                            continue;\n                        }\n                    };\n                    painter.paint(buf, s);\n                }\n\n                if let (Some(slash), Some(netmask)) = (caps.get(2), caps.get(3)) {\n                    self.separator.paint(buf, slash.as_str());\n                    self.number.paint(buf, netmask.as_str());\n                }\n            } else {\n                buf.push_str(caps.get(0).unwrap().as_str());\n            }\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_ip_v6_highlighter() {\n        let highlighter = IpV6Highlighter::new(IpV6Config {\n            number: Style::new().fg(Color::Blue),\n            letter: Style::new().fg(Color::Yellow),\n            separator: Style::new().fg(Color::Red),\n        })\n        .unwrap();\n\n        let cases = vec![\n            (\n                \"2001:db8:0:0:0:ff00:42:8329\",\n                \"[blue]2[reset][blue]0[reset][blue]0[reset][blue]1[reset][red]:[reset][yellow]d[reset][yellow]b[reset][blue]8[reset][red]:[reset][blue]0[reset][red]:[reset][blue]0[reset][red]:[reset][blue]0[reset][red]:[reset][yellow]f[reset][yellow]f[reset][blue]0[reset][blue]0[reset][red]:[reset][blue]4[reset][blue]2[reset][red]:[reset][blue]8[reset][blue]3[reset][blue]2[reset][blue]9[reset]\",\n            ),\n            (\n                \"2001:db8::ff00:42:8329\",\n                \"[blue]2[reset][blue]0[reset][blue]0[reset][blue]1[reset][red]:[reset][yellow]d[reset][yellow]b[reset][blue]8[reset][red]:[reset][red]:[reset][yellow]f[reset][yellow]f[reset][blue]0[reset][blue]0[reset][red]:[reset][blue]4[reset][blue]2[reset][red]:[reset][blue]8[reset][blue]3[reset][blue]2[reset][blue]9[reset]\",\n            ),\n            (\"::1\", \"[red]:[reset][red]:[reset][blue]1[reset]\"),\n            (\n                \"2001:db8:85a3::8a2e:192.0.2.33\",\n                \"[blue]2[reset][blue]0[reset][blue]0[reset][blue]1[reset][red]:[reset][yellow]d[reset][yellow]b[reset][blue]8[reset][red]:[reset][blue]8[reset][blue]5[reset][yellow]a[reset][blue]3[reset][red]:[reset][red]:[reset][blue]8[reset][yellow]a[reset][blue]2[reset][yellow]e[reset][red]:[reset][blue]1[reset][blue]9[reset][blue]2[reset][red].[reset][blue]0[reset][red].[reset][blue]2[reset][red].[reset][blue]3[reset][blue]3[reset]\",\n            ),\n            (\n                \"::ffff:127.0.0.1\",\n                \"[red]:[reset][red]:[reset][yellow]f[reset][yellow]f[reset][yellow]f[reset][yellow]f[reset][red]:[reset][blue]1[reset][blue]2[reset][blue]7[reset][red].[reset][blue]0[reset][red].[reset][blue]0[reset][red].[reset][blue]1[reset]\",\n            ),\n            (\n                \"fe80::/10\",\n                \"[yellow]f[reset][yellow]e[reset][blue]8[reset][blue]0[reset][red]:[reset][red]:[reset][red]/[reset][blue]10[reset]\",\n            ),\n            (\"Not ipv4: 192.168.0.1\", \"Not ipv4: 192.168.0.1\"),\n            (\"11:47:39:850\", \"11:47:39:850\"),\n            (\"123/234/345/456\", \"123/234/345/456\"),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/json.rs",
    "content": "use crate::core::config::JsonConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse serde_json::Value;\nuse std::borrow::Cow;\nuse std::fmt::Write;\n\npub struct JsonHighlighter {\n    key: Painter,\n    quote_token: Painter,\n    curly_bracket: Painter,\n    square_bracket: Painter,\n    comma: Painter,\n    colon: Painter,\n}\n\nimpl JsonHighlighter {\n    pub fn new(config: JsonConfig) -> Self {\n        Self {\n            key: Painter::new(config.key.into()),\n            quote_token: Painter::new(config.quote_token.into()),\n            curly_bracket: Painter::new(config.curly_bracket.into()),\n            square_bracket: Painter::new(config.square_bracket.into()),\n            comma: Painter::new(config.comma.into()),\n            colon: Painter::new(config.colon.into()),\n        }\n    }\n\n    fn format_json(&self, value: &Value, output: &mut String) {\n        match value {\n            Value::Object(map) => {\n                self.curly_bracket.paint(output, \"{\");\n                let mut first = true;\n                for (key, val) in map {\n                    if !first {\n                        self.comma.paint(output, \",\");\n                    }\n                    first = false;\n\n                    output.push(' ');\n                    self.quote_token.paint(output, \"\\\"\");\n                    self.key.paint(output, key);\n                    self.quote_token.paint(output, \"\\\"\");\n                    self.colon.paint(output, \":\");\n                    output.push(' ');\n\n                    self.format_json(val, output);\n                }\n                output.push(' ');\n                self.curly_bracket.paint(output, \"}\");\n            }\n            Value::Array(array) => {\n                self.square_bracket.paint(output, \"[\");\n                let mut first = true;\n                for item in array {\n                    if !first {\n                        self.comma.paint(output, \",\");\n                        output.push(' ');\n                    }\n                    first = false;\n\n                    self.format_json(item, output);\n                }\n                self.square_bracket.paint(output, \"]\");\n            }\n            Value::String(s) => {\n                self.quote_token.paint(output, \"\\\"\");\n                output.push_str(s);\n                self.quote_token.paint(output, \"\\\"\");\n            }\n            Value::Number(n) => {\n                write!(output, \"{}\", n).unwrap();\n            }\n            Value::Bool(b) => {\n                write!(output, \"{}\", b).unwrap();\n            }\n            Value::Null => {\n                output.push_str(\"null\");\n            }\n        }\n    }\n}\n\nimpl Highlight for JsonHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        let first = input.as_bytes().iter().find(|b| !b.is_ascii_whitespace());\n        if first != Some(&b'{') && first != Some(&b'[') {\n            return Cow::Borrowed(input);\n        }\n\n        let json_value: Value = match serde_json::from_str(input) {\n            Ok(value) => value,\n            Err(_) => return Cow::Borrowed(input),\n        };\n\n        let mut output = String::with_capacity(input.len() * 2);\n        self.format_json(&json_value, &mut output);\n\n        Cow::Owned(output)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_number_highlighter() {\n        let config = JsonConfig {\n            key: Style::new().fg(Color::Yellow),\n            quote_token: Style::new().fg(Color::Blue),\n            curly_bracket: Style::new().fg(Color::Cyan),\n            square_bracket: Style::new().fg(Color::Green),\n            comma: Style::new().fg(Color::Red),\n            colon: Style::new().fg(Color::Magenta),\n        };\n        let highlighter = JsonHighlighter::new(config);\n\n        let cases = vec![\n            (\n                r#\"{ \"name\": \"John Doe\", \"age\": 43, \"phones\": [ \"+44 1234567\", \"+44 2345678\" ] }\"#,\n                r#\"[cyan]{[reset] [blue]\"[reset][yellow]name[reset][blue]\"[reset][magenta]:[reset] [blue]\"[reset]John Doe[blue]\"[reset][red],[reset] [blue]\"[reset][yellow]age[reset][blue]\"[reset][magenta]:[reset] 43[red],[reset] [blue]\"[reset][yellow]phones[reset][blue]\"[reset][magenta]:[reset] [green][[reset][blue]\"[reset]+44 1234567[blue]\"[reset][red],[reset] [blue]\"[reset]+44 2345678[blue]\"[reset][green]][reset] [cyan]}[reset]\"#,\n            ),\n            (\n                r#\"{ \"name\": \"John\", \"age\": 30 }\"#,\n                r#\"[cyan]{[reset] [blue]\"[reset][yellow]name[reset][blue]\"[reset][magenta]:[reset] [blue]\"[reset]John[blue]\"[reset][red],[reset] [blue]\"[reset][yellow]age[reset][blue]\"[reset][magenta]:[reset] 30 [cyan]}[reset]\"#,\n            ),\n            (\"No jsons here!\", \"No jsons here!\"),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/key_value.rs",
    "content": "use super::RegexExt;\nuse crate::core::config::KeyValueConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse memchr::memchr;\nuse regex::{Error, Regex, RegexBuilder};\nuse std::borrow::Cow;\n\npub struct KeyValueHighlighter {\n    regex: Regex,\n    key: Painter,\n    separator: Painter,\n}\n\nimpl KeyValueHighlighter {\n    pub fn new(config: KeyValueConfig) -> Result<Self, Error> {\n        let pattern = r\"(?P<space_or_start>(^)|\\s)(?P<key>\\w+\\b)(?P<equals>=)\";\n        let regex = RegexBuilder::new(pattern).unicode(false).build()?;\n\n        Ok(Self {\n            regex,\n            key: Painter::new(config.key.into()),\n            separator: Painter::new(config.separator.into()),\n        })\n    }\n}\n\nimpl Highlight for KeyValueHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        if memchr(b'=', input.as_bytes()).is_none() {\n            return Cow::Borrowed(input);\n        }\n\n        self.regex.replace_all_cow(input, |caps, buf| {\n            let space_or_start = caps.name(\"space_or_start\").map(|s| s.as_str()).unwrap_or_default();\n            buf.push_str(space_or_start);\n            if let Some(k) = caps.name(\"key\") {\n                self.key.paint(buf, k.as_str());\n            }\n            if let Some(e) = caps.name(\"equals\") {\n                self.separator.paint(buf, e.as_str());\n            }\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_number_highlighter() {\n        let highlighter = KeyValueHighlighter::new(KeyValueConfig {\n            key: Style::new().fg(Color::Red),\n            separator: Style::new().fg(Color::Yellow),\n        })\n        .unwrap();\n\n        let cases = vec![\n            (\"Entry key=value\", \"Entry [red]key[reset][yellow]=[reset]value\"),\n            (\"No numbers here!\", \"No numbers here!\"),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/keyword.rs",
    "content": "use crate::core::config::KeywordConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse aho_corasick::{AhoCorasick, AhoCorasickBuilder, BuildError, MatchKind};\nuse std::borrow::Cow;\n\npub struct KeywordHighlighter {\n    ac: AhoCorasick,\n    style: Painter,\n    has_background: bool,\n}\n\nimpl KeywordHighlighter {\n    pub fn new(keyword_config: KeywordConfig) -> Result<Self, BuildError> {\n        let ac = AhoCorasickBuilder::new()\n            .match_kind(MatchKind::LeftmostFirst)\n            .build(&keyword_config.words)?;\n\n        let has_background = keyword_config.style.bg.is_some();\n\n        Ok(Self {\n            ac,\n            style: Painter::new(keyword_config.style.into()),\n            has_background,\n        })\n    }\n}\n\nfn is_word_byte(b: u8) -> bool {\n    b.is_ascii_uppercase() || b.is_ascii_lowercase() || b.is_ascii_digit() || b == b'_'\n}\n\nfn is_word_boundary(hay: &[u8], start: usize, end: usize) -> bool {\n    let left_ok = start == 0 || !is_word_byte(hay[start - 1]);\n    let right_ok = end == hay.len() || !is_word_byte(hay[end]);\n    left_ok && right_ok\n}\n\nimpl Highlight for KeywordHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        let bytes = input.as_bytes();\n        let mut out: Option<String> = None;\n        let mut last = 0;\n\n        for m in self.ac.find_iter(bytes) {\n            let (s, e) = (m.start(), m.end());\n            if !is_word_boundary(bytes, s, e) {\n                continue;\n            }\n\n            let out_buf = out.get_or_insert_with(|| String::with_capacity(input.len() + 16));\n\n            out_buf.push_str(&input[last..s]);\n\n            if !self.has_background {\n                self.style.paint(out_buf, &input[s..e]);\n            } else {\n                self.style.paint_with_padding(out_buf, &input[s..e]);\n            }\n\n            last = e;\n        }\n\n        match out {\n            None => Cow::Borrowed(input),\n            Some(mut s) => {\n                s.push_str(&input[last..]);\n                Cow::Owned(s)\n            }\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_foreground_keyword_highlighter() {\n        let config = KeywordConfig {\n            words: vec![\"null\".to_string()],\n            style: Style::new().fg(Color::Red),\n        };\n        let highlighter = KeywordHighlighter::new(config).unwrap();\n\n        let cases = vec![\n            (\"Hello null world\", \"Hello [red]null[reset] world\"),\n            (\n                \"There are 1001 nights in the tale.\",\n                \"There are 1001 nights in the tale.\",\n            ),\n            (\"No numbers here!\", \"No numbers here!\"),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n\n    #[test]\n    fn test_background_keyword_highlighter() {\n        let config = KeywordConfig {\n            words: vec![\"null\".to_string()],\n            style: Style::new().on(Color::Red),\n        };\n        let highlighter = KeywordHighlighter::new(config).unwrap();\n\n        let cases = vec![\n            (\"Hello null world\", \"Hello [bg_red] null [reset] world\"),\n            (\n                \"There are 1001 nights in the tale.\",\n                \"There are 1001 nights in the tale.\",\n            ),\n            (\"No numbers here!\", \"No numbers here!\"),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/mod.rs",
    "content": "use crate::core::highlighter::Highlight;\nuse crate::core::highlighters::date_dash::DateDashHighlighter;\nuse crate::core::highlighters::date_time::TimeHighlighter;\nuse crate::core::highlighters::ip_v4::IpV4Highlighter;\nuse crate::core::highlighters::ip_v6::IpV6Highlighter;\nuse crate::core::highlighters::json::JsonHighlighter;\nuse crate::core::highlighters::key_value::KeyValueHighlighter;\nuse crate::core::highlighters::keyword::KeywordHighlighter;\nuse crate::core::highlighters::number::NumberHighlighter;\nuse crate::core::highlighters::pointer::PointerHighlighter;\nuse crate::core::highlighters::quote::QuoteHighlighter;\nuse crate::core::highlighters::regex::RegexpHighlighter;\nuse crate::core::highlighters::unix_path::UnixPathHighlighter;\nuse crate::core::highlighters::unix_process::UnixProcessHighlighter;\nuse crate::core::highlighters::url::UrlHighlighter;\nuse crate::core::highlighters::uuid::UuidHighlighter;\nuse ::regex::{Captures, Regex};\nuse nu_ansi_term::Style as NuStyle;\nuse std::borrow::Cow;\n\nconst RESET: &str = \"\\x1b[0m\";\n\n/// Pre-computed ANSI escape prefix for a style. Avoids the `Display` dispatch\n/// of `style.paint(s)` on every call by writing `prefix + s + RESET` directly.\npub(crate) struct Painter {\n    prefix: String,\n}\n\nimpl Painter {\n    pub fn new(style: NuStyle) -> Self {\n        let styled = format!(\"{}\", style.paint(\"\"));\n        let prefix = styled.replace(RESET, \"\");\n        Self { prefix }\n    }\n\n    #[inline]\n    pub fn paint(&self, buf: &mut String, s: &str) {\n        if self.prefix.is_empty() {\n            buf.push_str(s);\n        } else {\n            buf.push_str(&self.prefix);\n            buf.push_str(s);\n            buf.push_str(RESET);\n        }\n    }\n\n    #[inline]\n    pub fn paint_with_padding(&self, buf: &mut String, s: &str) {\n        if self.prefix.is_empty() {\n            buf.push(' ');\n            buf.push_str(s);\n            buf.push(' ');\n        } else {\n            buf.push_str(&self.prefix);\n            buf.push(' ');\n            buf.push_str(s);\n            buf.push(' ');\n            buf.push_str(RESET);\n        }\n    }\n}\n\npub mod date_dash;\npub mod date_time;\npub mod ip_v4;\npub mod ip_v6;\npub mod json;\npub mod key_value;\npub mod keyword;\npub mod number;\npub mod pointer;\npub mod quote;\npub mod regex;\npub mod unix_path;\npub mod unix_process;\npub mod url;\npub mod uuid;\n\n/// Extension trait for `Regex` that provides a zero-alloc alternative to\n/// `replace_all`. Writes directly into a single buffer instead of allocating\n/// a `String` per match, and returns `Cow::Borrowed` when there are no matches.\npub(crate) trait RegexExt {\n    fn replace_all_cow<'a, F>(&self, input: &'a str, replacer: F) -> Cow<'a, str>\n    where\n        F: FnMut(&Captures<'_>, &mut String);\n}\n\nimpl RegexExt for Regex {\n    fn replace_all_cow<'a, F>(&self, input: &'a str, mut replacer: F) -> Cow<'a, str>\n    where\n        F: FnMut(&Captures<'_>, &mut String),\n    {\n        let mut out: Option<String> = None;\n        let mut last = 0usize;\n\n        for caps in self.captures_iter(input) {\n            let m = caps.get(0).unwrap();\n            let buf = out.get_or_insert_with(|| String::with_capacity(input.len() + 32));\n            buf.push_str(&input[last..m.start()]);\n            replacer(&caps, buf);\n            last = m.end();\n        }\n\n        match out {\n            Some(mut buf) => {\n                buf.push_str(&input[last..]);\n                Cow::Owned(buf)\n            }\n            None => Cow::Borrowed(input),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn painter_prefix_ends_with_reset() {\n        let style = NuStyle {\n            foreground: Some(nu_ansi_term::Color::Red),\n            ..Default::default()\n        };\n        let styled = format!(\"{}\", style.paint(\"\"));\n        assert!(\n            styled.ends_with(RESET),\n            \"nu_ansi_term output must end with RESET: {styled:?}\"\n        );\n    }\n\n    #[test]\n    fn painter_default_style_produces_empty_prefix() {\n        let painter = Painter::new(NuStyle::default());\n        assert!(painter.prefix.is_empty());\n    }\n\n    #[test]\n    fn painter_paint_roundtrip() {\n        let painter = Painter::new(NuStyle {\n            foreground: Some(nu_ansi_term::Color::Green),\n            ..Default::default()\n        });\n        let mut buf = String::new();\n        painter.paint(&mut buf, \"hello\");\n        assert!(buf.starts_with(\"\\x1b[\"));\n        assert!(buf.ends_with(RESET));\n        assert!(buf.contains(\"hello\"));\n    }\n}\n\npub enum StaticHighlight {\n    DateDash(DateDashHighlighter),\n    Time(TimeHighlighter),\n    IpV4(IpV4Highlighter),\n    IpV6(IpV6Highlighter),\n    Json(JsonHighlighter),\n    KeyValue(KeyValueHighlighter),\n    Keyword(KeywordHighlighter),\n    Number(NumberHighlighter),\n    Pointer(PointerHighlighter),\n    Quote(QuoteHighlighter),\n    Regexp(RegexpHighlighter),\n    UnixPath(UnixPathHighlighter),\n    UnixProcess(UnixProcessHighlighter),\n    Url(UrlHighlighter),\n    Uuid(UuidHighlighter),\n}\n\nimpl StaticHighlight {\n    pub fn needs_full_input(&self) -> bool {\n        matches!(self, StaticHighlight::Quote(_))\n    }\n}\n\nimpl Highlight for StaticHighlight {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        match self {\n            StaticHighlight::DateDash(h) => h.apply(input),\n            StaticHighlight::Time(h) => h.apply(input),\n            StaticHighlight::IpV4(h) => h.apply(input),\n            StaticHighlight::IpV6(h) => h.apply(input),\n            StaticHighlight::Json(h) => h.apply(input),\n            StaticHighlight::KeyValue(h) => h.apply(input),\n            StaticHighlight::Keyword(h) => h.apply(input),\n            StaticHighlight::Number(h) => h.apply(input),\n            StaticHighlight::Pointer(h) => h.apply(input),\n            StaticHighlight::Quote(h) => h.apply(input),\n            StaticHighlight::Regexp(h) => h.apply(input),\n            StaticHighlight::UnixPath(h) => h.apply(input),\n            StaticHighlight::UnixProcess(h) => h.apply(input),\n            StaticHighlight::Url(h) => h.apply(input),\n            StaticHighlight::Uuid(h) => h.apply(input),\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/number.rs",
    "content": "use crate::core::config::NumberConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse regex::{Error, Regex, RegexBuilder};\nuse std::borrow::Cow;\n\npub struct NumberHighlighter {\n    regex: Regex,\n    style: Painter,\n}\n\nimpl NumberHighlighter {\n    pub fn new(config: NumberConfig) -> Result<Self, Error> {\n        let pattern = r\"(?x)\n            \\b          # start of number\n            \\d+         # integer part\n            (?:\\.\\d+)?  # optional fractional\n            \\b          # end of number\n        \";\n\n        let regex = RegexBuilder::new(pattern).unicode(false).build()?;\n\n        Ok(Self {\n            regex,\n            style: Painter::new(config.style.into()),\n        })\n    }\n}\n\nimpl Highlight for NumberHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        let mut it = self.regex.find_iter(input).peekable();\n        if it.peek().is_none() {\n            return Cow::Borrowed(input);\n        }\n\n        let mut out = String::with_capacity(input.len() + 32);\n        let mut last = 0usize;\n\n        for m in it {\n            out.push_str(&input[last..m.start()]);\n            self.style.paint(&mut out, &input[m.start()..m.end()]);\n            last = m.end();\n        }\n        out.push_str(&input[last..]);\n\n        Cow::Owned(out)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_number_highlighter() {\n        let highlighter = NumberHighlighter::new(NumberConfig {\n            style: Style::new().fg(Color::Red),\n        })\n        .unwrap();\n\n        let cases = vec![\n            (\n                \"The fox jumps over 13 dogs. The number 42.5 is here.\",\n                \"The fox jumps over [red]13[reset] dogs. The number [red]42.5[reset] is here.\",\n            ),\n            (\n                \"There are 1001 nights in the tale.\",\n                \"There are [red]1001[reset] nights in the tale.\",\n            ),\n            (\"No numbers here!\", \"No numbers here!\"),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/pointer.rs",
    "content": "use super::RegexExt;\nuse crate::core::config::PointerConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse memchr::memchr2;\nuse regex::{Error, Regex, RegexBuilder};\nuse std::borrow::Cow;\n\npub struct PointerHighlighter {\n    regex: Regex,\n    number: Painter,\n    letter: Painter,\n    separator: Painter,\n    separator_token_str: String,\n    x: Painter,\n}\n\nimpl PointerHighlighter {\n    pub fn new(config: PointerConfig) -> Result<Self, Error> {\n        let pattern = r\"(?ix)\n            \\b\n            (?P<prefix>0x)\n            (?P<first_half>[0-9a-fA-F]{8})\n            \\b\n            |\n            \\b\n            (?P<prefix64>0x)\n            (?P<first_half64>[0-9a-fA-F]{8})\n            (?P<second_half>[0-9a-fA-F]{8})\n            \\b\n        \";\n\n        let regex = RegexBuilder::new(pattern).unicode(false).build()?;\n\n        Ok(Self {\n            regex,\n            number: Painter::new(config.number.into()),\n            letter: Painter::new(config.letter.into()),\n            separator: Painter::new(config.separator.into()),\n            separator_token_str: config.separator_token.to_string(),\n            x: Painter::new(config.x.into()),\n        })\n    }\n}\n\nimpl PointerHighlighter {\n    fn write_hex_chars(&self, buf: &mut String, text: &str) {\n        for (i, c) in text.char_indices() {\n            let s = &text[i..i + c.len_utf8()];\n            let painter = match c {\n                '0'..='9' => &self.number,\n                'x' | 'X' => &self.x,\n                'a'..='f' | 'A'..='F' => &self.letter,\n                _ => {\n                    buf.push(c);\n                    continue;\n                }\n            };\n            painter.paint(buf, s);\n        }\n    }\n}\n\nimpl Highlight for PointerHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        if memchr2(b'x', b'X', input.as_bytes()).is_none() {\n            return Cow::Borrowed(input);\n        }\n\n        self.regex.replace_all_cow(input, |caps, buf| {\n            let prefix = caps.name(\"prefix\").or_else(|| caps.name(\"prefix64\")).unwrap().as_str();\n            let first_half = caps\n                .name(\"first_half\")\n                .or_else(|| caps.name(\"first_half64\"))\n                .unwrap()\n                .as_str();\n\n            self.write_hex_chars(buf, prefix);\n            self.write_hex_chars(buf, first_half);\n\n            if let Some(second_half) = caps.name(\"second_half\") {\n                self.separator.paint(buf, &self.separator_token_str);\n                self.write_hex_chars(buf, second_half.as_str());\n            }\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_pointer_highlighter() {\n        let highlighter = PointerHighlighter::new(PointerConfig {\n            number: Style::new().fg(Color::Blue),\n            letter: Style::new().fg(Color::Magenta),\n            separator: Style::new().fg(Color::Green),\n            separator_token: '•',\n            x: Style::new().fg(Color::Red),\n        })\n        .unwrap();\n\n        let cases = vec![\n            (\n                \"0x8c2a0aeb\",\n                \"[blue]0[reset][red]x[reset][blue]8[reset][magenta]c[reset][blue]2[reset][magenta]a[reset][blue]0[reset][magenta]a[reset][magenta]e[reset][magenta]b[reset]\",\n            ),\n            (\n                \"0xd7b3b2f446e2c21b\",\n                \"[blue]0[reset][red]x[reset][magenta]d[reset][blue]7[reset][magenta]b[reset][blue]3[reset][magenta]b[reset][blue]2[reset][magenta]f[reset][blue]4[reset][green]•[reset][blue]4[reset][blue]6[reset][magenta]e[reset][blue]2[reset][magenta]c[reset][blue]2[reset][blue]1[reset][magenta]b[reset]\",\n            ),\n            (\"No numbers here!\", \"No numbers here!\"),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/quote.rs",
    "content": "use memchr::memchr_iter;\nuse nu_ansi_term::Style as NuStyle;\nuse std::borrow::Cow;\n\nuse crate::core::config::QuotesConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::quote::State::{InsideQuote, OutsideQuote};\nuse crate::style::Style;\n\nconst RESET: &str = \"\\x1b[0m\";\n\npub struct QuoteHighlighter {\n    quotes_token: u8,\n    color: String,\n}\n\nimpl QuoteHighlighter {\n    pub fn new(config: QuotesConfig) -> Self {\n        let color = ansi_color_code_without_reset(config.style);\n\n        Self {\n            quotes_token: config.quotes_token,\n            color,\n        }\n    }\n}\n\nfn ansi_color_code_without_reset(style: Style) -> String {\n    let nu_style = NuStyle::from(style);\n    let styled_str = format!(\"{}\", nu_style.paint(\"\"));\n\n    styled_str.replace(RESET, \"\")\n}\n\nimpl Highlight for QuoteHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        let quotes_count = memchr_iter(self.quotes_token, input.as_bytes()).count();\n\n        if quotes_count == 0 || quotes_count % 2 != 0 {\n            return Cow::Borrowed(input);\n        }\n\n        let mut state = OutsideQuote;\n        let mut output = String::with_capacity(input.len());\n\n        for ch in input.chars() {\n            match &mut state {\n                InsideQuote { potential_reset_code } => {\n                    if ch == self.quotes_token as char {\n                        // Flush any partially accumulated escape sequence.\n                        output.push_str(potential_reset_code);\n                        // End of a quoted segment: insert the closing quote and reset.\n                        output.push(ch);\n                        output.push_str(RESET);\n                        state = OutsideQuote;\n                        continue;\n                    }\n\n                    // Accumulate characters to see if we are matching a reset sequence.\n                    potential_reset_code.push(ch);\n                    if potential_reset_code.as_str() == RESET {\n                        output.push_str(potential_reset_code);\n                        output.push_str(&self.color);\n                        potential_reset_code.clear();\n                    } else if !RESET.starts_with(potential_reset_code.as_str()) {\n                        // The accumulated characters do not form the reset code.\n                        output.push_str(potential_reset_code);\n                        potential_reset_code.clear();\n                    }\n                }\n                OutsideQuote => {\n                    if ch == self.quotes_token as char {\n                        // Start of a quoted segment: insert the color code and the quote.\n                        output.push_str(&self.color);\n                        output.push(ch);\n                        state = InsideQuote {\n                            potential_reset_code: String::with_capacity(RESET.len()),\n                        };\n                        continue;\n                    }\n                    output.push(ch);\n                }\n            }\n        }\n\n        Cow::Owned(output)\n    }\n}\n\nenum State {\n    InsideQuote { potential_reset_code: String },\n    OutsideQuote,\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::{ConvertEscapeCodes, ConvertHighlightCodes};\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_multiple() {\n        let highlighter = QuoteHighlighter::new(QuotesConfig {\n            quotes_token: b'\"',\n            style: Style::new().fg(Color::Yellow),\n        });\n\n        let cases = vec![\n            (\n                r#\"Lorem ipsum \"dolor\" sit amet\"#,\n                r#\"Lorem ipsum [yellow]\"dolor\"[reset] sit amet\"#,\n            ),\n            (\n                r#\"Lorem ipsum dolor sit amet, consectetur adipiscing elit\"#,\n                r#\"Lorem ipsum dolor sit amet, consectetur adipiscing elit\"#,\n            ),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n\n    #[test]\n    fn test_no_overwrite() {\n        let highlighter = QuoteHighlighter::new(QuotesConfig {\n            quotes_token: b'\"',\n            style: Style::new().fg(Color::Yellow),\n        });\n\n        let input = r#\"Hello \"abc [red]def[reset] ghi\" World\"#.to_string().convert_highlight_codes();\n        let expected = r#\"Hello [yellow]\"abc [red]def[reset][yellow] ghi\"[reset] World\"#;\n\n        let actual = highlighter.apply(input.as_str());\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_odd_number_of_highlight_tokens() {\n        let highlighter = QuoteHighlighter::new(QuotesConfig {\n            quotes_token: b'\"',\n            style: Style::new().fg(Color::Yellow),\n        });\n\n        let input = r#\"Hello \"abc def ghi World\"#;\n        let expected = r#\"Hello \"abc def ghi World\"#;\n\n        let actual = highlighter.apply(input);\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_preserves_multiple_highlights_inside_quotes() {\n        let highlighter = QuoteHighlighter::new(QuotesConfig {\n            quotes_token: b'\"',\n            style: Style::new().fg(Color::Yellow),\n        });\n\n        let input = r#\"Log \"abc [red]error[reset] then [cyan]42[reset] end\" done\"#\n            .to_string()\n            .convert_highlight_codes();\n        let expected = r#\"Log [yellow]\"abc [red]error[reset][yellow] then [cyan]42[reset][yellow] end\"[reset] done\"#;\n\n        let actual = highlighter.apply(input.as_str());\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_highlight_at_start_of_quote() {\n        let highlighter = QuoteHighlighter::new(QuotesConfig {\n            quotes_token: b'\"',\n            style: Style::new().fg(Color::Yellow),\n        });\n\n        let input = r#\"\"[red]error[reset] occurred\"\"#.to_string().convert_highlight_codes();\n        let expected = r#\"[yellow]\"[red]error[reset][yellow] occurred\"[reset]\"#;\n\n        let actual = highlighter.apply(input.as_str());\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_highlight_at_end_of_quote() {\n        let highlighter = QuoteHighlighter::new(QuotesConfig {\n            quotes_token: b'\"',\n            style: Style::new().fg(Color::Yellow),\n        });\n\n        let input = r#\"\"something [red]error[reset]\"\"#.to_string().convert_highlight_codes();\n        let expected = r#\"[yellow]\"something [red]error[reset][yellow]\"[reset]\"#;\n\n        let actual = highlighter.apply(input.as_str());\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_no_highlights_inside_quotes() {\n        let highlighter = QuoteHighlighter::new(QuotesConfig {\n            quotes_token: b'\"',\n            style: Style::new().fg(Color::Yellow),\n        });\n\n        let input = r#\"Hello \"plain text\" world\"#;\n        let expected = r#\"Hello [yellow]\"plain text\"[reset] world\"#;\n\n        let actual = highlighter.apply(input);\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_adjacent_quoted_strings() {\n        let highlighter = QuoteHighlighter::new(QuotesConfig {\n            quotes_token: b'\"',\n            style: Style::new().fg(Color::Yellow),\n        });\n\n        let input = r#\"\"hello\"\"world\"\"#;\n        let expected = r#\"[yellow]\"hello\"[reset][yellow]\"world\"[reset]\"#;\n\n        let actual = highlighter.apply(input);\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_empty_quoted_string() {\n        let highlighter = QuoteHighlighter::new(QuotesConfig {\n            quotes_token: b'\"',\n            style: Style::new().fg(Color::Yellow),\n        });\n\n        let input = r#\"before \"\" after\"#;\n        let expected = r#\"before [yellow]\"\"[reset] after\"#;\n\n        let actual = highlighter.apply(input);\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_entirely_highlighted_content_inside_quotes() {\n        let highlighter = QuoteHighlighter::new(QuotesConfig {\n            quotes_token: b'\"',\n            style: Style::new().fg(Color::Yellow),\n        });\n\n        let input = r#\"\"[red]error[reset]\"\"#.to_string().convert_highlight_codes();\n        let expected = r#\"[yellow]\"[red]error[reset][yellow]\"[reset]\"#;\n\n        let actual = highlighter.apply(input.as_str());\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n\n    #[test]\n    fn test_single_quote_token() {\n        let highlighter = QuoteHighlighter::new(QuotesConfig {\n            quotes_token: b'\\'',\n            style: Style::new().fg(Color::Yellow),\n        });\n\n        let input = \"msg 'hello [red]world[reset] end' done\"\n            .to_string()\n            .convert_highlight_codes();\n        let expected = \"msg [yellow]'hello [red]world[reset][yellow] end'[reset] done\";\n\n        let actual = highlighter.apply(input.as_str());\n\n        assert_eq!(actual.to_string().convert_escape_codes(), expected);\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/regex.rs",
    "content": "use crate::core::config::RegexConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse regex::{Error, Regex};\nuse std::borrow::Cow;\n\npub struct RegexpHighlighter {\n    regex: Regex,\n    style: Painter,\n}\n\nimpl RegexpHighlighter {\n    /// This constructor takes a regular expression pattern and a `Style` object,\n    /// returning a `RegexpHighlighter` that will apply the specified style\n    /// to any text matching the regular expression.\n    ///\n    /// It supports one capture group `()`. When found, it will apply the style to the captured text.\n    ///\n    /// (If you are just interested in highlighting a specific keyword, you can use the simpler `KeywordHighlighter`\n    /// instead.)\n    /// # Example\n    ///\n    /// Given the regular expression pattern `'Started (.*)\\.'`, the highlighter will\n    /// apply the style to any text that matches the pattern within the capture group.\n    /// For example, in the text `'Started process.'`, only the word `'process'` will be styled.\n    ///\n    pub fn new(config: RegexConfig) -> Result<Self, Error> {\n        Ok(Self {\n            regex: Regex::new(config.regex.as_str())?,\n            style: Painter::new(config.style.into()),\n        })\n    }\n}\n\nimpl Highlight for RegexpHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        let capture_groups = self.regex.captures_len() - 1;\n        let mut caps_iter = self.regex.captures_iter(input).peekable();\n\n        if caps_iter.peek().is_none() {\n            return Cow::Borrowed(input);\n        }\n\n        let mut new_string = String::with_capacity(input.len() + 32);\n        let mut last_end = 0;\n\n        for caps in caps_iter {\n            if let Some(entire_match) = caps.get(0) {\n                new_string.push_str(&input[last_end..entire_match.start()]);\n\n                match capture_groups {\n                    1 => {\n                        if let Some(captured) = caps.get(1) {\n                            new_string.push_str(&input[entire_match.start()..captured.start()]);\n                            self.style.paint(&mut new_string, captured.as_str());\n                            new_string.push_str(&input[captured.end()..entire_match.end()]);\n                        } else {\n                            self.style.paint(&mut new_string, entire_match.as_str());\n                        }\n                    }\n                    _ => {\n                        self.style.paint(&mut new_string, entire_match.as_str());\n                    }\n                }\n                last_end = entire_match.end();\n            }\n        }\n        new_string.push_str(&input[last_end..]);\n\n        Cow::Owned(new_string)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    fn make_highlighter(pattern: &str) -> RegexpHighlighter {\n        let config = RegexConfig {\n            regex: pattern.to_string(),\n            style: Style::new().fg(Color::Red),\n        };\n        RegexpHighlighter::new(config).unwrap()\n    }\n\n    #[test]\n    fn test_optional_capture_group_not_participating() {\n        // Pattern with one optional capture group: group 1 participates\n        // only when \"error\" is present\n        let highlighter = make_highlighter(r\"(error)?warning\");\n\n        // When the capture group does NOT participate, the matched text\n        // (\"warning\") must still appear in the output.\n        let result = highlighter.apply(\"got a warning here\");\n        let readable = result.to_string().convert_escape_codes();\n        assert_eq!(readable, \"got a [red]warning[reset] here\");\n\n        // When the capture group DOES participate, only it is styled.\n        let result = highlighter.apply(\"got a errorwarning here\");\n        let readable = result.to_string().convert_escape_codes();\n        assert_eq!(readable, \"got a [red]error[reset]warning here\");\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/unix_path.rs",
    "content": "use super::RegexExt;\nuse crate::core::config::UnixPathConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse memchr::memchr;\nuse regex::{Error, Regex, RegexBuilder};\nuse std::borrow::Cow;\n\npub struct UnixPathHighlighter {\n    regex: Regex,\n    segment: Painter,\n    separator: Painter,\n}\n\nimpl UnixPathHighlighter {\n    pub fn new(config: UnixPathConfig) -> Result<Self, Error> {\n        let pattern = r\"(?x)\n            (?:^|\\s)\n            (?P<path>\n                (?:\\./|~/|//|/)\n                [\\w.-]+\n                (?:/[\\w.-]+)+\n            )\n        \";\n        let regex = RegexBuilder::new(pattern).unicode(false).build()?;\n\n        Ok(Self {\n            regex,\n            segment: Painter::new(config.segment.into()),\n            separator: Painter::new(config.separator.into()),\n        })\n    }\n}\n\nimpl Highlight for UnixPathHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        if memchr(b'/', input.as_bytes()).is_none() {\n            return Cow::Borrowed(input);\n        }\n\n        self.regex.replace_all_cow(input, |caps, buf| {\n            let full = caps.get(0).unwrap().as_str();\n            let path = &caps[\"path\"];\n\n            // Preserve any leading whitespace that was part of the match\n            if full.len() > path.len() {\n                buf.push_str(&full[..full.len() - path.len()]);\n            }\n\n            let mut seg_start = None;\n\n            for (i, ch) in path.char_indices() {\n                if ch == '/' {\n                    if let Some(start) = seg_start.take() {\n                        self.segment.paint(buf, &path[start..i]);\n                    }\n                    self.separator.paint(buf, \"/\");\n                } else if seg_start.is_none() {\n                    seg_start = Some(i);\n                }\n            }\n\n            if let Some(start) = seg_start {\n                self.segment.paint(buf, &path[start..]);\n            }\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_unix_path_highlighter() {\n        let highlighter = UnixPathHighlighter::new(UnixPathConfig {\n            segment: Style::new().fg(Color::Green),\n            separator: Style::new().fg(Color::Yellow),\n        })\n        .unwrap();\n\n        let cases = vec![\n            (\"a//b\", \"a//b\"),\n            (\"a/b\", \"a/b\"),\n            (\"name/name\", \"name/name\"),\n            (\"a/b/c\", \"a/b/c\"),\n            (\"justtext\", \"justtext\"),\n            (\"README.md\", \"README.md\"),\n            (\n                \"//network/share\",\n                \"[yellow]/[reset][yellow]/[reset][green]network[reset][yellow]/[reset][green]share[reset]\",\n            ),\n            (\n                \"/user/local\",\n                \"[yellow]/[reset][green]user[reset][yellow]/[reset][green]local[reset]\",\n            ),\n            (\"123/234/345/456\", \"123/234/345/456\"),\n            (\n                \"~/projects/rust/tailspin\",\n                \"[green]~[reset][yellow]/[reset][green]projects[reset][yellow]/[reset][green]rust[reset][yellow]/[reset][green]tailspin[reset]\",\n            ),\n            (\n                \"./a/b\",\n                \"[green].[reset][yellow]/[reset][green]a[reset][yellow]/[reset][green]b[reset]\",\n            ),\n            (\n                \"/var/log/nginx/error.log\",\n                \"[yellow]/[reset][green]var[reset][yellow]/[reset][green]log[reset][yellow]/[reset][green]nginx[reset][yellow]/[reset][green]error.log[reset]\",\n            ),\n            (\n                \"/path/.hidden/file\",\n                \"[yellow]/[reset][green]path[reset][yellow]/[reset][green].hidden[reset][yellow]/[reset][green]file[reset]\",\n            ),\n            (\n                \"/usr/local/\",\n                \"[yellow]/[reset][green]usr[reset][yellow]/[reset][green]local[reset]/\",\n            ),\n            (\n                \"See /etc/hosts please\",\n                \"See [yellow]/[reset][green]etc[reset][yellow]/[reset][green]hosts[reset] please\",\n            ),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/unix_process.rs",
    "content": "use super::RegexExt;\nuse crate::core::config::UnixProcessConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse memchr::memchr;\nuse regex::{Error, Regex, RegexBuilder};\nuse std::borrow::Cow;\n\npub struct UnixProcessHighlighter {\n    regex: Regex,\n    name: Painter,\n    id: Painter,\n    bracket: Painter,\n}\n\nimpl UnixProcessHighlighter {\n    pub fn new(config: UnixProcessConfig) -> Result<Self, Error> {\n        let pattern = r\"(?P<process_name>\\([A-Za-z0-9._ +:/-]+\\)|[A-Za-z0-9_/-]+)\\[(?P<process_id>\\d+)]\";\n        let regex = RegexBuilder::new(pattern).unicode(false).build()?;\n\n        Ok(Self {\n            regex,\n            name: Painter::new(config.name.into()),\n            id: Painter::new(config.id.into()),\n            bracket: Painter::new(config.bracket.into()),\n        })\n    }\n}\n\nimpl Highlight for UnixProcessHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        if memchr(b'[', input.as_bytes()).is_none() {\n            return Cow::Borrowed(input);\n        }\n\n        self.regex.replace_all_cow(input, |caps, buf| {\n            if let Some(p) = caps.name(\"process_name\") {\n                self.name.paint(buf, p.as_str());\n            }\n            self.bracket.paint(buf, \"[\");\n            if let Some(n) = caps.name(\"process_id\") {\n                self.id.paint(buf, n.as_str());\n            }\n            self.bracket.paint(buf, \"]\");\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_unix_process_highlighter() {\n        let highlighter = UnixProcessHighlighter::new(UnixProcessConfig {\n            name: Style::new().fg(Color::Magenta),\n            id: Style::new().fg(Color::Green),\n            bracket: Style::new().fg(Color::Blue),\n        })\n        .unwrap();\n\n        let cases = vec![\n            (\n                \"process[1]\",\n                \"[magenta]process[reset][blue][[reset][green]1[reset][blue]][reset]\",\n            ),\n            (\n                \"postfix/postscreen[1894]: CONNECT from [192.168.1.22]:12345 to [127.0.0.1]:25\",\n                \"[magenta]postfix/postscreen[reset][blue][[reset][green]1894[reset][blue]][reset]: CONNECT from [192.168.1.22]:12345 to [127.0.0.1]:25\",\n            ),\n            (\"No process here!\", \"No process here!\"),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/url.rs",
    "content": "use super::RegexExt;\nuse crate::core::config::UrlConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse regex::{Error, Regex, RegexBuilder};\nuse std::borrow::Cow;\n\npub struct UrlHighlighter {\n    url_regex: Regex,\n    query_params_regex: Regex,\n    http: Painter,\n    https: Painter,\n    host: Painter,\n    path: Painter,\n    query_params_key: Painter,\n    query_params_value: Painter,\n    symbols: Painter,\n}\n\nimpl UrlHighlighter {\n    pub fn new(config: UrlConfig) -> Result<Self, Error> {\n        let url_pattern = r\"(?x)\n            (?P<protocol>https?) (:) (//)\n            (?P<host>[A-Za-z0-9._\\-]+)\n            (?P<path>(?:/[A-Za-z0-9._~\\-/%+()]*)?)           # common URL-safe chars incl parens\n            (?P<query>\\?[A-Za-z0-9._~\\-/%+&=;,@!*()?:]*)?    # include &= and friends\";\n        let url_regex = RegexBuilder::new(url_pattern).unicode(false).build()?;\n\n        let query_params_pattern = r\"(?x)\n            (?P<delimiter>[?&])\n            (?P<key>   [A-Za-z0-9._~\\-+%]*)   # allow common URL-safe chars\n            (?P<equal> =)\n            (?P<value> [A-Za-z0-9._~\\-+%]*)\";\n        let query_params_regex = RegexBuilder::new(query_params_pattern).unicode(false).build()?;\n\n        Ok(Self {\n            url_regex,\n            query_params_regex,\n            http: Painter::new(config.http.into()),\n            https: Painter::new(config.https.into()),\n            host: Painter::new(config.host.into()),\n            path: Painter::new(config.path.into()),\n            query_params_key: Painter::new(config.query_params_key.into()),\n            query_params_value: Painter::new(config.query_params_value.into()),\n            symbols: Painter::new(config.symbols.into()),\n        })\n    }\n}\n\n/// Count how many trailing `)` characters are unbalanced within the given string.\n///\n/// Returns the number of excess trailing `)` that should be stripped from the URL match.\n/// For example:\n/// - `\"/wiki/Foo_(bar)\"` → 0 (balanced)\n/// - `\"https://example.com)\"` → 1 (one unbalanced trailing paren)\n/// - `\"/wiki/Foo_(bar))\"` → 1 (one unbalanced trailing paren)\nfn count_unbalanced_trailing_parens(s: &str) -> usize {\n    let open = s.chars().filter(|&c| c == '(').count();\n    let close = s.chars().filter(|&c| c == ')').count();\n\n    if close <= open {\n        return 0;\n    }\n\n    let excess = close - open;\n    let trailing = s.len() - s.trim_end_matches(')').len();\n\n    trailing.min(excess)\n}\n\nimpl Highlight for UrlHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        self.url_regex.replace_all_cow(input, |caps, buf| {\n            let full_match = caps.get(0).unwrap().as_str();\n            let trim_count = count_unbalanced_trailing_parens(full_match);\n\n            if let Some(protocol) = caps.name(\"protocol\") {\n                let painter = match protocol.as_str() {\n                    \"http\" => &self.http,\n                    \"https\" => &self.https,\n                    _ => &self.http,\n                };\n                painter.paint(buf, protocol.as_str());\n                buf.push_str(\"://\");\n            }\n\n            if let Some(host) = caps.name(\"host\") {\n                self.host.paint(buf, host.as_str());\n            }\n\n            if let Some(path) = caps.name(\"path\") {\n                let path_str = path.as_str();\n                if caps.name(\"query\").is_none() && trim_count > 0 {\n                    let trimmed = &path_str[..path_str.len() - trim_count];\n                    self.path.paint(buf, trimmed);\n                } else {\n                    self.path.paint(buf, path_str);\n                }\n            }\n\n            if let Some(query) = caps.name(\"query\") {\n                let query_str = if trim_count > 0 {\n                    &query.as_str()[..query.as_str().len() - trim_count]\n                } else {\n                    query.as_str()\n                };\n                let mut last = 0usize;\n                for query_caps in self.query_params_regex.captures_iter(query_str) {\n                    let m = query_caps.get(0).unwrap();\n                    buf.push_str(&query_str[last..m.start()]);\n                    let delimiter = query_caps.name(\"delimiter\").map_or(\"\", |m| m.as_str());\n                    let key = query_caps.name(\"key\").map_or(\"\", |m| m.as_str());\n                    let equal = query_caps.name(\"equal\").map_or(\"\", |m| m.as_str());\n                    let value = query_caps.name(\"value\").map_or(\"\", |m| m.as_str());\n                    self.symbols.paint(buf, delimiter);\n                    self.query_params_key.paint(buf, key);\n                    self.symbols.paint(buf, equal);\n                    self.query_params_value.paint(buf, value);\n                    last = m.end();\n                }\n                buf.push_str(&query_str[last..]);\n            }\n\n            // Append unbalanced trailing parens outside the highlighted URL\n            for _ in 0..trim_count {\n                buf.push(')');\n            }\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    fn make_highlighter() -> UrlHighlighter {\n        UrlHighlighter::new(UrlConfig {\n            http: Style::new().fg(Color::Yellow),\n            https: Style::new().fg(Color::White),\n            host: Style::new().fg(Color::Green),\n            path: Style::new().fg(Color::Blue),\n            query_params_key: Style::new().fg(Color::Magenta),\n            query_params_value: Style::new().fg(Color::Cyan),\n            symbols: Style::new().fg(Color::Red),\n        })\n        .unwrap()\n    }\n\n    #[test]\n    fn test_url_highlighter() {\n        let highlighter = make_highlighter();\n\n        let cases = vec![\n            (\n                \"https://www.openai.com/docs/api?apikey=abc123\",\n                \"[white]https[reset]://[green]www.openai.com[reset][blue]/docs/api[reset][red]?[reset][magenta]apikey[reset][red]=[reset][cyan]abc123[reset]\",\n            ),\n            (\n                \"https://api.example.org/api/v1/users?name=JohnDoe\",\n                \"[white]https[reset]://[green]api.example.org[reset][blue]/api/v1/users[reset][red]?[reset][magenta]name[reset][red]=[reset][cyan]JohnDoe[reset]\",\n            ),\n            (\n                \"http://example.com/path/to/resource?param1=value1&param2=value2\",\n                \"[yellow]http[reset]://[green]example.com[reset][blue]/path/to/resource[reset][red]?[reset][magenta]param1[reset][red]=[reset][cyan]value1[reset][red]&[reset][magenta]param2[reset][red]=[reset][cyan]value2[reset]\",\n            ),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n\n    #[test]\n    fn test_url_with_balanced_parens_in_path() {\n        let highlighter = make_highlighter();\n\n        // Wikipedia-style URL with balanced parentheses\n        let input = \"https://en.wikipedia.org/wiki/Foo_(bar)\";\n        let expected = \"[white]https[reset]://[green]en.wikipedia.org[reset][blue]/wiki/Foo_(bar)[reset]\";\n\n        let actual = highlighter.apply(input);\n        assert_eq!(expected, actual.to_string().convert_escape_codes());\n    }\n\n    #[test]\n    fn test_url_wrapped_in_parens() {\n        let highlighter = make_highlighter();\n\n        // URL surrounded by parentheses — trailing ) should not be highlighted\n        let input = \"(https://example.com/path)\";\n        let expected = \"([white]https[reset]://[green]example.com[reset][blue]/path[reset])\";\n\n        let actual = highlighter.apply(input);\n        assert_eq!(expected, actual.to_string().convert_escape_codes());\n    }\n\n    #[test]\n    fn test_url_with_balanced_parens_wrapped_in_parens() {\n        let highlighter = make_highlighter();\n\n        // Wikipedia URL inside parentheses — inner parens balanced, outer ) excluded\n        let input = \"(https://en.wikipedia.org/wiki/Foo_(bar))\";\n        let expected = \"([white]https[reset]://[green]en.wikipedia.org[reset][blue]/wiki/Foo_(bar)[reset])\";\n\n        let actual = highlighter.apply(input);\n        assert_eq!(expected, actual.to_string().convert_escape_codes());\n    }\n\n    #[test]\n    fn test_url_with_query_wrapped_in_parens() {\n        let highlighter = make_highlighter();\n\n        // URL with query string inside parentheses\n        let input = \"(https://example.com/path?key=value)\";\n        let expected = \"([white]https[reset]://[green]example.com[reset][blue]/path[reset][red]?[reset][magenta]key[reset][red]=[reset][cyan]value[reset])\";\n\n        let actual = highlighter.apply(input);\n        assert_eq!(expected, actual.to_string().convert_escape_codes());\n    }\n\n    #[test]\n    fn test_url_not_wrapped_no_parens() {\n        let highlighter = make_highlighter();\n\n        // Plain URL without any parentheses — nothing to trim\n        let input = \"https://example.com/path\";\n        let expected = \"[white]https[reset]://[green]example.com[reset][blue]/path[reset]\";\n\n        let actual = highlighter.apply(input);\n        assert_eq!(expected, actual.to_string().convert_escape_codes());\n    }\n\n    #[test]\n    fn test_url_single_quote_not_included() {\n        let highlighter = make_highlighter();\n\n        // URL wrapped in single quotes — quote should not be part of URL\n        let input = \"'https://example.com/path'\";\n        let expected = \"'[white]https[reset]://[green]example.com[reset][blue]/path[reset]'\";\n\n        let actual = highlighter.apply(input);\n        assert_eq!(expected, actual.to_string().convert_escape_codes());\n    }\n\n    #[test]\n    fn test_multiple_parenthesized_urls_on_one_line() {\n        let highlighter = make_highlighter();\n\n        let input = \"(https://a.com) and (https://b.com)\";\n        let expected = \"([white]https[reset]://[green]a.com[reset][blue][reset]) and ([white]https[reset]://[green]b.com[reset][blue][reset])\";\n\n        let actual = highlighter.apply(input);\n        assert_eq!(expected, actual.to_string().convert_escape_codes());\n    }\n\n    #[test]\n    fn test_url_with_parens_in_query_string() {\n        let highlighter = make_highlighter();\n\n        let input = \"https://example.com/api?filter=(name)\";\n        let expected = \"[white]https[reset]://[green]example.com[reset][blue]/api[reset][red]?[reset][magenta]filter[reset][red]=[reset][cyan][reset](name)\";\n\n        let actual = highlighter.apply(input);\n        assert_eq!(expected, actual.to_string().convert_escape_codes());\n    }\n\n    #[test]\n    fn test_url_double_wrapped_in_parens() {\n        let highlighter = make_highlighter();\n\n        let input = \"((https://example.com))\";\n        let expected = \"(([white]https[reset]://[green]example.com[reset][blue][reset]))\";\n\n        let actual = highlighter.apply(input);\n        assert_eq!(expected, actual.to_string().convert_escape_codes());\n    }\n\n    #[test]\n    fn test_url_with_nested_parens_in_path() {\n        let highlighter = make_highlighter();\n\n        let input = \"https://en.wikipedia.org/wiki/Foo_(bar_(baz))\";\n        let expected = \"[white]https[reset]://[green]en.wikipedia.org[reset][blue]/wiki/Foo_(bar_(baz))[reset]\";\n\n        let actual = highlighter.apply(input);\n        assert_eq!(expected, actual.to_string().convert_escape_codes());\n    }\n\n    #[test]\n    fn test_count_unbalanced_trailing_parens() {\n        assert_eq!(count_unbalanced_trailing_parens(\"no parens\"), 0);\n        assert_eq!(count_unbalanced_trailing_parens(\"/wiki/Foo_(bar)\"), 0);\n        assert_eq!(count_unbalanced_trailing_parens(\"https://example.com)\"), 1);\n        assert_eq!(count_unbalanced_trailing_parens(\"https://example.com))\"), 2);\n        assert_eq!(count_unbalanced_trailing_parens(\"/wiki/Foo_(bar))\"), 1);\n        assert_eq!(count_unbalanced_trailing_parens(\"/a_(b)_(c))\"), 1);\n    }\n}\n"
  },
  {
    "path": "src/core/highlighters/uuid.rs",
    "content": "use super::RegexExt;\nuse crate::core::config::UuidConfig;\nuse crate::core::highlighter::Highlight;\nuse crate::core::highlighters::Painter;\nuse memchr::memchr;\nuse regex::{Error, Regex, RegexBuilder};\nuse std::borrow::Cow;\n\npub struct UuidHighlighter {\n    regex: Regex,\n    number: Painter,\n    letter: Painter,\n    dash: Painter,\n}\n\nimpl UuidHighlighter {\n    pub fn new(config: UuidConfig) -> Result<Self, Error> {\n        let pattern = r\"(?x)       # Enable comments and whitespace insensitivity\n            \\b[0-9a-fA-F]{8}\\b    # Match first segment of UUID\n            -                     # Match separator\n            \\b[0-9a-fA-F]{4}\\b    # Match second segment of UUID\n            -                     # Match separator\n            \\b[0-9a-fA-F]{4}\\b    # Match third segment of UUID\n            -                     # Match separator\n            \\b[0-9a-fA-F]{4}\\b    # Match fourth segment of UUID\n            -                     # Match separator\n            \\b[0-9a-fA-F]{12}\\b   # Match last segment of UUID\n            \";\n\n        let regex = RegexBuilder::new(pattern).unicode(false).build()?;\n\n        Ok(Self {\n            regex,\n            number: Painter::new(config.number.into()),\n            letter: Painter::new(config.letter.into()),\n            dash: Painter::new(config.dash.into()),\n        })\n    }\n}\n\nfn has_at_least_n_dashes(bytes: &[u8], n: usize) -> bool {\n    let mut start = 0;\n    for _ in 0..n {\n        match memchr(b'-', &bytes[start..]) {\n            Some(pos) => start += pos + 1,\n            None => return false,\n        }\n    }\n    true\n}\n\nimpl Highlight for UuidHighlighter {\n    fn apply<'a>(&self, input: &'a str) -> Cow<'a, str> {\n        if !has_at_least_n_dashes(input.as_bytes(), 4) {\n            return Cow::Borrowed(input);\n        }\n\n        self.regex.replace_all_cow(input, |caps, buf| {\n            let matched = caps.get(0).unwrap().as_str();\n            for (i, c) in matched.char_indices() {\n                let s = &matched[i..i + c.len_utf8()];\n                let painter = match c {\n                    '0'..='9' => &self.number,\n                    'a'..='f' | 'A'..='F' => &self.letter,\n                    '-' => &self.dash,\n                    _ => {\n                        buf.push(c);\n                        continue;\n                    }\n                };\n                painter.paint(buf, s);\n            }\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::tests::escape_code_converter::ConvertEscapeCodes;\n    use crate::style::{Color, Style};\n\n    #[test]\n    fn test_uuid_highlighter() {\n        let highlighter = UuidHighlighter::new(UuidConfig {\n            number: Style::new().fg(Color::Cyan),\n            letter: Style::new().fg(Color::Yellow),\n            dash: Style::new().fg(Color::Red),\n        })\n        .unwrap();\n\n        let cases = vec![\n            (\n                \"The UUID is 123e4567-e89b-12d3-a456-426614174000.\",\n                \"The UUID is [cyan]1[reset][cyan]2[reset][cyan]3[reset][yellow]e[reset][cyan]4[reset][cyan]5[reset][cyan]6[reset][cyan]7[reset][red]-[reset][yellow]e[reset][cyan]8[reset][cyan]9[reset][yellow]b[reset][red]-[reset][cyan]1[reset][cyan]2[reset][yellow]d[reset][cyan]3[reset][red]-[reset][yellow]a[reset][cyan]4[reset][cyan]5[reset][cyan]6[reset][red]-[reset][cyan]4[reset][cyan]2[reset][cyan]6[reset][cyan]6[reset][cyan]1[reset][cyan]4[reset][cyan]1[reset][cyan]7[reset][cyan]4[reset][cyan]0[reset][cyan]0[reset][cyan]0[reset].\",\n            ),\n            (\n                \"Another UUID is f47ac10b-58cc-4372-a567-0e02b2c3d479.\",\n                \"Another UUID is [yellow]f[reset][cyan]4[reset][cyan]7[reset][yellow]a[reset][yellow]c[reset][cyan]1[reset][cyan]0[reset][yellow]b[reset][red]-[reset][cyan]5[reset][cyan]8[reset][yellow]c[reset][yellow]c[reset][red]-[reset][cyan]4[reset][cyan]3[reset][cyan]7[reset][cyan]2[reset][red]-[reset][yellow]a[reset][cyan]5[reset][cyan]6[reset][cyan]7[reset][red]-[reset][cyan]0[reset][yellow]e[reset][cyan]0[reset][cyan]2[reset][yellow]b[reset][cyan]2[reset][yellow]c[reset][cyan]3[reset][yellow]d[reset][cyan]4[reset][cyan]7[reset][cyan]9[reset].\",\n            ),\n            (\"No UUID here!\", \"No UUID here!\"),\n        ];\n\n        for (input, expected) in cases {\n            let actual = highlighter.apply(input);\n            assert_eq!(expected, actual.to_string().convert_escape_codes());\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/mod.rs",
    "content": "pub mod highlighter;\npub mod style;\n\npub mod config;\nmod highlighters;\nmod utils;\n\n#[cfg(test)]\nmod tests {\n    pub(crate) mod escape_code_converter;\n}\n"
  },
  {
    "path": "src/core/style.rs",
    "content": "use nu_ansi_term::{Color as NuColor, Style as NuStyle};\nuse serde::Deserialize;\n\n/// Defines the styling attributes for highlighted text.\n///\n/// Allows setting foreground (`fg`) and background (`bg`) colors as well as\n/// text attributes like bold, italic, faint, and underline.\n///\n/// Use the provided builder methods for convenient configuration.\n///\n/// # Examples\n///\n/// ```rust\n/// use tailspin::style::{Style, Color};\n///\n/// let style = Style::default().fg(Color::Blue).bold();\n/// ```\n#[derive(PartialEq, Eq, Ord, PartialOrd, Hash, Debug, Clone, Copy, Default, Deserialize)]\npub struct Style {\n    #[serde(default)]\n    pub fg: Option<Color>,\n    #[serde(default)]\n    pub bg: Option<Color>,\n    #[serde(default)]\n    pub bold: bool,\n    #[serde(default)]\n    pub faint: bool,\n    #[serde(default)]\n    pub italic: bool,\n    #[serde(default)]\n    pub underline: bool,\n}\n\nimpl Style {\n    pub fn new() -> Style {\n        Style::default()\n    }\n\n    pub const fn bold(&self) -> Style {\n        Style { bold: true, ..*self }\n    }\n\n    pub const fn faint(&self) -> Style {\n        Style { faint: true, ..*self }\n    }\n\n    pub const fn italic(&self) -> Style {\n        Style { italic: true, ..*self }\n    }\n\n    pub const fn underline(&self) -> Style {\n        Style {\n            underline: true,\n            ..*self\n        }\n    }\n\n    pub const fn fg(&self, fg: Color) -> Style {\n        Style { fg: Some(fg), ..*self }\n    }\n\n    pub const fn on(&self, bg: Color) -> Style {\n        Style { bg: Some(bg), ..*self }\n    }\n}\n\n/// Available ANSI colors for terminal output.\n///\n/// Includes standard and bright variants.\n///\n/// # Examples\n///\n/// ```rust\n/// use tailspin::style::Color;\n///\n/// let cyan = Color::Cyan;\n/// ```\n#[derive(PartialEq, Eq, Ord, PartialOrd, Hash, Debug, Clone, Copy, Default, Deserialize)]\n#[serde(rename_all = \"snake_case\")]\npub enum Color {\n    #[default]\n    Default,\n    Black,\n    Red,\n    Green,\n    Yellow,\n    Blue,\n    Magenta,\n    Cyan,\n    White,\n    BrightBlack,\n    BrightRed,\n    BrightGreen,\n    BrightYellow,\n    BrightBlue,\n    BrightMagenta,\n    BrightCyan,\n    BrightWhite,\n}\n\nimpl From<&Color> for NuColor {\n    fn from(color: &Color) -> Self {\n        match color {\n            Color::Default => NuColor::Default,\n            Color::Black => NuColor::Black,\n            Color::Red => NuColor::Red,\n            Color::Green => NuColor::Green,\n            Color::Yellow => NuColor::Yellow,\n            Color::Blue => NuColor::Blue,\n            Color::Magenta => NuColor::Magenta,\n            Color::Cyan => NuColor::Cyan,\n            Color::White => NuColor::White,\n            Color::BrightBlack => NuColor::DarkGray,\n            Color::BrightRed => NuColor::LightRed,\n            Color::BrightGreen => NuColor::LightGreen,\n            Color::BrightYellow => NuColor::LightYellow,\n            Color::BrightBlue => NuColor::LightBlue,\n            Color::BrightMagenta => NuColor::LightMagenta,\n            Color::BrightCyan => NuColor::LightCyan,\n            Color::BrightWhite => NuColor::LightGray,\n        }\n    }\n}\n\nimpl From<Style> for NuStyle {\n    fn from(style: Style) -> Self {\n        let mut nu_style = NuStyle::new();\n\n        if let Some(fg) = &style.fg {\n            nu_style = nu_style.fg(NuColor::from(fg));\n        }\n        if let Some(bg) = &style.bg {\n            nu_style = nu_style.on(NuColor::from(bg));\n        }\n\n        if style.bold {\n            nu_style = nu_style.bold();\n        }\n        if style.faint {\n            nu_style = nu_style.dimmed();\n        }\n        if style.italic {\n            nu_style = nu_style.italic();\n        }\n        if style.underline {\n            nu_style = nu_style.underline();\n        }\n\n        nu_style\n    }\n}\n"
  },
  {
    "path": "src/core/tests/escape_code_converter.rs",
    "content": "use std::collections::HashMap;\n\npub trait ConvertEscapeCodes {\n    fn convert_escape_codes(self) -> String;\n}\n\nimpl ConvertEscapeCodes for String {\n    fn convert_escape_codes(self) -> String {\n        let mut code_map = HashMap::new();\n\n        // Foreground colors\n        code_map.insert(\"\\x1b[31m\", \"[red]\");\n        code_map.insert(\"\\x1b[32m\", \"[green]\");\n        code_map.insert(\"\\x1b[33m\", \"[yellow]\");\n        code_map.insert(\"\\x1b[34m\", \"[blue]\");\n        code_map.insert(\"\\x1b[35m\", \"[magenta]\");\n        code_map.insert(\"\\x1b[36m\", \"[cyan]\");\n        code_map.insert(\"\\x1b[37m\", \"[white]\");\n\n        // Background colors\n        code_map.insert(\"\\x1b[41m\", \"[bg_red]\");\n        code_map.insert(\"\\x1b[42m\", \"[bg_green]\");\n        code_map.insert(\"\\x1b[43m\", \"[bg_yellow]\");\n        code_map.insert(\"\\x1b[44m\", \"[bg_blue]\");\n        code_map.insert(\"\\x1b[45m\", \"[bg_magenta]\");\n        code_map.insert(\"\\x1b[46m\", \"[bg_cyan]\");\n        code_map.insert(\"\\x1b[47m\", \"[bg_white]\");\n\n        // Other attributes\n        code_map.insert(\"\\x1b[1m\", \"[bold]\");\n        code_map.insert(\"\\x1b[3m\", \"[italic]\");\n        code_map.insert(\"\\x1b[4m\", \"[underline]\");\n        code_map.insert(\"\\x1b[0m\", \"[reset]\");\n\n        let mut result = self;\n\n        for (code, replacement) in code_map {\n            result = result.replace(code, replacement);\n        }\n\n        result\n    }\n}\n\npub trait ConvertHighlightCodes {\n    fn convert_highlight_codes(self) -> String;\n}\n\nimpl ConvertHighlightCodes for String {\n    fn convert_highlight_codes(self) -> String {\n        let mut code_map = HashMap::new();\n\n        // Foreground colors\n        code_map.insert(\"[red]\", \"\\x1b[31m\");\n        code_map.insert(\"[green]\", \"\\x1b[32m\");\n        code_map.insert(\"[yellow]\", \"\\x1b[33m\");\n        code_map.insert(\"[blue]\", \"\\x1b[34m\");\n        code_map.insert(\"[magenta]\", \"\\x1b[35m\");\n        code_map.insert(\"[cyan]\", \"\\x1b[36m\");\n        code_map.insert(\"[white]\", \"\\x1b[37m\");\n\n        // Background colors\n        code_map.insert(\"[bg_red]\", \"\\x1b[41m\");\n        code_map.insert(\"[bg_green]\", \"\\x1b[42m\");\n        code_map.insert(\"[bg_yellow]\", \"\\x1b[43m\");\n        code_map.insert(\"[bg_blue]\", \"\\x1b[44m\");\n        code_map.insert(\"[bg_magenta]\", \"\\x1b[45m\");\n        code_map.insert(\"[bg_cyan]\", \"\\x1b[46m\");\n        code_map.insert(\"[bg_white]\", \"\\x1b[47m\");\n\n        // Other attributes\n        code_map.insert(\"[bold]\", \"\\x1b[1m\");\n        code_map.insert(\"[italic]\", \"\\x1b[3m\");\n        code_map.insert(\"[underline]\", \"\\x1b[4m\");\n        code_map.insert(\"[reset]\", \"\\x1b[0m\");\n\n        let mut result = self;\n\n        for (replacement, code) in code_map {\n            result = result.replace(replacement, code);\n        }\n\n        result\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{ConvertEscapeCodes, ConvertHighlightCodes};\n\n    #[test]\n    fn test_escape_code_converter() {\n        let input = \"\\x1b[31mHello \\x1b[1mWorld\\x1b[0m!\".to_string();\n        let expected = \"[red]Hello [bold]World[reset]!\";\n\n        let actual = input.convert_escape_codes();\n\n        assert_eq!(actual, expected);\n    }\n\n    #[test]\n    fn test_escape_code_converter_with_bg() {\n        let input = \"\\x1b[41mHello \\x1b[1mWorld\\x1b[0m!\".to_string();\n        let expected = \"[bg_red]Hello [bold]World[reset]!\";\n\n        let actual = input.convert_escape_codes();\n\n        assert_eq!(actual, expected);\n    }\n\n    #[test]\n    fn test_highlight_code_converter() {\n        let input = \"[red]Hello [bold]World[reset]!\".to_string();\n        let expected = \"\\x1b[31mHello \\x1b[1mWorld\\x1b[0m!\";\n\n        let actual = input.convert_highlight_codes();\n\n        assert_eq!(actual, expected);\n    }\n\n    #[test]\n    fn test_highlight_code_converter_with_bg() {\n        let input = \"[bg_red]Hello [bold]World[reset]!\".to_string();\n        let expected = \"\\x1b[41mHello \\x1b[1mWorld\\x1b[0m!\";\n\n        let actual = input.convert_highlight_codes();\n\n        assert_eq!(actual, expected);\n    }\n}\n"
  },
  {
    "path": "src/core/utils/mod.rs",
    "content": "pub mod normalizer;\npub mod split_and_apply;\n"
  },
  {
    "path": "src/core/utils/normalizer.rs",
    "content": "use crate::core::config::KeywordConfig;\nuse crate::style::Style;\nuse std::collections::HashMap;\n\npub fn normalize_keyword_configs(configs: Vec<KeywordConfig>) -> Vec<KeywordConfig> {\n    let mut grouped_configs: HashMap<Style, Vec<String>> = HashMap::new();\n\n    for config in configs {\n        grouped_configs.entry(config.style).or_default().extend(config.words);\n    }\n\n    let mut result: Vec<KeywordConfig> = grouped_configs\n        .into_iter()\n        .map(|(style, mut words)| {\n            words.sort();\n            KeywordConfig { words, style }\n        })\n        .collect();\n\n    result.sort_by(|a, b| a.style.cmp(&b.style));\n\n    result\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::style::{Color, Style};\n    use std::default::Default;\n\n    #[test]\n    fn test_normalize_keyword_configs() {\n        let configs = vec![\n            KeywordConfig {\n                words: vec![\"hello\".to_string(), \"world\".to_string()],\n                style: Style {\n                    fg: Some(Color::Red),\n                    bold: true,\n                    ..Style::default()\n                },\n            },\n            KeywordConfig {\n                words: vec![\"foo\".to_string(), \"bar\".to_string()],\n                style: Style {\n                    fg: Some(Color::Red),\n                    bold: true,\n                    ..Style::default()\n                },\n            },\n            KeywordConfig {\n                words: vec![\"baz\".to_string()],\n                style: Style {\n                    fg: Some(Color::Green),\n                    underline: true,\n                    ..Style::default()\n                },\n            },\n        ];\n\n        let expected = vec![\n            KeywordConfig {\n                words: vec![\n                    \"bar\".to_string(),\n                    \"foo\".to_string(),\n                    \"hello\".to_string(),\n                    \"world\".to_string(),\n                ],\n                style: Style {\n                    fg: Some(Color::Red),\n                    bold: true,\n                    ..Style::default()\n                },\n            },\n            KeywordConfig {\n                words: vec![\"baz\".to_string()],\n                style: Style {\n                    fg: Some(Color::Green),\n                    underline: true,\n                    ..Style::default()\n                },\n            },\n        ];\n\n        let actual = normalize_keyword_configs(configs);\n        assert_eq!(actual, expected);\n    }\n\n    #[test]\n    fn test_normalize_keyword_configs_empty() {\n        let configs: Vec<KeywordConfig> = vec![];\n        let expected: Vec<KeywordConfig> = vec![];\n        let normalized_configs = normalize_keyword_configs(configs);\n        assert_eq!(normalized_configs, expected);\n    }\n\n    #[test]\n    fn test_normalize_keyword_simple_grouping() {\n        let configs = vec![\n            KeywordConfig {\n                words: vec![\"error\".to_string()],\n                style: Style::new().fg(Color::Red),\n            },\n            KeywordConfig {\n                words: vec![\"null\".to_string()],\n                style: Style::new().fg(Color::Red),\n            },\n        ];\n\n        let expected = vec![KeywordConfig {\n            words: vec![\"error\".to_string(), \"null\".to_string()],\n            style: Style::new().fg(Color::Red),\n        }];\n\n        let normalized_configs = normalize_keyword_configs(configs);\n        assert_eq!(normalized_configs, expected);\n    }\n\n    #[test]\n    fn test_do_not_normalize_slightly_different_groupings() {\n        let configs = vec![\n            KeywordConfig {\n                words: vec![\"error\".to_string()],\n                style: Style {\n                    fg: Some(Color::Red),\n                    bold: true,\n                    ..Style::default()\n                },\n            },\n            KeywordConfig {\n                words: vec![\"null\".to_string()],\n                style: Style {\n                    fg: Some(Color::Red),\n                    italic: true,\n                    ..Style::default()\n                },\n            },\n        ];\n\n        let expected = vec![\n            KeywordConfig {\n                words: vec![\"null\".to_string()],\n                style: Style {\n                    fg: Some(Color::Red),\n                    italic: true,\n                    ..Style::default()\n                },\n            },\n            KeywordConfig {\n                words: vec![\"error\".to_string()],\n                style: Style {\n                    fg: Some(Color::Red),\n                    bold: true,\n                    ..Style::default()\n                },\n            },\n        ];\n\n        let normalized_configs = normalize_keyword_configs(configs);\n        assert_eq!(normalized_configs, expected);\n    }\n\n    #[test]\n    fn test_normalize_keyword_configs_no_duplicates() {\n        let configs = vec![KeywordConfig {\n            words: vec![\"unique\".to_string()],\n            style: Style {\n                fg: Some(Color::Blue),\n                italic: true,\n                ..Style::default()\n            },\n        }];\n\n        let expected = vec![KeywordConfig {\n            words: vec![\"unique\".to_string()],\n            style: Style {\n                fg: Some(Color::Blue),\n                italic: true,\n                ..Style::default()\n            },\n        }];\n\n        let normalized_configs = normalize_keyword_configs(configs);\n        assert_eq!(normalized_configs, expected);\n    }\n}\n"
  },
  {
    "path": "src/core/utils/split_and_apply.rs",
    "content": "use crate::core::highlighter::Highlight;\nuse crate::core::highlighters::StaticHighlight;\nuse memchr::memmem::Finder;\nuse std::borrow::Cow;\nuse std::cmp::min;\nuse std::sync::LazyLock;\n\nstatic ESCAPE_FINDER: LazyLock<Finder<'static>> = LazyLock::new(|| Finder::new(\"\\x1b[\"));\nstatic RESET_FINDER: LazyLock<Finder<'static>> = LazyLock::new(|| Finder::new(\"\\x1b[0m\"));\n\nconst RESET_LEN: usize = \"\\x1b[0m\".len();\nconst SIXTEEN_KB: usize = 16 * 1024;\n\npub fn apply_only_to_unhighlighted<'a>(input: &'a str, highlighter: &StaticHighlight) -> Cow<'a, str> {\n    let bytes = input.as_bytes();\n    let mut result: Option<String> = None;\n    let mut copied = 0usize;\n    let mut pos = 0;\n\n    while pos < bytes.len() {\n        match ESCAPE_FINDER.find(&bytes[pos..]) {\n            None => {\n                apply_chunk(&input[pos..], highlighter, input, &mut result, &mut copied);\n                break;\n            }\n            Some(esc_offset) => {\n                if esc_offset > 0 {\n                    apply_chunk(\n                        &input[pos..pos + esc_offset],\n                        highlighter,\n                        input,\n                        &mut result,\n                        &mut copied,\n                    );\n                    pos += esc_offset;\n                }\n\n                if let Some(reset_offset) = RESET_FINDER.find(&bytes[pos..]) {\n                    let end = pos + reset_offset + RESET_LEN;\n                    push_unchanged(&input[pos..end], &mut result, &mut copied);\n                    pos = end;\n                } else {\n                    push_unchanged(&input[pos..], &mut result, &mut copied);\n                    break;\n                }\n            }\n        }\n    }\n\n    result.map_or(Cow::Borrowed(input), Cow::Owned)\n}\n\n#[inline(always)]\nfn apply_chunk(\n    text: &str,\n    highlighter: &StaticHighlight,\n    input: &str,\n    result: &mut Option<String>,\n    copied: &mut usize,\n) {\n    match highlighter.apply(text) {\n        Cow::Borrowed(_) => push_unchanged(text, result, copied),\n        Cow::Owned(ref new_text) => push_changed(new_text, input, result, copied),\n    }\n}\n\n#[inline(always)]\nfn push_unchanged(text: &str, result: &mut Option<String>, copied: &mut usize) {\n    if let Some(buf) = result {\n        buf.push_str(text);\n    } else {\n        *copied += text.len();\n    }\n}\n\n#[inline(always)]\nfn push_changed(new_text: &str, input: &str, result: &mut Option<String>, copied: &mut usize) {\n    let buf = result.get_or_insert_with(|| {\n        let extra = min(input.len(), SIXTEEN_KB);\n        let mut s = String::with_capacity(input.len() + extra);\n        s.push_str(&input[..*copied]);\n        s\n    });\n    buf.push_str(new_text);\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::core::config::NumberConfig;\n    use crate::core::highlighters::StaticHighlight;\n    use crate::core::highlighters::number::NumberHighlighter;\n    use crate::style::{Color, Style};\n\n    fn number_highlighter() -> StaticHighlight {\n        StaticHighlight::Number(\n            NumberHighlighter::new(NumberConfig {\n                style: Style::new().fg(Color::Cyan),\n            })\n            .unwrap(),\n        )\n    }\n\n    #[test]\n    fn no_escapes_no_match() {\n        let h = number_highlighter();\n        let input = \"hello world\";\n        let result = apply_only_to_unhighlighted(input, &h);\n        assert!(matches!(result, Cow::Borrowed(_)));\n        assert_eq!(&*result, \"hello world\");\n    }\n\n    #[test]\n    fn no_escapes_with_match() {\n        let h = number_highlighter();\n        let input = \"count 42 end\";\n        let result = apply_only_to_unhighlighted(input, &h);\n        assert!(matches!(result, Cow::Owned(_)));\n        assert!(result.contains(\"\\x1b[\"));\n        assert!(result.contains(\"42\"));\n    }\n\n    #[test]\n    fn skips_already_highlighted_region() {\n        let h = number_highlighter();\n        let input = \"before \\x1b[31m99\\x1b[0m after\";\n        let result = apply_only_to_unhighlighted(input, &h);\n        // 99 is inside an escape — should NOT be re-highlighted\n        // \"before\" and \"after\" have no numbers — no change\n        assert!(matches!(result, Cow::Borrowed(_)));\n    }\n\n    #[test]\n    fn highlights_outside_escapes() {\n        let h = number_highlighter();\n        let input = \"val 7 \\x1b[31mred\\x1b[0m end\";\n        let result = apply_only_to_unhighlighted(input, &h);\n        assert!(matches!(result, Cow::Owned(_)));\n        // The \"7\" outside the escape should be highlighted\n        assert!(result.contains(\"7\"));\n        // The escape region should be preserved verbatim\n        assert!(result.contains(\"\\x1b[31mred\\x1b[0m\"));\n    }\n\n    #[test]\n    fn escape_at_start() {\n        let h = number_highlighter();\n        let input = \"\\x1b[31mred\\x1b[0m 42 end\";\n        let result = apply_only_to_unhighlighted(input, &h);\n        assert!(matches!(result, Cow::Owned(_)));\n        assert!(result.starts_with(\"\\x1b[31mred\\x1b[0m\"));\n    }\n\n    #[test]\n    fn escape_at_end() {\n        let h = number_highlighter();\n        let input = \"hello \\x1b[31m99\\x1b[0m\";\n        let result = apply_only_to_unhighlighted(input, &h);\n        assert!(matches!(result, Cow::Borrowed(_)));\n    }\n\n    #[test]\n    fn unclosed_escape() {\n        let h = number_highlighter();\n        let input = \"ok \\x1b[31mforever red 42\";\n        let result = apply_only_to_unhighlighted(input, &h);\n        // \"ok \" has no number, and everything after \\x1b[ is treated as highlighted\n        assert!(matches!(result, Cow::Borrowed(_)));\n    }\n\n    #[test]\n    fn multiple_escapes() {\n        let h = number_highlighter();\n        let input = \"a \\x1b[31mx\\x1b[0m 5 \\x1b[32my\\x1b[0m b\";\n        let result = apply_only_to_unhighlighted(input, &h);\n        assert!(matches!(result, Cow::Owned(_)));\n        assert!(result.contains(\"\\x1b[31mx\\x1b[0m\"));\n        assert!(result.contains(\"\\x1b[32my\\x1b[0m\"));\n    }\n\n    #[test]\n    fn empty_input() {\n        let h = number_highlighter();\n        let result = apply_only_to_unhighlighted(\"\", &h);\n        assert!(matches!(result, Cow::Borrowed(_)));\n        assert_eq!(&*result, \"\");\n    }\n}\n"
  },
  {
    "path": "src/highlighter_builder/builtins.rs",
    "content": "use tailspin::config::KeywordConfig;\nuse tailspin::style::{Color, Style};\n\npub fn get_builtin_keywords(disable_builtin_keywords: bool) -> Vec<KeywordConfig> {\n    match disable_builtin_keywords {\n        true => vec![],\n        false => builtin_keywords(),\n    }\n}\n\nfn builtin_keywords() -> Vec<KeywordConfig> {\n    let severity_levels = vec![\n        KeywordConfig {\n            words: vec![\"ERROR\".to_string()],\n            style: Style::new().fg(Color::Red),\n        },\n        KeywordConfig {\n            words: vec![\"WARN\".to_string(), \"WARNING\".to_string()],\n            style: Style::new().fg(Color::Yellow),\n        },\n        KeywordConfig {\n            words: vec![\"INFO\".to_string()],\n            style: Style::new().fg(Color::White),\n        },\n        KeywordConfig {\n            words: vec![\"SUCCESS\".to_string(), \"DEBUG\".to_string()],\n            style: Style::new().fg(Color::Green),\n        },\n        KeywordConfig {\n            words: vec![\"TRACE\".to_string()],\n            style: Style::new().faint(),\n        },\n    ];\n\n    let rest_keywords = vec![\n        KeywordConfig {\n            words: vec![\"GET\".to_string()],\n            style: Style::new().fg(Color::Black).on(Color::Green),\n        },\n        KeywordConfig {\n            words: vec![\"POST\".to_string()],\n            style: Style::new().fg(Color::Black).on(Color::Yellow),\n        },\n        KeywordConfig {\n            words: vec![\"PUT\".to_string(), \"PATCH\".to_string()],\n            style: Style::new().fg(Color::Black).on(Color::Magenta),\n        },\n        KeywordConfig {\n            words: vec![\"DELETE\".to_string()],\n            style: Style::new().fg(Color::Black).on(Color::Red),\n        },\n        KeywordConfig {\n            words: vec![\"HEAD\".to_string(), \"CONNECT\".to_string(), \"OPTIONS\".to_string()],\n            style: Style::new().fg(Color::Black).on(Color::Blue),\n        },\n    ];\n\n    let booleans = [\n        KeywordConfig {\n            words: vec![\n                \"null\".to_string(),\n                \"NULL\".to_string(),\n                \"nil\".to_string(),\n                \"NIL\".to_string(),\n                \"NaN\".to_string(),\n                \"undefined\".to_string(),\n                \"false\".to_string(),\n                \"FALSE\".to_string(),\n            ],\n            style: Style::new().fg(Color::Red).italic(),\n        },\n        KeywordConfig {\n            words: vec![\"true\".to_string(), \"TRUE\".to_string()],\n            style: Style::new().fg(Color::Green).italic(),\n        },\n    ];\n\n    vec![]\n        .into_iter()\n        .chain(severity_levels)\n        .chain(rest_keywords)\n        .chain(booleans)\n        .collect()\n}\n"
  },
  {
    "path": "src/highlighter_builder/groups.rs",
    "content": "use crate::cli::HighlighterGroup;\nuse HighlighterConfigNew::*;\nuse std::fmt::Debug;\nuse thiserror::Error;\n\npub enum HighlighterConfigNew {\n    AllHighlightersEnabled,\n    SomeHighlightersEnabled,\n    SomeHighlightersDisabled,\n    Mismatch,\n}\n\npub struct HighlighterGroups {\n    pub numbers: bool,\n    pub uuids: bool,\n    pub quotes: bool,\n    pub ip_addresses: bool,\n    pub dates: bool,\n    pub paths: bool,\n    pub urls: bool,\n    pub pointers: bool,\n    pub processes: bool,\n    pub key_value_pairs: bool,\n    pub json: bool,\n}\n\nimpl HighlighterGroups {\n    const fn new_with_value(value: bool) -> Self {\n        HighlighterGroups {\n            numbers: value,\n            uuids: value,\n            quotes: value,\n            ip_addresses: value,\n            dates: value,\n            paths: value,\n            urls: value,\n            pointers: value,\n            processes: value,\n            key_value_pairs: value,\n            json: value,\n        }\n    }\n\n    pub const fn all_enabled() -> Self {\n        Self::new_with_value(true)\n    }\n}\n\npub fn get_highlighter_groups(\n    enabled: &[HighlighterGroup],\n    disabled: &[HighlighterGroup],\n) -> Result<HighlighterGroups, ConfigError> {\n    match determine_highlighter_type_new(enabled, disabled) {\n        AllHighlightersEnabled => Ok(HighlighterGroups::all_enabled()),\n        SomeHighlightersEnabled => Ok(HighlighterGroups {\n            numbers: enabled.contains(&HighlighterGroup::Numbers),\n            uuids: enabled.contains(&HighlighterGroup::Uuids),\n            quotes: enabled.contains(&HighlighterGroup::Quotes),\n            ip_addresses: enabled.contains(&HighlighterGroup::IpAddresses),\n            dates: enabled.contains(&HighlighterGroup::Dates),\n            paths: enabled.contains(&HighlighterGroup::Paths),\n            urls: enabled.contains(&HighlighterGroup::Urls),\n            pointers: enabled.contains(&HighlighterGroup::Pointers),\n            processes: enabled.contains(&HighlighterGroup::Processes),\n            key_value_pairs: enabled.contains(&HighlighterGroup::KeyValuePairs),\n            json: enabled.contains(&HighlighterGroup::Json),\n        }),\n        SomeHighlightersDisabled => Ok(HighlighterGroups {\n            numbers: !disabled.contains(&HighlighterGroup::Numbers),\n            uuids: !disabled.contains(&HighlighterGroup::Uuids),\n            quotes: !disabled.contains(&HighlighterGroup::Quotes),\n            ip_addresses: !disabled.contains(&HighlighterGroup::IpAddresses),\n            dates: !disabled.contains(&HighlighterGroup::Dates),\n            paths: !disabled.contains(&HighlighterGroup::Paths),\n            urls: !disabled.contains(&HighlighterGroup::Urls),\n            pointers: !disabled.contains(&HighlighterGroup::Pointers),\n            processes: !disabled.contains(&HighlighterGroup::Processes),\n            key_value_pairs: !disabled.contains(&HighlighterGroup::KeyValuePairs),\n            json: !disabled.contains(&HighlighterGroup::Json),\n        }),\n        Mismatch => Err(ConfigError::ConflictEnableDisable),\n    }\n}\n\npub const fn determine_highlighter_type_new(\n    enabled: &[HighlighterGroup],\n    disabled: &[HighlighterGroup],\n) -> HighlighterConfigNew {\n    let some_enabled = !enabled.is_empty();\n    let some_disabled = !disabled.is_empty();\n\n    let none_enabled = enabled.is_empty();\n    let none_disabled = disabled.is_empty();\n\n    let only_some_enabled = some_enabled && none_disabled;\n    let only_some_disabled = some_disabled && none_enabled;\n\n    if none_disabled && none_enabled {\n        return AllHighlightersEnabled;\n    }\n\n    if only_some_enabled {\n        return SomeHighlightersEnabled;\n    }\n\n    if only_some_disabled {\n        return SomeHighlightersDisabled;\n    }\n\n    Mismatch\n}\n\n#[derive(Debug, Error)]\npub enum ConfigError {\n    #[error(\"cannot both enable and disable highlighters\")]\n    ConflictEnableDisable,\n}\n"
  },
  {
    "path": "src/highlighter_builder/mod.rs",
    "content": "pub mod builtins;\npub mod groups;\n\nuse crate::highlighter_builder::groups::HighlighterGroups;\nuse crate::theme::Theme;\nuse tailspin::config::KeywordConfig;\nuse tailspin::*;\n\npub fn get_highlighter(\n    highlighter_groups: HighlighterGroups,\n    theme: Theme,\n    keywords: Vec<KeywordConfig>,\n) -> Result<Highlighter, Error> {\n    let mut builder = Highlighter::builder();\n\n    if highlighter_groups.json {\n        builder.with_json_highlighter(theme.json);\n    }\n\n    for regex in theme.regexes {\n        builder.with_regex_highlighter(regex);\n    }\n\n    if highlighter_groups.dates {\n        builder.with_date_time_highlighters(theme.dates);\n    }\n\n    if highlighter_groups.ip_addresses {\n        builder.with_ip_v6_highlighter(theme.ip_v6_addresses);\n        builder.with_ip_v4_highlighter(theme.ip_v4_addresses);\n    }\n\n    if highlighter_groups.urls {\n        builder.with_url_highlighter(theme.urls);\n    }\n\n    if highlighter_groups.paths {\n        builder.with_unix_path_highlighter(theme.paths);\n    }\n\n    if highlighter_groups.key_value_pairs {\n        builder.with_key_value_highlighter(theme.key_value_pairs);\n    }\n\n    if highlighter_groups.uuids {\n        builder.with_uuid_highlighter(theme.uuids);\n    }\n\n    if highlighter_groups.pointers {\n        builder.with_pointer_highlighter(theme.pointers);\n    }\n\n    if highlighter_groups.processes {\n        builder.with_unix_process_highlighter(theme.processes);\n    }\n\n    if highlighter_groups.numbers {\n        builder.with_number_highlighter(theme.numbers);\n    }\n\n    builder.with_keyword_highlighter(keywords);\n\n    if highlighter_groups.quotes {\n        builder.with_quote_highlighter(theme.quotes);\n    }\n\n    builder.build()\n}\n"
  },
  {
    "path": "src/io/controller/mod.rs",
    "content": "use crate::cli::get_config;\nuse crate::config::{Source, Target};\nuse crate::io::initial_read::{InitialReadCompleteReceiver, InitialReadCompleteSender, initial_read_complete_channel};\nuse crate::io::presenter::pager::{CustomPagerOptions, LessPagerOptions, Pager, PagerOptions};\nuse crate::io::presenter::stdout::StdoutPresenter;\nuse crate::io::reader::command::CommandReader;\nuse crate::io::reader::file_reader::FileReader;\nuse crate::io::reader::stdin::StdinReader;\nuse crate::io::writer::stdout::StdoutWriter;\nuse crate::io::writer::temp_file::TempFile;\nuse anyhow::{Context, Result};\nuse std::path::PathBuf;\nuse tailspin::Highlighter;\nuse tempfile::TempDir;\nuse tokio::fs::File;\nuse tokio::io::BufWriter;\n\npub enum Reader {\n    File(FileReader),\n    Stdin(StdinReader),\n    Command(CommandReader),\n}\n\npub enum Writer {\n    TempFile(TempFile),\n    Stdout(StdoutWriter),\n}\n\npub enum Presenter {\n    Pager(Pager),\n    StdOut(StdoutPresenter),\n}\n\npub async fn initialize_io() -> Result<(\n    Reader,\n    Writer,\n    Presenter,\n    Highlighter,\n    InitialReadCompleteSender,\n    InitialReadCompleteReceiver,\n    Option<TempDir>,\n)> {\n    let config = get_config()?;\n    let (read_complete_sender, read_complete_receiver) = initial_read_complete_channel();\n\n    let reader = get_reader(config.source).await?;\n    let (writer, presenter, temp_dir) = get_writer_presenter_and_temp_dir(config.target).await?;\n\n    Ok((\n        reader,\n        writer,\n        presenter,\n        config.highlighter,\n        read_complete_sender,\n        read_complete_receiver,\n        temp_dir,\n    ))\n}\n\nasync fn get_reader(input: Source) -> Result<Reader> {\n    let reader = match input {\n        Source::File(file) => Reader::File(FileReader::new(file.path, file.terminate_after_first_read).await?),\n        Source::Stdin => Reader::Stdin(StdinReader::new()),\n        Source::Command(cmd) => Reader::Command(CommandReader::new(cmd).await?),\n    };\n\n    Ok(reader)\n}\n\nasync fn get_writer_presenter_and_temp_dir(output: Target) -> Result<(Writer, Presenter, Option<TempDir>)> {\n    match output {\n        Target::Less(opts) => {\n            let less_pager_options = LessPagerOptions { follow: opts.follow };\n            let pager_opts = PagerOptions::Less(less_pager_options);\n            let (writer, presenter, temp_dir) = get_temp_file_and_pager(pager_opts).await?;\n\n            Ok((writer, presenter, Some(temp_dir)))\n        }\n        Target::CustomPager(opts) => {\n            let custom_pager_options = CustomPagerOptions {\n                command: opts.command,\n                args: opts.args,\n            };\n            let pager_options = PagerOptions::Custom(custom_pager_options);\n            let (writer, presenter, temp_dir) = get_temp_file_and_pager(pager_options).await?;\n\n            Ok((writer, presenter, Some(temp_dir)))\n        }\n        Target::Stdout => Ok((\n            Writer::Stdout(StdoutWriter::new()),\n            Presenter::StdOut(StdoutPresenter::new()),\n            None,\n        )),\n    }\n}\n\nasync fn get_temp_file_and_pager(pager_opts: PagerOptions) -> Result<(Writer, Presenter, TempDir)> {\n    let (temp_dir, path_buf, buf_writer) = create_temp_file().await?;\n    let temp_file = TempFile::new(buf_writer).await;\n    let pager = Pager::new(path_buf, pager_opts);\n\n    Ok((Writer::TempFile(temp_file), Presenter::Pager(pager), temp_dir))\n}\n\nasync fn create_temp_file() -> Result<(TempDir, PathBuf, BufWriter<File>)> {\n    let filename = \"tailspin.temp\";\n\n    let temp_dir = tempfile::tempdir().context(\"Could not locate temporary directory\")?;\n\n    let temp_file_path = temp_dir.path().join(filename);\n    let output_file = File::create(&temp_file_path)\n        .await\n        .context(\"Could not create temporary file\")?;\n\n    let buf_writer = BufWriter::new(output_file);\n\n    Ok((temp_dir, temp_file_path, buf_writer))\n}\n"
  },
  {
    "path": "src/io/initial_read.rs",
    "content": "use anyhow::Result;\nuse thiserror::Error;\nuse tokio::sync::oneshot;\n\npub fn initial_read_complete_channel() -> (InitialReadCompleteSender, InitialReadCompleteReceiver) {\n    let (tx, rx) = oneshot::channel();\n    (InitialReadCompleteSender(Some(tx)), InitialReadCompleteReceiver(rx))\n}\n\n#[derive(Debug, Error)]\nenum SignalError {\n    #[error(\"Failed to receive initial-read-complete signal\")]\n    Recv(#[source] oneshot::error::RecvError),\n    #[error(\"Failed to send initial-read-complete signal\")]\n    Send,\n}\n\n#[derive(Debug)]\npub struct InitialReadCompleteReceiver(oneshot::Receiver<()>);\n\nimpl InitialReadCompleteReceiver {\n    pub async fn receive(self) -> Result<()> {\n        self.0.await.map_err(SignalError::Recv)?;\n        Ok(())\n    }\n}\n\n#[derive(Debug)]\npub struct InitialReadCompleteSender(Option<oneshot::Sender<()>>);\n\nimpl InitialReadCompleteSender {\n    pub fn send(&mut self) -> Result<()> {\n        match self.0.take() {\n            Some(sender) => Ok(sender.send(()).map_err(|_| SignalError::Send)?),\n            None => Ok(()),\n        }\n    }\n}\n"
  },
  {
    "path": "src/io/mod.rs",
    "content": "pub mod controller;\npub mod initial_read;\npub mod presenter;\npub mod reader;\npub mod writer;\n"
  },
  {
    "path": "src/io/presenter/mod.rs",
    "content": "use crate::io::controller::Presenter;\nuse anyhow::Result;\n\npub mod pager;\npub mod stdout;\n\n/// Presenters are responsible for displaying output to the user.\n/// Different implementations handle output differently—e.g., direct stdout,\n/// paging via `less`, or using a custom pager.\n///\n/// When `present()` returns, the application terminates. For continuous\n/// output scenarios, implementations should ensure they never return.\npub trait Present: Send {\n    async fn present(&self) -> Result<()>;\n}\n\nimpl Present for Presenter {\n    async fn present(&self) -> Result<()> {\n        match self {\n            Presenter::Pager(p) => p.present().await,\n            Presenter::StdOut(p) => p.present().await,\n        }\n    }\n}\n"
  },
  {
    "path": "src/io/presenter/pager.rs",
    "content": "use crate::io::presenter::Present;\nuse anyhow::Result;\nuse std::path::{Path, PathBuf};\nuse thiserror::Error;\nuse tokio::process::Command;\n\npub struct Pager {\n    path: PathBuf,\n    pager_options: PagerOptions,\n}\n\npub enum PagerOptions {\n    Less(LessPagerOptions),\n    Custom(CustomPagerOptions),\n}\n\npub struct LessPagerOptions {\n    pub follow: bool,\n}\n\npub struct CustomPagerOptions {\n    pub command: String,\n    pub args: Vec<String>,\n}\n\n#[derive(Debug, Error)]\npub enum PagerError {\n    #[error(\"Could not set up signal handler\")]\n    SignalSetup(#[source] std::io::Error),\n\n    #[error(\"Could not run pager\")]\n    CommandSpawn(#[source] std::io::Error),\n\n    #[error(\"Pager exited with non-zero status: {0}\")]\n    NonZeroExit(std::process::ExitStatus),\n}\n\nimpl Pager {\n    pub const fn new(path: PathBuf, pager_options: PagerOptions) -> Self {\n        Self { path, pager_options }\n    }\n}\n\nimpl Present for Pager {\n    async fn present(&self) -> Result<()> {\n        #[cfg(unix)]\n        let _sigint = tokio::signal::unix::signal(tokio::signal::unix::SignalKind::interrupt())\n            .map_err(PagerError::SignalSetup)?;\n\n        let mut command = match &self.pager_options {\n            PagerOptions::Less(less) => get_less_pager_command(less.follow, &self.path),\n            PagerOptions::Custom(custom) => {\n                get_custom_pager_command(custom.command.clone(), custom.args.clone(), &self.path)\n            }\n        };\n\n        let status = command.status().await.map_err(PagerError::CommandSpawn)?;\n\n        status.success().then_some(()).ok_or(PagerError::NonZeroExit(status))?;\n\n        Ok(())\n    }\n}\n\nfn get_less_pager_command(follow: bool, path: &PathBuf) -> Command {\n    let mut args = vec![\n        \"--ignore-case\".to_string(),\n        \"--RAW-CONTROL-CHARS\".to_string(),\n        \"--\".to_string(), // End of option arguments\n    ];\n\n    if follow {\n        args.insert(0, \"+F\".to_string());\n    }\n\n    let mut cmd = Command::new(\"less\");\n\n    cmd.env(\"LESSSECURE\", \"1\").args(&args).arg(path);\n\n    cmd\n}\n\nfn get_custom_pager_command(command: String, args: Vec<String>, path: &Path) -> Command {\n    let replaced_args = replace_file_placeholder(args, path.to_str().unwrap());\n\n    let mut cmd = Command::new(command);\n\n    cmd.args(replaced_args);\n\n    cmd\n}\n\nfn replace_file_placeholder(args: Vec<String>, path: &str) -> Vec<String> {\n    args.into_iter().map(|arg| arg.replace(\"[FILE]\", path)).collect()\n}\n"
  },
  {
    "path": "src/io/presenter/stdout.rs",
    "content": "use crate::io::presenter::Present;\nuse anyhow::Result;\nuse std::future::pending;\n\n/// `StdoutPresenter` does not require any special presentation logic because\n/// the output is already directly handled by a dedicated stdout writer.\n/// Writing to stdout is sufficient, eliminating the need for additional\n/// presentation mechanisms.\npub struct StdoutPresenter {\n    _private: (),\n}\n\nimpl StdoutPresenter {\n    pub const fn new() -> StdoutPresenter {\n        Self { _private: () }\n    }\n}\n\nimpl Present for StdoutPresenter {\n    async fn present(&self) -> Result<()> {\n        pending::<()>().await;\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "src/io/reader/buffer_line_counter.rs",
    "content": "use anyhow::{Result, anyhow};\nuse memchr::memchr;\nuse tokio::io::{AsyncBufRead, AsyncBufReadExt};\n\npub const BUFF_READER_CAPACITY: usize = 64 * 1024;\n\npub enum ReadResult {\n    Eof,\n    Line(String),\n    Batch(Vec<String>),\n}\n\n/// Peeks at the buffered reader to classify available data, then dispatches\n/// to a handler. The peek/handle split exists because `fill_buf()` borrows\n/// the reader — we must drop that borrow before calling `read_until` or\n/// `consume` in the handlers.\npub async fn read_lines<R>(reader: &mut R) -> Result<ReadResult>\nwhere\n    R: AsyncBufRead + Unpin,\n{\n    match peek_buffer(reader).await? {\n        PeekResult::Eof => Ok(ReadResult::Eof),\n        PeekResult::SingleOrNoNewline => handle_single_or_no_newline(reader).await,\n        PeekResult::MultipleNewlines => handle_multiple_newlines(reader).await,\n    }\n}\n\nenum PeekResult {\n    Eof,\n    SingleOrNoNewline,\n    MultipleNewlines,\n}\n\nasync fn peek_buffer<R>(reader: &mut R) -> Result<PeekResult>\nwhere\n    R: AsyncBufRead + Unpin,\n{\n    let buf = reader.fill_buf().await?;\n\n    if buf.is_empty() {\n        return Ok(PeekResult::Eof);\n    }\n\n    match memchr(b'\\n', buf) {\n        None => Ok(PeekResult::SingleOrNoNewline),\n        Some(pos) => match memchr(b'\\n', &buf[pos + 1..]) {\n            None => Ok(PeekResult::SingleOrNoNewline),\n            Some(_) => Ok(PeekResult::MultipleNewlines),\n        },\n    }\n}\n\nasync fn handle_single_or_no_newline<R>(reader: &mut R) -> Result<ReadResult>\nwhere\n    R: AsyncBufRead + Unpin,\n{\n    let mut buf = Vec::new();\n    reader.read_until(b'\\n', &mut buf).await?;\n\n    if buf.last() == Some(&b'\\n') {\n        buf.pop();\n    }\n    if buf.last() == Some(&b'\\r') {\n        buf.pop();\n    }\n\n    let line = String::from_utf8_lossy(&buf).to_string();\n    Ok(ReadResult::Line(line))\n}\n\nasync fn handle_multiple_newlines<R>(reader: &mut R) -> Result<ReadResult>\nwhere\n    R: AsyncBufRead + Unpin,\n{\n    let buf = reader.fill_buf().await?;\n\n    if let Some(last_newline_pos) = buf.iter().rposition(|&b| b == b'\\n') {\n        let consumed_buf = &buf[..=last_newline_pos];\n        let lines = parse_buffer(consumed_buf);\n        reader.consume(last_newline_pos + 1);\n\n        return Ok(ReadResult::Batch(lines));\n    }\n\n    Err(anyhow!(\"Expected multiple newlines, but none found\"))\n}\n\nfn parse_buffer(buf: &[u8]) -> Vec<String> {\n    let mut parts = buf\n        .split(|&b| b == b'\\n')\n        .map(|slice| {\n            let slice = slice.strip_suffix(b\"\\r\").unwrap_or(slice);\n            String::from_utf8_lossy(slice).to_string()\n        })\n        .collect::<Vec<String>>();\n\n    if let Some(last) = parts.last() {\n        if last.is_empty() {\n            parts.pop();\n        }\n    }\n\n    parts\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::pin::Pin;\n    use std::task::{Context, Poll};\n    use std::time::Duration;\n    use tokio::io::BufReader;\n    use tokio::io::{AsyncRead, ReadBuf};\n    use tokio::time::timeout;\n\n    #[tokio::test]\n    async fn test_read_complete_lines_multiple_lines() {\n        let input = b\"line 1\\nline 2\\nline 3\\n\";\n        let mut reader = BufReader::new(&input[..]);\n\n        if let Ok(ReadResult::Batch(lines)) = read_lines(&mut reader).await {\n            assert_eq!(lines, vec![\"line 1\", \"line 2\", \"line 3\"]);\n        } else {\n            panic!(\"Expected Ok(ReadResult::Batch), got something else\");\n        }\n    }\n\n    #[tokio::test]\n    async fn test_do_not_omit_empty_lines() {\n        let input = b\"line 1\\n\\nline 3\\n\\n\";\n        let mut reader = BufReader::new(&input[..]);\n\n        if let Ok(ReadResult::Batch(lines)) = read_lines(&mut reader).await {\n            assert_eq!(lines, vec![\"line 1\", \"\", \"line 3\", \"\"]);\n        } else {\n            panic!(\"Expected Ok(ReadResult::Batch), got something else\");\n        }\n    }\n\n    #[tokio::test]\n    async fn test_read_complete_lines_multiple_lines_no_final_newline() {\n        let input = b\"line 1\\nline 2\\nline 3\";\n        let mut reader = BufReader::new(&input[..]);\n        let mut lines = vec![];\n\n        let lines_first_read = read_lines(&mut reader).await.unwrap();\n        let lines_second_read = read_lines(&mut reader).await.unwrap();\n\n        if let ReadResult::Batch(batch) = lines_first_read {\n            lines = [lines, batch].concat();\n        }\n\n        if let ReadResult::Line(line) = lines_second_read {\n            lines.push(line);\n        }\n\n        assert_eq!(lines, vec![\"line 1\", \"line 2\", \"line 3\"]);\n    }\n\n    #[tokio::test]\n    async fn test_read_eof_without_new_line_should_still_return_the_whole_string() {\n        let input = b\"incomplete line without newline\";\n        let mut reader = BufReader::new(&input[..]);\n\n        if let Ok(ReadResult::Line(line)) = read_lines(&mut reader).await {\n            assert_eq!(line, \"incomplete line without newline\");\n        } else {\n            panic!(\"Expected Ok(ReadResult::Line), got something else\");\n        }\n    }\n\n    #[tokio::test]\n    async fn test_read_complete_lines_single_complete_line() {\n        let input = b\"single complete line\\n\";\n        let mut reader = BufReader::new(&input[..]);\n\n        if let Ok(ReadResult::Line(line)) = read_lines(&mut reader).await {\n            assert_eq!(line, \"single complete line\");\n        } else {\n            panic!(\"Expected Ok(ReadResult::Line), got something else\");\n        }\n    }\n\n    #[tokio::test]\n    async fn test_read_complete_lines_empty_input() {\n        let input = b\"\";\n        let mut reader = BufReader::new(&input[..]);\n\n        if let Ok(ReadResult::Eof) = read_lines(&mut reader).await {\n            // success\n        } else {\n            panic!(\"Expected Ok(ReadResult::Eof), got something else\");\n        }\n    }\n\n    #[tokio::test]\n    async fn test_read_complete_lines_partial_line_pending() {\n        let input = b\"incomplete line without newline\";\n        let custom_reader = PendingAfterInitialRead::new(input);\n        let mut reader = BufReader::new(custom_reader);\n\n        let result = timeout(Duration::from_millis(100), read_lines(&mut reader)).await;\n\n        assert!(result.is_err(), \"Expected timeout because no newline or EOF is present\");\n    }\n\n    #[tokio::test]\n    async fn test_read_available_lines() {\n        let input = b\"extract lines\\n that are ready\\n to be extracted\\n but not more than that\";\n        let custom_reader = PendingAfterInitialRead::new(input);\n        let mut reader = BufReader::new(custom_reader);\n\n        let result = timeout(Duration::from_millis(100), read_lines(&mut reader)).await;\n\n        if let Ok(Ok(ReadResult::Batch(lines))) = result {\n            assert_eq!(lines, vec![\"extract lines\", \" that are ready\", \" to be extracted\"]);\n        } else {\n            panic!(\"Expected Ok(ReadResult::Batch), got something else\");\n        }\n    }\n\n    struct PendingAfterInitialRead {\n        data: Vec<u8>,\n        position: usize,\n    }\n\n    impl PendingAfterInitialRead {\n        fn new(initial_data: &[u8]) -> Self {\n            Self {\n                data: initial_data.to_vec(),\n                position: 0,\n            }\n        }\n    }\n\n    impl AsyncRead for PendingAfterInitialRead {\n        fn poll_read(\n            mut self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n            buf: &mut ReadBuf<'_>,\n        ) -> Poll<std::io::Result<()>> {\n            if self.position < self.data.len() {\n                let remaining = &self.data[self.position..];\n                let to_read = remaining.len().min(buf.remaining());\n                buf.put_slice(&remaining[..to_read]);\n                self.position += to_read;\n                Poll::Ready(Ok(()))\n            } else {\n                Poll::Pending\n            }\n        }\n    }\n\n    #[tokio::test]\n    async fn test_crlf_batch() {\n        let input = b\"line1\\r\\nline2\\r\\nline3\\r\\n\";\n        let mut reader = BufReader::new(&input[..]);\n\n        if let Ok(ReadResult::Batch(lines)) = read_lines(&mut reader).await {\n            assert_eq!(lines, vec![\"line1\", \"line2\", \"line3\"]);\n        } else {\n            panic!(\"Expected Ok(ReadResult::Batch), got something else\");\n        }\n    }\n\n    #[tokio::test]\n    async fn test_crlf_single_line() {\n        let input = b\"line1\\r\\n\";\n        let mut reader = BufReader::new(&input[..]);\n\n        if let Ok(ReadResult::Line(line)) = read_lines(&mut reader).await {\n            assert_eq!(line, \"line1\");\n        } else {\n            panic!(\"Expected Ok(ReadResult::Line), got something else\");\n        }\n    }\n\n    #[tokio::test]\n    async fn test_non_utf8_single_line() {\n        let input = b\"caf\\xe9\\n\";\n        let mut reader = BufReader::new(&input[..]);\n\n        if let Ok(ReadResult::Line(line)) = read_lines(&mut reader).await {\n            assert!(line.starts_with(\"caf\"));\n            assert!(line.contains('\\u{FFFD}'));\n        } else {\n            panic!(\"Expected Ok(ReadResult::Line), got something else\");\n        }\n    }\n\n    #[tokio::test]\n    async fn test_mixed_line_endings() {\n        let input = b\"unix\\nwindows\\r\\nunix2\\n\";\n        let mut reader = BufReader::new(&input[..]);\n\n        if let Ok(ReadResult::Batch(lines)) = read_lines(&mut reader).await {\n            assert_eq!(lines, vec![\"unix\", \"windows\", \"unix2\"]);\n        } else {\n            panic!(\"Expected Ok(ReadResult::Batch), got something else\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/io/reader/command.rs",
    "content": "use crate::io::reader::buffer_line_counter::{BUFF_READER_CAPACITY, ReadResult, read_lines};\nuse crate::io::reader::{AsyncLineReader, StreamEvent};\nuse anyhow::{Context, Result, anyhow};\nuse std::process::Stdio;\nuse tokio::io::BufReader;\nuse tokio::process::{Child, ChildStdout, Command};\n\npub struct CommandReader {\n    reader: BufReader<ChildStdout>,\n    child: Child,\n    ready: bool,\n}\n\nimpl CommandReader {\n    pub async fn new(command: String) -> Result<CommandReader> {\n        spawn_command(command).await\n    }\n}\n\n#[cfg(not(windows))]\nasync fn spawn_command(command: String) -> Result<CommandReader> {\n    let trap_command = format!(\"trap '' INT; {}\", command);\n\n    let mut child = Command::new(\"sh\")\n        .arg(\"-c\")\n        .arg(trap_command)\n        .stdout(Stdio::piped())\n        .spawn()\n        .context(\"Could not spawn process\")?;\n\n    let stdout = child\n        .stdout\n        .take()\n        .ok_or_else(|| anyhow!(\"Could not capture stdout of spawned process\"))?;\n\n    let reader = BufReader::with_capacity(BUFF_READER_CAPACITY, stdout);\n\n    Ok(CommandReader {\n        reader,\n        child,\n        ready: false,\n    })\n}\n\n#[cfg(windows)]\nasync fn spawn_command(_command: String) -> Result<CommandReader> {\n    Err(anyhow!(\"The --exec flag is not supported on Windows\"))\n}\n\nimpl Drop for CommandReader {\n    fn drop(&mut self) {\n        let _ = self.child.start_kill();\n    }\n}\n\nimpl AsyncLineReader for CommandReader {\n    async fn next(&mut self) -> Result<StreamEvent> {\n        if !self.ready {\n            self.ready = true;\n\n            return Ok(StreamEvent::Started);\n        }\n\n        let event = match read_lines(&mut self.reader).await? {\n            ReadResult::Eof => {\n                let _ = self.child.wait().await;\n                StreamEvent::Ended\n            }\n            ReadResult::Line(line) => StreamEvent::Line(line),\n            ReadResult::Batch(lines) => StreamEvent::Lines(lines),\n        };\n\n        Ok(event)\n    }\n}\n"
  },
  {
    "path": "src/io/reader/file_reader.rs",
    "content": "use crate::io::reader::StreamEvent::{Ended, Started};\nuse crate::io::reader::buffer_line_counter::{BUFF_READER_CAPACITY, ReadResult, read_lines};\nuse crate::io::reader::{AsyncLineReader, StreamEvent};\nuse anyhow::{Context, Result};\nuse std::path::Path;\nuse std::time::Duration;\nuse tokio::io::{AsyncBufReadExt, AsyncSeekExt, BufReader};\n\nconst POLL_INTERVAL: Duration = Duration::from_millis(100);\n\npub struct FileReader {\n    reader: BufReader<tokio::fs::File>,\n    buf: Vec<u8>,\n    initial_read_done: bool,\n    has_emitted_start_event: bool,\n    terminate_after_first_read: bool,\n}\n\nimpl FileReader {\n    pub async fn new<P: AsRef<Path>>(file_path: P, terminate_after_first_read: bool) -> Result<FileReader> {\n        let file_path = std::fs::canonicalize(file_path.as_ref()).context(\"Could not canonicalize file path\")?;\n\n        let file = tokio::fs::File::open(&file_path).await.context(\"Could not open file\")?;\n\n        let reader = BufReader::with_capacity(BUFF_READER_CAPACITY, file);\n\n        Ok(Self {\n            reader,\n            buf: Vec::new(),\n            initial_read_done: false,\n            has_emitted_start_event: false,\n            terminate_after_first_read,\n        })\n    }\n\n    async fn next_line(&mut self) -> Result<String> {\n        loop {\n            let bytes_read = self\n                .reader\n                .read_until(b'\\n', &mut self.buf)\n                .await\n                .context(\"Could not read next line\")?;\n\n            if bytes_read == 0 {\n                // Detect file truncation: if the file shrank past our position, restart from the beginning\n                let file_size = self\n                    .reader\n                    .get_ref()\n                    .metadata()\n                    .await\n                    .context(\"Could not stat file\")?\n                    .len();\n                let position = self\n                    .reader\n                    .stream_position()\n                    .await\n                    .context(\"Could not get stream position\")?;\n\n                if file_size < position {\n                    self.reader\n                        .seek(std::io::SeekFrom::Start(0))\n                        .await\n                        .context(\"Could not seek to start after truncation\")?;\n                    self.buf.clear();\n                }\n\n                tokio::time::sleep(POLL_INTERVAL).await;\n                continue;\n            }\n\n            if self.buf.ends_with(b\"\\n\") {\n                let line_end = if self.buf.ends_with(b\"\\r\\n\") {\n                    self.buf.len() - 2\n                } else {\n                    self.buf.len() - 1\n                };\n                let line = String::from_utf8_lossy(&self.buf[..line_end]).into_owned();\n                self.buf.clear();\n                return Ok(line);\n            }\n\n            // Partial line at EOF — wait for more data\n            tokio::time::sleep(POLL_INTERVAL).await;\n        }\n    }\n}\n\nimpl AsyncLineReader for FileReader {\n    async fn next(&mut self) -> Result<StreamEvent> {\n        if !self.initial_read_done {\n            match read_lines(&mut self.reader).await? {\n                ReadResult::Eof => {\n                    self.initial_read_done = true;\n                    // fall through to Started\n                }\n                ReadResult::Line(line) => return Ok(StreamEvent::Line(line)),\n                ReadResult::Batch(lines) => return Ok(StreamEvent::Lines(lines)),\n            }\n        }\n\n        if !self.has_emitted_start_event {\n            self.has_emitted_start_event = true;\n            return Ok(Started);\n        }\n\n        if self.terminate_after_first_read {\n            return Ok(Ended);\n        }\n\n        let line = self.next_line().await?;\n        Ok(StreamEvent::Line(line))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::io::reader::StreamEvent::*;\n    use std::fs::{File, OpenOptions};\n    use std::io::Write;\n    use tempfile::tempdir;\n    use tokio::time::{Duration, sleep, timeout};\n\n    #[tokio::test]\n    async fn test_read_exactly_n_lines() -> Result<()> {\n        let dir = tempdir().unwrap();\n        let file_path = dir.path().join(\"test.log\");\n\n        let mut file = File::create(&file_path).unwrap();\n        writeln!(file, \"line1\").unwrap();\n        writeln!(file, \"line2\").unwrap();\n        writeln!(file, \"line3\").unwrap();\n\n        let mut reader = FileReader::new(file_path, false).await?;\n\n        let event = reader.next().await?;\n        match event {\n            Lines(lines) => {\n                assert_eq!(lines.len(), 3);\n                assert_eq!(lines[0], \"line1\");\n                assert_eq!(lines[1], \"line2\");\n                assert_eq!(lines[2], \"line3\");\n            }\n            _ => panic!(\"Expected StreamEvent::Lines(...)\"),\n        }\n\n        let event = reader.next().await?;\n        match event {\n            Started => {}\n            _ => panic!(\"Expected StreamEvent::Started\"),\n        }\n\n        let result = timeout(Duration::from_millis(200), reader.next()).await;\n\n        assert!(\n            result.is_err(),\n            \"Entire file has been read, next() should not return anything: {:?}\",\n            result\n        );\n\n        Ok(())\n    }\n\n    #[tokio::test]\n    async fn test_terminate_after_first_read() -> Result<()> {\n        let test_result = timeout(Duration::from_millis(1000), async {\n            let dir = tempdir().unwrap();\n            let file_path = dir.path().join(\"test.log\");\n\n            let mut file = File::create(&file_path).unwrap();\n            writeln!(file, \"only_line\").unwrap();\n\n            let mut reader = FileReader::new(file_path, true).await?;\n\n            let first_event = reader.next().await?;\n            match first_event {\n                Line(line) => assert_eq!(line, \"only_line\"),\n                _ => panic!(\"Expected StreamEvent::Line(...)\"),\n            }\n\n            let second_event = reader.next().await?;\n            match second_event {\n                Started => {}\n                _ => panic!(\"Expected StreamEvent::Started\"),\n            }\n\n            let third_event = reader.next().await?;\n            match third_event {\n                Ended => {}\n                _ => panic!(\"Expected StreamEvent::Ended\"),\n            }\n\n            Ok(())\n        })\n        .await;\n\n        test_result.unwrap_or_else(|_| Err(anyhow::anyhow!(\"Test timed out!\")))\n    }\n\n    #[tokio::test]\n    async fn test_append_new_lines_after_initial_read() -> Result<()> {\n        let dir = tempdir()?;\n        let file_path = dir.path().join(\"test_append.log\");\n\n        let mut file = File::create(&file_path)?;\n        writeln!(file, \"initial1\")?;\n        writeln!(file, \"initial2\")?;\n\n        let mut reader = FileReader::new(file_path.as_path(), false).await?;\n        let event = reader.next().await?;\n        match event {\n            Lines(lines) => {\n                assert_eq!(lines.len(), 2);\n                assert_eq!(lines[0], \"initial1\");\n                assert_eq!(lines[1], \"initial2\");\n            }\n            _ => panic!(\"Expected StreamEvent::Lines(...)\"),\n        }\n\n        let event = reader.next().await?;\n        assert!(matches!(event, Started));\n\n        let mut file = OpenOptions::new().append(true).open(&file_path)?;\n        writeln!(file, \"appended1\")?;\n        writeln!(file, \"appended2\")?;\n\n        sleep(Duration::from_millis(200)).await;\n\n        let event = timeout(Duration::from_millis(1000), reader.next())\n            .await\n            .context(\"Timed out waiting for appended1\")?;\n        match event? {\n            Line(line) => assert_eq!(line, \"appended1\"),\n            _ => panic!(\"Expected StreamEvent::Line(...) with appended1\"),\n        }\n\n        let event = timeout(Duration::from_millis(1000), reader.next())\n            .await\n            .context(\"Timed out waiting for appended2\")?;\n        match event? {\n            Line(line) => assert_eq!(line, \"appended2\"),\n            _ => panic!(\"Expected StreamEvent::Line(...) with appended2\"),\n        }\n\n        Ok(())\n    }\n\n    #[tokio::test]\n    async fn test_empty_file() -> Result<()> {\n        let test_result = timeout(Duration::from_millis(1000), async {\n            let dir = tempdir().unwrap();\n            let file_path = dir.path().join(\"empty.log\");\n            File::create(&file_path).unwrap();\n\n            let mut reader = FileReader::new(file_path, true).await?;\n\n            let event = reader.next().await?;\n            assert!(matches!(event, Started));\n\n            let event = reader.next().await?;\n            assert!(matches!(event, Ended));\n\n            Ok(())\n        })\n        .await;\n\n        test_result.unwrap_or_else(|_| Err(anyhow::anyhow!(\"Test timed out!\")))\n    }\n\n    #[tokio::test]\n    async fn test_no_trailing_newline() -> Result<()> {\n        let test_result = timeout(Duration::from_millis(1000), async {\n            let dir = tempdir().unwrap();\n            let file_path = dir.path().join(\"no_trailing.log\");\n\n            let mut file = File::create(&file_path).unwrap();\n            write!(file, \"line1\\nline2\").unwrap();\n\n            let mut reader = FileReader::new(file_path, true).await?;\n\n            let mut all_lines = Vec::new();\n            loop {\n                let event = reader.next().await?;\n                match event {\n                    Line(line) => all_lines.push(line),\n                    Lines(lines) => all_lines.extend(lines),\n                    Started | Ended => break,\n                }\n            }\n            assert_eq!(all_lines, vec![\"line1\", \"line2\"]);\n\n            Ok(())\n        })\n        .await;\n\n        test_result.unwrap_or_else(|_| Err(anyhow::anyhow!(\"Test timed out!\")))\n    }\n\n    #[tokio::test]\n    async fn test_crlf_line_endings() -> Result<()> {\n        let dir = tempdir()?;\n        let file_path = dir.path().join(\"crlf.log\");\n\n        {\n            let mut file = File::create(&file_path)?;\n            file.write_all(b\"line1\\r\\nline2\\r\\n\")?;\n        }\n\n        let mut reader = FileReader::new(file_path.as_path(), false).await?;\n\n        let event = reader.next().await?;\n        match event {\n            Lines(lines) => {\n                assert_eq!(lines.len(), 2);\n                assert_eq!(lines[0], \"line1\");\n                assert_eq!(lines[1], \"line2\");\n            }\n            _ => panic!(\"Expected StreamEvent::Lines(...)\"),\n        }\n\n        let event = reader.next().await?;\n        assert!(matches!(event, Started));\n\n        // Append a CRLF line in follow mode\n        {\n            let mut file = OpenOptions::new().append(true).open(&file_path)?;\n            file.write_all(b\"appended\\r\\n\")?;\n        }\n\n        sleep(Duration::from_millis(200)).await;\n\n        let event = timeout(Duration::from_millis(1000), reader.next())\n            .await\n            .context(\"Timed out waiting for appended CRLF line\")?;\n        match event? {\n            Line(line) => assert_eq!(line, \"appended\"),\n            _ => panic!(\"Expected StreamEvent::Line(\\\"appended\\\")\"),\n        }\n\n        Ok(())\n    }\n\n    #[tokio::test]\n    async fn test_non_utf8_content() -> Result<()> {\n        let test_result = timeout(Duration::from_millis(1000), async {\n            let dir = tempdir().unwrap();\n            let file_path = dir.path().join(\"non_utf8.log\");\n\n            {\n                let mut file = File::create(&file_path).unwrap();\n                // Write invalid UTF-8: 0xFF 0xFE are not valid UTF-8 byte sequences\n                file.write_all(b\"hello \\xff\\xfe world\\n\").unwrap();\n            }\n\n            let mut reader = FileReader::new(file_path, true).await?;\n\n            let event = reader.next().await?;\n            match event {\n                Line(line) => {\n                    assert!(line.contains(\"hello\"));\n                    assert!(line.contains(\"world\"));\n                    assert!(line.contains('\\u{FFFD}'));\n                }\n                _ => panic!(\"Expected StreamEvent::Line(...)\"),\n            }\n\n            Ok(())\n        })\n        .await;\n\n        test_result.unwrap_or_else(|_| Err(anyhow::anyhow!(\"Test timed out!\")))\n    }\n\n    #[tokio::test]\n    async fn test_non_utf8_in_follow_mode() -> Result<()> {\n        let dir = tempdir()?;\n        let file_path = dir.path().join(\"non_utf8_follow.log\");\n\n        {\n            let mut file = File::create(&file_path)?;\n            writeln!(file, \"initial\")?;\n        }\n\n        let mut reader = FileReader::new(file_path.as_path(), false).await?;\n\n        let event = reader.next().await?;\n        match event {\n            Line(line) => assert_eq!(line, \"initial\"),\n            _ => panic!(\"Expected StreamEvent::Line(\\\"initial\\\")\"),\n        }\n\n        let event = reader.next().await?;\n        assert!(matches!(event, Started));\n\n        // Append non-UTF-8 in follow mode\n        {\n            let mut file = OpenOptions::new().append(true).open(&file_path)?;\n            file.write_all(b\"caf\\xe9\\n\")?;\n        }\n\n        sleep(Duration::from_millis(200)).await;\n\n        let event = timeout(Duration::from_millis(1000), reader.next())\n            .await\n            .context(\"Timed out waiting for non-UTF-8 line\")?;\n        match event? {\n            Line(line) => {\n                assert!(line.starts_with(\"caf\"));\n                assert!(line.contains('\\u{FFFD}'));\n            }\n            _ => panic!(\"Expected StreamEvent::Line(...)\"),\n        }\n\n        Ok(())\n    }\n\n    #[tokio::test]\n    async fn test_truncation_detection() -> Result<()> {\n        let dir = tempdir()?;\n        let file_path = dir.path().join(\"truncate.log\");\n\n        let mut file = File::create(&file_path)?;\n        writeln!(file, \"original1\")?;\n        writeln!(file, \"original2\")?;\n\n        let mut reader = FileReader::new(file_path.as_path(), false).await?;\n\n        let event = reader.next().await?;\n        match event {\n            Lines(lines) => {\n                assert_eq!(lines.len(), 2);\n                assert_eq!(lines[0], \"original1\");\n                assert_eq!(lines[1], \"original2\");\n            }\n            _ => panic!(\"Expected StreamEvent::Lines(...)\"),\n        }\n\n        let event = reader.next().await?;\n        assert!(matches!(event, Started));\n\n        // Truncate the file and write new, shorter content\n        let mut file = File::create(&file_path)?;\n        writeln!(file, \"new\")?;\n\n        sleep(Duration::from_millis(200)).await;\n\n        let event = timeout(Duration::from_millis(1000), reader.next())\n            .await\n            .context(\"Timed out waiting for line after truncation\")?;\n        match event? {\n            Line(line) => assert_eq!(line, \"new\"),\n            _ => panic!(\"Expected StreamEvent::Line(\\\"new\\\")\"),\n        }\n\n        Ok(())\n    }\n\n    #[tokio::test]\n    async fn test_large_file_streams_in_batches() -> Result<()> {\n        let test_result = timeout(Duration::from_millis(5000), async {\n            let dir = tempdir().unwrap();\n            let file_path = dir.path().join(\"large.log\");\n\n            {\n                let mut file = File::create(&file_path).unwrap();\n                for i in 0..2000 {\n                    writeln!(\n                        file,\n                        \"line {:05} - padding to make this line reasonably long for testing\",\n                        i\n                    )\n                    .unwrap();\n                }\n            }\n\n            let mut reader = FileReader::new(file_path, true).await?;\n\n            let mut event_count = 0;\n            let mut total_lines = 0;\n\n            loop {\n                let event = reader.next().await?;\n                match event {\n                    Line(_) => {\n                        event_count += 1;\n                        total_lines += 1;\n                    }\n                    Lines(lines) => {\n                        event_count += 1;\n                        total_lines += lines.len();\n                    }\n                    Started => break,\n                    Ended => panic!(\"Unexpected Ended before Started\"),\n                }\n            }\n\n            assert_eq!(total_lines, 2000);\n            assert!(\n                event_count > 1,\n                \"Large file should produce multiple events, got {}\",\n                event_count\n            );\n\n            Ok(())\n        })\n        .await;\n\n        test_result.unwrap_or_else(|_| Err(anyhow::anyhow!(\"Test timed out!\")))\n    }\n}\n"
  },
  {
    "path": "src/io/reader/mod.rs",
    "content": "mod buffer_line_counter;\npub mod command;\npub mod file_reader;\npub mod stdin;\n\nuse crate::io::controller::Reader;\nuse anyhow::Result;\n\n#[derive(Debug)]\npub enum StreamEvent {\n    Started,\n    Ended,\n    Line(String),\n    Lines(Vec<String>),\n}\n\npub trait AsyncLineReader {\n    async fn next(&mut self) -> Result<StreamEvent>;\n}\n\nimpl AsyncLineReader for Reader {\n    async fn next(&mut self) -> Result<StreamEvent> {\n        match self {\n            Reader::File(r) => r.next().await,\n            Reader::Stdin(r) => r.next().await,\n            Reader::Command(r) => r.next().await,\n        }\n    }\n}\n"
  },
  {
    "path": "src/io/reader/stdin.rs",
    "content": "use crate::io::reader::buffer_line_counter::{BUFF_READER_CAPACITY, ReadResult, read_lines};\nuse crate::io::reader::{AsyncLineReader, StreamEvent};\nuse anyhow::Result;\nuse tokio::io::{BufReader, Stdin, stdin};\n\npub struct StdinReader {\n    reader: BufReader<Stdin>,\n    stream_started: bool,\n}\n\nimpl StdinReader {\n    pub fn new() -> StdinReader {\n        let reader = BufReader::with_capacity(BUFF_READER_CAPACITY, stdin());\n        let stream_started = false;\n\n        StdinReader { reader, stream_started }\n    }\n}\n\nimpl AsyncLineReader for StdinReader {\n    async fn next(&mut self) -> Result<StreamEvent> {\n        if !self.stream_started {\n            self.stream_started = true;\n\n            return Ok(StreamEvent::Started);\n        }\n\n        match read_lines(&mut self.reader).await? {\n            ReadResult::Eof => Ok(StreamEvent::Ended),\n            ReadResult::Line(line) => Ok(StreamEvent::Line(line)),\n            ReadResult::Batch(lines) => Ok(StreamEvent::Lines(lines)),\n        }\n    }\n}\n"
  },
  {
    "path": "src/io/writer/mod.rs",
    "content": "pub mod stdout;\npub mod temp_file;\n\nuse crate::io::controller::Writer;\nuse anyhow::Result;\n\npub trait AsyncLineWriter {\n    async fn write(&mut self, line: &str) -> Result<()>;\n}\n\nimpl AsyncLineWriter for Writer {\n    async fn write(&mut self, line: &str) -> Result<()> {\n        match self {\n            Writer::TempFile(w) => w.write(line).await,\n            Writer::Stdout(w) => w.write(line).await,\n        }\n    }\n}\n"
  },
  {
    "path": "src/io/writer/stdout.rs",
    "content": "use crate::io::writer::AsyncLineWriter;\nuse anyhow::Result;\nuse std::io::{self, Write as _};\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\n#[error(\"broken pipe\")]\npub struct BrokenPipe;\n\nimpl BrokenPipe {\n    pub fn suppress(result: Result<()>) -> Result<()> {\n        match result {\n            Err(report) if report.downcast_ref::<Self>().is_some() => Ok(()),\n            other => other,\n        }\n    }\n}\n\npub struct StdoutWriter {\n    _private: (),\n}\n\nimpl StdoutWriter {\n    pub const fn new() -> StdoutWriter {\n        StdoutWriter { _private: () }\n    }\n}\n\nimpl AsyncLineWriter for StdoutWriter {\n    async fn write(&mut self, line: &str) -> Result<()> {\n        match writeln!(io::stdout(), \"{}\", line) {\n            Err(e) if e.kind() == io::ErrorKind::BrokenPipe => Err(BrokenPipe)?,\n            result => Ok(result?),\n        }\n    }\n}\n"
  },
  {
    "path": "src/io/writer/temp_file.rs",
    "content": "use crate::io::writer::AsyncLineWriter;\nuse anyhow::{Context, Result};\nuse tokio::fs::File;\nuse tokio::io::{AsyncWriteExt, BufWriter};\n\npub struct TempFile {\n    writer: BufWriter<File>,\n}\n\nimpl TempFile {\n    pub async fn new(writer: BufWriter<File>) -> Self {\n        TempFile { writer }\n    }\n}\n\nimpl AsyncLineWriter for TempFile {\n    async fn write(&mut self, line: &str) -> Result<()> {\n        self.writer\n            .write_all(line.as_bytes())\n            .await\n            .context(\"Failed to write line to file\")?;\n\n        self.writer\n            .write_all(b\"\\n\")\n            .await\n            .context(\"Failed to write line to file\")?;\n\n        // Flush after each write so the pager (e.g. less +F) sees lines immediately\n        self.writer.flush().await.context(\"Error flushing temp file\")?;\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "src/lib.rs",
    "content": "//! <p align=\"center\">\n//!   <a href=\"https://github.com/bensadeh/tailspin\">\n//!     <img src=\"https://raw.githubusercontent.com/bensadeh/tailspin/main/assets/tailspin.png\" alt=\"tailspin logo\" width=\"250\" />\n//!   </a>\n//! </p>\n//!\n//! #\n//!\n//! `tailspin` is a log file highlighter. This crate exposes the [`Highlighter`] type,\n//! allowing you to programmatically apply the same pattern-driven highlighting used by the CLI.\n//!\n//! In order to configure the highlighter, use the [`HighlighterBuilder`]. Otherwise, use\n//! [`Highlighter::default()`](crate::Highlighter::default) for reasonable defaults.\n//!\n//! ## Dependency usage\n//!\n//! When using `tailspin` as a library, disable default features to avoid pulling in\n//! CLI-specific dependencies like `tokio`, `clap`, and `rayon`:\n//!\n//! ```toml\n//! [dependencies]\n//! tailspin = { version = \"6.0\", default-features = false }\n//! ```\n//!\n//!\n//! ## Example\n//!\n//! ```rust\n//! use tailspin::config::*;\n//! use tailspin::Highlighter;\n//! use tailspin::style::{Color, Style};\n//!\n//! let mut builder = Highlighter::builder();\n//!\n//! builder\n//!     .with_number_highlighter(NumberConfig {\n//!         style: Style {\n//!             fg: Some(Color::Cyan),\n//!             ..Style::default()\n//!         },\n//!     })\n//!     .with_quote_highlighter(QuotesConfig {\n//!         quotes_token: b'\"',\n//!         style: Style {\n//!             fg: Some(Color::Yellow),\n//!             ..Style::default()\n//!         },\n//!     })\n//!     .with_uuid_highlighter(UuidConfig::default());\n//!    \n//! // Using the highlight builder can fail if the regexes inside don't compile\n//! let highlighter = match builder.build() {\n//!     Ok(h) => h,\n//!     Err(_) => panic!(\"Failed to build highlighter\"),\n//! };\n//!\n//! let input = \"Hello 42 world\";\n//! let output = highlighter.apply(input);\n//!\n//! // \"\\x1b[36m\" = ANSI cyan start, \"\\x1b[0m\" = reset\n//! assert_eq!(output, \"Hello \\x1b[36m42\\x1b[0m world\");\n//! ```\n\nmod core;\n\npub use core::highlighter::{Error, Highlighter, HighlighterBuilder};\n\n/// Configuration support for custom highlighting themes and regex rules.\npub mod config {\n    pub use super::core::config::*;\n}\n\n/// ANSI style and color definitions for highlighted output.\npub mod style {\n    pub use super::core::style::{Color, Style};\n}\n"
  },
  {
    "path": "src/main.rs",
    "content": "#![forbid(unsafe_code)]\n\nuse io::controller::{Reader, Writer, initialize_io};\nuse io::initial_read::InitialReadCompleteSender;\nuse io::presenter::Present;\nuse io::reader::{AsyncLineReader, StreamEvent};\nuse io::writer::AsyncLineWriter;\nuse io::writer::stdout::BrokenPipe;\nuse rayon::iter::ParallelIterator;\nuse rayon::prelude::IntoParallelRefIterator;\nuse tailspin::Highlighter;\nuse tokio::task::JoinHandle;\n\nmod cli;\nmod config;\nmod highlighter_builder;\nmod io;\nmod theme;\n\n#[tokio::main(flavor = \"current_thread\")]\nasync fn main() {\n    if let Err(err) = run().await {\n        eprintln!(\"{} {err}\", nu_ansi_term::Color::Red.paint(\"Error:\"));\n        std::process::exit(1);\n    }\n}\n\nasync fn run() -> anyhow::Result<()> {\n    let (reader, writer, presenter, highlighter, initial_read_complete_tx, initial_read_complete_rx, _temp_dir) =\n        initialize_io().await?;\n\n    let mut process_stream_task = tokio::spawn(process_stream(reader, writer, highlighter, initial_read_complete_tx));\n\n    if initial_read_complete_rx.receive().await.is_err() {\n        // The sender was dropped, meaning process_stream failed before signaling.\n        // Surface the actual error instead of a generic \"failed to receive signal\" message.\n        return process_stream_task.await?;\n    }\n\n    let mut presenter_task = tokio::spawn(async move { presenter.present().await });\n\n    tokio::select! {\n        presenter_result = &mut presenter_task => {\n            abort_and_drain(&mut process_stream_task).await;\n            presenter_result??;\n        },\n        process_stream_result = &mut process_stream_task => {\n            abort_and_drain(&mut presenter_task).await;\n            BrokenPipe::suppress(process_stream_result?)?;\n        },\n    }\n\n    Ok(())\n}\n\nasync fn abort_and_drain<T>(handle: &mut JoinHandle<T>) {\n    handle.abort();\n    let _drain = handle.await;\n}\n\nasync fn process_stream(\n    mut reader: Reader,\n    mut writer: Writer,\n    highlighter: Highlighter,\n    mut initial_read_complete: InitialReadCompleteSender,\n) -> anyhow::Result<()> {\n    loop {\n        match reader.next().await? {\n            StreamEvent::Started => initial_read_complete.send()?,\n            StreamEvent::Ended => return Ok(()),\n            StreamEvent::Line(line) => write_line(&mut writer, &highlighter, line.as_str()).await?,\n            StreamEvent::Lines(lines) => write_lines(&mut writer, &highlighter, lines).await?,\n        }\n    }\n}\n\nasync fn write_line(writer: &mut Writer, highlighter: &Highlighter, line: &str) -> anyhow::Result<()> {\n    let highlighted = highlighter.apply(line);\n\n    writer.write(&highlighted).await?;\n\n    Ok(())\n}\n\nasync fn write_lines(writer: &mut Writer, highlighter: &Highlighter, lines: Vec<String>) -> anyhow::Result<()> {\n    let highlighted = lines\n        .par_iter()\n        .map(|line| highlighter.apply(line.as_str()))\n        .collect::<Vec<_>>()\n        .join(\"\\n\");\n\n    writer.write(&highlighted).await?;\n\n    Ok(())\n}\n"
  },
  {
    "path": "src/theme/mappers.rs",
    "content": "use crate::theme::*;\n\nimpl From<TomlTheme> for Theme {\n    fn from(toml: TomlTheme) -> Self {\n        Theme {\n            keywords: toml.keywords.map_or_else(Vec::new, |keywords| {\n                keywords.into_iter().map(KeywordConfig::from).collect()\n            }),\n            regexes: toml\n                .regexes\n                .map_or_else(Vec::new, |regexes| regexes.into_iter().map(RegexConfig::from).collect()),\n            numbers: toml.numbers.map_or_else(NumberConfig::default, NumberConfig::from),\n            uuids: toml.uuids.map_or_else(UuidConfig::default, UuidConfig::from),\n            quotes: toml.quotes.map_or_else(QuotesConfig::default, QuotesConfig::from),\n            ip_v4_addresses: toml.ip_addresses.map_or_else(IpV4Config::default, IpV4Config::from),\n            ip_v6_addresses: toml.ip_addresses.map_or_else(IpV6Config::default, IpV6Config::from),\n            dates: toml.dates.map_or_else(DateTimeConfig::default, DateTimeConfig::from),\n            paths: toml.paths.map_or_else(UnixPathConfig::default, UnixPathConfig::from),\n            urls: toml.urls.map_or_else(UrlConfig::default, UrlConfig::from),\n            pointers: toml.pointers.map_or_else(PointerConfig::default, PointerConfig::from),\n            json: toml.json.map_or_else(JsonConfig::default, JsonConfig::from),\n            processes: toml\n                .processes\n                .map_or_else(UnixProcessConfig::default, UnixProcessConfig::from),\n            key_value_pairs: toml\n                .key_value_pairs\n                .map_or_else(KeyValueConfig::default, KeyValueConfig::from),\n        }\n    }\n}\n\nimpl From<KeywordToml> for KeywordConfig {\n    fn from(keyword_toml: KeywordToml) -> Self {\n        KeywordConfig {\n            words: keyword_toml.words,\n            style: keyword_toml.style,\n        }\n    }\n}\n\nimpl From<RegexToml> for RegexConfig {\n    fn from(regex_toml: RegexToml) -> Self {\n        RegexConfig {\n            regex: regex_toml.regex,\n            style: regex_toml.style,\n        }\n    }\n}\n\nimpl From<NumberToml> for NumberConfig {\n    fn from(number_toml: NumberToml) -> Self {\n        let default_config = NumberConfig::default();\n\n        NumberConfig {\n            style: number_toml.number.unwrap_or(default_config.style),\n        }\n    }\n}\n\nimpl From<UuidToml> for UuidConfig {\n    fn from(uuid_toml: UuidToml) -> Self {\n        let default_config = UuidConfig::default();\n\n        UuidConfig {\n            number: uuid_toml.number.unwrap_or(default_config.number),\n            letter: uuid_toml.letter.unwrap_or(default_config.letter),\n            dash: uuid_toml.dash.unwrap_or(default_config.dash),\n        }\n    }\n}\n\nimpl From<QuotesToml> for QuotesConfig {\n    fn from(quotes_toml: QuotesToml) -> Self {\n        let default_config = QuotesConfig::default();\n\n        QuotesConfig {\n            quotes_token: quotes_toml\n                .quotes_token\n                .filter(|ch| ch.is_ascii())\n                .map_or(default_config.quotes_token, |ch| ch as u8),\n            style: quotes_toml.style.unwrap_or(default_config.style),\n        }\n    }\n}\n\nimpl From<IpToml> for IpV4Config {\n    fn from(ip_toml: IpToml) -> Self {\n        let default_config = IpV4Config::default();\n\n        IpV4Config {\n            number: ip_toml.number.unwrap_or(default_config.number),\n            separator: ip_toml.separator.unwrap_or(default_config.separator),\n        }\n    }\n}\n\nimpl From<IpToml> for IpV6Config {\n    fn from(ip_toml: IpToml) -> Self {\n        let default_config = IpV6Config::default();\n\n        IpV6Config {\n            number: ip_toml.number.unwrap_or(default_config.number),\n            letter: ip_toml.letter.unwrap_or(default_config.letter),\n            separator: ip_toml.separator.unwrap_or(default_config.separator),\n        }\n    }\n}\n\nimpl From<DateToml> for DateTimeConfig {\n    fn from(date_toml: DateToml) -> Self {\n        let default_config = DateTimeConfig::default();\n\n        DateTimeConfig {\n            date: date_toml.date.unwrap_or(default_config.date),\n            time: date_toml.time.unwrap_or(default_config.time),\n            zone: date_toml.zone.unwrap_or(default_config.zone),\n            separator: date_toml.separator.unwrap_or(default_config.separator),\n        }\n    }\n}\n\nimpl From<PathToml> for UnixPathConfig {\n    fn from(path_toml: PathToml) -> Self {\n        let default_config = UnixPathConfig::default();\n\n        UnixPathConfig {\n            segment: path_toml.segment.unwrap_or(default_config.segment),\n            separator: path_toml.separator.unwrap_or(default_config.separator),\n        }\n    }\n}\n\nimpl From<UrlToml> for UrlConfig {\n    fn from(url_toml: UrlToml) -> Self {\n        let default_config = UrlConfig::default();\n\n        UrlConfig {\n            http: url_toml.http.unwrap_or(default_config.http),\n            https: url_toml.https.unwrap_or(default_config.https),\n            host: url_toml.host.unwrap_or(default_config.host),\n            path: url_toml.path.unwrap_or(default_config.path),\n            query_params_key: url_toml.query_params_key.unwrap_or(default_config.query_params_key),\n            query_params_value: url_toml.query_params_value.unwrap_or(default_config.query_params_value),\n            symbols: url_toml.symbols.unwrap_or(default_config.symbols),\n        }\n    }\n}\n\nimpl From<PointerToml> for PointerConfig {\n    fn from(pointer_toml: PointerToml) -> Self {\n        let default_config = PointerConfig::default();\n\n        PointerConfig {\n            number: pointer_toml.number.unwrap_or(default_config.number),\n            letter: pointer_toml.letter.unwrap_or(default_config.letter),\n            separator: pointer_toml.separator.unwrap_or(default_config.separator),\n            separator_token: pointer_toml.separator_token.unwrap_or(default_config.separator_token),\n            x: pointer_toml.x.unwrap_or(default_config.x),\n        }\n    }\n}\n\nimpl From<KeyValueToml> for KeyValueConfig {\n    fn from(key_value_toml: KeyValueToml) -> Self {\n        let default_config = KeyValueConfig::default();\n\n        KeyValueConfig {\n            key: key_value_toml.key.unwrap_or(default_config.key),\n            separator: key_value_toml.separator.unwrap_or(default_config.separator),\n        }\n    }\n}\n\nimpl From<UnixProcessToml> for UnixProcessConfig {\n    fn from(process_toml: UnixProcessToml) -> Self {\n        let default_config = UnixProcessConfig::default();\n\n        UnixProcessConfig {\n            name: process_toml.name.unwrap_or(default_config.name),\n            id: process_toml.id.unwrap_or(default_config.id),\n            bracket: process_toml.bracket.unwrap_or(default_config.bracket),\n        }\n    }\n}\n\nimpl From<JsonToml> for JsonConfig {\n    fn from(json_toml: JsonToml) -> Self {\n        let default_config = JsonConfig::default();\n\n        JsonConfig {\n            key: json_toml.key.unwrap_or(default_config.key),\n            quote_token: json_toml.quote_token.unwrap_or(default_config.quote_token),\n            curly_bracket: json_toml.curly_bracket.unwrap_or(default_config.curly_bracket),\n            square_bracket: json_toml.square_bracket.unwrap_or(default_config.square_bracket),\n            comma: json_toml.comma.unwrap_or(default_config.comma),\n            colon: json_toml.colon.unwrap_or(default_config.colon),\n        }\n    }\n}\n"
  },
  {
    "path": "src/theme/mod.rs",
    "content": "use serde::Deserialize;\nuse tailspin::config::*;\nuse tailspin::style::Style;\n\nmod mappers;\npub mod reader;\n\npub struct Theme {\n    pub keywords: Vec<KeywordConfig>,\n    pub regexes: Vec<RegexConfig>,\n    pub numbers: NumberConfig,\n    pub uuids: UuidConfig,\n    pub quotes: QuotesConfig,\n    pub ip_v4_addresses: IpV4Config,\n    pub ip_v6_addresses: IpV6Config,\n    pub dates: DateTimeConfig,\n    pub paths: UnixPathConfig,\n    pub urls: UrlConfig,\n    pub pointers: PointerConfig,\n    pub processes: UnixProcessConfig,\n    pub key_value_pairs: KeyValueConfig,\n    pub json: JsonConfig,\n}\n\n#[derive(Deserialize, Debug, Default)]\npub struct TomlTheme {\n    pub keywords: Option<Vec<KeywordToml>>,\n    pub regexes: Option<Vec<RegexToml>>,\n    pub numbers: Option<NumberToml>,\n    pub uuids: Option<UuidToml>,\n    pub quotes: Option<QuotesToml>,\n    pub ip_addresses: Option<IpToml>,\n    pub dates: Option<DateToml>,\n    pub paths: Option<PathToml>,\n    pub urls: Option<UrlToml>,\n    pub pointers: Option<PointerToml>,\n    pub processes: Option<UnixProcessToml>,\n    pub key_value_pairs: Option<KeyValueToml>,\n    pub json: Option<JsonToml>,\n}\n\n#[derive(Deserialize, Debug)]\npub struct KeywordToml {\n    pub words: Vec<String>,\n    pub style: Style,\n}\n\n#[derive(Deserialize, Debug)]\npub struct RegexToml {\n    pub regex: String,\n    pub style: Style,\n}\n\n#[derive(Deserialize, Debug)]\npub struct NumberToml {\n    pub number: Option<Style>,\n}\n\n#[derive(Deserialize, Debug)]\npub struct UuidToml {\n    pub number: Option<Style>,\n    pub letter: Option<Style>,\n    pub dash: Option<Style>,\n}\n\n#[derive(Deserialize, Debug)]\npub struct QuotesToml {\n    pub quotes_token: Option<char>,\n    pub style: Option<Style>,\n}\n\n#[derive(Deserialize, Debug, Copy, Clone)]\npub struct IpToml {\n    pub number: Option<Style>,\n    pub letter: Option<Style>,\n    pub separator: Option<Style>,\n}\n\n#[derive(Deserialize, Debug)]\npub struct DateToml {\n    pub date: Option<Style>,\n    pub time: Option<Style>,\n    pub zone: Option<Style>,\n    pub separator: Option<Style>,\n}\n\n#[derive(Deserialize, Debug)]\npub struct PathToml {\n    pub segment: Option<Style>,\n    pub separator: Option<Style>,\n}\n\n#[derive(Deserialize, Debug)]\npub struct UrlToml {\n    pub http: Option<Style>,\n    pub https: Option<Style>,\n    pub host: Option<Style>,\n    pub path: Option<Style>,\n    pub query_params_key: Option<Style>,\n    pub query_params_value: Option<Style>,\n    pub symbols: Option<Style>,\n}\n\n#[derive(Deserialize, Debug)]\npub struct PointerToml {\n    pub number: Option<Style>,\n    pub letter: Option<Style>,\n    pub separator: Option<Style>,\n    pub separator_token: Option<char>,\n    pub x: Option<Style>,\n}\n\n#[derive(Deserialize, Debug)]\npub struct UnixProcessToml {\n    pub name: Option<Style>,\n    pub id: Option<Style>,\n    pub bracket: Option<Style>,\n}\n\n#[derive(Deserialize, Debug)]\npub struct KeyValueToml {\n    pub key: Option<Style>,\n    pub separator: Option<Style>,\n}\n\n#[derive(Deserialize, Debug)]\npub struct JsonToml {\n    pub key: Option<Style>,\n    pub quote_token: Option<Style>,\n    pub curly_bracket: Option<Style>,\n    pub square_bracket: Option<Style>,\n    pub comma: Option<Style>,\n    pub colon: Option<Style>,\n}\n"
  },
  {
    "path": "src/theme/reader.rs",
    "content": "use crate::theme::{Theme, TomlTheme};\nuse std::env;\nuse std::env::VarError;\nuse std::fs;\nuse std::io;\nuse std::path::{Path, PathBuf};\nuse thiserror::Error;\n\npub fn parse_theme(custom_config_path: &Option<PathBuf>) -> Result<Theme, ThemeError> {\n    if let Some(path) = custom_config_path {\n        let toml_theme = read_and_parse_toml(path)?;\n        return Ok(Theme::from(toml_theme));\n    }\n\n    let default_path = get_config_dir()?.join(\"tailspin\").join(\"theme.toml\");\n\n    let toml_theme = match read_and_parse_toml(&default_path) {\n        Ok(theme) => theme,\n        Err(ThemeError::FileNotFound) => TomlTheme::default(),\n        Err(e) => return Err(e),\n    };\n\n    Ok(Theme::from(toml_theme))\n}\n\nfn get_config_dir() -> Result<PathBuf, ThemeError> {\n    expand_var_os(\"XDG_CONFIG_HOME\")\n        .or_else(|| expand_var_os(\"HOME\").map(|home| home.join(\".config\")))\n        .or_else(|| expand_var_os(\"USERPROFILE\"))\n        .ok_or(ThemeError::HomeEnvironment(VarError::NotPresent))\n}\n\nfn expand_var_os(key: &str) -> Option<PathBuf> {\n    env::var_os(key)\n        .and_then(|os_str| os_str.into_string().ok())\n        .map(|s| shellexpand::tilde(&s).into_owned().into())\n}\nfn read_and_parse_toml(path: &Path) -> Result<TomlTheme, ThemeError> {\n    let content = fs::read_to_string(path).map_err(|err| match err.kind() {\n        io::ErrorKind::NotFound => ThemeError::FileNotFound,\n        _ => ThemeError::Read(err),\n    })?;\n\n    toml::from_str::<TomlTheme>(&content).map_err(ThemeError::Parsing)\n}\n\n#[derive(Debug, Error)]\npub enum ThemeError {\n    #[error(\"could not read the TOML file: {0}\")]\n    Read(#[source] io::Error),\n\n    #[error(transparent)]\n    Parsing(#[from] toml::de::Error),\n\n    #[error(\"could not find the TOML file\")]\n    FileNotFound,\n\n    #[error(\"could not determine the home environment: {0}\")]\n    HomeEnvironment(#[source] VarError),\n}\n"
  },
  {
    "path": "tests/files/empty.log",
    "content": ""
  },
  {
    "path": "tests/integration_tests.rs",
    "content": "use std::borrow::Cow;\nuse tailspin::config::*;\nuse tailspin::style::{Color, Style};\nuse tailspin::*;\n\nmod utils;\n\n#[test]\nfn test_binary_with_various_inputs() {\n    let binary_path = utils::build_binary();\n\n    let test_cases = [\n        (\"Hello null\", \"Hello \\u{1b}[3;31mnull\\u{1b}[0m\"),\n        (\"Hello world\", \"Hello world\"),\n        (\"\", \"\"),\n    ];\n\n    for (input, expected_output) in test_cases {\n        let output = utils::run_binary_with_input(binary_path.clone(), input);\n        assert_eq!(output.trim(), expected_output, \"Failed on input: {}\", input);\n    }\n}\n\n#[test]\nfn default_constructor_should_not_panic() {\n    let result = std::panic::catch_unwind(Highlighter::default);\n\n    assert!(result.is_ok(), \"Default constructor should never fail\");\n}\n\n#[test]\nfn no_highlights_should_return_borrowed() {\n    let highlighter = Highlighter::default();\n\n    // Each input bypasses progressively more fast-path checks (byte-level early\n    // returns) while still not matching any highlighter regex, so the pipeline\n    // must return Cow::Borrowed for every one of them.\n    let inputs: &[&str] = &[\n        // No trigger characters — every fast-path returns early.\n        \"Nothing will be highlighted in this string\",\n        // Colon present → DateTime and IpV6 run their regex.\n        \"status: pending\",\n        // Dot present → IpV4 runs its regex.\n        \"hello.world\",\n        // Dash and slash → DateDash and UnixPath run their regex.\n        \"left-right mid/end\",\n        // Bracket present → UnixProcess runs its regex.\n        \"see [note] here\",\n        // Equals present → KeyValue runs its regex.\n        \"not ==> equal\",\n        // Contains 'x' → Pointer runs its regex.\n        \"extra context\",\n        // All trigger characters present — every highlighter reaches its regex.\n        //   :  → DateTime, IpV6         .  → IpV4\n        //   -  → DateDash (×4 for UUID) /  → UnixPath\n        //   [  → UnixProcess            =  → KeyValue\n        //   x  → Pointer\n        \"mix: [note] x.y a-b-c-d-e ==> w/q\",\n    ];\n\n    for input in inputs {\n        let output = highlighter.apply(input);\n        assert!(\n            matches!(output, Cow::Borrowed(s) if std::ptr::eq(s, *input)),\n            \"Expected Cow::Borrowed for input: {input:?}, got Cow::Owned\",\n        );\n    }\n}\n\n#[test]\nfn it_works() {\n    let mut builder = Highlighter::builder();\n\n    builder\n        .with_number_highlighter(NumberConfig {\n            style: Style {\n                fg: Some(Color::Cyan),\n                ..Style::default()\n            },\n        })\n        .with_quote_highlighter(QuotesConfig {\n            quotes_token: b'\"',\n            style: Style {\n                fg: Some(Color::Yellow),\n                ..Style::default()\n            },\n        })\n        .with_uuid_highlighter(UuidConfig::default());\n\n    let highlighter = match builder.build() {\n        Ok(h) => h,\n        Err(_) => panic!(\"Failed to build highlighter\"),\n    };\n\n    let actual = highlighter.apply(\"Hello 123 world! \");\n    let expected = \"Hello \\u{1b}[36m123\\u{1b}[0m world! \".to_string();\n\n    assert_eq!(actual, expected);\n}\n"
  },
  {
    "path": "tests/utils.rs",
    "content": "use std::io::Write;\nuse std::path::PathBuf;\nuse std::process::{Command, Stdio};\n\npub fn build_binary() -> PathBuf {\n    Command::new(\"cargo\")\n        .arg(\"build\")\n        .status()\n        .expect(\"Failed to execute cargo build\");\n\n    PathBuf::from(\"./target/debug/tspin\")\n}\n\npub fn run_binary_with_input(binary_path: PathBuf, input: &str) -> String {\n    let mut child = Command::new(binary_path)\n        .stdin(Stdio::piped())\n        .stdout(Stdio::piped())\n        .spawn()\n        .expect(\"Failed to spawn child process\");\n\n    if let Some(stdin) = child.stdin.as_mut() {\n        stdin.write_all(input.as_bytes()).expect(\"Failed to write to stdin\");\n    }\n\n    let output = child.wait_with_output().expect(\"Failed to read output\");\n\n    String::from_utf8_lossy(&output.stdout).into_owned()\n}\n"
  },
  {
    "path": "util/generate_all.sh",
    "content": "#!/bin/bash\n\nset -e\n\n./generate_man_pages.sh\n./generate_shell_completions.sh\n"
  },
  {
    "path": "util/generate_man_pages.sh",
    "content": "#!/bin/bash\n\nset -e  # If any command fails, stop the script immediately\n\nfull_version=$(cargo run -- -V)\nversion_number=$(echo \"$full_version\" | awk '{print $2}')\n\ntouch tspin.adoc\n\nasciidoctor -b manpage tspin.adoc \\\n  --destination=../man/ \\\n  --attribute release-version=\"$version_number\""
  },
  {
    "path": "util/generate_shell_completions.sh",
    "content": "#!/bin/bash\n\nset -e  # If any command fails, stop the script immediately\n\n# Go to the project directory\ncd ..\n\n# Build your Rust program\ncargo build\n\n# Path to the built binary\nspin_path=./target/debug/tspin\n\n# Generate shell completions\n$spin_path --generate-zsh-completions > completions/tspin.zsh\n$spin_path --generate-bash-completions > completions/tspin.bash\n$spin_path --generate-fish-completions > completions/tspin.fish\n"
  },
  {
    "path": "util/tspin.adoc",
    "content": "= tspin(1)\n:doctype: manpage\n:manmanual: tailspin\n:man source: tailspin {release-version}\n:revdate: {docdate}\n\nifdef::env-github[]\n:toc:\n:toc-title:\n:toc-placement!:\n:numbered:\nendif::[]\n\n== NAME\n\ntspin - A log file highlighter\n\n== SYNOPSIS\n\n*tspin* [_OPTION_]... [_FILE_]...\n\n== DESCRIPTION\n\ntailspin is a command line tool that highlights log files.\n\n== OPTIONS\n\n_-f, --follow_::\nFollow (tail) the contents of the file.\nAlways true when using the _--exec_ flag.\n\n_-p, --print_::\nPrint the output to stdout instead of viewing the contents in the pager _less_.\nAlways true if using stdin.\n\n_--config-path_ *CONFIG_PATH*::\nSpecify the path to a custom configuration file.\nDefaults to *XDG_CONFIG_HOME/tailspin/theme.toml* or *~/.config/tailspin/theme.toml* if not set.\n\n_-e, --exec_ *COMMAND*::\nRun command and view the output in a pager.\nThe command traps the interrupt signal to allow for cancelling and resuming follow mode while inside _less_.\n\n+\n.Example:\n----\ntspin --listen-command 'kubectl logs -f pod_name'\n----\n\n_--highlight_ *COLOR1*:__word1,word2,...__ *COLOR2*:__word3,word4,...__::\nHighlight the provided comma-separated words in the specified color.\nPossible colors are red, green, yellow, blue, magenta, and cyan.\n\n+\n.Example:\n----\ntspin logfile.txt --highlight red:error,fail --highlight green:success,ok\n----\n\n_--enable=[HIGHLIGHT_GROUP]_::\nDisable all highlighting groups except the ones specified.\nComma separated list of groups.\nCannot be used with *--disable=[HIGHLIGHT_GROUP]*.\n\n_--disable=[HIGHLIGHT_GROUP]_::\nDisable the specified highlighting groups.\nComma separated list of groups.\nCannot be used with *--enable=[HIGHLIGHT_GROUP]*.\n\n_--disable-builtin-keywords_::\nDisables the highlighting of all builtin keyword groups (booleans, severity and REST).\n\n== ENVIRONMENT VARIABLES\n\n*TAILSPIN_PAGER*::\nSet the _TAILSPIN_PAGER_ environment variable to override the default pager.\nThe command must include the string _[FILE]_ which will be replaced with the file path internally.\nFor example, _\"ov -f [FILE]\"_.\n\n== SEE ALSO\n\n*less*(1), *tail*(1)\n\n== About\n\nBen Sadeh (github.com/bensadeh/tailspin)\n\nReleased under the MIT License\n"
  }
]