[
  {
    "path": ".gitattributes",
    "content": "* text=auto\n\n*.ps1 text eol=crlf\n*.json text eol=crlf\n*.cfg text eol=crlf\n\n*.png binary\n*.jpg binary\n\nconfig/* diff\nconfig/applications.json diff\n*.json diff\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# Chris rules EVERYTHING (including paths listed below)\n*          @ChrisTitusTech"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\ncontact@christitus.com.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# How to Contribute?\n\n## Testing\n\n* Test the latest changes to WinUtil by running the pre-release and reporting issues you are encountering to help us continually improve WinUtil!\n\n#### **Run the latest pre-release**\n   ```ps1\n   irm https://christitus.com/windev | iex\n   ```\n\n!!! bug \"Keep in mind\"\n\n     This is a pre-release and should be treated as such. It exists for developers to test the utility and report or fix bugs before they get added to the stable release. Don't use it in production!\n\n## Issues\n\n* If you encounter any challenges or problems with the script, I kindly request that you submit them via the \"Issues\" tab on the GitHub repository. By filling out the provided template, you can provide specific details about the issue, allowing me (and others in the community) to promptly address any bugs or consider feature requests.\n\n## Contribute Code\n\n* Pull requests are now handled directly on the **MAIN branch**. This was done since we can now select specific releases to launch via releases in GitHub.\n\n* If you're doing code changes, then you can submit a PR to `main` branch, but I am very selective about these.\n\n!!! warning \"Important\"\n\n     Do not use a code formatter, make massive amounts of line changes, or make multiple feature changes. EACH FEATURE CHANGE SHOULD BE IT'S OWN PULL REQUEST!\n\n* When creating pull requests, it is essential to thoroughly document all changes made. This includes, but is not limited to, documenting any additions made to the `tweaks` section and corresponding `undo tweak`, so users are able to remove the newly added tweaks if necessary, and comprehensive documentation is required for all code changes. Document your changes and briefly explain why you made your changes in your Pull Request Description. Failure to adhere to this format may result in the denial of the pull request. Additionally, any code lacking sufficient documentation may also be denied.\n\n* By following these guidelines, we can maintain a high standard of quality and ensure that the codebase remains organized and well-documented.\n\n!!! note\n\n     When creating a function, please include \"WPF\" or \"WinUtil\" in the file name so it can be loaded into the runspace.\n\n## Walk through\n\n* This is a guide for beginners. If you are still having issues, look at the following official GitHub documentation:\n    * [Commit through WEB](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/about-commits)\n    * [Commit through GitHub Desktop](https://docs.github.com/en/desktop/making-changes-in-a-branch/committing-and-reviewing-changes-to-your-project-in-github-desktop#about-commits)\n    * [Create a Pull Request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request)\n\n\n### Overview\n\n``` mermaid\n%%{init: {\"flowchart\": {\"curve\": \"cardinal\"}} }%%\ngraph TD\n  A[Fork Project] --> B[Clone Repository];\n  B --> C[Create New Branch];\n  C --> D[Make Changes];\n  D --> G[Test Changes];\n  G --> H{Tests Passed?};\n  H -->|Yes| E[Commit Changes];\n  H -->|No| J[Fix Issues];\n  J --> G;\n  E --> F[Push Branch];\n  F --> K[Create Pull Request];\n  K --> L[Fill out PR template];\n  classDef default stroke:#333,stroke-width:4px,font-size:12pt;\n```\n!!! info\n\n     This is a diagram to guide you through the process. It may vary depending on the type of change you're making.\n\n### Fork the Repo\n* Fork the WinUtil Repository [here](https://github.com/ChrisTitusTech/winutil) to create a copy that will be available in your repository list.\n\n![Fork Image](/docs/assets/images/Fork-Button-Dark.png#gh-dark-mode-only)\n\n![Fork Image](/docs/assets/images/Fork-Button-Light.png#only-light#gh-light-mode-only)\n\n### Clone the Fork\n!!! tip\n\n     While you can make your changes directly through the Web, we recommend cloning the repo to your device using the application GitHub Desktop (available in WinUtil) to test your fork easily.\n\n* Install GitHub Desktop if it is not already installed.\n* Log in using the same GitHub account you used to fork WinUtil.\n* Choose the fork under \"Your Repositories\" and press \"clone {repo name}\"\n* Create a new branch and name it something relatable to your changes.\n\n* Now you can modify WinUtil to your liking using your preferred text editor.\n\n\n### Testing your changes\n\n* To test to see if your changes work as intended run following commands in a powershell terminal as admin:\n\n* Change the directory where you are running the commands to the forked project.\n* `cd {path to the folder with the compile.ps1}`\n* Run the following command to compile and run WinUtil:\n* `.\\Compile.ps1 -run`\n\n![Compile](/docs/assets/images/Complie.png)\n\n* After seeing that your changes work properly, feel free to commit the changes to the repository and make a PR. For help on that, follow the documentation below.\n\n### Committing the changes\n* Before committing your changes, please discard changes made to the `winutil.ps1` file, like the following:\n\n![Push Commit Image](/docs/assets/images/Discard-GHD.png)\n\n* Now, commit your changes once you are happy with the result.\n\n![Commit Image](/docs/assets/images/Commit-GHD.png)\n\n* Push the changes to upload them to your fork on github.com.\n\n![Push Commit Image](/docs/assets/images/Push-Commit.png)\n\n### Making a PR\n* To make a PR on your repo under a new branch linking to the main branch, a button will show and say Preview and Create pull request. Click that button and fill in all the information that is provided on the template. Once all the information is filled in correctly, check your PR to make sure there is not a WinUtil.ps1 file attached to the PR. Once everything is good, make the PR and wait for Chris (the maintainer) to accept or deny your PR. Once it is accepted by Chris, you will be able to see your changes in the \"/windev\" build.\n* If you do not see your feature in the main \"/win\" build, that is fine. All new changes go into the /windev build to make sure everything is working OK before going fully public.\n* Congratulations! You just submitted your first PR. Thank you so much for contributing to WinUtil.\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "custom: https://www.cttstore.com/windows-toolbox\ngithub: christitustech\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
    "content": "name: \"Bug report\"\ndescription: \"Report a bug to help us identify and fix issues in the project.\"\nlabels: [\"bug\"]\n\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        - Remember, we only support Windows 11. If you encounter problems on Windows 10, please consider upgrading to Windows 11.\n        - For general questions, join our Community-driven [Discord Server](https://discord.gg/RUbZUZyByQ).\n\n  - type: dropdown\n    id: affected_part\n    attributes:\n      label: What part of Winutil are you having issues with?\n      options:\n        - Program Install Tab\n        - Tweaks Tab\n        - Config Tab\n        - Updates Tab\n        - Win11 Creator Tab\n    validations:\n      required: false\n\n  - type: textarea\n    id: issue_description\n    attributes:\n      label: Provide a clear and concise description of the issue.\n    validations:\n      required: true\n\n  - type: textarea\n    id: error_output\n    attributes:\n      label: Paste the full error output (if available) or Screenshot.\n      placeholder: \"Include any relevant logs or error messages.\"\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n    - name: 💻 Community Discord\n      url: https://discord.gg/RUbZUZyByQ\n      about: Join our Community Discord server to chat with other users in the Winutil community.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yaml",
    "content": "name: \"Feature request\"\ndescription: \"Suggest a new feature or improvement for the project.\"\nlabels: [\"enhancement\"]\n\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        # ✨ **Feature request**\n        Thank you for taking the time to suggest a feature! Please provide as much detail as possible to help us understand and evaluate your request.\n\n        ## ⚠️ **IMPORTANT**\n        - 🛠️ **Supported environments only:** We only support Windows 11.\n        - 💡 For general questions, use the [Discussions section](https://github.com/Christitustech/winutil/discussions) or join our Community-driven [Discord Server](https://discord.gg/RUbZUZyByQ).\n\n  - type: textarea\n    id: proposed_solution\n    attributes:\n      label: 💡 Describe the solution you'd like\n      placeholder: \"Provide a clear and concise description.\"\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--Before you make this PR have you followed the docs here? - https://winutil.christitus.com/contributing/ -->\n\n## Type of Change\n- [ ] New feature\n- [ ] Bug fix\n- [ ] Documentation update\n- [ ] UI/UX improvement\n\n<!-- This automatically adds labels to your PR based on the selections above. -->\n\n## Description\n<!--[What does this PR do? Provide Screenshots when possible.]-->\n\n## Issue related to PR\n<!--[List any ISSUES this is related to as it AUTO-CLOSES Them!]-->\n- Resolves #\n"
  },
  {
    "path": ".github/SECURITY.md",
    "content": "# Security Policy\n\nIf you find a security issue please make post it in the issues tab. If you think it should be private you can email me at contact@christitus.com.\n\nFor immediate response check out our discord server @ [![](https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ?theme=default-inverted&style=for-the-badge)](https://discord.gg/RUbZUZyByQ)\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n    ignore:\n      - dependency-name: \"actions/stale\"\n        versions: '>= 9'\n"
  },
  {
    "path": ".github/release-drafter.yml",
    "content": "tag-prefix: ''\ncategories:\n  - title: '🚀 Features'\n    labels:\n      - 'feature'\n      - 'enhancement'\n      - 'new feature'\n  - title: '🐛 Bug Fixes'\n    labels:\n      - 'hotfix'\n      - 'bugfix'\n      - 'bug'\n  - title: '📚 Documentation'\n    label: 'documentation'\n  - title: '🎨 UI/UX Improvements'\n    label: 'ui update'\nchange-template: '- $TITLE @$AUTHOR (#$NUMBER)'\ntemplate: |\n  ## Changes\n\n  $CHANGES\n\nchange-title-escapes: '\\<*_&\"'''\nautolabeler:\n  - label: 'documentation'\n    files:\n      - '*.md'\n    branch:\n      - '/docs{0,1}\\/.+/'\n  - label: 'bug'\n    branch:\n      - '/fix\\/.+/'\n    title:\n      - '/fix/i'\n  - label: 'new feature'\n    branch:\n      - '/feature\\/.+/'\n    body:\n      - '/[A-Z]+-[0-9]+/'\n  - label: 'documentation'\n    files:\n      - '**/*.md'\n      - 'docs/**/*'\nreplacers:\n  - search: /\"/g\n    replace: ''\n  - search: /'/g\n    replace: ''\nexclude-labels:\n  - 'skip-changelog'\n\nfilter-by-commitish: true\n"
  },
  {
    "path": ".github/workflows/auto-merge-docs.yaml",
    "content": "name: Auto-merge Docs PRs\n\non:\n  pull_request:\n    types: [opened, synchronize, reopened]\n    branches:\n      - main\n\njobs:\n  auto-merge:\n    if: github.event.pull_request.head.ref == 'docs-update' && (github.event.pull_request.user.login == 'ChrisTitusTech' || github.event.pull_request.user.login == 'github-actions[bot]')\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n      contents: write\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n\n      - name: Auto-approve PR\n        if: github.event.pull_request.user.login == 'github-actions[bot]'\n        run: gh pr review \"$PR_NUMBER\" --approve\n        env:\n          PR_NUMBER: ${{ github.event.pull_request.number }}\n          GH_TOKEN: ${{ secrets.AUTO_MERGE }}\n\n      - name: Enable auto-merge\n        run: gh pr merge \"$PR_NUMBER\" --squash --delete-branch --admin\n        env:\n          PR_NUMBER: ${{ github.event.pull_request.number }}\n          GH_TOKEN: ${{ secrets.AUTO_MERGE }}\n"
  },
  {
    "path": ".github/workflows/close-discussion-on-pr.yaml",
    "content": "name: Close Discussion on PR Merge\n\non:\n  pull_request:\n    types: [closed]\n\njobs:\n  closeDiscussion:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n\n      - name: Check if PR was merged\n        if: github.event.pull_request.merged == true\n        run: echo \"PR was merged\"\n\n      - name: Extract Discussion Number & Close If any Were Found\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        if: github.event.pull_request.merged == true\n        id: extract-discussion\n        run: |\n          pr_body=\"${{ github.event.pull_request.body }}\"\n          discussion_ids=$(echo \"$pr_body\" | grep -oP '(?i)(resolve|fix|close)[s|d]? #\\K[0-9]+')\n\n          if [ -z \"$discussion_ids\" ]; then\n            echo \"No discussion IDs found.\"\n            exit 0\n          fi\n\n          for discussion_id in $discussion_ids; do\n            echo \"Attempting to close discussion #$discussion_id\"\n            response=$(curl -s -X PATCH -H \"Authorization: token $GITHUB_TOKEN\" \\\n                 -H \"Accept: application/vnd.github.v3+json\" \\\n                 -d '{\"state\": \"closed\"}' \\\n                 \"https://api.github.com/repos/${{ github.repository }}/discussions/$discussion_id\")\n\n            if echo \"$response\" | jq -e '.id' > /dev/null; then\n              echo \"Successfully closed discussion #$discussion_id\"\n            else\n              error_message=$(echo \"$response\" | jq -r '.message // \"Unknown error\"')\n              echo \"Warning: Failed to close discussion #$discussion_id. Error: $error_message\"\n              echo \"Full response: $response\"\n            fi\n          done\n        shell: bash\n        continue-on-error: true\n"
  },
  {
    "path": ".github/workflows/close-old-issues.yaml",
    "content": "name: Close Inactive Issues\n\non:\n  schedule:\n    - cron: '0 0 * * *'  # Run daily\n  workflow_dispatch:  # This line enables manual triggering\n\njobs:\n  close-issues:\n    runs-on: ubuntu-latest\n    permissions:\n      issues: write  # Ensure necessary permissions for issues\n      pull-requests: none\n      contents: none\n    steps:\n    - name: Close inactive issues\n      uses: actions/stale@v10\n      with:\n        # A list of labels to reference when looking through issues,\n        # and only when one (or even more) of these labels are found..\n        # then skip this issue, and never try to stale and/or close it.\n        exempt-issue-labels: \"Keep Issue Open\"\n        # Split it into two weeks, after one week the issue will be marked as stale,\n        # after another week have pasted without any update.. the issue will then be closed.\n        days-before-issue-stale: 90\n        days-before-issue-close: 365\n        # NEVER mark PRs as Stale or Close + this workflow should never have write permissions on PRs, EVER!\n        days-before-pr-stale: -1\n        days-before-pr-close: -1\n        # Sends a message for both the Stale and Close events of an issue.\n        stale-issue-message: \"This issue was marked as stale due to inactivity.\"\n        close-issue-message: \"This issue was closed after remaining stale without updates.\"\n        # Increase this value if the project receives a lot of\n        # PRs (yes.. apparently they're processed no matter what) & Issues.\n        # Default value for it (according to the docs) is 30\n        operations-per-run: 200\n        # Make this field equal true if you want to test your configuration if it works correctly or not\n        debug-only: false\n        repo-token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/compile-check.yaml",
    "content": "name: Compile & Check\n\non:\n  push:\n    branches: [\"main\"]\n  pull_request:\n    branches: [\"main\"]\n  workflow_dispatch: # Manual trigger added\n  workflow_call: # Allow other Actions to call this workflow\n\njobs:\n  Compile-and-Check:\n    runs-on: windows-latest\n    steps:\n    - name: Checkout Sources\n      uses: actions/checkout@v6\n\n    - name: Compile and Syntaxcheck winutil.ps1\n      shell: pwsh\n      run: |\n        Set-ExecutionPolicy Bypass -Scope Process -Force; ./Compile.ps1\n      continue-on-error: false # Directly fail the job on error, removing the need for a separate check\n"
  },
  {
    "path": ".github/workflows/docs.yaml",
    "content": "name: Deploy Hugo site to Pages\n\non:\n  push:\n    branches:\n      - main\n    paths:\n      - \"docs/**\"\n      - \"config/tweaks.json\"\n      - \"config/feature.json\"\n      - \"functions/**\"\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n  pull-requests: write\n\nconcurrency:\n  group: \"pages\"\n  cancel-in-progress: false\n\ndefaults:\n  run:\n    shell: bash\n\njobs:\n  build:\n    if: github.repository == 'ChrisTitusTech/winutil'\n    runs-on: ubuntu-latest\n    env:\n      HUGO_VERSION: 0.156.0\n      HUGO_ENVIRONMENT: production\n      TZ: America/Chicago\n    steps:\n      - name: Install Hugo CLI\n        run: |\n          wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \\\n          && sudo dpkg -i ${{ runner.temp }}/hugo.deb\n      - name: Checkout\n        uses: actions/checkout@v6\n        with:\n          submodules: recursive\n          fetch-depth: 0\n          persist-credentials: false\n      - name: Setup Pages\n        id: pages\n        uses: actions/configure-pages@v5\n\n      - name: Generate Dev Docs from JSON\n        shell: pwsh\n        run: |\n          Set-Location tools\n          ./devdocs-generator.ps1\n\n      - name: Create Pull Request\n        id: cpr\n        uses: peter-evans/create-pull-request@v8\n        with:\n          token: ${{ secrets.AUTO_MERGE }}\n          commit-message: 'chore: Update generated dev docs'\n          title: 'chore: Update Generated Dev Docs'\n          body: 'Automated update of generated documentation from JSON sources'\n          branch: docs-update\n          delete-branch: true\n          add-paths: |\n            docs/content/dev/\n            config/tweaks.json\n            config/feature.json\n          labels: |\n            automated\n            documentation\n\n      - name: Check outputs\n        run: |\n          echo \"Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}\"\n          echo \"Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}\"\n\n      - name: Install Node.js dependencies\n        run: \"cd docs && [[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true\"\n      - name: Cache Restore\n        id: cache-restore\n        uses: actions/cache/restore@v5\n        with:\n          path: |\n            ${{ runner.temp }}/hugo_cache\n          key: hugo-${{ github.run_id }}\n          restore-keys: hugo-\n      - name: Build with Hugo\n        run: |\n          hugo \\\n            --gc \\\n            --minify \\\n            --cleanDestinationDir \\\n            --source docs \\\n            --cacheDir \"${{ runner.temp }}/hugo_cache\"\n      - name: Cache Save\n        id: cache-save\n        uses: actions/cache/save@v5\n        with:\n          path: |\n            ${{ runner.temp }}/hugo_cache\n          key: ${{ steps.cache-restore.outputs.cache-primary-key }}\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v4\n        with:\n          path: ./docs/public\n\n  deploy:\n    if: github.repository == 'ChrisTitusTech/winutil'\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    needs: build\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4\n"
  },
  {
    "path": ".github/workflows/issue-slash-commands.yaml",
    "content": "name: Issue slash commands\n\non:\n  issue_comment:\n    types: [created, edited]\n\njobs:\n  issueCommands:\n    # Skip this job if the comment was created/edited on a PR\n    if: ${{ !github.event.issue.pull_request }}\n    runs-on: ubuntu-latest\n    permissions:\n      issues: write\n      pull-requests: none\n      contents: read\n\n    steps:\n      - run: echo \"command=false\" >> $GITHUB_ENV\n\n      - name: Check for /label command\n        id: check_label_command\n        run: |\n          if [[ \"${{ contains(github.event.comment.body, '/label') }}\" == \"true\" ]]; then\n            echo \"command=true\" >> $GITHUB_ENV\n            LABEL_NAME=$(echo \"${{ github.event.comment.body }}\" | awk -F\"/label\" '/\\/label/ { match($2, /'\\''([^'\\'']*)'\\''/, arr); if (arr[1] != \"\") print arr[1] }')\n            echo \"label_command=true\" >> $GITHUB_ENV\n            echo \"label_name=${LABEL_NAME}\" >> $GITHUB_ENV\n          else\n            echo \"label_command=false\" >> $GITHUB_ENV\n          fi\n\n      - name: Check for /unlabel command\n        id: check_unlabel_command\n        run: |\n          if [[ \"${{ contains(github.event.comment.body, '/unlabel') }}\" == \"true\" ]]; then\n            echo \"command=true\" >> $GITHUB_ENV\n            UNLABEL_NAME=$(echo \"${{ github.event.comment.body }}\" | awk -F\"/unlabel\" '/\\/unlabel/ { match($2, /'\\''([^'\\'']*)'\\''/, arr); if (arr[1] != \"\") print arr[1] }')\n            echo \"unlabel_command=true\" >> $GITHUB_ENV\n            echo \"unlabel_name=${UNLABEL_NAME}\" >> $GITHUB_ENV\n          else\n            echo \"unlabel_command=false\" >> $GITHUB_ENV\n          fi\n\n      - name: Check for /close command\n        id: check_close_command\n        run: |\n          if [[ \"${{ contains(github.event.comment.body, '/close') }}\" == \"true\" ]]; then\n            echo \"command=true\" >> $GITHUB_ENV\n            echo \"close_command=true\" >> $GITHUB_ENV\n            echo \"reopen_command=false\" >> $GITHUB_ENV\n          else\n            echo \"close_command=false\" >> $GITHUB_ENV\n          fi\n\n      - name: Check for /open or /reopen command\n        id: check_reopen_command\n        run: |\n          if [[ \"${{ contains(github.event.comment.body, '/open') }}\" == \"true\" ]] || [[ \"${{ contains(github.event.comment.body, '/reopen') }}\" == \"true\" ]]; then\n            echo \"command=true\" >> $GITHUB_ENV\n            echo \"reopen_command=true\" >> $GITHUB_ENV\n            echo \"close_command=false\" >> $GITHUB_ENV\n          else\n            echo \"reopen_command=false\" >> $GITHUB_ENV\n          fi\n\n      - name: Check if the user is allowed\n        id: check_user\n        if: env.command == 'true'\n        run: |\n          ALLOWED_USERS=(\"ChrisTitusTech\" \"og-mrk\" \"Marterich\" \"MyDrift-user\" \"Real-MullaC\" \"CodingWonders\" \"GabiNun\")\n          if [[ \" ${ALLOWED_USERS[@]} \" =~ \" ${{ github.event.comment.user.login }} \" ]]; then\n            echo \"user=true\" >> $GITHUB_ENV\n          else\n            exit 0\n          fi\n\n      - name: Close issue\n        if: env.close_command == 'true'\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          ISSUE_NUMBER: ${{ github.event.issue.number }}\n        run: |\n          echo Closing the issue...\n          if [[ \"${{ contains(github.event.comment.body, 'not planned') }}\" == \"true\" ]]; then\n            gh issue close $ISSUE_NUMBER --repo ${{ github.repository }} --reason 'not planned'\n          else\n            gh issue close $ISSUE_NUMBER --repo ${{ github.repository }}\n          fi\n\n      - name: Reopen issue\n        if: env.reopen_command == 'true'\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          ISSUE_NUMBER: ${{ github.event.issue.number }}\n        run: |\n          echo Reopening the issue...\n          gh issue reopen $ISSUE_NUMBER --repo ${{ github.repository }}\n\n      - name: Label issue\n        if: env.label_command == 'true'\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          ISSUE_NUMBER: ${{ github.event.issue.number }}\n        run: |\n          echo Labeling the issue...\n          gh issue edit $ISSUE_NUMBER --repo ${{ github.repository }} --add-label \"${{ env.label_name }}\"\n\n      - name: Remove labels\n        if: env.unlabel_command == 'true'\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          ISSUE_NUMBER: ${{ github.event.issue.number }}\n        run: |\n          echo Unlabeling the issue...\n          gh issue edit $ISSUE_NUMBER --repo ${{ github.repository }} --remove-label \"${{ env.unlabel_name }}\"\n"
  },
  {
    "path": ".github/workflows/label-pr.yaml",
    "content": "name: Label PRs by Type of Change\n\non:\n  pull_request_target:\n    types: [opened, edited, synchronize]\n\njobs:\n  label-pr:\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n      issues: write\n      contents: read  # Often needed for github-script\n    steps:\n      - name: Check PR body for Type of Change\n        uses: actions/github-script@v8\n        with:\n          script: |\n            const prBody = context.payload.pull_request.body || '';\n            const labelsToAdd = [];\n\n            if (/\\[x\\]\\s*New feature/i.test(prBody)) {\n              labelsToAdd.push('new feature');\n            }\n            if (/\\[x\\]\\s*Bug fix/i.test(prBody)) {\n              labelsToAdd.push('bug');\n            }\n            if (/\\[x\\]\\s*Documentation update/i.test(prBody)) {\n              labelsToAdd.push('documentation');\n            }\n            if (/\\[x\\]\\s*Hotfix/i.test(prBody)) {\n              labelsToAdd.push('hotfix');\n            }\n            if (/\\[x\\]\\s*UI\\/UX improvement/i.test(prBody)) {\n              labelsToAdd.push('ui update');\n            }\n\n            if (labelsToAdd.length > 0) {\n              await github.rest.issues.addLabels({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                issue_number: context.payload.pull_request.number,\n                labels: labelsToAdd\n              });\n            }\n"
  },
  {
    "path": ".github/workflows/pre-release.yaml",
    "content": "name: Pre-Release WinUtil\n\npermissions:\n  contents: write\n  actions: read\n  pull-requests: write\n\non:\n  workflow_dispatch: # Manual trigger added\n\njobs:\n  build-runspace:\n    runs-on: windows-latest\n    env:\n      CERTIFICATE_BASE64: ${{ secrets.CERTIFICATE_BASE64 }}\n    steps:\n      - name: Checkout Repository\n        uses: actions/checkout@v6\n\n      - name: Generate Dev Docs and Update JSON Links\n        shell: pwsh\n        run: |\n          Set-Location tools\n          ./devdocs-generator.ps1\n\n      - name: Compile project\n        shell: pwsh\n        run: |\n          Set-ExecutionPolicy Bypass -Scope Process -Force; ./Compile.ps1\n        continue-on-error: false # Directly fail the job on error, removing the need for a separate check\n\n      - name: Create Pull Request for Updated JSON Links\n        id: cpr\n        uses: peter-evans/create-pull-request@v8\n        with:\n          token: ${{ secrets.AUTO_MERGE }}\n          commit-message: 'chore: Update documentation links in JSON configs'\n          title: 'chore: Update Generated Dev Docs'\n          body: 'Automated update of documentation links in JSON configs from pre-release build'\n          branch: docs-update\n          delete-branch: true\n          add-paths: |\n            config/tweaks.json\n            config/feature.json\n          labels: |\n            automated\n            documentation\n\n      - name: Check outputs\n        shell: bash\n        run: |\n          echo \"Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}\"\n          echo \"Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}\"\n\n      - name: Set Version to Todays Date\n        id: extract_version\n        run: |\n          $version = (Get-Date -Format \"yy.MM.dd\")\n          echo \"VERSION=$version\" >> $env:GITHUB_ENV\n        shell: pwsh\n\n      - name: Create Tag\n        id: create_tag\n        run: |\n          $tagExists = git tag -l $env:VERSION\n          if ($tagExists -eq \"\") {\n            git tag $env:VERSION\n            if ($LASTEXITCODE -ne 0) {\n              Write-Error \"Failed to create tag $env:VERSION\"\n              exit 1\n            }\n            git push origin $env:VERSION\n            if ($LASTEXITCODE -ne 0) {\n              Write-Error \"Failed to push tag $env:VERSION\"\n              exit 1\n            }\n          } else {\n            Write-Host \"Tag $env:VERSION already exists, skipping tag creation\"\n          }\n        shell: pwsh\n\n      - name: Generate Release Notes\n        id: generate_notes\n        uses: release-drafter/release-drafter@v7\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        with:\n          config-name: release-drafter.yml\n          version: ${{ env.VERSION }}\n\n      - name: Create and Upload Release\n        id: create_release\n        uses: softprops/action-gh-release@v2\n        with:\n          tag_name: ${{ env.VERSION }}\n          name: Pre-Release ${{ env.VERSION }}\n          body: |\n            ${{ steps.generate_notes.outputs.body }}\n\n            ![GitHub Downloads (specific asset, specific tag)](https://img.shields.io/github/downloads/ChrisTitusTech/winutil/${{ env.VERSION }}/winutil.ps1)\n          append_body: false\n          files: ./winutil.ps1\n          prerelease: true\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/remove-winutil.yaml",
    "content": "name: Remove winutil.ps1 if included in a Push\n\non:\n  push:\n    branches:\n      - '**'\n\njobs:\n  check-and-delete-file:\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v6\n\n    - name: Check if winutil.ps1 exists\n      id: check_existence\n      run: |\n        if [ -f \"winutil.ps1\" ]; then\n          echo \"winutil_exists=true\" >> $GITHUB_OUTPUT\n        else\n          echo \"winutil_exists=false\" >> $GITHUB_OUTPUT\n        fi\n\n    - name: Delete winutil.ps1 if it exists\n      if: steps.check_existence.outputs.winutil_exists == 'true'\n      run: |\n        git config --global user.email \"winutil-action@noreply.github.com\"\n        git config --global user.name \"winutil-action\"\n        git rm winutil.ps1\n        git commit -m \"Delete winutil.ps1 as it is not allowed\"\n        git push origin HEAD:${{ github.ref }}\n      env:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/sponsors.yaml",
    "content": "name: Generate Sponsors README\non:\n  workflow_dispatch:\n  schedule:\n    - cron: 30 15 * * 0-6\npermissions:\n  contents: write\n  pull-requests: write\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    if: (github.event_name == 'schedule' && github.repository == 'ChrisTitusTech/winutil') || (github.event_name != 'schedule')\n    steps:\n      - name: Checkout 🛎️\n        uses: actions/checkout@v6\n        with:\n          persist-credentials: false\n\n      - name: Generate Sponsors 💖\n        uses: JamesIves/github-sponsors-readme-action@v1\n        with:\n          token: ${{ secrets.PAT }}\n          file: 'README.md'\n\n      - name: Create Pull Request 🚀\n        id: cpr\n        uses: peter-evans/create-pull-request@v8\n        with:\n          token: ${{ secrets.GITHUB_TOKEN }}\n          commit-message: 'Update sponsors in README'\n          title: 'chore: Update Sponsors README'\n          body: 'Automated update of sponsors section'\n          branch: sponsors-update\n          delete-branch: true\n          labels: automated\n\n      - name: Check outputs\n        run: |\n          echo \"Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}\"\n          echo \"Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}\"\n"
  },
  {
    "path": ".github/workflows/unittests.yaml",
    "content": "name: Unit Tests\n\non:\n  push:\n\njobs:\n  lint:\n    name: PS Script Analyzer\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v6\n    - name: lint\n      uses: devblackops/github-action-psscriptanalyzer@master\n      with:\n        sendComment: false\n        settingsPath: lint/PSScriptAnalyser.ps1\n        failOnErrors: false\n        failOnWarnings: false\n        failOnInfos: false\n  test:\n    runs-on: windows-latest\n\n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v6\n\n    - name: Install Pester\n      run: |\n        Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process\n        Install-Module -Name Pester -Force -SkipPublisherCheck -AllowClobber\n      shell: pwsh\n\n    - name: Run Pester tests\n      run: |\n        Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process\n        Invoke-Pester -Path 'pester/*.Tests.ps1' -Output Detailed\n\n      shell: pwsh\n      env:\n        TEMP: ${{ runner.temp }}\n"
  },
  {
    "path": ".gitignore",
    "content": "### VSCode ###\n\n# Configuration folder\n.vscode/\n.idea/\n\n### Visual Studio ###\n\n# Visual Studio user-specific files\n.vs/\n\nwinutil.pdb\n\n### Preprocessor Hashes ###\n.preprocessor_hashes.json\n\n### Windows ###\n\n# Folder config file\n[Dd]esktop.ini\n\n# Ignore Generated XAML Files\nxaml/inputApp.xaml\nxaml/inputFeatures.xaml\nxaml/inputTweaks.xaml\n\n# Executables and Configs\nwinget.msixbundle\npester.ps1\n*.psd*\nooshutup10.cfg\nwinutil.exe.config\nMicrosoft.UI.Xaml*\nlicense1.xml\nwinutil.ps1\n\n# Libraries\nSystem.Management.Automation.dll\nMicrosoft.PowerShell.ConsoleHost.dll\n\n# Compressed files\n*.zip\n\n### MacOS ###\n\n# General\n.DS_Store\nTrue\ntest.ps1\nwinutil.ps1\n\n# temporary excludes for docs\n.github/site/\n\nbinary/\n\n.preprocessor_hashes.json\n\n# Hugo Files\ndocs/public/\ndocs/.hugo_build.lock\ndocs/resources/\n"
  },
  {
    "path": "Compile.ps1",
    "content": "param (\r\n    [switch]$Run,\r\n    [string]$Arguments\r\n)\r\n\r\nif ((Get-Item \".\\winutil.ps1\" -ErrorAction SilentlyContinue).IsReadOnly) {\r\n    Remove-Item \".\\winutil.ps1\" -Force\r\n}\r\n\r\n$OFS = \"`r`n\"\r\n$scriptname = \"winutil.ps1\"\r\n$workingdir = $PSScriptRoot\r\n\r\n# Variable to sync between runspaces\r\n$sync = [Hashtable]::Synchronized(@{})\r\n$sync.configs = @{}\r\n\r\nfunction Update-Progress {\r\n    param (\r\n        [Parameter(Mandatory, position=0)]\r\n        [string]$StatusMessage,\r\n\r\n        [Parameter(Mandatory, position=1)]\r\n        [ValidateRange(0,100)]\r\n        [int]$Percent,\r\n\r\n        [Parameter(position=2)]\r\n        [string]$Activity = \"Compiling\"\r\n    )\r\n\r\n    Write-Progress -Activity $Activity -Status $StatusMessage -PercentComplete $Percent\r\n}\r\n\r\nUpdate-Progress \"Pre-req: Running Preprocessor...\" 0\r\n\r\n# Dot source the 'Invoke-Preprocessing' Function from 'tools/Invoke-Preprocessing.ps1' Script\r\n$preprocessingFilePath = \".\\tools\\Invoke-Preprocessing.ps1\"\r\n. $preprocessingFilePath\r\n\r\n$excludedFiles = @()\r\n\r\n# Add directories only if they exist\r\nif (Test-Path '.\\.git\\') { $excludedFiles += '.\\.git\\' }\r\nif (Test-Path '.\\binary\\') { $excludedFiles += '.\\binary\\' }\r\n\r\n# Add files that should always be excluded\r\n$excludedFiles += @(\r\n    '.\\.gitignore',\r\n    '.\\.gitattributes',\r\n    '.\\.github\\CODEOWNERS',\r\n    '.\\LICENSE',\r\n    \"$preprocessingFilePath\",\r\n    '*.png',\r\n    '.\\.preprocessor_hashes.json'\r\n)\r\n\r\n$msg = \"Pre-req: Code Formatting\"\r\nInvoke-Preprocessing -WorkingDir \"$workingdir\" -ExcludedFiles $excludedFiles -ProgressStatusMessage $msg\r\n\r\n# Create the script in memory.\r\nUpdate-Progress \"Pre-req: Allocating Memory\" 0\r\n$script_content = [System.Collections.Generic.List[string]]::new()\r\n\r\nUpdate-Progress \"Adding: Version\" 10\r\n$script_content.Add($(Get-Content \"scripts\\start.ps1\").replace('#{replaceme}',\"$(Get-Date -Format yy.MM.dd)\"))\r\n\r\nUpdate-Progress \"Adding: Functions\" 20\r\nGet-ChildItem \"functions\" -Recurse -File | ForEach-Object {\r\n    $script_content.Add($(Get-Content $psitem.FullName))\r\n    }\r\nUpdate-Progress \"Adding: Config *.json\" 40\r\nGet-ChildItem \"config\" | Where-Object {$psitem.extension -eq \".json\"} | ForEach-Object {\r\n    $json = (Get-Content $psitem.FullName -Raw)\r\n    $jsonAsObject = $json | ConvertFrom-Json\r\n\r\n    # Add 'WPFInstall' as a prefix to every entry-name in 'applications.json' file\r\n    if ($psitem.Name -eq \"applications.json\") {\r\n        foreach ($appEntryName in $jsonAsObject.PSObject.Properties.Name) {\r\n            $appEntryContent = $jsonAsObject.$appEntryName\r\n            $jsonAsObject.PSObject.Properties.Remove($appEntryName)\r\n            $jsonAsObject | Add-Member -MemberType NoteProperty -Name \"WPFInstall$appEntryName\" -Value $appEntryContent\r\n        }\r\n    }\r\n\r\n    # Line 90 requires no whitespace inside the here-strings, to keep formatting of the JSON in the final script.\r\n    $json = @\"\r\n$($jsonAsObject | ConvertTo-Json -Depth 3)\r\n\"@\r\n\r\n    $sync.configs.$($psitem.BaseName) = $json | ConvertFrom-Json\r\n    $script_content.Add($(Write-Output \"`$sync.configs.$($psitem.BaseName) = @'`r`n$json`r`n'@ `| ConvertFrom-Json\" ))\r\n}\r\n\r\n# Read the entire XAML file as a single string, preserving line breaks\r\n$xaml = Get-Content \"$workingdir\\xaml\\inputXML.xaml\" -Raw\r\n\r\nUpdate-Progress \"Adding: Xaml \" 90\r\n\r\n# Add the XAML content to $script_content using a here-string\r\n$script_content.Add(@\"\r\n`$inputXML = @'\r\n$xaml\r\n'@\r\n\"@)\r\n\r\nUpdate-Progress \"Adding: autounattend.xml\" 95\r\n$autounattendRaw = Get-Content \"$workingdir\\tools\\autounattend.xml\" -Raw\r\n# Strip XML comments (<!-- ... -->, including multi-line)\r\n$autounattendRaw = [regex]::Replace($autounattendRaw, '<!--.*?-->', '', [System.Text.RegularExpressions.RegexOptions]::Singleline)\r\n# Drop blank lines and trim trailing whitespace per line\r\n$autounattendXml = ($autounattendRaw -split \"`r?`n\" |\r\n    Where-Object { $_.Trim() -ne '' } |\r\n    ForEach-Object { $_.TrimEnd() }) -join \"`r`n\"\r\n$script_content.Add(@\"\r\n`$WinUtilAutounattendXml = @'\r\n$autounattendXml\r\n'@\r\n\"@)\r\n\r\n$script_content.Add($(Get-Content \"scripts\\main.ps1\"))\r\n\r\nUpdate-Progress \"Removing temporary files\" 99\r\nRemove-Item \"xaml\\inputApp.xaml\" -ErrorAction SilentlyContinue\r\nRemove-Item \"xaml\\inputTweaks.xaml\" -ErrorAction SilentlyContinue\r\nRemove-Item \"xaml\\inputFeatures.xaml\" -ErrorAction SilentlyContinue\r\n\r\nSet-Content -Path \"$scriptname\" -Value ($script_content -join \"`r`n\") -Encoding ascii\r\nWrite-Progress -Activity \"Compiling\" -Completed\r\n\r\nUpdate-Progress -Activity \"Validating\" -StatusMessage \"Checking winutil.ps1 Syntax\" -Percent 0\r\ntry {\r\n    Get-Command -Syntax .\\winutil.ps1 | Out-Null\r\n} catch {\r\n    Write-Warning \"Syntax Validation for 'winutil.ps1' has failed\"\r\n    Write-Host \"$($Error[0])\" -ForegroundColor Red\r\n    exit 1\r\n}\r\nWrite-Progress -Activity \"Validating\" -Completed\r\n\r\nif ($run) {\r\n    Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass\r\n    .\\Winutil.ps1 $Arguments\r\n    break\r\n}\r\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2022 CT Tech Group LLC\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": "# Chris Titus Tech's Windows Utility\n\n[![Version](https://img.shields.io/github/v/release/ChrisTitusTech/winutil?color=%230567ff&label=Latest%20Release&style=for-the-badge)](https://github.com/ChrisTitusTech/winutil/releases/latest)\n![GitHub Downloads (specific asset, all releases)](https://img.shields.io/github/downloads/ChrisTitusTech/winutil/winutil.ps1?label=Total%20Downloads&style=for-the-badge)\n[![](https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ?theme=default-inverted&style=for-the-badge)](https://discord.gg/RUbZUZyByQ)\n[![Static Badge](https://img.shields.io/badge/Documentation-_?style=for-the-badge&logo=bookstack&color=grey)](https://winutil.christitus.com/)\n\nThis utility is a compilation of Windows tasks I perform on each Windows system I use. It is meant to streamline *installs*, debloat with *tweaks*, troubleshoot with *config*, and fix Windows *updates*. I am extremely picky about any contributions to keep this project clean and efficient.\n\n![screen-install](/docs/assets/images/Title-Screen.png)\n\n## 💡 Usage\n\nWinutil must be run in Admin mode because it performs system-wide tweaks. To achieve this, run PowerShell as an administrator. Here are a few ways to do it:\n\n1. **Start menu Method:**\n   - Right-click on the start menu.\n   - Choose \"Windows PowerShell (Admin)\" (for Windows 10) or \"Terminal (Admin)\" (for Windows 11).\n\n2. **Search and Launch Method:**\n   - Press the Windows key.\n   - Type \"PowerShell\" or \"Terminal\" (for Windows 11).\n   - Press `Ctrl + Shift + Enter` or Right-click and choose \"Run as administrator\" to launch it with administrator privileges.\n\n### Launch Command\n\n#### Stable Branch (Recommended)\n\n```ps1\nirm \"https://christitus.com/win\" | iex\n```\n#### Dev Branch\n\n```ps1\nirm \"https://christitus.com/windev\" | iex\n```\n\nIf you have Issues, refer to [Known Issues](https://winutil.christitus.com/knownissues/) or [Create Issue](https://github.com/ChrisTitusTech/winutil/issues)\n\n## 🎓 Documentation\n\n### [WinUtil Official Documentation](https://winutil.christitus.com/)\n\n### [YouTube Tutorial](https://www.youtube.com/watch?v=6UQZ5oQg8XA)\n\n### [ChrisTitus.com Article](https://christitus.com/windows-tool/)\n\n## 🛠️ Build & Develop\n\n> [!NOTE]\n> Winutil is a relatively large script, so it's split into multiple files which're combined into a single `.ps1` file using a custom compiler. This makes maintaining the project a lot easier.\n\nGet a copy of the source code, this can be done using GitHub UI (`Code -> Download ZIP`), or by cloning (downloading) the repo using git.\n\nIf git is installed, run the following commands under a PowerShell window to clone and move into project's directory:\n```ps1\ngit clone --depth 1 \"https://github.com/ChrisTitusTech/winutil.git\"\ncd winutil\n```\n\nTo build the project, run the Compile Script under a PowerShell window (admin permissions IS NOT required):\n```ps1\n.\\Compile.ps1\n```\n\nYou'll see a new file named `winutil.ps1`, which's created by `Compile.ps1` script, now you can run it as admin and a new window will popup, enjoy your own compiled version of WinUtil :)\n\n> [!TIP]\n> For more info on using WinUtil and how to develop for it, please consider reading [the Contribution Guidelines](https://winutil.christitus.com/contributing/), if you don't know where to start, or have questions, you can ask over on our [Discord Community Server](https://discord.gg/RUbZUZyByQ) and active project members will answer when they can.\n\n## 💖 Support\n- To morally and mentally support the project, make sure to leave a ⭐️!\n- EXE Wrapper for $10 @ https://www.cttstore.com/windows-toolbox\n\n## 💖 Sponsors\n\nThese are the sponsors that help keep this project alive with monthly contributions.\n\n<!-- sponsors --><a href=\"https://github.com/dwelfusius\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;dwelfusius.png\" width=\"60px\" alt=\"User avatar: \" /></a><a href=\"https://github.com/mews-se\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;mews-se.png\" width=\"60px\" alt=\"User avatar: Martin Stockzell\" /></a><a href=\"https://github.com/jdiegmueller\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;jdiegmueller.png\" width=\"60px\" alt=\"User avatar: Jason A. Diegmueller\" /></a><a href=\"https://github.com/robertsandrock\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;robertsandrock.png\" width=\"60px\" alt=\"User avatar: RMS\" /></a><a href=\"https://github.com/KenichiQaz\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;KenichiQaz.png\" width=\"60px\" alt=\"User avatar: Stefan\" /></a><a href=\"https://github.com/paulsheets\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;paulsheets.png\" width=\"60px\" alt=\"User avatar: Paul\" /></a><a href=\"https://github.com/djones369\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;djones369.png\" width=\"60px\" alt=\"User avatar: Dave J  (WhamGeek)\" /></a><a href=\"https://github.com/anthonymendez\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;anthonymendez.png\" width=\"60px\" alt=\"User avatar: Anthony Mendez\" /></a><a href=\"https://github.com/FatBastard0\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;FatBastard0.png\" width=\"60px\" alt=\"User avatar: \" /></a><a href=\"https://github.com/DursleyGuy\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;DursleyGuy.png\" width=\"60px\" alt=\"User avatar: DursleyGuy\" /></a><a href=\"https://github.com/DwayneTheRockLobster1\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;DwayneTheRockLobster1.png\" width=\"60px\" alt=\"User avatar: \" /></a><a href=\"https://github.com/KieraKujisawa\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;KieraKujisawa.png\" width=\"60px\" alt=\"User avatar: Kiera Meredith\" /></a><a href=\"https://github.com/partybrasil\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;partybrasil.png\" width=\"60px\" alt=\"User avatar: Miguel Diaz\" /></a><a href=\"https://github.com/andrewpayne68\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;andrewpayne68.png\" width=\"60px\" alt=\"User avatar: Andrew P\" /></a><a href=\"https://github.com/nathanzilgo\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;nathanzilgo.png\" width=\"60px\" alt=\"User avatar: Nathan Fernandes Pedroza\" /></a><a href=\"https://github.com/EnzoFerroni\"><img src=\"https:&#x2F;&#x2F;github.com&#x2F;EnzoFerroni.png\" width=\"60px\" alt=\"User avatar: Enzo Ferroni\" /></a><!-- sponsors -->\n\n## 🏅 Thanks to all Contributors\nThanks a lot for spending your time helping Winutil grow. Thanks a lot! Keep rocking 🍻.\n\n[![Contributors](https://contrib.rocks/image?repo=ChrisTitusTech/winutil)](https://github.com/ChrisTitusTech/winutil/graphs/contributors)\n\n## 📊 GitHub Stats\n\n![Alt](https://repobeats.axiom.co/api/embed/aad37eec9114c507f109d34ff8d38a59adc9503f.svg \"Repobeats analytics image\")\n"
  },
  {
    "path": "config/applications.json",
    "content": "{\r\n    \"1password\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"1password\",\r\n        \"content\": \"1Password\",\r\n        \"description\": \"1Password is a password manager that allows you to store and manage your passwords securely.\",\r\n        \"link\": \"https://1password.com/\",\r\n        \"winget\": \"AgileBits.1Password\"\r\n    },\r\n    \"7zip\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"7zip\",\r\n        \"content\": \"7-Zip\",\r\n        \"description\": \"7-Zip is a free and open-source file archiver utility. It supports several compression formats and provides a high compression ratio, making it a popular choice for file compression.\",\r\n        \"link\": \"https://www.7-zip.org/\",\r\n        \"winget\": \"7zip.7zip\",\r\n        \"foss\": true\r\n    },\r\n    \"adobe\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"adobereader\",\r\n        \"content\": \"Adobe Acrobat Reader\",\r\n        \"description\": \"Adobe Acrobat Reader is a free PDF viewer with essential features for viewing, printing, and annotating PDF documents.\",\r\n        \"link\": \"https://www.adobe.com/acrobat/pdf-reader.html\",\r\n        \"winget\": \"Adobe.Acrobat.Reader.64-bit\"\r\n    },\r\n    \"advancedip\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"advanced-ip-scanner\",\r\n        \"content\": \"Advanced IP Scanner\",\r\n        \"description\": \"Advanced IP Scanner is a fast and easy-to-use network scanner. It is designed to analyze LAN networks and provides information about connected devices.\",\r\n        \"link\": \"https://www.advanced-ip-scanner.com/\",\r\n        \"winget\": \"Famatech.AdvancedIPScanner\"\r\n    },\r\n    \"affine\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"AFFiNE\",\r\n        \"description\": \"AFFiNE is an open-source alternative to Notion. Write, draw, plan all at once. Selfhost it to sync across devices.\",\r\n        \"link\": \"https://affine.pro/\",\r\n        \"winget\": \"ToEverything.AFFiNE\",\r\n        \"foss\": true\r\n    },\r\n    \"ai-as-workspace\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"AI as Workspace\",\r\n        \"description\": \"Workspace-style AI chat client with multiple workspaces, plugins, and local-first design; open-source (BSD-3-Clause).\",\r\n        \"link\": \"https://aiaw.app/\",\r\n        \"winget\": \"NitroRCr.AIasWorkspace\",\r\n        \"foss\": true\r\n    },\r\n    \"aimp\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"aimp\",\r\n        \"content\": \"AIMP (Music Player)\",\r\n        \"description\": \"AIMP is a feature-rich music player with support for various audio formats, playlists, and customizable user interface.\",\r\n        \"link\": \"https://www.aimp.ru/\",\r\n        \"winget\": \"AIMP.AIMP\"\r\n    },\r\n    \"alacritty\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"alacritty\",\r\n        \"content\": \"Alacritty Terminal\",\r\n        \"description\": \"Alacritty is a fast, cross-platform, and GPU-accelerated terminal emulator. It is designed for performance and aims to be the fastest terminal emulator available.\",\r\n        \"link\": \"https://alacritty.org/\",\r\n        \"winget\": \"Alacritty.Alacritty\",\r\n        \"foss\": true\r\n    },\r\n    \"anaconda3\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"anaconda3\",\r\n        \"content\": \"Anaconda\",\r\n        \"description\": \"Anaconda is a distribution of the Python and R programming languages for scientific computing.\",\r\n        \"link\": \"https://www.anaconda.com/products/distribution\",\r\n        \"winget\": \"Anaconda.Anaconda3\"\r\n    },\r\n    \"angryipscanner\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"angryip\",\r\n        \"content\": \"Angry IP Scanner\",\r\n        \"description\": \"Angry IP Scanner is an open-source and cross-platform network scanner. It is used to scan IP addresses and ports, providing information about network connectivity.\",\r\n        \"link\": \"https://angryip.org/\",\r\n        \"winget\": \"angryziber.AngryIPScanner\",\r\n        \"foss\": true\r\n    },\r\n    \"anki\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"anki\",\r\n        \"content\": \"Anki\",\r\n        \"description\": \"Anki is a flashcard application that helps you memorize information with intelligent spaced repetition.\",\r\n        \"link\": \"https://apps.ankiweb.net/\",\r\n        \"winget\": \"Anki.Anki\",\r\n        \"foss\": true\r\n    },\r\n    \"anydesk\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"anydesk\",\r\n        \"content\": \"AnyDesk\",\r\n        \"description\": \"AnyDesk is a remote desktop software that enables users to access and control computers remotely. It is known for its fast connection and low latency.\",\r\n        \"link\": \"https://anydesk.com/\",\r\n        \"winget\": \"AnyDesk.AnyDesk\"\r\n    },\r\n    \"anythingllm\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"AnythingLLM\",\r\n        \"description\": \"Desktop AI application for chat with documents (RAG) and agent workflows; offers a Windows installer and an open-source codebase.\",\r\n        \"link\": \"https://anythingllm.com/\",\r\n        \"winget\": \"na\",\r\n        \"foss\": true\r\n    },\r\n    \"audacity\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"audacity\",\r\n        \"content\": \"Audacity\",\r\n        \"description\": \"Audacity is a free and open-source audio editing software known for its powerful recording and editing capabilities.\",\r\n        \"link\": \"https://www.audacityteam.org/\",\r\n        \"winget\": \"Audacity.Audacity\",\r\n        \"foss\": true\r\n    },\r\n    \"autoruns\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"autoruns\",\r\n        \"content\": \"Autoruns\",\r\n        \"description\": \"This utility shows you what programs are configured to run during system bootup or login.\",\r\n        \"link\": \"https://learn.microsoft.com/en-us/sysinternals/downloads/autoruns\",\r\n        \"winget\": \"Microsoft.Sysinternals.Autoruns\"\r\n    },\r\n    \"rdcman\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"rdcman\",\r\n        \"content\": \"RDCMan\",\r\n        \"description\": \"RDCMan manages multiple remote desktop connections. It is useful for managing server labs where you need regular access to each machine such as automated checkin systems and data centers.\",\r\n        \"link\": \"https://learn.microsoft.com/en-us/sysinternals/downloads/rdcman\",\r\n        \"winget\": \"Microsoft.Sysinternals.RDCMan\"\r\n    },\r\n    \"autohotkey\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"autohotkey\",\r\n        \"content\": \"AutoHotkey\",\r\n        \"description\": \"AutoHotkey is a scripting language for Windows that allows users to create custom automation scripts and macros. It is often used for automating repetitive tasks and customizing keyboard shortcuts.\",\r\n        \"link\": \"https://www.autohotkey.com/\",\r\n        \"winget\": \"AutoHotkey.AutoHotkey\",\r\n        \"foss\": true\r\n    },\r\n    \"autoit\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"autoit.install\",\r\n        \"content\": \"AutoIt\",\r\n        \"description\": \"Windows GUI automation scripting tool (freeware) used to automate keystrokes, mouse actions, and window/control interactions.\",\r\n        \"link\": \"https://www.autoitscript.com/site/autoit/\",\r\n        \"winget\": \"na\",\r\n        \"foss\": false\r\n    },\r\n    \"azuredatastudio\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"azure-data-studio\",\r\n        \"content\": \"Microsoft Azure Data Studio\",\r\n        \"description\": \"Azure Data Studio is a data management tool that enables you to work with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux.\",\r\n        \"link\": \"https://docs.microsoft.com/sql/azure-data-studio/what-is-azure-data-studio\",\r\n        \"winget\": \"Microsoft.AzureDataStudio\"\r\n    },\r\n    \"barrier\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"barrier\",\r\n        \"content\": \"Barrier\",\r\n        \"description\": \"Barrier is an open-source software KVM (keyboard, video, and mouseswitch). It allows users to control multiple computers with a single keyboard and mouse, even if they have different operating systems.\",\r\n        \"link\": \"https://github.com/debauchee/barrier\",\r\n        \"winget\": \"DebaucheeOpenSourceGroup.Barrier\",\r\n        \"foss\": true\r\n    },\r\n    \"bat\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"bat\",\r\n        \"content\": \"Bat (Cat)\",\r\n        \"description\": \"Bat is a cat command clone with syntax highlighting. It provides a user-friendly and feature-rich alternative to the traditional cat command for viewing and concatenating files.\",\r\n        \"link\": \"https://github.com/sharkdp/bat\",\r\n        \"winget\": \"sharkdp.bat\",\r\n        \"foss\": true\r\n    },\r\n    \"beeper\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Beeper\",\r\n        \"description\": \"All your chats in one app.\",\r\n        \"link\": \"https://www.beeper.com/\",\r\n        \"winget\": \"Beeper.Beeper\"\r\n    },\r\n    \"bitwarden\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"bitwarden\",\r\n        \"content\": \"Bitwarden\",\r\n        \"description\": \"Bitwarden is an open-source password management solution. It allows users to store and manage their passwords in a secure and encrypted vault, accessible across multiple devices.\",\r\n        \"link\": \"https://bitwarden.com/\",\r\n        \"winget\": \"Bitwarden.Bitwarden\",\r\n        \"foss\": true\r\n    },\r\n    \"bleachbit\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"bleachbit\",\r\n        \"content\": \"BleachBit\",\r\n        \"description\": \"Clean Your System and Free Disk Space.\",\r\n        \"link\": \"https://www.bleachbit.org/\",\r\n        \"winget\": \"BleachBit.BleachBit\",\r\n        \"foss\": true\r\n    },\r\n    \"blender\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"blender\",\r\n        \"content\": \"Blender (3D Graphics)\",\r\n        \"description\": \"Blender is a powerful open-source 3D creation suite, offering modeling, sculpting, animation, and rendering tools.\",\r\n        \"link\": \"https://www.blender.org/\",\r\n        \"winget\": \"BlenderFoundation.Blender\",\r\n        \"foss\": true\r\n    },\r\n    \"brave\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"brave\",\r\n        \"content\": \"Brave\",\r\n        \"description\": \"Brave is a privacy-focused web browser that blocks ads and trackers, offering a faster and safer browsing experience.\",\r\n        \"link\": \"https://www.brave.com\",\r\n        \"winget\": \"Brave.Brave\",\r\n        \"foss\": true\r\n    },\r\n    \"bulkcrapuninstaller\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"bulk-crap-uninstaller\",\r\n        \"content\": \"Bulk Crap Uninstaller\",\r\n        \"description\": \"Bulk Crap Uninstaller is a free and open-source uninstaller utility for Windows. It helps users remove unwanted programs and clean up their system by uninstalling multiple applications at once.\",\r\n        \"link\": \"https://www.bcuninstaller.com/\",\r\n        \"winget\": \"Klocman.BulkCrapUninstaller\",\r\n        \"foss\": true\r\n    },\r\n    \"bulkrenameutility\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"bulkrenameutility\",\r\n        \"content\": \"Bulk Rename Utility\",\r\n        \"description\": \"Bulk Rename Utility allows you to easily rename files and folders recursively based upon find-replace, character place, fields, sequences, regular expressions, EXIF data, and more.\",\r\n        \"link\": \"https://www.bulkrenameutility.co.uk\",\r\n        \"winget\": \"TGRMNSoftware.BulkRenameUtility\"\r\n    },\r\n    \"buzz\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Buzz\",\r\n        \"description\": \"Offline audio transcription and translation desktop app powered by Whisper, packaged for Windows and available via WinGet.\",\r\n        \"link\": \"https://github.com/chidiwilliams/buzz\",\r\n        \"winget\": \"ChidiWilliams.Buzz\",\r\n        \"foss\": true\r\n    },\r\n    \"AdvancedRenamer\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"advanced-renamer\",\r\n        \"content\": \"Advanced Renamer\",\r\n        \"description\": \"Advanced Renamer is a program for renaming multiple files and folders at once. By configuring renaming methods the names can be manipulated in various ways.\",\r\n        \"link\": \"https://www.advancedrenamer.com/\",\r\n        \"winget\": \"HulubuluSoftware.AdvancedRenamer\"\r\n    },\r\n    \"citrixworkspaceapp\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"citrix-workspace\",\r\n        \"content\": \"Citrix Workspace app\",\r\n        \"description\": \"a secure, unified client application that provides instant access to virtual desktops, SaaS, web, and Windows apps from any device (Windows, macOS, Linux, iOS, Android) or browser.\",\r\n        \"link\": \"https://www.citrix.com/downloads/workspace-app/\",\r\n        \"winget\": \"Citrix.Workspace\",\r\n    },\r\n    \"calibre\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"calibre\",\r\n        \"content\": \"Calibre\",\r\n        \"description\": \"Calibre is a powerful and easy-to-use e-book manager, viewer, and converter.\",\r\n        \"link\": \"https://calibre-ebook.com/\",\r\n        \"winget\": \"calibre.calibre\",\r\n        \"foss\": true\r\n    },\r\n    \"carnac\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"carnac\",\r\n        \"content\": \"Carnac\",\r\n        \"description\": \"Carnac is a keystroke visualizer for Windows. It displays keystrokes in an overlay, making it useful for presentations, tutorials, and live demonstrations.\",\r\n        \"link\": \"https://carnackeys.com/\",\r\n        \"winget\": \"code52.Carnac\",\r\n        \"foss\": true\r\n    },\r\n    \"cemu\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"cemu\",\r\n        \"content\": \"Cemu\",\r\n        \"description\": \"Cemu is a highly experimental software to emulate Wii U applications on PC.\",\r\n        \"link\": \"https://cemu.info/\",\r\n        \"winget\": \"Cemu.Cemu\",\r\n        \"foss\": true\r\n    },\r\n    \"chatgpt\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"ChatGPT\",\r\n        \"description\": \"ChatGPT desktop app provides direct access to OpenAI's conversational AI assistant for writing, analysis, and productivity tasks.\",\r\n        \"link\": \"https://openai.com/chatgpt/desktop/\",\r\n        \"winget\": \"OpenAI.ChatGPT\"\r\n    },\r\n    \"chatterino\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"chatterino\",\r\n        \"content\": \"Chatterino\",\r\n        \"description\": \"Chatterino is a chat client for Twitch chat that offers a clean and customizable interface for a better streaming experience.\",\r\n        \"link\": \"https://www.chatterino.com/\",\r\n        \"winget\": \"ChatterinoTeam.Chatterino\",\r\n        \"foss\": true\r\n    },\r\n    \"chrome\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"googlechrome\",\r\n        \"content\": \"Chrome\",\r\n        \"description\": \"Google Chrome is a widely used web browser known for its speed, simplicity, and seamless integration with Google services.\",\r\n        \"link\": \"https://www.google.com/chrome/\",\r\n        \"winget\": \"Google.Chrome\"\r\n    },\r\n    \"chromium\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"chromium\",\r\n        \"content\": \"Chromium\",\r\n        \"description\": \"Chromium is the open-source project that serves as the foundation for various web browsers, including Chrome.\",\r\n        \"link\": \"https://github.com/Hibbiki/chromium-win64\",\r\n        \"winget\": \"Hibbiki.Chromium\",\r\n        \"foss\": true\r\n    },\r\n    \"claude\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"claude\",\r\n        \"content\": \"Claude\",\r\n        \"description\": \"Anthropic's Claude desktop application for Windows, designed for focused AI-assisted work and chat.\",\r\n        \"link\": \"https://claude.ai/\",\r\n        \"winget\": \"Anthropic.Claude\",\r\n        \"foss\": false\r\n    },\r\n    \"claude-code\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"claude-code\",\r\n        \"content\": \"Claude Code\",\r\n        \"description\": \"Anthropic's agentic coding tool for the terminal/IDE workflows, available on Windows and distributed via WinGet.\",\r\n        \"link\": \"https://code.claude.com/\",\r\n        \"winget\": \"Anthropic.ClaudeCode\",\r\n        \"foss\": false\r\n    },\r\n    \"clementine\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"clementine\",\r\n        \"content\": \"Clementine\",\r\n        \"description\": \"Clementine is a modern music player and library organizer, supporting various audio formats and online radio services.\",\r\n        \"link\": \"https://www.clementine-player.org/\",\r\n        \"winget\": \"Clementine.Clementine\",\r\n        \"foss\": true\r\n    },\r\n    \"clink\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"clink\",\r\n        \"content\": \"Clink\",\r\n        \"description\": \"Clink is a powerful Bash-compatible command-line interface (CLIenhancement for Windows, adding features like syntax highlighting and improved history).\",\r\n        \"link\": \"https://mridgers.github.io/clink/\",\r\n        \"winget\": \"chrisant996.Clink\",\r\n        \"foss\": true\r\n    },\r\n    \"clonehero\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Clone Hero\",\r\n        \"description\": \"Clone Hero is a free rhythm game, which can be played with any 5 or 6 button guitar controller.\",\r\n        \"link\": \"https://clonehero.net/\",\r\n        \"winget\": \"CloneHeroTeam.CloneHero\"\r\n    },\r\n    \"cmake\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"cmake\",\r\n        \"content\": \"CMake\",\r\n        \"description\": \"CMake is an open-source, cross-platform family of tools designed to build, test and package software.\",\r\n        \"link\": \"https://cmake.org/\",\r\n        \"winget\": \"Kitware.CMake\",\r\n        \"foss\": true\r\n    },\r\n    \"copyq\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"copyq\",\r\n        \"content\": \"CopyQ (Clipboard Manager)\",\r\n        \"description\": \"CopyQ is a clipboard manager with advanced features, allowing you to store, edit, and retrieve clipboard history.\",\r\n        \"link\": \"https://copyq.readthedocs.io/\",\r\n        \"winget\": \"hluk.CopyQ\",\r\n        \"foss\": true\r\n    },\r\n    \"cpuz\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"cpu-z\",\r\n        \"content\": \"CPU-Z\",\r\n        \"description\": \"CPU-Z is a system monitoring and diagnostic tool for Windows. It provides detailed information about the computer's hardware components, including the CPU, memory, and motherboard.\",\r\n        \"link\": \"https://www.cpuid.com/softwares/cpu-z.html\",\r\n        \"winget\": \"CPUID.CPU-Z\"\r\n    },\r\n    \"crystaldiskinfo\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"crystaldiskinfo\",\r\n        \"content\": \"Crystal Disk Info\",\r\n        \"description\": \"Crystal Disk Info is a disk health monitoring tool that provides information about the status and performance of hard drives. It helps users anticipate potential issues and monitor drive health.\",\r\n        \"link\": \"https://crystalmark.info/en/software/crystaldiskinfo/\",\r\n        \"winget\": \"CrystalDewWorld.CrystalDiskInfo\",\r\n        \"foss\": true\r\n    },\r\n    \"capframex\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"CapFrameX\",\r\n        \"description\": \"Frametimes capture and analysis tool based on Intel's PresentMon. Overlay provided by Rivatuner Statistics Server.\",\r\n        \"link\": \"https://www.capframex.com/\",\r\n        \"winget\": \"CXWorld.CapFrameX\",\r\n        \"foss\": true\r\n    },\r\n    \"crystaldiskmark\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"crystaldiskmark\",\r\n        \"content\": \"Crystal Disk Mark\",\r\n        \"description\": \"Crystal Disk Mark is a disk benchmarking tool that measures the read and write speeds of storage devices. It helps users assess the performance of their hard drives and SSDs.\",\r\n        \"link\": \"https://crystalmark.info/en/software/crystaldiskmark/\",\r\n        \"winget\": \"CrystalDewWorld.CrystalDiskMark\",\r\n        \"foss\": true\r\n    },\r\n    \"cursor\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"cursoride\",\r\n        \"content\": \"Cursor\",\r\n        \"description\": \"AI-powered code editor (VS Code-based) with agentic coding features and integrated AI assistance for development workflows.\",\r\n        \"link\": \"https://cursor.com/\",\r\n        \"winget\": \"Anysphere.Cursor\",\r\n        \"foss\": false\r\n    },\r\n    \"darktable\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"darktable\",\r\n        \"content\": \"darktable\",\r\n        \"description\": \"Open-source photo editing tool, offering an intuitive interface, advanced editing capabilities, and a non-destructive workflow for seamless image enhancement.\",\r\n        \"link\": \"https://www.darktable.org/install/\",\r\n        \"winget\": \"darktable.darktable\",\r\n        \"foss\": true\r\n    },\r\n    \"DaxStudio\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"daxstudio\",\r\n        \"content\": \"DaxStudio\",\r\n        \"description\": \"DAX (Data Analysis eXpressions) Studio is the ultimate tool for executing and analyzing DAX queries against Microsoft Tabular models.\",\r\n        \"link\": \"https://daxstudio.org/\",\r\n        \"winget\": \"DaxStudio.DaxStudio\",\r\n        \"foss\": true\r\n    },\r\n    \"ddu\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"ddu\",\r\n        \"content\": \"Display Driver Uninstaller\",\r\n        \"description\": \"Display Driver Uninstaller (DDU) is a tool for completely uninstalling graphics drivers from NVIDIA, AMD, and Intel. It is useful for troubleshooting graphics driver-related issues.\",\r\n        \"link\": \"https://www.wagnardsoft.com/display-driver-uninstaller-DDU-\",\r\n        \"winget\": \"Wagnardsoft.DisplayDriverUninstaller\"\r\n    },\r\n    \"deepl\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"deepl\",\r\n        \"content\": \"DeepL\",\r\n        \"description\": \"DeepL desktop translation and writing assistant for Windows, including shortcuts and in-app writing improvement features.\",\r\n        \"link\": \"https://www.deepl.com/en/windows-app\",\r\n        \"winget\": \"DeepL.DeepL\",\r\n        \"foss\": false\r\n    },\r\n    \"deluge\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"deluge\",\r\n        \"content\": \"Deluge\",\r\n        \"description\": \"Deluge is a free and open-source BitTorrent client. It features a user-friendly interface, support for plugins, and the ability to manage torrents remotely.\",\r\n        \"link\": \"https://deluge-torrent.org/\",\r\n        \"winget\": \"DelugeTeam.Deluge\",\r\n        \"foss\": true\r\n    },\r\n    \"devtoys\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"devtoys\",\r\n        \"content\": \"DevToys\",\r\n        \"description\": \"DevToys is a collection of development-related utilities and tools for Windows. It includes tools for file management, code formatting, and productivity enhancements for developers.\",\r\n        \"link\": \"https://devtoys.app/\",\r\n        \"winget\": \"DevToys-app.DevToys\",\r\n        \"foss\": true\r\n    },\r\n    \"digikam\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"digikam\",\r\n        \"content\": \"digiKam\",\r\n        \"description\": \"digiKam is an advanced open-source photo management software with features for organizing, editing, and sharing photos.\",\r\n        \"link\": \"https://www.digikam.org/\",\r\n        \"winget\": \"KDE.digikam\",\r\n        \"foss\": true\r\n    },\r\n    \"discord\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"discord\",\r\n        \"content\": \"Discord\",\r\n        \"description\": \"Discord is a popular communication platform with voice, video, and text chat, designed for gamers but used by a wide range of communities.\",\r\n        \"link\": \"https://discord.com/\",\r\n        \"winget\": \"Discord.Discord\"\r\n    },\r\n    \"dismtools\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"DISMTools\",\r\n        \"description\": \"DISMTools is a fast, customizable GUI for the DISM utility, supporting Windows images from Windows 7 onward. It handles installations on any drive, offers project support, and lets users tweak settings like color modes, language, and DISM versions; powered by both native DISM and a managed DISM API.\",\r\n        \"link\": \"https://github.com/CodingWonders/DISMTools\",\r\n        \"winget\": \"CodingWondersSoftware.DISMTools.Stable\",\r\n        \"foss\": true\r\n    },\r\n    \"ntlite\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"ntlite-free\",\r\n        \"content\": \"NTLite\",\r\n        \"description\": \"Integrate updates, drivers, automate Windows and application setup, speedup Windows deployment process and have it all set for the next time.\",\r\n        \"link\": \"https://ntlite.com\",\r\n        \"winget\": \"Nlitesoft.NTLite\"\r\n    },\r\n    \"ditto\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"ditto\",\r\n        \"content\": \"Ditto\",\r\n        \"description\": \"Ditto is an extension to the standard windows clipboard.\",\r\n        \"link\": \"https://github.com/sabrogden/Ditto\",\r\n        \"winget\": \"Ditto.Ditto\",\r\n        \"foss\": true\r\n    },\r\n    \"dockerdesktop\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"docker-desktop\",\r\n        \"content\": \"Docker Desktop\",\r\n        \"description\": \"Docker Desktop is a powerful tool for containerized application development and deployment.\",\r\n        \"link\": \"https://www.docker.com/products/docker-desktop\",\r\n        \"winget\": \"Docker.DockerDesktop\"\r\n    },\r\n    \"dotnet3\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"dotnetcore3-desktop-runtime\",\r\n        \"content\": \".NET Desktop Runtime 3.1\",\r\n        \"description\": \".NET Desktop Runtime 3.1 is a runtime environment required for running applications developed with .NET Core 3.1.\",\r\n        \"link\": \"https://dotnet.microsoft.com/download/dotnet/3.1\",\r\n        \"winget\": \"Microsoft.DotNet.DesktopRuntime.3_1\"\r\n    },\r\n    \"dotnet5\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"dotnet-5.0-runtime\",\r\n        \"content\": \".NET Desktop Runtime 5\",\r\n        \"description\": \".NET Desktop Runtime 5 is a runtime environment required for running applications developed with .NET 5.\",\r\n        \"link\": \"https://dotnet.microsoft.com/download/dotnet/5.0\",\r\n        \"winget\": \"Microsoft.DotNet.DesktopRuntime.5\"\r\n    },\r\n    \"dotnet6\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"dotnet-6.0-runtime\",\r\n        \"content\": \".NET Desktop Runtime 6\",\r\n        \"description\": \".NET Desktop Runtime 6 is a runtime environment required for running applications developed with .NET 6.\",\r\n        \"link\": \"https://dotnet.microsoft.com/download/dotnet/6.0\",\r\n        \"winget\": \"Microsoft.DotNet.DesktopRuntime.6\"\r\n    },\r\n    \"dotnet7\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"dotnet-7.0-runtime\",\r\n        \"content\": \".NET Desktop Runtime 7\",\r\n        \"description\": \".NET Desktop Runtime 7 is a runtime environment required for running applications developed with .NET 7.\",\r\n        \"link\": \"https://dotnet.microsoft.com/download/dotnet/7.0\",\r\n        \"winget\": \"Microsoft.DotNet.DesktopRuntime.7\"\r\n    },\r\n    \"dotnet8\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"dotnet-8.0-runtime\",\r\n        \"content\": \".NET Desktop Runtime 8\",\r\n        \"description\": \".NET Desktop Runtime 8 is a runtime environment required for running applications developed with .NET 8.\",\r\n        \"link\": \"https://dotnet.microsoft.com/download/dotnet/8.0\",\r\n        \"winget\": \"Microsoft.DotNet.DesktopRuntime.8\"\r\n    },\r\n    \"dotnet9\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"dotnet-9.0-runtime\",\r\n        \"content\": \".NET Desktop Runtime 9\",\r\n        \"description\": \".NET Desktop Runtime 9 is a runtime environment required for running applications developed with .NET 9.\",\r\n        \"link\": \"https://dotnet.microsoft.com/download/dotnet/9.0\",\r\n        \"winget\": \"Microsoft.DotNet.DesktopRuntime.9\"\r\n    },\r\n    \"dotnet10\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"dotnet-10.0-runtime\",\r\n        \"content\": \".NET Desktop Runtime 10\",\r\n        \"description\": \".NET Desktop Runtime 10 is a runtime environment required for running applications developed with .NET 10.\",\r\n        \"link\": \"https://dotnet.microsoft.com/download/dotnet/10.0\",\r\n        \"winget\": \"Microsoft.DotNet.DesktopRuntime.10\"\r\n    },\r\n    \"dmt\": {\r\n        \"winget\": \"GNE.DualMonitorTools\",\r\n        \"choco\": \"dual-monitor-tools\",\r\n        \"category\": \"Utilities\",\r\n        \"content\": \"Dual Monitor Tools\",\r\n        \"link\": \"https://dualmonitortool.sourceforge.net/\",\r\n        \"description\": \"Dual Monitor Tools (DMT) is a FOSS app that allows you to customize the handling of multiple monitors. Useful for fullscreen games and apps that handle a second monitor poorly and can improve your workflow.\",\r\n        \"foss\": true\r\n    },\r\n    \"duplicati\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"duplicati\",\r\n        \"content\": \"Duplicati\",\r\n        \"description\": \"Duplicati is an open-source backup solution that supports encrypted, compressed, and incremental backups. It is designed to securely store data on cloud storage services.\",\r\n        \"link\": \"https://www.duplicati.com/\",\r\n        \"winget\": \"Duplicati.Duplicati\",\r\n        \"foss\": true\r\n    },\r\n    \"eaapp\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"ea-app\",\r\n        \"content\": \"EA App\",\r\n        \"description\": \"EA App is a platform for accessing and playing Electronic Arts games.\",\r\n        \"link\": \"https://www.ea.com/ea-app\",\r\n        \"winget\": \"ElectronicArts.EADesktop\"\r\n    },\r\n    \"eartrumpet\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"eartrumpet\",\r\n        \"content\": \"EarTrumpet (Audio)\",\r\n        \"description\": \"EarTrumpet is an audio control app for Windows, providing a simple and intuitive interface for managing sound settings.\",\r\n        \"link\": \"https://eartrumpet.app/\",\r\n        \"winget\": \"File-New-Project.EarTrumpet\",\r\n        \"foss\": true\r\n    },\r\n    \"edge\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"microsoft-edge\",\r\n        \"content\": \"Edge\",\r\n        \"description\": \"Microsoft Edge is a modern web browser built on Chromium, offering performance, security, and integration with Microsoft services.\",\r\n        \"link\": \"https://www.microsoft.com/edge\",\r\n        \"winget\": \"Microsoft.Edge\"\r\n    },\r\n    \"efibooteditor\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"EFI Boot Editor\",\r\n        \"description\": \"EFI Boot Editor is a tool for managing the EFI/UEFI boot entries on your system. It allows you to customize the boot configuration of your computer.\",\r\n        \"link\": \"https://www.easyuefi.com/\",\r\n        \"winget\": \"EFIBootEditor.EFIBootEditor\"\r\n    },\r\n    \"emulationstation\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"emulationstation\",\r\n        \"content\": \"Emulation Station\",\r\n        \"description\": \"Emulation Station is a graphical and themeable emulator front-end that allows you to access all your favorite games in one place.\",\r\n        \"link\": \"https://emulationstation.org/\",\r\n        \"winget\": \"Emulationstation.Emulationstation\",\r\n        \"foss\": true\r\n    },\r\n    \"enteauth\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"ente-auth\",\r\n        \"content\": \"Ente Auth\",\r\n        \"description\": \"Ente Auth is a free, cross-platform, end-to-end encrypted authenticator app.\",\r\n        \"link\": \"https://ente.io/auth/\",\r\n        \"winget\": \"ente-io.auth-desktop\",\r\n        \"foss\": true\r\n    },\r\n    \"epicgames\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"epicgameslauncher\",\r\n        \"content\": \"Epic Games Launcher\",\r\n        \"description\": \"Epic Games Launcher is the client for accessing and playing games from the Epic Games Store.\",\r\n        \"link\": \"https://www.epicgames.com/store/en-US/\",\r\n        \"winget\": \"EpicGames.EpicGamesLauncher\"\r\n    },\r\n    \"esearch\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"everything\",\r\n        \"content\": \"Everything Search\",\r\n        \"description\": \"Everything Search is a fast and efficient file search utility for Windows.\",\r\n        \"link\": \"https://www.voidtools.com/\",\r\n        \"winget\": \"voidtools.Everything\"\r\n    },\r\n    \"espanso\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"espanso\",\r\n        \"content\": \"Espanso\",\r\n        \"description\": \"Cross-platform and open-source Text Expander written in Rust.\",\r\n        \"link\": \"https://espanso.org/\",\r\n        \"winget\": \"Espanso.Espanso\",\r\n        \"foss\": true\r\n    },\r\n    \"ffmpeg\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"FFmpeg Batch AV Converter\",\r\n        \"description\": \"FFmpeg Batch AV Converter is a universal audio and video encoder, that allows to use the full potential of ffmpeg command line with a few mouse clicks in a convenient GUI with drag and drop, progress information.\",\r\n        \"link\": \"https://ffmpeg-batch.sourceforge.io/\",\r\n        \"winget\": \"eibol.FFmpegBatchAVConverter\",\r\n        \"foss\": true\r\n    },\r\n    \"falkon\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"falkon\",\r\n        \"content\": \"Falkon\",\r\n        \"description\": \"Falkon is a lightweight and fast web browser with a focus on user privacy and efficiency.\",\r\n        \"link\": \"https://www.falkon.org/\",\r\n        \"winget\": \"KDE.Falkon\",\r\n        \"foss\": true\r\n    },\r\n    \"fastfetch\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Fastfetch\",\r\n        \"description\": \"Fastfetch is a neofetch-like tool for fetching system information and displaying them in a pretty way.\",\r\n        \"link\": \"https://github.com/fastfetch-cli/fastfetch/\",\r\n        \"winget\": \"Fastfetch-cli.Fastfetch\",\r\n        \"foss\": true\r\n    },\r\n    \"ferdium\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"ferdium\",\r\n        \"content\": \"Ferdium\",\r\n        \"description\": \"Ferdium is a messaging application that combines multiple messaging services into a single app for easy management.\",\r\n        \"link\": \"https://ferdium.org/\",\r\n        \"winget\": \"Ferdium.Ferdium\",\r\n        \"foss\": true\r\n    },\r\n    \"ffmpeg-full\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"ffmpeg-full\",\r\n        \"content\": \"FFmpeg (full)\",\r\n        \"description\": \"FFmpeg is a powerful multimedia processing tool that enables users to convert, edit, and stream audio and video files with a vast range of codecs and formats. | Note: FFmpeg can not be uninstalled using winget.\",\r\n        \"link\": \"https://ffmpeg.org/\",\r\n        \"winget\": \"Gyan.FFmpeg\"\r\n    },\r\n    \"fileconverter\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"file-converter\",\r\n        \"content\": \"File-Converter\",\r\n        \"description\": \"File Converter is a very simple tool which allows you to convert and compress one or several file(s) using the context menu in Windows Explorer.\",\r\n        \"link\": \"https://file-converter.io/\",\r\n        \"winget\": \"AdrienAllard.FileConverter\",\r\n        \"foss\": true\r\n    },\r\n    \"files\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"files\",\r\n        \"content\": \"Files\",\r\n        \"description\": \"Alternative file explorer.\",\r\n        \"link\": \"https://github.com/files-community/Files\",\r\n        \"winget\": \"na\",\r\n        \"foss\": true\r\n    },\r\n    \"firealpaca\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"firealpaca\",\r\n        \"content\": \"Fire Alpaca\",\r\n        \"description\": \"Fire Alpaca is a free digital painting software that provides a wide range of drawing tools and a user-friendly interface.\",\r\n        \"link\": \"https://firealpaca.com/\",\r\n        \"winget\": \"FireAlpaca.FireAlpaca\"\r\n    },\r\n    \"firefox\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"firefox\",\r\n        \"content\": \"Firefox\",\r\n        \"description\": \"Mozilla Firefox is an open-source web browser known for its customization options, privacy features, and extensions.\",\r\n        \"link\": \"https://www.mozilla.org/en-US/firefox/new/\",\r\n        \"winget\": \"Mozilla.Firefox\",\r\n        \"foss\": true\r\n    },\r\n    \"firefoxesr\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"FirefoxESR\",\r\n        \"content\": \"Firefox ESR\",\r\n        \"description\": \"Mozilla Firefox is an open-source web browser known for its customization options, privacy features, and extensions. Firefox ESR (Extended Support Release) receives major updates every 42 weeks with minor updates such as crash fixes, security fixes and policy updates as needed, but at least every four weeks.\",\r\n        \"link\": \"https://www.mozilla.org/en-US/firefox/enterprise/\",\r\n        \"winget\": \"Mozilla.Firefox.ESR\",\r\n        \"foss\": true\r\n    },\r\n    \"flameshot\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"flameshot\",\r\n        \"content\": \"Flameshot (Screenshots)\",\r\n        \"description\": \"Flameshot is a powerful yet simple to use screenshot software, offering annotation and editing features.\",\r\n        \"link\": \"https://flameshot.org/\",\r\n        \"winget\": \"Flameshot.Flameshot\",\r\n        \"foss\": true\r\n    },\r\n    \"lightshot\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"lightshot\",\r\n        \"content\": \"Lightshot (Screenshots)\",\r\n        \"description\": \"Ligthshot is an easy-to-use, light-weight screenshot software tool, where you can optionally edit your screenshots using different tools, share them via Internet and/or save to disk, and customize the available options.\",\r\n        \"link\": \"https://app.prntscr.com/\",\r\n        \"winget\": \"Skillbrains.Lightshot\"\r\n    },\r\n    \"floorp\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Floorp\",\r\n        \"description\": \"Floorp is an open-source web browser project that aims to provide a simple and fast browsing experience.\",\r\n        \"link\": \"https://floorp.app/\",\r\n        \"winget\": \"Ablaze.Floorp\",\r\n        \"foss\": true\r\n    },\r\n    \"flow\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"flow-launcher\",\r\n        \"content\": \"Flow launcher\",\r\n        \"description\": \"Keystroke launcher for Windows to search, manage and launch files, folders bookmarks, websites and more.\",\r\n        \"link\": \"https://www.flowlauncher.com/\",\r\n        \"winget\": \"Flow-Launcher.Flow-Launcher\",\r\n        \"foss\": true\r\n    },\r\n    \"flux\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"flux\",\r\n        \"content\": \"F.lux\",\r\n        \"description\": \"f.lux adjusts the color temperature of your screen to reduce eye strain during nighttime use.\",\r\n        \"link\": \"https://justgetflux.com/\",\r\n        \"winget\": \"flux.flux\"\r\n    },\r\n    \"foobar\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"foobar2000\",\r\n        \"content\": \"foobar2000 (Music Player)\",\r\n        \"description\": \"foobar2000 is a highly customizable and extensible music player for Windows, known for its modular design and advanced features.\",\r\n        \"link\": \"https://www.foobar2000.org/\",\r\n        \"winget\": \"PeterPawlowski.foobar2000\"\r\n    },\r\n    \"foxpdfeditor\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Foxit PDF Editor\",\r\n        \"description\": \"Foxit PDF Editor is a feature-rich PDF editor and viewer with a familiar ribbon-style interface.\",\r\n        \"link\": \"https://www.foxit.com/pdf-editor/\",\r\n        \"winget\": \"Foxit.PhantomPDF\"\r\n    },\r\n    \"foxpdfreader\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"foxitreader\",\r\n        \"content\": \"Foxit PDF Reader\",\r\n        \"description\": \"Foxit PDF Reader is a free PDF viewer with a familiar ribbon-style interface.\",\r\n        \"link\": \"https://www.foxit.com/pdf-reader/\",\r\n        \"winget\": \"Foxit.FoxitReader\"\r\n    },\r\n    \"freecad\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"freecad\",\r\n        \"content\": \"FreeCAD\",\r\n        \"description\": \"FreeCAD is a parametric 3D CAD modeler, designed for product design and engineering tasks, with a focus on flexibility and extensibility.\",\r\n        \"link\": \"https://www.freecadweb.org/\",\r\n        \"winget\": \"FreeCAD.FreeCAD\",\r\n        \"foss\": true\r\n    },\r\n    \"fxsound\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"fxsound\",\r\n        \"content\": \"FxSound\",\r\n        \"description\": \"FxSound is free open-source software to boost sound quality, volume, and bass. Including an equalizer, effects, and presets for customized audio.\",\r\n        \"link\": \"https://www.fxsound.com/\",\r\n        \"winget\": \"FxSound.FxSound\",\r\n        \"foss\": true\r\n    },\r\n    \"fzf\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"fzf\",\r\n        \"content\": \"Fzf\",\r\n        \"description\": \"A command-line fuzzy finder.\",\r\n        \"link\": \"https://github.com/junegunn/fzf/\",\r\n        \"winget\": \"junegunn.fzf\",\r\n        \"foss\": true\r\n    },\r\n    \"geforcenow\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"nvidia-geforce-now\",\r\n        \"content\": \"GeForce NOW\",\r\n        \"description\": \"GeForce NOW is a cloud gaming service that allows you to play high-quality PC games on your device.\",\r\n        \"link\": \"https://www.nvidia.com/en-us/geforce-now/\",\r\n        \"winget\": \"Nvidia.GeForceNow\"\r\n    },\r\n    \"gimp\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"gimp\",\r\n        \"content\": \"GIMP (Image Editor)\",\r\n        \"description\": \"GIMP is a versatile open-source raster graphics editor used for tasks such as photo retouching, image editing, and image composition.\",\r\n        \"link\": \"https://www.gimp.org/\",\r\n        \"winget\": \"GIMP.GIMP.3\",\r\n        \"foss\": true\r\n    },\r\n    \"git\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"git\",\r\n        \"content\": \"Git\",\r\n        \"description\": \"Git is a distributed version control system widely used for tracking changes in source code during software development.\",\r\n        \"link\": \"https://git-scm.com/\",\r\n        \"winget\": \"Git.Git\",\r\n        \"foss\": true\r\n    },\r\n    \"gitbutler\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Git Butler\",\r\n        \"description\": \"A Git client for simultaneous branches on top of your existing workflow.\",\r\n        \"link\": \"https://gitbutler.com/\",\r\n        \"winget\": \"GitButler.GitButler\"\r\n    },\r\n    \"gitextensions\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"git;gitextensions\",\r\n        \"content\": \"Git Extensions\",\r\n        \"description\": \"Git Extensions is a graphical user interface for Git, providing additional features for easier source code management.\",\r\n        \"link\": \"https://gitextensions.github.io/\",\r\n        \"winget\": \"GitExtensionsTeam.GitExtensions\"\r\n    },\r\n    \"githubcli\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"git;gh\",\r\n        \"content\": \"GitHub CLI\",\r\n        \"description\": \"GitHub CLI is a command-line tool that simplifies working with GitHub directly from the terminal.\",\r\n        \"link\": \"https://cli.github.com/\",\r\n        \"winget\": \"GitHub.cli\",\r\n        \"foss\": true\r\n    },\r\n    \"github-copilot-cli\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"GitHub Copilot CLI\",\r\n        \"description\": \"GitHub Copilot experience for the command line: natural-language assistance for commands and development tasks; distributed via WinGet.\",\r\n        \"link\": \"https://github.com/github/copilot-cli\",\r\n        \"winget\": \"GitHub.Copilot\",\r\n        \"foss\": false\r\n    },\r\n    \"githubdesktop\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"git;github-desktop\",\r\n        \"content\": \"GitHub Desktop\",\r\n        \"description\": \"GitHub Desktop is a visual Git client that simplifies collaboration on GitHub repositories with an easy-to-use interface.\",\r\n        \"link\": \"https://desktop.github.com/\",\r\n        \"winget\": \"GitHub.GitHubDesktop\",\r\n        \"foss\": true\r\n    },\r\n    \"gitkrakenclient\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"gitkraken\",\r\n        \"content\": \"GitKraken Client\",\r\n        \"description\": \"GitKraken Client is a powerful visual Git client from Axosoft that works with ALL git repositories on any hosting environment.\",\r\n        \"link\": \"https://www.gitkraken.com/git-client\",\r\n        \"winget\": \"Axosoft.GitKraken\"\r\n    },\r\n    \"glaryutilities\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"glaryutilities-free\",\r\n        \"content\": \"Glary Utilities\",\r\n        \"description\": \"Glary Utilities is a comprehensive system optimization and maintenance tool for Windows.\",\r\n        \"link\": \"https://www.glarysoft.com/glary-utilities/\",\r\n        \"winget\": \"Glarysoft.GlaryUtilities\"\r\n    },\r\n    \"godotengine\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"godot\",\r\n        \"content\": \"Godot Engine\",\r\n        \"description\": \"Godot Engine is a free, open-source 2D and 3D game engine with a focus on usability and flexibility.\",\r\n        \"link\": \"https://godotengine.org/\",\r\n        \"winget\": \"GodotEngine.GodotEngine\",\r\n        \"foss\": true\r\n    },\r\n    \"gog\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"goggalaxy\",\r\n        \"content\": \"GOG Galaxy\",\r\n        \"description\": \"GOG Galaxy is a gaming client that offers DRM-free games, additional content, and more.\",\r\n        \"link\": \"https://www.gog.com/galaxy\",\r\n        \"winget\": \"GOG.Galaxy\"\r\n    },\r\n    \"gitify\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Gitify\",\r\n        \"description\": \"GitHub notifications on your menu bar.\",\r\n        \"link\": \"https://www.gitify.io/\",\r\n        \"winget\": \"Gitify.Gitify\",\r\n        \"foss\": true\r\n    },\r\n    \"golang\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"golang\",\r\n        \"content\": \"Go\",\r\n        \"description\": \"Go (or Golang) is a statically typed, compiled programming language designed for simplicity, reliability, and efficiency.\",\r\n        \"link\": \"https://go.dev/\",\r\n        \"winget\": \"GoLang.Go\",\r\n        \"foss\": true\r\n    },\r\n    \"googledrive\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"googledrive\",\r\n        \"content\": \"Google Drive\",\r\n        \"description\": \"File syncing across devices all tied to your Google account.\",\r\n        \"link\": \"https://www.google.com/drive/\",\r\n        \"winget\": \"Google.GoogleDrive\"\r\n    },\r\n    \"gpt4all\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"gpt4all\",\r\n        \"content\": \"GPT4All\",\r\n        \"description\": \"Open-source desktop application to run LLMs locally with an emphasis on privacy (MIT-licensed codebase).\",\r\n        \"link\": \"https://nomic.ai/gpt4all\",\r\n        \"winget\": \"nomic.gpt4all\",\r\n        \"foss\": true\r\n    },\r\n    \"gpuz\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"gpu-z\",\r\n        \"content\": \"GPU-Z\",\r\n        \"description\": \"GPU-Z provides detailed information about your graphics card and GPU.\",\r\n        \"link\": \"https://www.techpowerup.com/gpuz/\",\r\n        \"winget\": \"TechPowerUp.GPU-Z\"\r\n    },\r\n    \"greenshot\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"greenshot\",\r\n        \"content\": \"Greenshot (Screenshots)\",\r\n        \"description\": \"Greenshot is a light-weight screenshot software tool with built-in image editor and customizable capture options.\",\r\n        \"link\": \"https://getgreenshot.org/\",\r\n        \"winget\": \"Greenshot.Greenshot\",\r\n        \"foss\": true\r\n    },\r\n    \"gsudo\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"gsudo\",\r\n        \"content\": \"Gsudo\",\r\n        \"description\": \"Gsudo is a sudo implementation for Windows, allowing elevated privilege execution.\",\r\n        \"link\": \"https://gerardog.github.io/gsudo/\",\r\n        \"winget\": \"gerardog.gsudo\"\r\n    },\r\n    \"handbrake\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"handbrake\",\r\n        \"content\": \"HandBrake\",\r\n        \"description\": \"HandBrake is an open-source video transcoder, allowing you to convert video from nearly any format to a selection of widely supported codecs.\",\r\n        \"link\": \"https://handbrake.fr/\",\r\n        \"winget\": \"HandBrake.HandBrake\",\r\n        \"foss\": true\r\n    },\r\n    \"harmonoid\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Harmonoid\",\r\n        \"description\": \"Plays and manages your music library. Looks beautiful and juicy. Playlists, visuals, synced lyrics, pitch shift, volume boost and more.\",\r\n        \"link\": \"https://harmonoid.com/\",\r\n        \"winget\": \"Harmonoid.Harmonoid\",\r\n        \"foss\": true\r\n    },\r\n    \"heidisql\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"heidisql\",\r\n        \"content\": \"HeidiSQL\",\r\n        \"description\": \"HeidiSQL is a powerful and easy-to-use client for MySQL, MariaDB, Microsoft SQL Server, and PostgreSQL databases. It provides tools for database management and development.\",\r\n        \"link\": \"https://www.heidisql.com/\",\r\n        \"winget\": \"HeidiSQL.HeidiSQL\",\r\n        \"foss\": true\r\n    },\r\n    \"helix\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"helix\",\r\n        \"content\": \"Helix\",\r\n        \"description\": \"Helix is a neovim alternative built in Rust.\",\r\n        \"link\": \"https://helix-editor.com/\",\r\n        \"winget\": \"Helix.Helix\",\r\n        \"foss\": true\r\n    },\r\n    \"heroiclauncher\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Heroic Games Launcher\",\r\n        \"description\": \"Heroic Games Launcher is an open-source alternative game launcher for Epic Games Store.\",\r\n        \"link\": \"https://heroicgameslauncher.com/\",\r\n        \"winget\": \"HeroicGamesLauncher.HeroicGamesLauncher\",\r\n        \"foss\": true\r\n    },\r\n    \"hexchat\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"hexchat\",\r\n        \"content\": \"Hexchat\",\r\n        \"description\": \"HexChat is a free, open-source IRC (Internet Relay Chat) client with a graphical interface for easy communication.\",\r\n        \"link\": \"https://hexchat.github.io/\",\r\n        \"winget\": \"HexChat.HexChat\",\r\n        \"foss\": true\r\n    },\r\n    \"hwinfo\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"hwinfo\",\r\n        \"content\": \"HWiNFO\",\r\n        \"description\": \"HWiNFO provides comprehensive hardware information and diagnostics for Windows.\",\r\n        \"link\": \"https://www.hwinfo.com/\",\r\n        \"winget\": \"REALiX.HWiNFO\"\r\n    },\r\n    \"hwmonitor\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"hwmonitor\",\r\n        \"content\": \"HWMonitor\",\r\n        \"description\": \"HWMonitor is a hardware monitoring program that reads PC systems main health sensors.\",\r\n        \"link\": \"https://www.cpuid.com/softwares/hwmonitor.html\",\r\n        \"winget\": \"CPUID.HWMonitor\"\r\n    },\r\n    \"imhex\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"ImHex (Hex Editor)\",\r\n        \"description\": \"A modern, featureful Hex Editor for Reverse Engineers and Developers.\",\r\n        \"link\": \"https://imhex.werwolv.net/\",\r\n        \"winget\": \"WerWolv.ImHex\",\r\n        \"foss\": true\r\n    },\r\n    \"imageglass\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"imageglass\",\r\n        \"content\": \"ImageGlass (Image Viewer)\",\r\n        \"description\": \"ImageGlass is a versatile image viewer with support for various image formats and a focus on simplicity and speed.\",\r\n        \"link\": \"https://imageglass.org/\",\r\n        \"winget\": \"DuongDieuPhap.ImageGlass\",\r\n        \"foss\": true\r\n    },\r\n    \"imgburn\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"imgburn\",\r\n        \"content\": \"ImgBurn\",\r\n        \"description\": \"ImgBurn is a lightweight CD, DVD, HD-DVD, and Blu-ray burning application with advanced features for creating and burning disc images.\",\r\n        \"link\": \"https://www.imgburn.com/\",\r\n        \"winget\": \"LIGHTNINGUK.ImgBurn\"\r\n    },\r\n    \"inkscape\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"inkscape\",\r\n        \"content\": \"Inkscape\",\r\n        \"description\": \"Inkscape is a powerful open-source vector graphics editor, suitable for tasks such as illustrations, icons, logos, and more.\",\r\n        \"link\": \"https://inkscape.org/\",\r\n        \"winget\": \"Inkscape.Inkscape\",\r\n        \"foss\": true\r\n    },\r\n    \"itch\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"itch\",\r\n        \"content\": \"Itch.io\",\r\n        \"description\": \"Itch.io is a digital distribution platform for indie games and creative projects.\",\r\n        \"link\": \"https://itch.io/\",\r\n        \"winget\": \"ItchIo.Itch\",\r\n        \"foss\": true\r\n    },\r\n    \"itunes\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"itunes\",\r\n        \"content\": \"iTunes\",\r\n        \"description\": \"iTunes is a media player, media library, and online radio broadcaster application developed by Apple Inc.\",\r\n        \"link\": \"https://www.apple.com/itunes/\",\r\n        \"winget\": \"Apple.iTunes\"\r\n    },\r\n    \"jami\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"jami\",\r\n        \"content\": \"Jami\",\r\n        \"description\": \"Jami is a secure and privacy-focused communication platform that offers audio and video calls, messaging, and file sharing.\",\r\n        \"link\": \"https://jami.net/\",\r\n        \"winget\": \"SFLinux.Jami\",\r\n        \"foss\": true\r\n    },\r\n    \"jan\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"jan\",\r\n        \"content\": \"Jan\",\r\n        \"description\": \"Open-source ChatGPT alternative that runs on your computer (offline-first desktop AI assistant / local model runner).\",\r\n        \"link\": \"https://jan.ai/\",\r\n        \"winget\": \"Jan.Jan\",\r\n        \"foss\": true\r\n    },\r\n    \"java8\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"corretto8jdk\",\r\n        \"content\": \"Amazon Corretto 8 (LTS)\",\r\n        \"description\": \"Amazon Corretto is a no-cost, multiplatform, production-ready distribution of the Open Java Development Kit (OpenJDK).\",\r\n        \"link\": \"https://aws.amazon.com/corretto\",\r\n        \"winget\": \"Amazon.Corretto.8.JDK\",\r\n        \"foss\": true\r\n    },\r\n    \"java11\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"corretto11jdk\",\r\n        \"content\": \"Amazon Corretto 11 (LTS)\",\r\n        \"description\": \"Amazon Corretto is a no-cost, multiplatform, production-ready distribution of the Open Java Development Kit (OpenJDK).\",\r\n        \"link\": \"https://aws.amazon.com/corretto\",\r\n        \"winget\": \"Amazon.Corretto.11.JDK\",\r\n        \"foss\": true\r\n    },\r\n    \"java17\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"corretto17jdk\",\r\n        \"content\": \"Amazon Corretto 17 (LTS)\",\r\n        \"description\": \"Amazon Corretto is a no-cost, multiplatform, production-ready distribution of the Open Java Development Kit (OpenJDK).\",\r\n        \"link\": \"https://aws.amazon.com/corretto\",\r\n        \"winget\": \"Amazon.Corretto.17.JDK\",\r\n        \"foss\": true\r\n    },\r\n    \"java21\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"corretto21jdk\",\r\n        \"content\": \"Amazon Corretto 21 (LTS)\",\r\n        \"description\": \"Amazon Corretto is a no-cost, multiplatform, production-ready distribution of the Open Java Development Kit (OpenJDK).\",\r\n        \"link\": \"https://aws.amazon.com/corretto\",\r\n        \"winget\": \"Amazon.Corretto.21.JDK\",\r\n        \"foss\": true\r\n    },\r\n    \"java25\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"corretto25jdk\",\r\n        \"content\": \"Amazon Corretto 25 (LTS)\",\r\n        \"description\": \"Amazon Corretto is a no-cost, multiplatform, production-ready distribution of the Open Java Development Kit (OpenJDK).\",\r\n        \"link\": \"https://aws.amazon.com/corretto\",\r\n        \"winget\": \"Amazon.Corretto.25.JDK\",\r\n        \"foss\": true\r\n    },\r\n    \"jdownloader\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"jdownloader\",\r\n        \"content\": \"JDownloader\",\r\n        \"description\": \"JDownloader is a feature-rich download manager with support for various file hosting services.\",\r\n        \"link\": \"https://jdownloader.org/\",\r\n        \"winget\": \"AppWork.JDownloader\"\r\n    },\r\n    \"jellyfinmediaplayer\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"jellyfin-media-player\",\r\n        \"content\": \"Jellyfin Media Player\",\r\n        \"description\": \"Jellyfin Media Player is a client application for the Jellyfin media server, providing access to your media library.\",\r\n        \"link\": \"https://github.com/jellyfin/jellyfin-media-player\",\r\n        \"winget\": \"Jellyfin.JellyfinMediaPlayer\",\r\n        \"foss\": true\r\n    },\r\n    \"jellyfinserver\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"jellyfin\",\r\n        \"content\": \"Jellyfin Server\",\r\n        \"description\": \"Jellyfin Server is an open-source media server software, allowing you to organize and stream your media library.\",\r\n        \"link\": \"https://jellyfin.org/\",\r\n        \"winget\": \"Jellyfin.Server\",\r\n        \"foss\": true\r\n    },\r\n    \"jetbrains\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"jetbrainstoolbox\",\r\n        \"content\": \"Jetbrains Toolbox\",\r\n        \"description\": \"Jetbrains Toolbox is a platform for easy installation and management of JetBrains developer tools.\",\r\n        \"link\": \"https://www.jetbrains.com/toolbox/\",\r\n        \"winget\": \"JetBrains.Toolbox\"\r\n    },\r\n    \"joplin\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"joplin\",\r\n        \"content\": \"Joplin (FOSS Notes)\",\r\n        \"description\": \"Joplin is an open-source note-taking and to-do application with synchronization capabilities.\",\r\n        \"link\": \"https://joplinapp.org/\",\r\n        \"winget\": \"Joplin.Joplin\",\r\n        \"foss\": true\r\n    },\r\n    \"jpegview\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"jpegview\",\r\n        \"content\": \"JPEG View\",\r\n        \"description\": \"JPEGView is a lean, fast and highly configurable viewer/editor for JPEG, BMP, PNG, WEBP, TGA, GIF, JXL, HEIC, HEIF, AVIF and TIFF images with a minimal GUI.\",\r\n        \"link\": \"https://github.com/sylikc/jpegview\",\r\n        \"winget\": \"sylikc.JPEGView\",\r\n        \"foss\": true\r\n    },\r\n    \"kdeconnect\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"kdeconnect-kde\",\r\n        \"content\": \"KDE Connect\",\r\n        \"description\": \"KDE Connect allows seamless integration between your KDE desktop and mobile devices.\",\r\n        \"link\": \"https://community.kde.org/KDEConnect\",\r\n        \"winget\": \"KDE.KDEConnect\",\r\n        \"foss\": true\r\n    },\r\n    \"kdenlive\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"kdenlive\",\r\n        \"content\": \"Kdenlive (Video Editor)\",\r\n        \"description\": \"Kdenlive is an open-source video editing software with powerful features for creating and editing professional-quality videos.\",\r\n        \"link\": \"https://kdenlive.org/\",\r\n        \"winget\": \"KDE.Kdenlive\",\r\n        \"foss\": true\r\n    },\r\n    \"keepass\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"keepassxc\",\r\n        \"content\": \"KeePassXC\",\r\n        \"description\": \"KeePassXC is a cross-platform, open-source password manager with strong encryption features.\",\r\n        \"link\": \"https://keepassxc.org/\",\r\n        \"winget\": \"KeePassXCTeam.KeePassXC\",\r\n        \"foss\": true\r\n    },\r\n    \"klite\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"k-litecodecpack-standard\",\r\n        \"content\": \"K-Lite Codec Standard\",\r\n        \"description\": \"K-Lite Codec Pack Standard is a collection of audio and video codecs and related tools, providing essential components for media playback.\",\r\n        \"link\": \"https://www.codecguide.com/\",\r\n        \"winget\": \"CodecGuide.K-LiteCodecPack.Standard\"\r\n    },\r\n    \"kodi\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"kodi\",\r\n        \"content\": \"Kodi Media Center\",\r\n        \"description\": \"Kodi is an open-source media center application that allows you to play and view most videos, music, podcasts, and other digital media files.\",\r\n        \"link\": \"https://kodi.tv/\",\r\n        \"winget\": \"XBMCFoundation.Kodi\",\r\n        \"foss\": true\r\n    },\r\n    \"krita\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"krita\",\r\n        \"content\": \"Krita (Image Editor)\",\r\n        \"description\": \"Krita is a powerful open-source painting application. It is designed for concept artists, illustrators, matte and texture artists, and the VFX industry.\",\r\n        \"link\": \"https://krita.org/en/features/\",\r\n        \"winget\": \"KDE.Krita\",\r\n        \"foss\": true\r\n    },\r\n    \"lazygit\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"lazygit\",\r\n        \"content\": \"Lazygit\",\r\n        \"description\": \"Simple terminal UI for git commands.\",\r\n        \"link\": \"https://github.com/jesseduffield/lazygit/\",\r\n        \"winget\": \"JesseDuffield.lazygit\",\r\n        \"foss\": true\r\n    },\r\n    \"libreoffice\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"libreoffice-fresh\",\r\n        \"content\": \"LibreOffice\",\r\n        \"description\": \"LibreOffice is a powerful and free office suite, compatible with other major office suites.\",\r\n        \"link\": \"https://www.libreoffice.org/\",\r\n        \"winget\": \"TheDocumentFoundation.LibreOffice\",\r\n        \"foss\": true\r\n    },\r\n    \"librewolf\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"librewolf\",\r\n        \"content\": \"LibreWolf\",\r\n        \"description\": \"LibreWolf is a privacy-focused web browser based on Firefox, with additional privacy and security enhancements.\",\r\n        \"link\": \"https://librewolf-community.gitlab.io/\",\r\n        \"winget\": \"LibreWolf.LibreWolf\",\r\n        \"foss\": true\r\n    },\r\n    \"linkshellextension\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"linkshellextension\",\r\n        \"content\": \"Link Shell extension\",\r\n        \"description\": \"Link Shell Extension (LSE) provides for the creation of Hardlinks, Junctions, Volume Mountpoints, Symbolic Links, a folder cloning process that utilises Hardlinks or Symbolic Links and a copy process taking care of Junctions, Symbolic Links, and Hardlinks. LSE, as its name implies is implemented as a Shell extension and is accessed from Windows Explorer, or similar file/folder managers.\",\r\n        \"link\": \"https://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html\",\r\n        \"winget\": \"HermannSchinagl.LinkShellExtension\"\r\n    },\r\n    \"linphone\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"linphone\",\r\n        \"content\": \"Linphone\",\r\n        \"description\": \"Linphone is an open-source voice over IP (VoIPservice that allows for audio and video calls, messaging, and more.\",\r\n        \"link\": \"https://www.linphone.org/\",\r\n        \"winget\": \"BelledonneCommunications.Linphone\",\r\n        \"foss\": true\r\n    },\r\n    \"livelywallpaper\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"lively\",\r\n        \"content\": \"Lively Wallpaper\",\r\n        \"description\": \"Free and open-source software that allows users to set animated desktop wallpapers and screensavers.\",\r\n        \"link\": \"https://www.rocksdanister.com/lively/\",\r\n        \"winget\": \"rocksdanister.LivelyWallpaper\",\r\n        \"foss\": true\r\n    },\r\n    \"lm-studio\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"lm-studio\",\r\n        \"content\": \"LM Studio\",\r\n        \"description\": \"Desktop app to discover, download, and run local LLMs on your machine, with a built-in chat UI and local inference tooling.\",\r\n        \"link\": \"https://lmstudio.ai/\",\r\n        \"winget\": \"ElementLabs.LMStudio\",\r\n        \"foss\": false\r\n    },\r\n    \"localsend\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"localsend.install\",\r\n        \"content\": \"LocalSend\",\r\n        \"description\": \"An open-source cross-platform alternative to AirDrop.\",\r\n        \"link\": \"https://localsend.org/\",\r\n        \"winget\": \"LocalSend.LocalSend\",\r\n        \"foss\": true\r\n    },\r\n    \"lockhunter\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"lockhunter\",\r\n        \"content\": \"LockHunter\",\r\n        \"description\": \"LockHunter is a free tool to delete files blocked by something you do not know.\",\r\n        \"link\": \"https://lockhunter.com/\",\r\n        \"winget\": \"CrystalRich.LockHunter\"\r\n    },\r\n    \"logseq\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"logseq\",\r\n        \"content\": \"Logseq\",\r\n        \"description\": \"Logseq is a versatile knowledge management and note-taking application designed for the digital thinker. With a focus on the interconnectedness of ideas, Logseq allows users to seamlessly organize their thoughts through a combination of hierarchical outlines and bi-directional linking. It supports both structured and unstructured content, enabling users to create a personalized knowledge graph that adapts to their evolving ideas and insights.\",\r\n        \"link\": \"https://logseq.com/\",\r\n        \"winget\": \"Logseq.Logseq\",\r\n        \"foss\": true\r\n    },\r\n    \"logitechghub\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"lghub\",\r\n        \"content\": \"Logitech G Hub\",\r\n        \"description\": \"Official software for managing Logitech gaming peripherals (mice, keyboards, headsets, lighting profiles, etc.).\",\r\n        \"link\": \"https://www.logitechg.com/en-us/software/ghub\",\r\n        \"winget\": \"Logitech.GHUB\"\r\n    },\r\n    \"malwarebytes\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"malwarebytes\",\r\n        \"content\": \"Malwarebytes\",\r\n        \"description\": \"Malwarebytes is an anti-malware software that provides real-time protection against threats.\",\r\n        \"link\": \"https://www.malwarebytes.com/\",\r\n        \"winget\": \"Malwarebytes.Malwarebytes\"\r\n    },\r\n    \"masscode\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"massCode (Snippet Manager)\",\r\n        \"description\": \"massCode is a fast and efficient open-source code snippet manager for developers.\",\r\n        \"link\": \"https://masscode.io/\",\r\n        \"winget\": \"antonreshetov.massCode\",\r\n        \"foss\": true\r\n    },\r\n    \"matrix\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"element-desktop\",\r\n        \"content\": \"Element\",\r\n        \"description\": \"Element is a client for Matrix; an open network for secure, decentralized communication.\",\r\n        \"link\": \"https://element.io/\",\r\n        \"winget\": \"Element.Element\",\r\n        \"foss\": true\r\n    },\r\n    \"meld\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"meld\",\r\n        \"content\": \"Meld\",\r\n        \"description\": \"Meld is a visual diff and merge tool for files and directories.\",\r\n        \"link\": \"https://meldmerge.org/\",\r\n        \"winget\": \"Meld.Meld\",\r\n        \"foss\": true\r\n    },\r\n     \"microsoft-aishell\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Microsoft AI Shell\",\r\n        \"description\": \"CLI shell that connects to AI assistance providers ('agents') for command-line productivity; distributed via WinGet.\",\r\n        \"link\": \"https://github.com/PowerShell/AIShell\",\r\n        \"winget\": \"Microsoft.AIShell\",\r\n        \"foss\": true\r\n    },\r\n    \"microsoft-copilot\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Microsoft Copilot\",\r\n        \"description\": \"Microsoft Copilot desktop app for Windows (consumer Copilot), distributed via Microsoft Store and commonly installed via its Store ID.\",\r\n        \"link\": \"https://apps.microsoft.com/detail/9nht9rb2f4hd\",\r\n        \"winget\": \"9NHT9RB2F4HD\",\r\n        \"foss\": false\r\n    },\r\n    \"ModernFlyouts\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Modern Flyouts\",\r\n        \"description\": \"An open-source, modern, Fluent Design-based set of flyouts for Windows.\",\r\n        \"link\": \"https://github.com/ModernFlyouts-Community/ModernFlyouts/\",\r\n        \"winget\": \"ModernFlyouts.ModernFlyouts\",\r\n        \"foss\": true\r\n    },\r\n    \"monitorian\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"monitorian\",\r\n        \"content\": \"Monitorian\",\r\n        \"description\": \"Monitorian is a utility for adjusting monitor brightness and contrast on Windows.\",\r\n        \"link\": \"https://github.com/emoacht/Monitorian\",\r\n        \"winget\": \"emoacht.Monitorian\",\r\n        \"foss\": true\r\n    },\r\n    \"moonlight\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"moonlight-qt\",\r\n        \"content\": \"Moonlight/GameStream Client\",\r\n        \"description\": \"Moonlight/GameStream Client allows you to stream PC games to other devices over your local network.\",\r\n        \"link\": \"https://moonlight-stream.org/\",\r\n        \"winget\": \"MoonlightGameStreamingProject.Moonlight\",\r\n        \"foss\": true\r\n    },\r\n    \"Motrix\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"motrix\",\r\n        \"content\": \"Motrix Download Manager\",\r\n        \"description\": \"A full-featured download manager.\",\r\n        \"link\": \"https://motrix.app/\",\r\n        \"winget\": \"agalwood.Motrix\",\r\n        \"foss\": true\r\n    },\r\n    \"mpchc\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"mpc-hc-clsid2\",\r\n        \"content\": \"Media Player Classic - Home Cinema\",\r\n        \"description\": \"Media Player Classic - Home Cinema (MPC-HC) is a free and open-source video and audio player for Windows. MPC-HC is based on the original Guliverkli project and contains many additional features and bug fixes.\",\r\n        \"link\": \"https://github.com/clsid2/mpc-hc/\",\r\n        \"winget\": \"clsid2.mpc-hc\",\r\n        \"foss\": true\r\n    },\r\n    \"mremoteng\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"mremoteng\",\r\n        \"content\": \"mRemoteNG\",\r\n        \"description\": \"mRemoteNG is a free and open-source remote connections manager. It allows you to view and manage multiple remote sessions in a single interface.\",\r\n        \"link\": \"https://mremoteng.org/\",\r\n        \"winget\": \"mRemoteNG.mRemoteNG\",\r\n        \"foss\": true\r\n    },\r\n    \"msedgeredirect\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"msedgeredirect\",\r\n        \"content\": \"MSEdgeRedirect\",\r\n        \"description\": \"A Tool to Redirect News, Search, Widgets, Weather, and More to your default browser.\",\r\n        \"link\": \"https://github.com/rcmaehl/MSEdgeRedirect\",\r\n        \"winget\": \"rcmaehl.MSEdgeRedirect\",\r\n        \"foss\": true\r\n    },\r\n    \"msiafterburner\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"msiafterburner\",\r\n        \"content\": \"MSI Afterburner\",\r\n        \"description\": \"MSI Afterburner is a graphics card overclocking utility with advanced features.\",\r\n        \"link\": \"https://www.msi.com/Landing/afterburner\",\r\n        \"winget\": \"Guru3D.Afterburner\"\r\n    },\r\n    \"mullvadvpn\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"mullvad-app\",\r\n        \"content\": \"Mullvad VPN\",\r\n        \"description\": \"This is the VPN client software for the Mullvad VPN service.\",\r\n        \"link\": \"https://github.com/mullvad/mullvadvpn-app\",\r\n        \"winget\": \"MullvadVPN.MullvadVPN\",\r\n        \"foss\": true\r\n    },\r\n    \"BorderlessGaming\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"borderlessgaming\",\r\n        \"content\": \"Borderless Gaming\",\r\n        \"description\": \"Play your favorite games in a borderless window; no more time consuming alt-tabs.\",\r\n        \"link\": \"https://github.com/Codeusa/Borderless-Gaming\",\r\n        \"winget\": \"Codeusa.BorderlessGaming\",\r\n        \"foss\": true\r\n    },\r\n    \"EqualizerAPO\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"equalizerapo\",\r\n        \"content\": \"Equalizer APO\",\r\n        \"description\": \"Equalizer APO is a parametric / graphic equalizer for Windows.\",\r\n        \"link\": \"https://sourceforge.net/projects/equalizerapo\",\r\n        \"winget\": \"na\",\r\n        \"foss\": true\r\n    },\r\n    \"CompactGUI\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"compactgui\",\r\n        \"content\": \"Compact GUI\",\r\n        \"description\": \"Transparently compress active games and programs using Windows 10/11 APIs\",\r\n        \"link\": \"https://github.com/IridiumIO/CompactGUI\",\r\n        \"winget\": \"IridiumIO.CompactGUI\",\r\n        \"foss\": true\r\n    },\r\n    \"ExifCleaner\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"ExifCleaner\",\r\n        \"description\": \"Desktop app to clean metadata from images, videos, PDFs, and other files.\",\r\n        \"link\": \"https://github.com/szTheory/exifcleaner\",\r\n        \"winget\": \"szTheory.exifcleaner\",\r\n        \"foss\": true\r\n    },\r\n    \"mullvadbrowser\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Mullvad Browser\",\r\n        \"description\": \"Mullvad Browser is a privacy-focused web browser, developed in partnership with the Tor Project.\",\r\n        \"link\": \"https://mullvad.net/browser\",\r\n        \"winget\": \"MullvadVPN.MullvadBrowser\",\r\n        \"foss\": true\r\n    },\r\n    \"musescore\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"musescore\",\r\n        \"content\": \"MuseScore\",\r\n        \"description\": \"Create, play back and print beautiful sheet music with free and easy to use music notation software MuseScore.\",\r\n        \"link\": \"https://musescore.org/en\",\r\n        \"winget\": \"Musescore.Musescore\",\r\n        \"foss\": true\r\n    },\r\n    \"musicbee\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"musicbee\",\r\n        \"content\": \"MusicBee (Music Player)\",\r\n        \"description\": \"MusicBee is a customizable music player with support for various audio formats. It includes features like an integrated search function, tag editing, and more.\",\r\n        \"link\": \"https://getmusicbee.com/\",\r\n        \"winget\": \"MusicBee.MusicBee\"\r\n    },\r\n    \"mp3tag\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"mp3tag\",\r\n        \"content\": \"Mp3tag (Metadata Audio Editor)\",\r\n        \"description\": \"Mp3tag is a powerful and yet easy-to-use tool to edit metadata of common audio formats.\",\r\n        \"link\": \"https://www.mp3tag.de/en/\",\r\n        \"winget\": \"Mp3tag.Mp3tag\"\r\n    },\r\n    \"tagscanner\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"tagscanner\",\r\n        \"content\": \"TagScanner (Tag Scanner)\",\r\n        \"description\": \"TagScanner is a powerful tool for organizing and managing your music collection.\",\r\n        \"link\": \"https://www.xdlab.ru/en/\",\r\n        \"winget\": \"SergeySerkov.TagScanner\"\r\n    },\r\n    \"nanazip\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"nanazip\",\r\n        \"content\": \"NanaZip\",\r\n        \"description\": \"NanaZip is a fast and efficient file compression and decompression tool.\",\r\n        \"link\": \"https://github.com/M2Team/NanaZip\",\r\n        \"winget\": \"M2Team.NanaZip\",\r\n        \"foss\": true\r\n    },\r\n    \"netbird\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"netbird\",\r\n        \"content\": \"NetBird\",\r\n        \"description\": \"NetBird is a open-source alternative comparable to TailScale that can be connected to a selfhosted Server.\",\r\n        \"link\": \"https://netbird.io/\",\r\n        \"winget\": \"netbird\",\r\n        \"foss\": true\r\n    },\r\n    \"naps2\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"naps2\",\r\n        \"content\": \"NAPS2 (Document Scanner)\",\r\n        \"description\": \"NAPS2 is a document scanning application that simplifies the process of creating electronic documents.\",\r\n        \"link\": \"https://www.naps2.com/\",\r\n        \"winget\": \"Cyanfish.NAPS2\",\r\n        \"foss\": true\r\n    },\r\n    \"neofetchwin\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Neofetch\",\r\n        \"description\": \"Neofetch is a command-line utility for displaying system information in a visually appealing way.\",\r\n        \"link\": \"https://github.com/nepnep39/neofetch-win\",\r\n        \"winget\": \"nepnep.neofetch-win\",\r\n        \"foss\": true\r\n    },\r\n    \"neovim\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"neovim\",\r\n        \"content\": \"Neovim\",\r\n        \"description\": \"Neovim is a highly extensible text editor and an improvement over the original Vim editor.\",\r\n        \"link\": \"https://neovim.io/\",\r\n        \"winget\": \"Neovim.Neovim\"\r\n    },\r\n    \"nextclouddesktop\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"nextcloud-client\",\r\n        \"content\": \"Nextcloud Desktop\",\r\n        \"description\": \"Nextcloud Desktop is the official desktop client for the Nextcloud file synchronization and sharing platform.\",\r\n        \"link\": \"https://nextcloud.com/install/#install-clients\",\r\n        \"winget\": \"Nextcloud.NextcloudDesktop\",\r\n        \"foss\": true\r\n    },\r\n    \"nglide\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"nGlide (3dfx compatibility)\",\r\n        \"description\": \"nGlide is a 3Dfx Voodoo Glide wrapper. It allows you to play games that use Glide API on modern graphics cards without the need for a 3Dfx Voodoo graphics card.\",\r\n        \"link\": \"https://www.zeus-software.com/downloads/nglide\",\r\n        \"winget\": \"ZeusSoftware.nGlide\"\r\n    },\r\n    \"nmap\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"nmap\",\r\n        \"content\": \"Nmap\",\r\n        \"description\": \"Nmap (Network Mapper) is an open-source tool for network exploration and security auditing. It discovers devices on a network and provides information about their ports and services.\",\r\n        \"link\": \"https://nmap.org/\",\r\n        \"winget\": \"Insecure.Nmap\",\r\n        \"foss\": true\r\n    },\r\n    \"nodejs\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"nodejs\",\r\n        \"content\": \"NodeJS\",\r\n        \"description\": \"NodeJS is a JavaScript runtime built on Chrome's V8 JavaScript engine for building server-side and networking applications.\",\r\n        \"link\": \"https://nodejs.org/\",\r\n        \"winget\": \"OpenJS.NodeJS\",\r\n        \"foss\": true\r\n    },\r\n    \"nodejslts\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"nodejs-lts\",\r\n        \"content\": \"NodeJS LTS\",\r\n        \"description\": \"NodeJS LTS provides Long-Term Support releases for stable and reliable server-side JavaScript development.\",\r\n        \"link\": \"https://nodejs.org/\",\r\n        \"winget\": \"OpenJS.NodeJS.LTS\"\r\n    },\r\n    \"nomacs\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"nomacs\",\r\n        \"content\": \"Nomacs (Image viewer)\",\r\n        \"description\": \"Nomacs is a free, open-source image viewer that supports multiple platforms. It features basic image editing capabilities and supports a variety of image formats.\",\r\n        \"link\": \"https://nomacs.org/\",\r\n        \"winget\": \"nomacs.nomacs\",\r\n        \"foss\": true\r\n    },\r\n    \"notepadplus\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"notepadplusplus\",\r\n        \"content\": \"Notepad++\",\r\n        \"description\": \"Notepad++ is a free, open-source code editor and Notepad replacement with support for multiple languages.\",\r\n        \"link\": \"https://notepad-plus-plus.org/\",\r\n        \"winget\": \"Notepad++.Notepad++\",\r\n        \"foss\": true\r\n    },\r\n    \"nuget\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"nuget.commandline\",\r\n        \"content\": \"NuGet\",\r\n        \"description\": \"NuGet is a package manager for the .NET framework, enabling developers to manage and share libraries in their .NET applications.\",\r\n        \"link\": \"https://www.nuget.org/\",\r\n        \"winget\": \"Microsoft.NuGet\",\r\n        \"foss\": true\r\n    },\r\n    \"nushell\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"nushell\",\r\n        \"content\": \"Nushell\",\r\n        \"description\": \"Nushell is a new shell that takes advantage of modern hardware and systems to provide a powerful, expressive, and fast experience.\",\r\n        \"link\": \"https://www.nushell.sh/\",\r\n        \"winget\": \"Nushell.Nushell\",\r\n        \"foss\": true\r\n    },\r\n    \"nvclean\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"NVCleanstall\",\r\n        \"description\": \"NVCleanstall is a tool designed to customize NVIDIA driver installations, allowing advanced users to control more aspects of the installation process.\",\r\n        \"link\": \"https://www.techpowerup.com/nvcleanstall/\",\r\n        \"winget\": \"TechPowerUp.NVCleanstall\"\r\n    },\r\n    \"nvm\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"nvm\",\r\n        \"content\": \"Node Version Manager\",\r\n        \"description\": \"Node Version Manager (NVM) for Windows allows you to easily switch between multiple Node.js versions.\",\r\n        \"link\": \"https://github.com/coreybutler/nvm-windows\",\r\n        \"winget\": \"CoreyButler.NVMforWindows\",\r\n        \"foss\": true\r\n    },\r\n    \"obs\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"obs-studio\",\r\n        \"content\": \"OBS Studio\",\r\n        \"description\": \"OBS Studio is a free and open-source software for video recording and live streaming. It supports real-time video/audio capturing and mixing, making it popular among content creators.\",\r\n        \"link\": \"https://obsproject.com/\",\r\n        \"winget\": \"OBSProject.OBSStudio\",\r\n        \"foss\": true\r\n    },\r\n    \"obsidian\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"obsidian\",\r\n        \"content\": \"Obsidian\",\r\n        \"description\": \"Obsidian is a powerful note-taking and knowledge management application.\",\r\n        \"link\": \"https://obsidian.md/\",\r\n        \"winget\": \"Obsidian.Obsidian\"\r\n    },\r\n    \"okular\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"okular\",\r\n        \"content\": \"Okular\",\r\n        \"description\": \"Okular is a versatile document viewer with advanced features.\",\r\n        \"link\": \"https://okular.kde.org/\",\r\n        \"winget\": \"KDE.Okular\",\r\n        \"foss\": true\r\n    },\r\n    \"ollama\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Ollama\",\r\n        \"description\": \"Ollama lets you run and manage local large language models on your desktop.\",\r\n        \"link\": \"https://ollama.com/\",\r\n        \"winget\": \"Ollama.Ollama\",\r\n        \"foss\": true\r\n    },\r\n    \"onedrive\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"onedrive\",\r\n        \"content\": \"OneDrive\",\r\n        \"description\": \"OneDrive is a cloud storage service provided by Microsoft, allowing users to store and share files securely across devices.\",\r\n        \"link\": \"https://onedrive.live.com/\",\r\n        \"winget\": \"Microsoft.OneDrive\"\r\n    },\r\n    \"onlyoffice\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"onlyoffice\",\r\n        \"content\": \"ONLYOffice Desktop\",\r\n        \"description\": \"ONLYOffice Desktop is a comprehensive office suite for document editing and collaboration.\",\r\n        \"link\": \"https://www.onlyoffice.com/desktop.aspx\",\r\n        \"winget\": \"ONLYOFFICE.DesktopEditors\",\r\n        \"foss\": true\r\n    },\r\n    \"OPAutoClicker\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"autoclicker\",\r\n        \"content\": \"OPAutoClicker\",\r\n        \"description\": \"A full-fledged autoclicker with two modes of autoclicking, at your dynamic cursor location or at a prespecified location.\",\r\n        \"link\": \"https://www.opautoclicker.com\",\r\n        \"winget\": \"OPAutoClicker.OPAutoClicker\"\r\n    },\r\n    \"openhashtab\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"openhashtab\",\r\n        \"content\": \"OpenHashTab\",\r\n        \"description\": \"OpenHashTab is a shell extension for conveniently calculating and checking file hashes from file properties.\",\r\n        \"link\": \"https://github.com/namazso/OpenHashTab/\",\r\n        \"winget\": \"namazso.OpenHashTab\",\r\n        \"foss\": true\r\n    },\r\n    \"openrgb\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"openrgb\",\r\n        \"content\": \"OpenRGB\",\r\n        \"description\": \"OpenRGB is an open-source RGB lighting control software designed to manage and control RGB lighting for various components and peripherals.\",\r\n        \"link\": \"https://openrgb.org/\",\r\n        \"winget\": \"OpenRGB.OpenRGB\",\r\n        \"foss\": true\r\n    },\r\n    \"openscad\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"openscad\",\r\n        \"content\": \"OpenSCAD\",\r\n        \"description\": \"OpenSCAD is a free and open-source script-based 3D CAD modeler. It is especially useful for creating parametric designs for 3D printing.\",\r\n        \"link\": \"https://www.openscad.org/\",\r\n        \"winget\": \"OpenSCAD.OpenSCAD\",\r\n        \"foss\": true\r\n    },\r\n    \"openshell\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"open-shell\",\r\n        \"content\": \"Open Shell (Start Menu)\",\r\n        \"description\": \"Open Shell is a Windows Start Menu replacement with enhanced functionality and customization options.\",\r\n        \"link\": \"https://github.com/Open-Shell/Open-Shell-Menu\",\r\n        \"winget\": \"Open-Shell.Open-Shell-Menu\",\r\n        \"foss\": true\r\n    },\r\n    \"OpenVPN\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"openvpn-connect\",\r\n        \"content\": \"OpenVPN Connect\",\r\n        \"description\": \"OpenVPN Connect is an open-source VPN client that allows you to connect securely to a VPN server. It provides a secure and encrypted connection for protecting your online privacy.\",\r\n        \"link\": \"https://openvpn.net/\",\r\n        \"winget\": \"OpenVPNTechnologies.OpenVPNConnect\",\r\n        \"foss\": true\r\n    },\r\n    \"OVirtualBox\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"virtualbox\",\r\n        \"content\": \"Oracle VirtualBox\",\r\n        \"description\": \"Oracle VirtualBox is a powerful and free open-source virtualization tool for x86 and AMD64/Intel64 architectures.\",\r\n        \"link\": \"https://www.virtualbox.org/\",\r\n        \"winget\": \"Oracle.VirtualBox\",\r\n        \"foss\": true\r\n    },\r\n    \"ownclouddesktop\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"owncloud-client\",\r\n        \"content\": \"ownCloud Desktop\",\r\n        \"description\": \"ownCloud Desktop is the official desktop client for the ownCloud file synchronization and sharing platform.\",\r\n        \"link\": \"https://owncloud.com/desktop-app/\",\r\n        \"winget\": \"ownCloud.ownCloudDesktop\",\r\n        \"foss\": true\r\n    },\r\n    \"policyplus\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Policy Plus\",\r\n        \"description\": \"Local Group Policy Editor plus more, for all Windows editions.\",\r\n        \"link\": \"https://github.com/Fleex255/PolicyPlus\",\r\n        \"winget\": \"Fleex255.PolicyPlus\",\r\n        \"foss\": true\r\n    },\r\n    \"potplayer\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"PotPlayer\",\r\n        \"description\": \"PotPlayer is a free Windows media player with wide format support, high performance, built-in codecs, and extensive customization options.\",\r\n        \"link\": \"https://potplayer.tv/\",\r\n        \"winget\": \"Daum.PotPlayer\"\r\n    },\r\n    \"power-automate-desktop\": {\r\n        \"category\": \"AI-Automation\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Power Automate for desktop\",\r\n        \"description\": \"Microsoft's Windows RPA tool for building desktop flows to automate repetitive tasks across apps and services.\",\r\n        \"link\": \"https://powerautomate.microsoft.com/desktop/\",\r\n        \"winget\": \"na\",\r\n        \"foss\": false\r\n    },\r\n    \"processexplorer\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Process Explorer\",\r\n        \"description\": \"Process Explorer is a task manager and system monitor.\",\r\n        \"link\": \"https://learn.microsoft.com/sysinternals/downloads/process-explorer\",\r\n        \"winget\": \"Microsoft.Sysinternals.ProcessExplorer\"\r\n    },\r\n    \"Paintdotnet\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"paint.net\",\r\n        \"content\": \"Paint.NET\",\r\n        \"description\": \"Paint.NET is a free image and photo editing software for Windows. It features an intuitive user interface and supports a wide range of powerful editing tools.\",\r\n        \"link\": \"https://www.getpaint.net/\",\r\n        \"winget\": \"dotPDN.PaintDotNet\"\r\n    },\r\n    \"parsec\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"parsec\",\r\n        \"content\": \"Parsec\",\r\n        \"description\": \"Parsec is a low-latency, high-quality remote desktop sharing application for collaborating and gaming across devices.\",\r\n        \"link\": \"https://parsec.app/\",\r\n        \"winget\": \"Parsec.Parsec\"\r\n    },\r\n    \"pdf-xchange\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"pdfxchangeeditor\",\r\n        \"content\": \"PDF-XChangeEditor\",\r\n        \"description\": \"a comprehensive Windows-based software suite and editor for creating, viewing, editing, annotating, and signing PDF files.\",\r\n        \"link\": \"https://www.pdf-xchange.com/\",\r\n        \"winget\": \"TrackerSoftware.PDF-XChangeEditor\"\r\n    },\r\n    \"pdf24creator\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"pdf24\",\r\n        \"content\": \"PDF24 creator\",\r\n        \"description\": \"Free and easy-to-use online/desktop PDF tools that make you more productive\",\r\n        \"link\": \"https://tools.pdf24.org/en/\",\r\n        \"winget\": \"geeksoftwareGmbH.PDF24Creator\"\r\n    },\r\n    \"pdfsam\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"pdfsam\",\r\n        \"content\": \"PDFsam Basic\",\r\n        \"description\": \"PDFsam Basic is a free and open-source tool for splitting, merging, and rotating PDF files.\",\r\n        \"link\": \"https://pdfsam.org/\",\r\n        \"winget\": \"PDFsam.PDFsam\",\r\n        \"foss\": true\r\n    },\r\n    \"peazip\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"peazip\",\r\n        \"content\": \"PeaZip\",\r\n        \"description\": \"PeaZip is a free, open-source file archiver utility that supports multiple archive formats and provides encryption features.\",\r\n        \"link\": \"https://peazip.github.io/\",\r\n        \"winget\": \"Giorgiotani.Peazip\",\r\n        \"foss\": true\r\n    },\r\n    \"piimager\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"rpi-imager\",\r\n        \"content\": \"Raspberry Pi Imager\",\r\n        \"description\": \"Raspberry Pi Imager is a utility for writing operating system images to SD cards for Raspberry Pi devices.\",\r\n        \"link\": \"https://www.raspberrypi.com/software/\",\r\n        \"winget\": \"RaspberryPiFoundation.RaspberryPiImager\"\r\n    },\r\n    \"playnite\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"playnite\",\r\n        \"content\": \"Playnite\",\r\n        \"description\": \"Playnite is an open-source video game library manager with one simple goal: To provide a unified interface for all of your games.\",\r\n        \"link\": \"https://playnite.link/\",\r\n        \"winget\": \"Playnite.Playnite\",\r\n        \"foss\": true\r\n    },\r\n    \"plex\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"plexmediaserver\",\r\n        \"content\": \"Plex Media Server\",\r\n        \"description\": \"Plex Media Server is a media server software that allows you to organize and stream your media library. It supports various media formats and offers a wide range of features.\",\r\n        \"link\": \"https://www.plex.tv/your-media/\",\r\n        \"winget\": \"Plex.PlexMediaServer\"\r\n    },\r\n    \"plexdesktop\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"plex\",\r\n        \"content\": \"Plex Desktop\",\r\n        \"description\": \"Plex Desktop for Windows is the front end for Plex Media Server.\",\r\n        \"link\": \"https://www.plex.tv\",\r\n        \"winget\": \"Plex.Plex\"\r\n    },\r\n    \"Portmaster\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"portmaster\",\r\n        \"content\": \"Portmaster\",\r\n        \"description\": \"Portmaster is a free and open-source application that puts you back in charge over all your computers network connections.\",\r\n        \"link\": \"https://safing.io/\",\r\n        \"winget\": \"Safing.Portmaster\",\r\n        \"foss\": true\r\n    },\r\n    \"posh\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"oh-my-posh\",\r\n        \"content\": \"Oh My Posh (Prompt)\",\r\n        \"description\": \"Oh My Posh is a cross-platform prompt theme engine for any shell.\",\r\n        \"link\": \"https://ohmyposh.dev/\",\r\n        \"winget\": \"JanDeDobbeleer.OhMyPosh\",\r\n        \"foss\": true\r\n    },\r\n    \"postman\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"postman\",\r\n        \"content\": \"Postman\",\r\n        \"description\": \"Postman is a collaboration platform for API development that simplifies the process of developing APIs.\",\r\n        \"link\": \"https://www.postman.com/\",\r\n        \"winget\": \"Postman.Postman\"\r\n    },\r\n    \"powerautomate\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"powerautomatedesktop\",\r\n        \"content\": \"Power Automate\",\r\n        \"description\": \"Using Power Automate Desktop you can automate tasks on the desktop as well as the Web.\",\r\n        \"link\": \"https://www.microsoft.com/en-us/power-platform/products/power-automate\",\r\n        \"winget\": \"Microsoft.PowerAutomateDesktop\"\r\n    },\r\n    \"powerbi\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"powerbi\",\r\n        \"content\": \"Power BI\",\r\n        \"description\": \"Create stunning reports and visualizations with Power BI Desktop. It puts visual analytics at your fingertips with intuitive report authoring. Drag-and-drop to place content exactly where you want it on the flexible and fluid canvas. Quickly discover patterns as you explore a single unified view of linked, interactive visualizations.\",\r\n        \"link\": \"https://www.microsoft.com/en-us/power-platform/products/power-bi/\",\r\n        \"winget\": \"Microsoft.PowerBI\"\r\n    },\r\n    \"powershell\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"powershell-core\",\r\n        \"content\": \"PowerShell\",\r\n        \"description\": \"PowerShell is a task automation framework and scripting language designed for system administrators, offering powerful command-line capabilities.\",\r\n        \"link\": \"https://github.com/PowerShell/PowerShell\",\r\n        \"winget\": \"Microsoft.PowerShell\",\r\n        \"foss\": true\r\n    },\r\n    \"powertoys\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"powertoys\",\r\n        \"content\": \"PowerToys\",\r\n        \"description\": \"PowerToys is a set of utilities for power users to enhance productivity, featuring tools like FancyZones, PowerRename, and more.\",\r\n        \"link\": \"https://github.com/microsoft/PowerToys\",\r\n        \"winget\": \"Microsoft.PowerToys\",\r\n        \"foss\": true\r\n    },\r\n    \"prismlauncher\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"prismlauncher\",\r\n        \"content\": \"Prism Launcher\",\r\n        \"description\": \"Prism Launcher is an open-source Minecraft launcher with the ability to manage multiple instances, accounts and mods.\",\r\n        \"link\": \"https://prismlauncher.org/\",\r\n        \"winget\": \"PrismLauncher.PrismLauncher\",\r\n        \"foss\": true\r\n    },\r\n    \"processlasso\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"plasso\",\r\n        \"content\": \"Process Lasso\",\r\n        \"description\": \"Process Lasso is a system optimization and automation tool that improves system responsiveness and stability by adjusting process priorities and CPU affinities.\",\r\n        \"link\": \"https://bitsum.com/\",\r\n        \"winget\": \"BitSum.ProcessLasso\"\r\n    },\r\n    \"protonauth\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"protonauth\",\r\n        \"content\": \"Proton Authenticator\",\r\n        \"description\": \"2FA app from Proton to securely sync and backup 2FA codes.\",\r\n        \"link\": \"https://proton.me/authenticator\",\r\n        \"winget\": \"Proton.ProtonAuthenticator\",\r\n        \"foss\": true\r\n    },\r\n    \"processmonitor\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"procexp\",\r\n        \"content\": \"SysInternals Process Monitor\",\r\n        \"description\": \"SysInternals Process Monitor is an advanced monitoring tool that shows real-time file system, registry, and process/thread activity.\",\r\n        \"link\": \"https://docs.microsoft.com/en-us/sysinternals/downloads/procmon\",\r\n        \"winget\": \"Microsoft.Sysinternals.ProcessMonitor\"\r\n    },\r\n    \"orcaslicer\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"orcaslicer\",\r\n        \"content\": \"OrcaSlicer\",\r\n        \"description\": \"G-code generator for 3D printers (Bambu, Prusa, Voron, VzBot, RatRig, Creality, etc.).\",\r\n        \"link\": \"https://github.com/SoftFever/OrcaSlicer\",\r\n        \"winget\": \"SoftFever.OrcaSlicer\",\r\n        \"foss\": true\r\n    },\r\n    \"prucaslicer\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"prusaslicer\",\r\n        \"content\": \"PrusaSlicer\",\r\n        \"description\": \"PrusaSlicer is a powerful and easy-to-use slicing software for 3D printing with Prusa 3D printers.\",\r\n        \"link\": \"https://www.prusa3d.com/prusaslicer/\",\r\n        \"winget\": \"Prusa3d.PrusaSlicer\",\r\n        \"foss\": true\r\n    },\r\n    \"psremoteplay\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"ps-remote-play\",\r\n        \"content\": \"PS Remote Play\",\r\n        \"description\": \"PS Remote Play is a free application that allows you to stream games from your PlayStation console to a PC or mobile device.\",\r\n        \"link\": \"https://remoteplay.dl.playstation.net/remoteplay/lang/gb/\",\r\n        \"winget\": \"PlayStation.PSRemotePlay\"\r\n    },\r\n    \"putty\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"putty\",\r\n        \"content\": \"PuTTY\",\r\n        \"description\": \"PuTTY is a free and open-source terminal emulator, serial console, and network file transfer application. It supports various network protocols such as SSH, Telnet, and SCP.\",\r\n        \"link\": \"https://www.chiark.greenend.org.uk/~sgtatham/putty/\",\r\n        \"winget\": \"PuTTY.PuTTY\",\r\n        \"foss\": true\r\n    },\r\n    \"python3\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"python\",\r\n        \"content\": \"Python3\",\r\n        \"description\": \"Python is a versatile programming language used for web development, data analysis, artificial intelligence, and more.\",\r\n        \"link\": \"https://www.python.org/\",\r\n        \"winget\": \"Python.Python.3.14\",\r\n        \"foss\": true\r\n    },\r\n    \"qbittorrent\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"qbittorrent\",\r\n        \"content\": \"qBittorrent\",\r\n        \"description\": \"qBittorrent is a free and open-source BitTorrent client that aims to provide a feature-rich and lightweight alternative to other torrent clients.\",\r\n        \"link\": \"https://www.qbittorrent.org/\",\r\n        \"winget\": \"qBittorrent.qBittorrent\",\r\n        \"foss\": true\r\n    },\r\n    \"transmission\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"transmission\",\r\n        \"content\": \"Transmission\",\r\n        \"description\": \"Transmission is a cross-platform BitTorrent client that is open-source, easy, powerful, and lean.\",\r\n        \"link\": \"https://transmissionbt.com/\",\r\n        \"winget\": \"Transmission.Transmission\",\r\n        \"foss\": true\r\n    },\r\n    \"tixati\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"tixati.portable\",\r\n        \"content\": \"Tixati\",\r\n        \"description\": \"Tixati is a cross-platform BitTorrent client written in C++ that has been designed to be light on system resources.\",\r\n        \"link\": \"https://www.tixati.com/\",\r\n        \"winget\": \"Tixati.Tixati.Portable\"\r\n    },\r\n    \"qtox\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"qtox\",\r\n        \"content\": \"QTox\",\r\n        \"description\": \"QTox is a free and open-source messaging app that prioritizes user privacy and security in its design.\",\r\n        \"link\": \"https://qtox.github.io/\",\r\n        \"winget\": \"Tox.qTox\",\r\n        \"foss\": true\r\n    },\r\n    \"quicklook\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"quicklook\",\r\n        \"content\": \"Quicklook\",\r\n        \"description\": \"Bring macOS \\u201cQuick Look\\u201d feature to Windows.\",\r\n        \"link\": \"https://github.com/QL-Win/QuickLook\",\r\n        \"winget\": \"QL-Win.QuickLook\",\r\n        \"foss\": true\r\n    },\r\n    \"rainmeter\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Rainmeter\",\r\n        \"description\": \"Rainmeter is a desktop customization tool that allows you to create and share customizable skins for your desktop.\",\r\n        \"link\": \"https://www.rainmeter.net/\",\r\n        \"winget\": \"Rainmeter.Rainmeter\",\r\n        \"foss\": true\r\n    },\r\n    \"revo\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"revo-uninstaller\",\r\n        \"content\": \"Revo Uninstaller\",\r\n        \"description\": \"Revo Uninstaller is an advanced uninstaller tool that helps you remove unwanted software and clean up your system.\",\r\n        \"link\": \"https://www.revouninstaller.com/\",\r\n        \"winget\": \"RevoUninstaller.RevoUninstaller\"\r\n    },\r\n    \"WiseProgramUninstaller\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Wise Program Uninstaller (WiseCleaner)\",\r\n        \"description\": \"Wise Program Uninstaller is the perfect solution for uninstalling Windows programs, allowing you to uninstall applications quickly and completely using its simple and user-friendly interface.\",\r\n        \"link\": \"https://www.wisecleaner.com/wise-program-uninstaller.html\",\r\n        \"winget\": \"WiseCleaner.WiseProgramUninstaller\"\r\n    },\r\n    \"revolt\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Revolt\",\r\n        \"description\": \"Find your community, connect with the world. Revolt is one of the best ways to stay connected with your friends and community without sacrificing any usability.\",\r\n        \"link\": \"https://revolt.chat/\",\r\n        \"winget\": \"Revolt.RevoltDesktop\",\r\n        \"foss\": true\r\n    },\r\n    \"ripgrep\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"ripgrep\",\r\n        \"content\": \"Ripgrep\",\r\n        \"description\": \"Fast and powerful commandline search tool.\",\r\n        \"link\": \"https://github.com/BurntSushi/ripgrep/\",\r\n        \"winget\": \"BurntSushi.ripgrep.MSVC\",\r\n        \"foss\": true\r\n    },\r\n    \"rufus\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"rufus\",\r\n        \"content\": \"Rufus Imager\",\r\n        \"description\": \"Rufus is a utility that helps format and create bootable USB drives, such as USB keys or pen drives.\",\r\n        \"link\": \"https://rufus.ie/\",\r\n        \"winget\": \"Rufus.Rufus\",\r\n        \"foss\": true\r\n    },\r\n    \"rustdesk\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"rustdesk.portable\",\r\n        \"content\": \"RustDesk\",\r\n        \"description\": \"RustDesk is a free and open-source remote desktop application. It provides a secure way to connect to remote machines and access desktop environments.\",\r\n        \"link\": \"https://rustdesk.com/\",\r\n        \"winget\": \"RustDesk.RustDesk\",\r\n        \"foss\": true\r\n    },\r\n    \"rustlang\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"rust\",\r\n        \"content\": \"Rust\",\r\n        \"description\": \"Rust is a programming language designed for safety and performance, particularly focused on systems programming.\",\r\n        \"link\": \"https://www.rust-lang.org/\",\r\n        \"winget\": \"Rustlang.Rust.MSVC\",\r\n        \"foss\": true\r\n    },\r\n    \"sagethumbs\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"sagethumbs\",\r\n        \"content\": \"SageThumbs\",\r\n        \"description\": \"Provides support for thumbnails in Explorer with more formats.\",\r\n        \"link\": \"https://sagethumbs.en.lo4d.com/windows\",\r\n        \"winget\": \"CherubicSoftware.SageThumbs\",\r\n        \"foss\": true\r\n    },\r\n    \"sandboxie\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"sandboxie\",\r\n        \"content\": \"Sandboxie Plus\",\r\n        \"description\": \"Sandboxie Plus is a sandbox-based isolation program that provides enhanced security by running applications in an isolated environment.\",\r\n        \"link\": \"https://github.com/sandboxie-plus/Sandboxie\",\r\n        \"winget\": \"Sandboxie.Plus\",\r\n        \"foss\": true\r\n    },\r\n    \"sdio\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"sdio\",\r\n        \"content\": \"Snappy Driver Installer Origin\",\r\n        \"description\": \"Snappy Driver Installer Origin is a free and open-source driver updater with a vast driver database for Windows.\",\r\n        \"link\": \"https://www.glenn.delahoy.com/snappy-driver-installer-origin/\",\r\n        \"winget\": \"GlennDelahoy.SnappyDriverInstallerOrigin\",\r\n        \"foss\": true\r\n    },\r\n    \"session\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"session\",\r\n        \"content\": \"Session\",\r\n        \"description\": \"Session is a private and secure messaging app built on a decentralized network for user privacy and data protection.\",\r\n        \"link\": \"https://getsession.org/\",\r\n        \"winget\": \"Session.Session\",\r\n        \"foss\": true\r\n    },\r\n    \"sharex\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"sharex\",\r\n        \"content\": \"ShareX (Screenshots)\",\r\n        \"description\": \"ShareX is a free and open-source screen capture and file sharing tool. It supports various capture methods and offers advanced features for editing and sharing screenshots.\",\r\n        \"link\": \"https://getsharex.com/\",\r\n        \"winget\": \"ShareX.ShareX\",\r\n        \"foss\": true\r\n    },\r\n    \"nilesoftShell\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"nilesoft-shell\",\r\n        \"content\": \"Nilesoft Shell\",\r\n        \"description\": \"Shell is an expanded context menu tool that adds extra functionality and customization options to the Windows context menu.\",\r\n        \"link\": \"https://nilesoft.org/\",\r\n        \"winget\": \"Nilesoft.Shell\"\r\n    },\r\n    \"systeminformer\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"System Informer\",\r\n        \"description\": \"A free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware.\",\r\n        \"link\": \"https://systeminformer.com/\",\r\n        \"winget\": \"WinsiderSS.SystemInformer\",\r\n        \"foss\": true\r\n    },\r\n    \"sidequest\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"sidequest\",\r\n        \"content\": \"SideQuestVR\",\r\n        \"description\": \"SideQuestVR is a community-driven platform that enables users to discover, install, and manage virtual reality content on Oculus Quest devices.\",\r\n        \"link\": \"https://sidequestvr.com/\",\r\n        \"winget\": \"SideQuestVR.SideQuest\"\r\n    },\r\n    \"signal\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"signal\",\r\n        \"content\": \"Signal\",\r\n        \"description\": \"Signal is a privacy-focused messaging app that offers end-to-end encryption for secure and private communication.\",\r\n        \"link\": \"https://signal.org/\",\r\n        \"winget\": \"OpenWhisperSystems.Signal\",\r\n        \"foss\": true\r\n    },\r\n    \"signalrgb\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"SignalRGB\",\r\n        \"description\": \"SignalRGB lets you control and sync your favorite RGB devices with one free application.\",\r\n        \"link\": \"https://www.signalrgb.com/\",\r\n        \"winget\": \"WhirlwindFX.SignalRgb\"\r\n    },\r\n    \"simplenote\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"simplenote\",\r\n        \"content\": \"simplenote\",\r\n        \"description\": \"Simplenote is an easy way to keep notes, lists, ideas and more.\",\r\n        \"link\": \"https://simplenote.com/\",\r\n        \"winget\": \"Automattic.Simplenote\",\r\n        \"foss\": true\r\n    },\r\n    \"simplewall\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"simplewall\",\r\n        \"content\": \"Simplewall\",\r\n        \"description\": \"Simplewall is a free and open-source firewall application for Windows. It allows users to control and manage the inbound and outbound network traffic of applications.\",\r\n        \"link\": \"https://github.com/henrypp/simplewall\",\r\n        \"winget\": \"Henry++.simplewall\",\r\n        \"foss\": true\r\n    },\r\n    \"slack\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"slack\",\r\n        \"content\": \"Slack\",\r\n        \"description\": \"Slack is a collaboration hub that connects teams and facilitates communication through channels, messaging, and file sharing.\",\r\n        \"link\": \"https://slack.com/\",\r\n        \"winget\": \"SlackTechnologies.Slack\"\r\n    },\r\n    \"spacedrive\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Spacedrive File Manager\",\r\n        \"description\": \"Spacedrive is a file manager that offers cloud storage integration and file synchronization across devices.\",\r\n        \"link\": \"https://www.spacedrive.com/\",\r\n        \"winget\": \"spacedrive.Spacedrive\",\r\n        \"foss\": true\r\n    },\r\n    \"spacesniffer\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"spacesniffer\",\r\n        \"content\": \"SpaceSniffer\",\r\n        \"description\": \"A tool application that lets you understand how folders and files are structured on your disks.\",\r\n        \"link\": \"http://www.uderzo.it/main_products/space_sniffer/\",\r\n        \"winget\": \"UderzoSoftware.SpaceSniffer\"\r\n    },\r\n    \"starship\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"starship\",\r\n        \"content\": \"Starship (Shell Prompt)\",\r\n        \"description\": \"Starship is a minimal, fast, and customizable prompt for any shell.\",\r\n        \"link\": \"https://starship.rs/\",\r\n        \"winget\": \"starship\",\r\n        \"foss\": true\r\n    },\r\n    \"steam\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"steam-client\",\r\n        \"content\": \"Steam\",\r\n        \"description\": \"Steam is a digital distribution platform for purchasing and playing video games, offering multiplayer gaming, video streaming, and more.\",\r\n        \"link\": \"https://store.steampowered.com/about/\",\r\n        \"winget\": \"Valve.Steam\"\r\n    },\r\n    \"strawberry\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"strawberrymusicplayer\",\r\n        \"content\": \"Strawberry (Music Player)\",\r\n        \"description\": \"Strawberry is an open-source music player that focuses on music collection management and audio quality. It supports various audio formats and features a clean user interface.\",\r\n        \"link\": \"https://www.strawberrymusicplayer.org/\",\r\n        \"winget\": \"StrawberryMusicPlayer.Strawberry\",\r\n        \"foss\": true\r\n    },\r\n    \"stremio\": {\r\n        \"winget\": \"Stremio.Stremio\",\r\n        \"choco\": \"stremio\",\r\n        \"category\": \"Multimedia Tools\",\r\n        \"content\": \"Stremio\",\r\n        \"link\": \"https://www.stremio.com/\",\r\n        \"description\": \"Stremio is a media center application that allows users to organize and stream their favorite movies, TV shows, and video content.\",\r\n        \"foss\": true\r\n    },\r\n    \"sublimemerge\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"sublimemerge\",\r\n        \"content\": \"Sublime Merge\",\r\n        \"description\": \"Sublime Merge is a Git client with advanced features and a beautiful interface.\",\r\n        \"link\": \"https://www.sublimemerge.com/\",\r\n        \"winget\": \"SublimeHQ.SublimeMerge\"\r\n    },\r\n    \"sublimetext\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"sublimetext4\",\r\n        \"content\": \"Sublime Text\",\r\n        \"description\": \"Sublime Text is a sophisticated text editor for code, markup, and prose.\",\r\n        \"link\": \"https://www.sublimetext.com/\",\r\n        \"winget\": \"SublimeHQ.SublimeText.4\"\r\n    },\r\n    \"sumatra\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"sumatrapdf\",\r\n        \"content\": \"Sumatra PDF\",\r\n        \"description\": \"Sumatra PDF is a lightweight and fast PDF viewer with minimalistic design.\",\r\n        \"link\": \"https://www.sumatrapdfreader.org/free-pdf-reader.html\",\r\n        \"winget\": \"SumatraPDF.SumatraPDF\",\r\n        \"foss\": true\r\n    },\r\n    \"pdfgear\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"PDFgear\",\r\n        \"description\": \"PDFgear is a piece of full-featured PDF management software for Windows, macOS, and mobile, and it's completely free to use.\",\r\n        \"link\": \"https://www.pdfgear.com/\",\r\n        \"winget\": \"PDFgear.PDFgear\"\r\n    },\r\n    \"sunshine\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"sunshine\",\r\n        \"content\": \"Sunshine/GameStream Server\",\r\n        \"description\": \"Sunshine is a GameStream server that allows you to remotely play PC games on Android devices, offering low-latency streaming.\",\r\n        \"link\": \"https://github.com/LizardByte/Sunshine\",\r\n        \"winget\": \"LizardByte.Sunshine\",\r\n        \"foss\": true\r\n    },\r\n    \"superf4\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"superf4\",\r\n        \"content\": \"SuperF4\",\r\n        \"description\": \"SuperF4 is a utility that allows you to terminate programs instantly by pressing a customizable hotkey.\",\r\n        \"link\": \"https://stefansundin.github.io/superf4/\",\r\n        \"winget\": \"StefanSundin.Superf4\",\r\n        \"foss\": true\r\n    },\r\n    \"swift\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Swift toolchain\",\r\n        \"description\": \"Swift is a general-purpose programming language that's approachable for newcomers and powerful for experts.\",\r\n        \"link\": \"https://www.swift.org/\",\r\n        \"winget\": \"Swift.Toolchain\",\r\n        \"foss\": true\r\n    },\r\n    \"synctrayzor\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"synctrayzor\",\r\n        \"content\": \"SyncTrayzor\",\r\n        \"description\": \"Windows tray utility / filesystem watcher / launcher for Syncthing.\",\r\n        \"link\": \"https://github.com/GermanCoding/SyncTrayzor\",\r\n        \"winget\": \"GermanCoding.SyncTrayzor\",\r\n        \"foss\": true\r\n    },\r\n    \"sqlmanagementstudio\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"sql-server-management-studio\",\r\n        \"content\": \"Microsoft SQL Server Management Studio\",\r\n        \"description\": \"SQL Server Management Studio (SSMS) is an integrated environment for managing any SQL infrastructure, from SQL Server to Azure SQL Database. SSMS provides tools to configure, monitor, and administer instances of SQL Server and databases.\",\r\n        \"link\": \"https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16\",\r\n        \"winget\": \"Microsoft.SQLServerManagementStudio\"\r\n    },\r\n    \"tabby\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"tabby\",\r\n        \"content\": \"Tabby.sh\",\r\n        \"description\": \"Tabby is a highly configurable terminal emulator, SSH and serial client for Windows, macOS and Linux.\",\r\n        \"link\": \"https://tabby.sh/\",\r\n        \"winget\": \"Eugeny.Tabby\",\r\n        \"foss\": true\r\n    },\r\n    \"tailscale\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"tailscale\",\r\n        \"content\": \"Tailscale\",\r\n        \"description\": \"Tailscale is a secure and easy-to-use VPN solution for connecting your devices and networks.\",\r\n        \"link\": \"https://tailscale.com/\",\r\n        \"winget\": \"tailscale.tailscale\",\r\n        \"foss\": true\r\n    },\r\n    \"TcNoAccSwitcher\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"tcno-acc-switcher\",\r\n        \"content\": \"TCNO Account Switcher\",\r\n        \"description\": \"A Super-fast account switcher for Steam, Battle.net, Epic Games, Origin, Riot, Ubisoft and many others!\",\r\n        \"link\": \"https://github.com/TCNOco/TcNo-Acc-Switcher\",\r\n        \"winget\": \"TechNobo.TcNoAccountSwitcher\",\r\n        \"foss\": true\r\n    },\r\n    \"tcpview\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"tcpview\",\r\n        \"content\": \"SysInternals TCPView\",\r\n        \"description\": \"SysInternals TCPView is a network monitoring tool that displays a detailed list of all TCP and UDP endpoints on your system.\",\r\n        \"link\": \"https://docs.microsoft.com/en-us/sysinternals/downloads/tcpview\",\r\n        \"winget\": \"Microsoft.Sysinternals.TCPView\"\r\n    },\r\n    \"teams\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"microsoft-teams\",\r\n        \"content\": \"Teams\",\r\n        \"description\": \"Microsoft Teams is a collaboration platform that integrates with Office 365 and offers chat, video conferencing, file sharing, and more.\",\r\n        \"link\": \"https://www.microsoft.com/en-us/microsoft-teams/group-chat-software\",\r\n        \"winget\": \"Microsoft.Teams\"\r\n    },\r\n    \"teamviewer\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"teamviewer9\",\r\n        \"content\": \"TeamViewer\",\r\n        \"description\": \"TeamViewer is a popular remote access and support software that allows you to connect to and control remote devices.\",\r\n        \"link\": \"https://www.teamviewer.com/\",\r\n        \"winget\": \"TeamViewer.TeamViewer\"\r\n    },\r\n    \"telegram\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"telegram\",\r\n        \"content\": \"Telegram\",\r\n        \"description\": \"Telegram is a cloud-based instant messaging app known for its security features, speed, and simplicity.\",\r\n        \"link\": \"https://telegram.org/\",\r\n        \"winget\": \"Telegram.TelegramDesktop\",\r\n        \"foss\": true\r\n    },\r\n    \"unigram\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Unigram\",\r\n        \"description\": \"Unigram - Telegram for Windows.\",\r\n        \"link\": \"https://unigramdev.github.io/\",\r\n        \"winget\": \"Telegram.Unigram\",\r\n        \"foss\": true\r\n    },\r\n    \"terminal\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"microsoft-windows-terminal\",\r\n        \"content\": \"Windows Terminal\",\r\n        \"description\": \"Windows Terminal is a modern, fast, and efficient terminal application for command-line users, supporting multiple tabs, panes, and more.\",\r\n        \"link\": \"https://aka.ms/terminal\",\r\n        \"winget\": \"Microsoft.WindowsTerminal\",\r\n        \"foss\": true\r\n    },\r\n    \"Thonny\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"thonny\",\r\n        \"content\": \"Thonny Python IDE\",\r\n        \"description\": \"Python IDE for beginners.\",\r\n        \"link\": \"https://github.com/thonny/thonny\",\r\n        \"winget\": \"AivarAnnamaa.Thonny\",\r\n        \"foss\": true\r\n    },\r\n    \"MuEditor\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Code With Mu (Mu Editor)\",\r\n        \"description\": \"Mu is a Python code editor for beginner programmers.\",\r\n        \"link\": \"https://codewith.mu/\",\r\n        \"winget\": \"Mu.Mu\",\r\n        \"foss\": true\r\n    },\r\n    \"thorium\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"thorium\",\r\n        \"content\": \"Thorium Browser AVX2\",\r\n        \"description\": \"Browser built for speed over vanilla Chromium. It is built with AVX2 optimizations and is the fastest browser on the market.\",\r\n        \"link\": \"https://thorium.rocks/\",\r\n        \"winget\": \"Alex313031.Thorium.AVX2\",\r\n        \"foss\": true\r\n    },\r\n    \"thunderbird\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"thunderbird\",\r\n        \"content\": \"Thunderbird\",\r\n        \"description\": \"Mozilla Thunderbird is a free and open-source email client, news client, and chat client with advanced features.\",\r\n        \"link\": \"https://www.thunderbird.net/\",\r\n        \"winget\": \"Mozilla.Thunderbird\",\r\n        \"foss\": true\r\n    },\r\n    \"betterbird\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"betterbird\",\r\n        \"content\": \"Betterbird\",\r\n        \"description\": \"Betterbird is a fork of Mozilla Thunderbird with additional features and bugfixes.\",\r\n        \"link\": \"https://www.betterbird.eu/\",\r\n        \"winget\": \"Betterbird.Betterbird\",\r\n        \"foss\": true\r\n    },\r\n    \"tidal\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Tidal\",\r\n        \"description\": \"Tidal is a music streaming service known for its high-fidelity audio quality and exclusive content. It offers a vast library of songs and curated playlists.\",\r\n        \"link\": \"https://tidal.com/\",\r\n        \"winget\": \"9NNCB5BS59PH\"\r\n    },\r\n    \"tor\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"tor-browser\",\r\n        \"content\": \"Tor Browser\",\r\n        \"description\": \"Tor Browser is designed for anonymous web browsing, utilizing the Tor network to protect user privacy and security.\",\r\n        \"link\": \"https://www.torproject.org/\",\r\n        \"winget\": \"TorProject.TorBrowser\",\r\n        \"foss\": true\r\n    },\r\n    \"totalcommander\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"TotalCommander\",\r\n        \"content\": \"Total Commander\",\r\n        \"description\": \"Total Commander is a file manager for Windows that provides a powerful and intuitive interface for file management.\",\r\n        \"link\": \"https://www.ghisler.com/\",\r\n        \"winget\": \"Ghisler.TotalCommander\"\r\n    },\r\n    \"treesize\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"treesizefree\",\r\n        \"content\": \"TreeSize Free\",\r\n        \"description\": \"TreeSize Free is a disk space manager that helps you analyze and visualize the space usage on your drives.\",\r\n        \"link\": \"https://www.jam-software.com/treesize_free/\",\r\n        \"winget\": \"JAMSoftware.TreeSize.Free\"\r\n    },\r\n    \"ttaskbar\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"translucenttb\",\r\n        \"content\": \"TranslucentTB\",\r\n        \"description\": \"TranslucentTB is a tool that allows you to customize the transparency of the Windows Taskbar.\",\r\n        \"link\": \"https://github.com/TranslucentTB/TranslucentTB\",\r\n        \"winget\": \"9PF4KZ2VN4W9\",\r\n        \"foss\": true\r\n    },\r\n    \"twinkletray\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"twinkle-tray\",\r\n        \"content\": \"Twinkle Tray\",\r\n        \"description\": \"Twinkle Tray lets you easily manage the brightness levels of multiple monitors.\",\r\n        \"link\": \"https://twinkletray.com/\",\r\n        \"winget\": \"xanderfrangos.twinkletray\",\r\n        \"foss\": true\r\n    },\r\n    \"ubisoft\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"ubisoft-connect\",\r\n        \"content\": \"Ubisoft Connect\",\r\n        \"description\": \"Ubisoft Connect is Ubisoft's digital distribution and online gaming service, providing access to Ubisoft's games and services.\",\r\n        \"link\": \"https://ubisoftconnect.com/\",\r\n        \"winget\": \"Ubisoft.Connect\"\r\n    },\r\n    \"ungoogled\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"ungoogled-chromium\",\r\n        \"content\": \"Ungoogled\",\r\n        \"description\": \"Ungoogled Chromium is a version of Chromium without Google's integration for enhanced privacy and control.\",\r\n        \"link\": \"https://github.com/Eloston/ungoogled-chromium\",\r\n        \"winget\": \"eloston.ungoogled-chromium\",\r\n        \"foss\": true\r\n    },\r\n    \"unity\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"unityhub\",\r\n        \"content\": \"Unity Game Engine\",\r\n        \"description\": \"Unity is a powerful game development platform for creating 2D, 3D, augmented reality, and virtual reality games.\",\r\n        \"link\": \"https://unity.com/\",\r\n        \"winget\": \"Unity.UnityHub\"\r\n    },\r\n    \"vagrant\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"vagrant\",\r\n        \"content\": \"Vagrant\",\r\n        \"description\": \"Vagrant is an open-source tool for building and managing virtualized development environments.\",\r\n        \"link\": \"https://www.vagrantup.com/\",\r\n        \"winget\": \"Hashicorp.Vagrant\",\r\n        \"foss\": true\r\n    },\r\n    \"vc2015_32\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Visual C++ 2015-2022 32-bit\",\r\n        \"description\": \"Visual C++ 2015-2022 32-bit redistributable package installs runtime components of Visual C++ libraries required to run 32-bit applications.\",\r\n        \"link\": \"https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads\",\r\n        \"winget\": \"Microsoft.VCRedist.2015+.x86\"\r\n    },\r\n    \"vc2015_64\": {\r\n        \"category\": \"Microsoft Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Visual C++ 2015-2022 64-bit\",\r\n        \"description\": \"Visual C++ 2015-2022 64-bit redistributable package installs runtime components of Visual C++ libraries required to run 64-bit applications.\",\r\n        \"link\": \"https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads\",\r\n        \"winget\": \"Microsoft.VCRedist.2015+.x64\"\r\n    },\r\n    \"ventoy\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"ventoy\",\r\n        \"content\": \"Ventoy\",\r\n        \"description\": \"Ventoy is an open-source tool for creating bootable USB drives. It supports multiple ISO files on a single USB drive, making it a versatile solution for installing operating systems.\",\r\n        \"link\": \"https://www.ventoy.net/\",\r\n        \"winget\": \"Ventoy.Ventoy\",\r\n        \"foss\": true\r\n    },\r\n    \"vesktop\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Vesktop\",\r\n        \"description\": \"A cross platform electron-based desktop app aiming to give you a snappier Discord experience with Vencord pre-installed.\",\r\n        \"link\": \"https://github.com/Vencord/Vesktop\",\r\n        \"winget\": \"Vencord.Vesktop\",\r\n        \"foss\": true\r\n    },\r\n    \"viber\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"viber\",\r\n        \"content\": \"Viber\",\r\n        \"description\": \"Viber is a free messaging and calling app with features like group chats, video calls, and more.\",\r\n        \"link\": \"https://www.viber.com/\",\r\n        \"winget\": \"Rakuten.Viber\"\r\n    },\r\n    \"videomass\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Videomass\",\r\n        \"description\": \"Videomass by GianlucaPernigotto is a cross-platform GUI for FFmpeg, streamlining multimedia file processing with batch conversions and user-friendly features.\",\r\n        \"link\": \"https://jeanslack.github.io/Videomass/\",\r\n        \"winget\": \"GianlucaPernigotto.Videomass\",\r\n        \"foss\": true\r\n    },\r\n    \"visualstudio2022\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"visualstudio2022community\",\r\n        \"content\": \"Visual Studio 2022\",\r\n        \"description\": \"Visual Studio 2022 is an integrated development environment (IDE) for building, debugging, and deploying applications.\",\r\n        \"link\": \"https://visualstudio.microsoft.com/\",\r\n        \"winget\": \"Microsoft.VisualStudio.2022.Community\"\r\n    },\r\n    \"visualstudio2026\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"visualstudio2026community\",\r\n        \"content\": \"Visual Studio 2026\",\r\n        \"description\": \"Visual Studio 2026 is an integrated development environment (IDE) for building, debugging, and deploying applications.\",\r\n        \"link\": \"https://visualstudio.microsoft.com/\",\r\n        \"winget\": \"Microsoft.VisualStudio.2026.Community\"\r\n    },\r\n    \"vivaldi\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"vivaldi\",\r\n        \"content\": \"Vivaldi\",\r\n        \"description\": \"Vivaldi is a highly customizable web browser with a focus on user personalization and productivity features.\",\r\n        \"link\": \"https://vivaldi.com/\",\r\n        \"winget\": \"Vivaldi.Vivaldi\"\r\n    },\r\n    \"vlc\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"vlc\",\r\n        \"content\": \"VLC (Video Player)\",\r\n        \"description\": \"VLC Media Player is a free and open-source multimedia player that supports a wide range of audio and video formats. It is known for its versatility and cross-platform compatibility.\",\r\n        \"link\": \"https://www.videolan.org/vlc/\",\r\n        \"winget\": \"VideoLAN.VLC\",\r\n        \"foss\": true\r\n    },\r\n    \"voicemeeter\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"voicemeeter\",\r\n        \"content\": \"Voicemeeter (Audio)\",\r\n        \"description\": \"Voicemeeter is a virtual audio mixer that allows you to manage and enhance audio streams on your computer. It is commonly used for audio recording and streaming purposes.\",\r\n        \"link\": \"https://voicemeeter.com/\",\r\n        \"winget\": \"VB-Audio.Voicemeeter\"\r\n    },\r\n    \"VoicemeeterPotato\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"voicemeeter-potato\",\r\n        \"content\": \"Voicemeeter Potato\",\r\n        \"description\": \"Voicemeeter Potato is the ultimate version of the Voicemeeter Audio Mixer Application endowed with Virtual Audio Device to mix and manage any audio sources from or to any audio devices or applications.\",\r\n        \"link\": \"https://voicemeeter.com/\",\r\n        \"winget\": \"VB-Audio.Voicemeeter.Potato\"\r\n    },\r\n    \"vrdesktopstreamer\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Virtual Desktop Streamer\",\r\n        \"description\": \"Virtual Desktop Streamer is a tool that allows you to stream your desktop screen to VR devices.\",\r\n        \"link\": \"https://www.vrdesktop.net/\",\r\n        \"winget\": \"VirtualDesktop.Streamer\"\r\n    },\r\n    \"vscode\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"vscode\",\r\n        \"content\": \"VS Code\",\r\n        \"description\": \"Visual Studio Code is a free, open-source code editor with support for multiple programming languages.\",\r\n        \"link\": \"https://code.visualstudio.com/\",\r\n        \"winget\": \"Microsoft.VisualStudioCode\",\r\n        \"foss\": true\r\n    },\r\n    \"vscodium\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"vscodium\",\r\n        \"content\": \"VS Codium\",\r\n        \"description\": \"VSCodium is a community-driven, freely-licensed binary distribution of Microsoft's VS Code.\",\r\n        \"link\": \"https://vscodium.com/\",\r\n        \"winget\": \"VSCodium.VSCodium\",\r\n        \"foss\": true\r\n    },\r\n    \"waterfox\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"waterfox\",\r\n        \"content\": \"Waterfox\",\r\n        \"description\": \"Waterfox is a fast, privacy-focused web browser based on Firefox, designed to preserve user choice and privacy.\",\r\n        \"link\": \"https://www.waterfox.net/\",\r\n        \"winget\": \"Waterfox.Waterfox\",\r\n        \"foss\": true\r\n    },\r\n    \"wazuh\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"wazuh-agent\",\r\n        \"content\": \"Wazuh.\",\r\n        \"description\": \"Wazuh is an open-source security monitoring platform that offers intrusion detection, compliance checks, and log analysis.\",\r\n        \"link\": \"https://wazuh.com/\",\r\n        \"winget\": \"Wazuh.WazuhAgent\",\r\n        \"foss\": true\r\n    },\r\n    \"wezterm\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"wezterm\",\r\n        \"content\": \"Wezterm\",\r\n        \"description\": \"WezTerm is a powerful cross-platform terminal emulator and multiplexer.\",\r\n        \"link\": \"https://wezfurlong.org/wezterm/index.html\",\r\n        \"winget\": \"wez.wezterm\",\r\n        \"foss\": true\r\n    },\r\n    \"windowspchealth\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Windows PC Health Check\",\r\n        \"description\": \"Windows PC Health Check is a tool that helps you check if your PC meets the system requirements for Windows 11.\",\r\n        \"link\": \"https://support.microsoft.com/en-us/windows/how-to-use-the-pc-health-check-app-9c8abd9b-03ba-4e67-81ef-36f37caa7844\",\r\n        \"winget\": \"Microsoft.WindowsPCHealthCheck\"\r\n    },\r\n    \"WindowGrid\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"windowgrid\",\r\n        \"content\": \"WindowGrid\",\r\n        \"description\": \"WindowGrid is a modern window management program for Windows that allows the user to quickly and easily layout their windows on a dynamic grid using just the mouse.\",\r\n        \"link\": \"http://windowgrid.net/\",\r\n        \"winget\": \"na\"\r\n    },\r\n    \"wingetui\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"wingetui\",\r\n        \"content\": \"UniGetUI\",\r\n        \"description\": \"UniGetUI is a GUI for Winget, Chocolatey, and other Windows CLI package managers.\",\r\n        \"link\": \"https://www.marticliment.com/wingetui/\",\r\n        \"winget\": \"MartiCliment.UniGetUI\",\r\n        \"foss\": true\r\n    },\r\n    \"winmerge\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"winmerge\",\r\n        \"content\": \"WinMerge\",\r\n        \"description\": \"WinMerge is a visual text file and directory comparison tool for Windows.\",\r\n        \"link\": \"https://winmerge.org/\",\r\n        \"winget\": \"WinMerge.WinMerge\",\r\n        \"foss\": true\r\n    },\r\n    \"winpaletter\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"WinPaletter\",\r\n        \"content\": \"WinPaletter\",\r\n        \"description\": \"WinPaletter is a tool for adjusting the color palette of Windows 10, providing customization options for window colors.\",\r\n        \"link\": \"https://github.com/Abdelrhman-AK/WinPaletter\",\r\n        \"winget\": \"Abdelrhman-AK.WinPaletter\",\r\n        \"foss\": true\r\n    },\r\n    \"winrar\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"winrar\",\r\n        \"content\": \"WinRAR\",\r\n        \"description\": \"WinRAR is a powerful archive manager that allows you to create, manage, and extract compressed files.\",\r\n        \"link\": \"https://www.win-rar.com/\",\r\n        \"winget\": \"RARLab.WinRAR\"\r\n    },\r\n    \"winscp\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"winscp\",\r\n        \"content\": \"WinSCP\",\r\n        \"description\": \"WinSCP is a popular open-source SFTP, FTP, and SCP client for Windows. It allows secure file transfers between a local and a remote computer.\",\r\n        \"link\": \"https://winscp.net/\",\r\n        \"winget\": \"WinSCP.WinSCP\",\r\n        \"foss\": true\r\n    },\r\n    \"wireguard\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"wireguard\",\r\n        \"content\": \"WireGuard\",\r\n        \"description\": \"WireGuard is a fast and modern VPN (Virtual Private Network) protocol. It aims to be simpler and more efficient than other VPN protocols, providing secure and reliable connections.\",\r\n        \"link\": \"https://www.wireguard.com/\",\r\n        \"winget\": \"WireGuard.WireGuard\",\r\n        \"foss\": true\r\n    },\r\n    \"wireshark\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"wireshark\",\r\n        \"content\": \"Wireshark\",\r\n        \"description\": \"Wireshark is a widely-used open-source network protocol analyzer. It allows users to capture and analyze network traffic in real-time, providing detailed insights into network activities.\",\r\n        \"link\": \"https://www.wireshark.org/\",\r\n        \"winget\": \"WiresharkFoundation.Wireshark\",\r\n        \"foss\": true\r\n    },\r\n    \"wisetoys\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"WiseToys\",\r\n        \"description\": \"WiseToys is a set of utilities and tools designed to enhance and optimize your Windows experience.\",\r\n        \"link\": \"https://toys.wisecleaner.com/\",\r\n        \"winget\": \"WiseCleaner.WiseToys\"\r\n    },\r\n    \"TeraCopy\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"TeraCopy\",\r\n        \"content\": \"TeraCopy\",\r\n        \"description\": \"Copy your files faster and more securely.\",\r\n        \"link\": \"https://codesector.com/teracopy\",\r\n        \"winget\": \"CodeSector.TeraCopy\"\r\n    },\r\n    \"wizfile\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"WizFile\",\r\n        \"description\": \"Find files by name on your hard drives almost instantly.\",\r\n        \"link\": \"https://antibody-software.com/wizfile/\",\r\n        \"winget\": \"AntibodySoftware.WizFile\"\r\n    },\r\n    \"wiztree\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"wiztree\",\r\n        \"content\": \"WizTree\",\r\n        \"description\": \"WizTree is a fast disk space analyzer that helps you quickly find the files and folders consuming the most space on your hard drive.\",\r\n        \"link\": \"https://wiztreefree.com/\",\r\n        \"winget\": \"AntibodySoftware.WizTree\"\r\n    },\r\n    \"xdm\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"xdm\",\r\n        \"content\": \"Xtreme Download Manager\",\r\n        \"description\": \"Xtreme Download Manager is an advanced download manager with support for various protocols and browsers. *Browser integration deprecated by google store. No official release.*\",\r\n        \"link\": \"https://xtremedownloadmanager.com/\",\r\n        \"winget\": \"subhra74.XtremeDownloadManager\",\r\n        \"foss\": true\r\n    },\r\n    \"xeheditor\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"HxD\",\r\n        \"content\": \"HxD Hex Editor\",\r\n        \"description\": \"HxD is a free hex editor that allows you to edit, view, search, and analyze binary files.\",\r\n        \"link\": \"https://mh-nexus.de/en/hxd/\",\r\n        \"winget\": \"MHNexus.HxD\"\r\n    },\r\n    \"xemu\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"XEMU\",\r\n        \"description\": \"XEMU is an open-source Xbox emulator that allows you to play Xbox games on your PC, aiming for accuracy and compatibility.\",\r\n        \"link\": \"https://xemu.app/\",\r\n        \"winget\": \"xemu-project.xemu\",\r\n        \"foss\": true\r\n    },\r\n    \"xnview\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"xnview\",\r\n        \"content\": \"XnView classic\",\r\n        \"description\": \"XnView is an efficient image viewer, browser and converter for Windows.\",\r\n        \"link\": \"https://www.xnview.com/en/xnview/\",\r\n        \"winget\": \"XnSoft.XnView.Classic\"\r\n    },\r\n    \"xournal\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"xournalplusplus\",\r\n        \"content\": \"Xournal++\",\r\n        \"description\": \"Xournal++ is an open-source handwriting notetaking software with PDF annotation capabilities.\",\r\n        \"link\": \"https://xournalpp.github.io/\",\r\n        \"winget\": \"Xournal++.Xournal++\",\r\n        \"foss\": true\r\n    },\r\n    \"xpipe\": {\r\n        \"category\": \"Pro Tools\",\r\n        \"choco\": \"xpipe\",\r\n        \"content\": \"XPipe\",\r\n        \"description\": \"XPipe is an open-source tool for orchestrating containerized applications. It simplifies the deployment and management of containerized services in a distributed environment.\",\r\n        \"link\": \"https://xpipe.io/\",\r\n        \"winget\": \"xpipe-io.xpipe\",\r\n        \"foss\": true\r\n    },\r\n    \"yarn\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"yarn\",\r\n        \"content\": \"Yarn\",\r\n        \"description\": \"Yarn is a fast, reliable, and secure dependency management tool for JavaScript projects.\",\r\n        \"link\": \"https://yarnpkg.com/\",\r\n        \"winget\": \"Yarn.Yarn\",\r\n        \"foss\": true\r\n    },\r\n    \"ytdlp\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"yt-dlp\",\r\n        \"content\": \"Yt-dlp\",\r\n        \"description\": \"Command-line tool that allows you to download videos from YouTube and other supported sites. It is an improved version of the popular youtube-dl.\",\r\n        \"link\": \"https://github.com/yt-dlp/yt-dlp\",\r\n        \"winget\": \"yt-dlp.yt-dlp\",\r\n        \"foss\": true\r\n    },\r\n    \"zerotierone\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"zerotier-one\",\r\n        \"content\": \"ZeroTier One\",\r\n        \"description\": \"ZeroTier One is a software-defined networking tool that allows you to create secure and scalable networks.\",\r\n        \"link\": \"https://zerotier.com/\",\r\n        \"winget\": \"ZeroTier.ZeroTierOne\"\r\n    },\r\n    \"zim\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"zim\",\r\n        \"content\": \"Zim Desktop Wiki\",\r\n        \"description\": \"Zim Desktop Wiki is a graphical text editor used to maintain a collection of wiki pages.\",\r\n        \"link\": \"https://zim-wiki.org/\",\r\n        \"winget\": \"Zimwiki.Zim\",\r\n        \"foss\": true\r\n    },\r\n    \"znote\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Znote\",\r\n        \"description\": \"Znote is a note-taking application.\",\r\n        \"link\": \"https://znote.io/\",\r\n        \"winget\": \"alagrede.znote\",\r\n        \"foss\": true\r\n    },\r\n    \"zoom\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"zoom\",\r\n        \"content\": \"Zoom\",\r\n        \"description\": \"Zoom is a popular video conferencing and web conferencing service for online meetings, webinars, and collaborative projects.\",\r\n        \"link\": \"https://zoom.us/\",\r\n        \"winget\": \"Zoom.Zoom\"\r\n    },\r\n    \"zoomit\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"ZoomIt\",\r\n        \"description\": \"A screen zoom, annotation, and recording tool for technical presentations and demos.\",\r\n        \"link\": \"https://learn.microsoft.com/en-us/sysinternals/downloads/zoomit\",\r\n        \"winget\": \"Microsoft.Sysinternals.ZoomIt\"\r\n    },\r\n    \"zotero\": {\r\n        \"category\": \"Document\",\r\n        \"choco\": \"zotero\",\r\n        \"content\": \"Zotero\",\r\n        \"description\": \"Zotero is a free, easy-to-use tool to help you collect, organize, cite, and share your research materials.\",\r\n        \"link\": \"https://www.zotero.org/\",\r\n        \"winget\": \"DigitalScholar.Zotero\",\r\n        \"foss\": true\r\n    },\r\n    \"zoxide\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"zoxide\",\r\n        \"content\": \"Zoxide\",\r\n        \"description\": \"Zoxide is a fast and efficient directory changer (cd) that helps you navigate your file system with ease.\",\r\n        \"link\": \"https://github.com/ajeetdsouza/zoxide\",\r\n        \"winget\": \"ajeetdsouza.zoxide\",\r\n        \"foss\": true\r\n    },\r\n    \"zulip\": {\r\n        \"category\": \"Communications\",\r\n        \"choco\": \"zulip\",\r\n        \"content\": \"Zulip\",\r\n        \"description\": \"Zulip is an open-source team collaboration tool with chat streams for productive and organized communication.\",\r\n        \"link\": \"https://zulipchat.com/\",\r\n        \"winget\": \"Zulip.Zulip\",\r\n        \"foss\": true\r\n    },\r\n    \"syncthingtray\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"syncthingtray\",\r\n        \"content\": \"Syncthingtray\",\r\n        \"description\": \"Might be the alternative for Synctrayzor. Windows tray utility / filesystem watcher / launcher for Syncthing.\",\r\n        \"link\": \"https://github.com/Martchus/syncthingtray\",\r\n        \"winget\": \"Martchus.syncthingtray\",\r\n        \"foss\": true\r\n    },\r\n    \"miniconda\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"miniconda3\",\r\n        \"content\": \"Miniconda\",\r\n        \"description\": \"Miniconda is a free minimal installer for conda. It is a small bootstrap version of Anaconda that includes only conda, Python, the packages they both depend on, and a small number of other useful packages (like pip, zlib, and a few others).\",\r\n        \"link\": \"https://docs.conda.io/projects/miniconda\",\r\n        \"winget\": \"Anaconda.Miniconda3\",\r\n        \"foss\": true\r\n    },\r\n    \"pixi\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"pixi\",\r\n        \"content\": \"Pixi\",\r\n        \"description\": \"Pixi is a fast software package manager built on top of the existing conda ecosystem. Spins up development environments quickly on Windows, macOS and Linux. Pixi supports Python, R, C/C++, Rust, Ruby, and many other languages.\",\r\n        \"link\": \"https://pixi.sh\",\r\n        \"winget\": \"prefix-dev.pixi\",\r\n        \"foss\": true\r\n    },\r\n    \"temurin\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"temurin\",\r\n        \"content\": \"Eclipse Temurin\",\r\n        \"description\": \"Eclipse Temurin is the open-source Java SE build based upon OpenJDK.\",\r\n        \"link\": \"https://adoptium.net/temurin/\",\r\n        \"winget\": \"EclipseAdoptium.Temurin.21.JDK\",\r\n        \"foss\": true\r\n    },\r\n    \"intelpresentmon\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Intel-PresentMon\",\r\n        \"description\": \"A new gaming performance overlay and telemetry application to monitor and measure your gaming experience.\",\r\n        \"link\": \"https://game.intel.com/us/stories/intel-presentmon/\",\r\n        \"winget\": \"Intel.PresentMon.Beta\",\r\n        \"foss\": true\r\n    },\r\n    \"pyenvwin\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"pyenv-win\",\r\n        \"content\": \"Python Version Manager (pyenv-win)\",\r\n        \"description\": \"pyenv for Windows is a simple python version management tool. It lets you easily switch between multiple versions of Python.\",\r\n        \"link\": \"https://pyenv-win.github.io/pyenv-win/\",\r\n        \"winget\": \"na\",\r\n        \"foss\": true\r\n    },\r\n    \"tightvnc\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"TightVNC\",\r\n        \"content\": \"TightVNC\",\r\n        \"description\": \"TightVNC is a free and open-source remote desktop software that lets you access and control a computer over the network. With its intuitive interface, you can interact with the remote screen as if you were sitting in front of it. You can open files, launch applications, and perform other actions on the remote desktop almost as if you were physically there.\",\r\n        \"link\": \"https://www.tightvnc.com/\",\r\n        \"winget\": \"GlavSoft.TightVNC\",\r\n        \"foss\": true\r\n    },\r\n    \"ultravnc\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"ultravnc\",\r\n        \"content\": \"UltraVNC\",\r\n        \"description\": \"UltraVNC is a powerful, easy to use and free - remote pc access software - that can display the screen of another computer (via internet or network) on your own screen. The program allows you to use your mouse and keyboard to control the other PC remotely. It means that you can work on a remote computer, as if you were sitting in front of it, right from your current location.\",\r\n        \"link\": \"https://uvnc.com/\",\r\n        \"winget\": \"uvncbvba.UltraVnc\",\r\n        \"foss\": true\r\n    },\r\n    \"windowsfirewallcontrol\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"windowsfirewallcontrol\",\r\n        \"content\": \"Windows Firewall Control\",\r\n        \"description\": \"Windows Firewall Control is a powerful tool which extends the functionality of Windows Firewall and provides new extra features which makes Windows Firewall better.\",\r\n        \"link\": \"https://www.binisoft.org/wfc\",\r\n        \"winget\": \"BiniSoft.WindowsFirewallControl\"\r\n    },\r\n    \"vistaswitcher\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"VistaSwitcher\",\r\n        \"description\": \"VistaSwitcher makes it easier for you to locate windows and switch focus, even on multi-monitor systems. The switcher window consists of an easy-to-read list of all tasks running with clearly shown titles and a full-sized preview of the selected task.\",\r\n        \"link\": \"https://www.ntwind.com/freeware/vistaswitcher.html\",\r\n        \"winget\": \"ntwind.VistaSwitcher\"\r\n    },\r\n    \"autodarkmode\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"auto-dark-mode\",\r\n        \"content\": \"Windows Auto Dark Mode\",\r\n        \"description\": \"Automatically switches between the dark and light theme of Windows 10 and Windows 11.\",\r\n        \"link\": \"https://github.com/AutoDarkMode/Windows-Auto-Night-Mode\",\r\n        \"winget\": \"Armin2208.WindowsAutoNightMode\",\r\n        \"foss\": true\r\n    },\r\n    \"AmbieWhiteNoise\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Ambie White Noise\",\r\n        \"description\": \"Ambie is the ultimate app to help you focus, study, or relax. We use white noise and nature sounds combined with an innovative focus timer to keep you concentrated on doing your best work.\",\r\n        \"link\": \"https://ambieapp.com/\",\r\n        \"winget\": \"9P07XNM5CHP0\",\r\n        \"foss\": true\r\n    },\r\n    \"magicwormhole\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"magic-wormhole\",\r\n        \"content\": \"Magic Wormhole\",\r\n        \"description\": \"get things from one computer to another, safely.\",\r\n        \"link\": \"https://github.com/magic-wormhole/magic-wormhole\",\r\n        \"winget\": \"magic-wormhole.magic-wormhole\",\r\n        \"foss\": true\r\n    },\r\n    \"croc\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"croc\",\r\n        \"content\": \"croc\",\r\n        \"description\": \"Easily and securely send things from one computer to another.\",\r\n        \"link\": \"https://github.com/schollz/croc\",\r\n        \"winget\": \"schollz.croc\",\r\n        \"foss\": true\r\n    },\r\n    \"qgis\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"qgis\",\r\n        \"content\": \"QGIS\",\r\n        \"description\": \"QGIS (Quantum GIS) is an open-source Geographic Information System (GIS) software that enables users to create, edit, visualize, analyze, and publish geospatial information on Windows, macOS, and Linux platforms.\",\r\n        \"link\": \"https://qgis.org/en/site/\",\r\n        \"winget\": \"OSGeo.QGIS\",\r\n        \"foss\": true\r\n    },\r\n    \"smplayer\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"smplayer\",\r\n        \"content\": \"SMPlayer\",\r\n        \"description\": \"SMPlayer is a free media player for Windows and Linux with built-in codecs that can play virtually all video and audio formats.\",\r\n        \"link\": \"https://www.smplayer.info\",\r\n        \"winget\": \"SMPlayer.SMPlayer\",\r\n        \"foss\": true\r\n    },\r\n    \"glazewm\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"GlazeWM\",\r\n        \"description\": \"GlazeWM is a tiling window manager for Windows inspired by i3 and Polybar.\",\r\n        \"link\": \"https://github.com/glzr-io/glazewm\",\r\n        \"winget\": \"glzr-io.glazewm\",\r\n        \"foss\": true\r\n    },\r\n    \"fancontrol\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"FanControl\",\r\n        \"description\": \"Fan Control is a free and open-source software that allows the user to control his CPU, GPU and case fans using temperatures.\",\r\n        \"link\": \"https://getfancontrol.com/\",\r\n        \"winget\": \"Rem0o.FanControl\",\r\n        \"foss\": true\r\n    },\r\n    \"fnm\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"fnm\",\r\n        \"content\": \"Fast Node Manager\",\r\n        \"description\": \"Fast Node Manager (fnm) allows you to switch your Node version by using the terminal.\",\r\n        \"link\": \"https://github.com/Schniz/fnm\",\r\n        \"winget\": \"Schniz.fnm\",\r\n        \"foss\": true\r\n    },\r\n    \"Windhawk\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"windhawk\",\r\n        \"content\": \"Windhawk\",\r\n        \"description\": \"The customization marketplace for Windows programs.\",\r\n        \"link\": \"https://windhawk.net\",\r\n        \"winget\": \"RamenSoftware.Windhawk\"\r\n    },\r\n    \"ForceAutoHDR\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"ForceAutoHDR\",\r\n        \"description\": \"ForceAutoHDR simplifies the process of adding games to the AutoHDR list in the Windows Registry.\",\r\n        \"link\": \"https://github.com/7gxycn08/ForceAutoHDR\",\r\n        \"winget\": \"ForceAutoHDR.7gxycn08\",\r\n        \"foss\": true\r\n    },\r\n    \"JoyToKey\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"joytokey\",\r\n        \"content\": \"JoyToKey\",\r\n        \"description\": \"Enables PC game controllers to emulate the keyboard and mouse input.\",\r\n        \"link\": \"https://joytokey.net/en/\",\r\n        \"winget\": \"JTKsoftware.JoyToKey\"\r\n    },\r\n    \"nditools\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"NDI Tools\",\r\n        \"description\": \"NDI, or Network Device Interface, is a video connectivity standard that enables multimedia systems to identify and communicate with one another over IP and to encode, transmit, and receive high-quality, low latency, frame-accurate video and audio, and exchange metadata in real-time.\",\r\n        \"link\": \"https://ndi.video/\",\r\n        \"winget\": \"NDI.NDITools\"\r\n    },\r\n    \"kicad\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Kicad\",\r\n        \"description\": \"Kicad is an open-source EDA tool. It's a good starting point for those who want to do electrical design and is even used by professionals in the industry.\",\r\n        \"link\": \"https://www.kicad.org/\",\r\n        \"winget\": \"KiCad.KiCad\",\r\n        \"foss\": true\r\n    },\r\n    \"dropox\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Dropbox\",\r\n        \"description\": \"The Dropbox desktop app! Save hard drive space, share and edit files and send for signature \\u2013 all without the distraction of countless browser tabs.\",\r\n        \"link\": \"https://www.dropbox.com/en_GB/desktop\",\r\n        \"winget\": \"Dropbox.Dropbox\"\r\n    },\r\n    \"Overwolf\": {\r\n        \"category\": \"Games\",\r\n        \"choco\": \"overwolf\",\r\n        \"content\": \"Overwolf\",\r\n        \"description\": \"Popular platform for game overlays and companion apps (mod managers, trackers, etc.), widely used by gamers.\",\r\n        \"link\": \"https://www.overwolf.com/app/overwolf-curseforge\",\r\n        \"winget\": \"Overwolf.CurseForge\"\r\n    },\r\n    \"OFGB\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"ofgb\",\r\n        \"content\": \"OFGB (Oh Frick Go Back)\",\r\n        \"description\": \"GUI Tool to remove ads from various places around Windows 11\",\r\n        \"link\": \"https://github.com/xM4ddy/OFGB\",\r\n        \"winget\": \"xM4ddy.OFGB\",\r\n        \"foss\": true\r\n    },\r\n    \"PaleMoon\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"paleMoon\",\r\n        \"content\": \"PaleMoon\",\r\n        \"description\": \"Pale Moon is an open-source, Goanna-based web browser available for Microsoft Windows and Linux (with other operating systems in development), focusing on efficiency and ease of use.\",\r\n        \"link\": \"https://www.palemoon.org/download.shtml\",\r\n        \"winget\": \"MoonchildProductions.PaleMoon\",\r\n        \"foss\": true\r\n    },\r\n    \"Shotcut\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Shotcut\",\r\n        \"description\": \"Shotcut is a free, open-source, cross-platform video editor.\",\r\n        \"link\": \"https://shotcut.org/\",\r\n        \"winget\": \"Meltytech.Shotcut\",\r\n        \"foss\": true\r\n    },\r\n    \"LenovoLegionToolkit\": {\r\n        \"category\": \"Utilities\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Lenovo Legion Toolkit\",\r\n        \"description\": \"Lenovo Legion Toolkit (LLT) is a open-source utility created for Lenovo Legion (and similar) series laptops, that allows changing a couple of features that are only available in Lenovo Vantage or Legion Zone. It runs no background services, uses less memory, uses virtually no CPU, and contains no telemetry. Just like Lenovo Vantage, this application is Windows only.\",\r\n        \"link\": \"https://github.com/BartoszCichecki/LenovoLegionToolkit\",\r\n        \"winget\": \"BartoszCichecki.LenovoLegionToolkit\",\r\n        \"foss\": true\r\n    },\r\n    \"PulsarEdit\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"pulsar\",\r\n        \"content\": \"Pulsar\",\r\n        \"description\": \"A Community-led Hyper-Hackable Text Editor\",\r\n        \"link\": \"https://pulsar-edit.dev/\",\r\n        \"winget\": \"Pulsar-Edit.Pulsar\",\r\n        \"foss\": true\r\n    },\r\n    \"Aegisub\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"aegisub\",\r\n        \"content\": \"Aegisub\",\r\n        \"description\": \"Aegisub is a free, cross-platform open-source tool for creating and modifying subtitles. Aegisub makes it quick and easy to time subtitles to audio, and features many powerful tools for styling them, including a built-in real-time video preview.\",\r\n        \"link\": \"https://github.com/Aegisub/Aegisub\",\r\n        \"winget\": \"Aegisub.Aegisub\",\r\n        \"foss\": true\r\n    },\r\n    \"SubtitleEdit\": {\r\n        \"category\": \"Multimedia Tools\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Subtitle Edit\",\r\n        \"description\": \"Subtitle Edit is a free and open-source editor for video subtitles.\",\r\n        \"link\": \"https://github.com/SubtitleEdit/subtitleedit\",\r\n        \"winget\": \"Nikse.SubtitleEdit\",\r\n        \"foss\": true\r\n    },\r\n    \"Fork\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"git-fork\",\r\n        \"content\": \"Fork\",\r\n        \"description\": \"Fork - a fast and friendly git client.\",\r\n        \"link\": \"https://git-fork.com/\",\r\n        \"winget\": \"Fork.Fork\"\r\n    },\r\n    \"ZenBrowser\": {\r\n        \"category\": \"Browsers\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Zen Browser\",\r\n        \"description\": \"The modern, privacy-focused, performance-driven browser built on Firefox.\",\r\n        \"link\": \"https://zen-browser.app/\",\r\n        \"winget\": \"Zen-Team.Zen-Browser\",\r\n        \"foss\": true\r\n    },\r\n    \"Zed\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"na\",\r\n        \"content\": \"Zed\",\r\n        \"description\": \"Zed is a modern, high-performance code editor designed from the ground up for speed and collaboration.\",\r\n        \"link\": \"https://zed.dev/\",\r\n        \"winget\": \"ZedIndustries.Zed\",\r\n        \"foss\": true\r\n    },\r\n    \"LLLVM\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"llvm\",\r\n        \"winget\": \"LLVM.LLVM\",\r\n        \"description\": \"A collection of modular and reusable compiler and toolchain technologies.\",\r\n        \"content\": \"LLVM\",\r\n        \"link\": \"https://llvm.org\",\r\n        \"foss\": true\r\n    },\r\n    \"NASM\": {\r\n        \"category\": \"Development\",\r\n        \"choco\": \"nasm\",\r\n        \"winget\": \"NASM.NASM\",\r\n        \"description\": \"A powerful assembler for the x86 platform.\",\r\n        \"content\": \"NASM\",\r\n        \"link\": \"https://nasm.us\",\r\n        \"foss\": true\r\n    }\r\n}\r\n"
  },
  {
    "path": "config/appnavigation.json",
    "content": "{\r\n    \"WPFInstall\": {\r\n        \"Content\": \"Install/Upgrade Applications\",\r\n        \"Category\": \"____Actions\",\r\n        \"Type\": \"Button\",\r\n        \"Order\": \"1\",\r\n        \"Description\": \"Install or upgrade the selected applications\"\r\n    },\r\n    \"WPFUninstall\": {\r\n        \"Content\": \"Uninstall Applications\",\r\n        \"Category\": \"____Actions\",\r\n        \"Type\": \"Button\",\r\n        \"Order\": \"2\",\r\n        \"Description\": \"Uninstall the selected applications\"\r\n    },\r\n    \"WPFInstallUpgrade\": {\r\n        \"Content\": \"Upgrade all Applications\",\r\n        \"Category\": \"____Actions\",\r\n        \"Type\": \"Button\",\r\n        \"Order\": \"3\",\r\n        \"Description\": \"Upgrade all applications to the latest version\"\r\n    },\r\n    \"WingetRadioButton\": {\r\n        \"Content\": \"Winget\",\r\n        \"Category\": \"__Package Manager\",\r\n        \"Type\": \"RadioButton\",\r\n        \"GroupName\": \"PackageManagerGroup\",\r\n        \"Checked\": true,\r\n        \"Order\": \"1\",\r\n        \"Description\": \"Use Winget for package management\"\r\n    },\r\n    \"ChocoRadioButton\": {\r\n        \"Content\": \"Chocolatey\",\r\n        \"Category\": \"__Package Manager\",\r\n        \"Type\": \"RadioButton\",\r\n        \"GroupName\": \"PackageManagerGroup\",\r\n        \"Checked\": false,\r\n        \"Order\": \"2\",\r\n        \"Description\": \"Use Chocolatey for package management\"\r\n    },\r\n    \"WPFCollapseAllCategories\": {\r\n        \"Content\": \"Collapse All Categories\",\r\n        \"Category\": \"__Selection\",\r\n        \"Type\": \"Button\",\r\n        \"Order\": \"1\",\r\n        \"Description\": \"Collapse all application categories\"\r\n    },\r\n    \"WPFExpandAllCategories\": {\r\n        \"Content\": \"Expand All Categories\",\r\n        \"Category\": \"__Selection\",\r\n        \"Type\": \"Button\",\r\n        \"Order\": \"2\",\r\n        \"Description\": \"Expand all application categories\"\r\n    },\r\n    \"WPFClearInstallSelection\": {\r\n        \"Content\": \"Clear Selection\",\r\n        \"Category\": \"__Selection\",\r\n        \"Type\": \"Button\",\r\n        \"Order\": \"3\",\r\n        \"Description\": \"Clear the selection of applications\"\r\n    },\r\n    \"WPFGetInstalled\": {\r\n        \"Content\": \"Show Installed Apps\",\r\n        \"Category\": \"__Selection\",\r\n        \"Type\": \"Button\",\r\n        \"Order\": \"4\",\r\n        \"Description\": \"Show installed applications\"\r\n    },\r\n    \"WPFselectedAppsButton\": {\r\n        \"Content\": \"Selected Apps: 0\",\r\n        \"Category\": \"__Selection\",\r\n        \"Type\": \"Button\",\r\n        \"Order\": \"5\",\r\n        \"Description\": \"Show the selected applications\"\r\n    },\r\n    \"WPFToggleFOSSHighlight\": {\r\n        \"Content\": \"Highlight FOSS\",\r\n        \"Category\": \"__Selection\",\r\n        \"Type\": \"Toggle\",\r\n        \"Checked\": true,\r\n        \"Order\": \"6\",\r\n        \"Description\": \"Toggle the green highlight for FOSS applications\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "config/dns.json",
    "content": "{\r\n    \"Google\":{\r\n        \"Primary\": \"8.8.8.8\",\r\n        \"Secondary\": \"8.8.4.4\",\r\n        \"Primary6\": \"2001:4860:4860::8888\",\r\n        \"Secondary6\": \"2001:4860:4860::8844\"\r\n    },\r\n    \"Cloudflare\":{\r\n        \"Primary\": \"1.1.1.1\",\r\n        \"Secondary\": \"1.0.0.1\",\r\n        \"Primary6\": \"2606:4700:4700::1111\",\r\n        \"Secondary6\": \"2606:4700:4700::1001\"\r\n    },\r\n    \"Cloudflare_Malware\":{\r\n        \"Primary\": \"1.1.1.2\",\r\n        \"Secondary\": \"1.0.0.2\",\r\n        \"Primary6\": \"2606:4700:4700::1112\",\r\n        \"Secondary6\": \"2606:4700:4700::1002\"\r\n    },\r\n    \"Cloudflare_Malware_Adult\":{\r\n        \"Primary\": \"1.1.1.3\",\r\n        \"Secondary\": \"1.0.0.3\",\r\n        \"Primary6\": \"2606:4700:4700::1113\",\r\n        \"Secondary6\": \"2606:4700:4700::1003\"\r\n    },\r\n    \"Open_DNS\":{\r\n        \"Primary\": \"208.67.222.222\",\r\n        \"Secondary\": \"208.67.220.220\",\r\n        \"Primary6\": \"2620:119:35::35\",\r\n        \"Secondary6\": \"2620:119:53::53\"\r\n    },\r\n    \"Quad9\":{\r\n        \"Primary\": \"9.9.9.9\",\r\n        \"Secondary\": \"149.112.112.112\",\r\n        \"Primary6\": \"2620:fe::fe\",\r\n        \"Secondary6\": \"2620:fe::9\"\r\n    },\r\n    \"AdGuard_Ads_Trackers\":{\r\n        \"Primary\": \"94.140.14.14\",\r\n        \"Secondary\": \"94.140.15.15\",\r\n        \"Primary6\": \"2a10:50c0::ad1:ff\",\r\n        \"Secondary6\": \"2a10:50c0::ad2:ff\"\r\n    },\r\n    \"AdGuard_Ads_Trackers_Malware_Adult\":{\r\n        \"Primary\": \"94.140.14.15\",\r\n        \"Secondary\": \"94.140.15.16\",\r\n        \"Primary6\": \"2a10:50c0::bad1:ff\",\r\n        \"Secondary6\": \"2a10:50c0::bad2:ff\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "config/feature.json",
    "content": "{\r\n  \"WPFFeaturesdotnet\": {\r\n    \"Content\": \"All .Net Framework (2,3,4)\",\r\n    \"Description\": \".NET and .NET Framework is a developer platform made up of tools, programming languages, and libraries for building many different types of applications.\",\r\n    \"category\": \"Features\",\r\n    \"panel\": \"1\",\r\n    \"feature\": [\r\n      \"NetFx4-AdvSrvs\",\r\n      \"NetFx3\"\r\n    ],\r\n    \"InvokeScript\": [],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/features/dotnet\"\r\n  },\r\n  \"WPFFeatureshyperv\": {\r\n    \"Content\": \"HyperV Virtualization\",\r\n    \"Description\": \"Hyper-V is a hardware virtualization product developed by Microsoft that allows users to create and manage virtual machines.\",\r\n    \"category\": \"Features\",\r\n    \"panel\": \"1\",\r\n    \"feature\": [\r\n      \"Microsoft-Hyper-V-All\"\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"bcdedit /set hypervisorschedulertype classic\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/features/hyperv\"\r\n  },\r\n  \"WPFFeatureslegacymedia\": {\r\n    \"Content\": \"Legacy Media (WMP, DirectPlay)\",\r\n    \"Description\": \"Enables legacy programs from previous versions of Windows.\",\r\n    \"category\": \"Features\",\r\n    \"panel\": \"1\",\r\n    \"feature\": [\r\n      \"WindowsMediaPlayer\",\r\n      \"MediaPlayback\",\r\n      \"DirectPlay\",\r\n      \"LegacyComponents\"\r\n    ],\r\n    \"InvokeScript\": [],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/features/legacymedia\"\r\n  },\r\n  \"WPFFeaturewsl\": {\r\n    \"Content\": \"Windows Subsystem for Linux\",\r\n    \"Description\": \"Windows Subsystem for Linux is an optional feature of Windows that allows Linux programs to run natively on Windows without the need for a separate virtual machine or dual booting.\",\r\n    \"category\": \"Features\",\r\n    \"panel\": \"1\",\r\n    \"feature\": [\r\n      \"VirtualMachinePlatform\",\r\n      \"Microsoft-Windows-Subsystem-Linux\"\r\n    ],\r\n    \"InvokeScript\": [],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/features/wsl\"\r\n  },\r\n  \"WPFFeaturenfs\": {\r\n    \"Content\": \"NFS - Network File System\",\r\n    \"Description\": \"Network File System (NFS) is a mechanism for storing files on a network.\",\r\n    \"category\": \"Features\",\r\n    \"panel\": \"1\",\r\n    \"feature\": [\r\n      \"ServicesForNFS-ClientOnly\",\r\n      \"ClientForNFS-Infrastructure\",\r\n      \"NFS-Administration\"\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"nfsadmin client stop\",\r\n      \"Set-ItemProperty -Path 'HKLM:\\\\SOFTWARE\\\\Microsoft\\\\ClientForNFS\\\\CurrentVersion\\\\Default' -Name 'AnonymousUID' -Type DWord -Value 0\",\r\n      \"Set-ItemProperty -Path 'HKLM:\\\\SOFTWARE\\\\Microsoft\\\\ClientForNFS\\\\CurrentVersion\\\\Default' -Name 'AnonymousGID' -Type DWord -Value 0\",\r\n      \"nfsadmin client start\",\r\n      \"nfsadmin client localhost config fileaccess=755 SecFlavors=+sys -krb5 -krb5i\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/features/nfs\"\r\n  },\r\n  \"WPFFeatureRegBackup\": {\r\n    \"Content\": \"Enable Daily Registry Backup Task 12.30am\",\r\n    \"Description\": \"Enables daily registry backup, previously disabled by Microsoft in Windows 10 1803.\",\r\n    \"category\": \"Features\",\r\n    \"panel\": \"1\",\r\n    \"feature\": [],\r\n    \"InvokeScript\": [\r\n      \"\r\n      New-ItemProperty -Path 'HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Configuration Manager' -Name 'EnablePeriodicBackup' -Type DWord -Value 1 -Force\r\n      New-ItemProperty -Path 'HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Configuration Manager' -Name 'BackupCount' -Type DWord -Value 2 -Force\r\n      $action = New-ScheduledTaskAction -Execute 'schtasks' -Argument '/run /i /tn \\\"\\\\Microsoft\\\\Windows\\\\Registry\\\\RegIdleBackup\\\"'\r\n      $trigger = New-ScheduledTaskTrigger -Daily -At 00:30\r\n      Register-ScheduledTask -Action $action -Trigger $trigger -TaskName 'AutoRegBackup' -Description 'Create System Registry Backups' -User 'System'\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/features/regbackup\"\r\n  },\r\n  \"WPFFeatureEnableLegacyRecovery\": {\r\n    \"Content\": \"Enable Legacy F8 Boot Recovery\",\r\n    \"Description\": \"Enables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes.\",\r\n    \"category\": \"Features\",\r\n    \"panel\": \"1\",\r\n    \"feature\": [],\r\n    \"InvokeScript\": [\r\n      \"bcdedit /set bootmenupolicy legacy\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/features/enablelegacyrecovery\"\r\n  },\r\n  \"WPFFeatureDisableLegacyRecovery\": {\r\n    \"Content\": \"Disable Legacy F8 Boot Recovery\",\r\n    \"Description\": \"Disables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes.\",\r\n    \"category\": \"Features\",\r\n    \"panel\": \"1\",\r\n    \"feature\": [],\r\n    \"InvokeScript\": [\r\n      \"bcdedit /set bootmenupolicy standard\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/features/disablelegacyrecovery\"\r\n  },\r\n  \"WPFFeaturesSandbox\": {\r\n    \"Content\": \"Windows Sandbox\",\r\n    \"Description\": \"Windows Sandbox is a lightweight virtual machine that provides a temporary desktop environment to safely run applications and programs in isolation.\",\r\n    \"category\": \"Features\",\r\n    \"panel\": \"1\",\r\n    \"feature\": [\r\n      \"Containers-DisposableClientVM\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/features/sandbox\"\r\n  },\r\n  \"WPFFeatureInstall\": {\r\n    \"Content\": \"Install Features\",\r\n    \"category\": \"Features\",\r\n    \"panel\": \"1\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"function\": \"Invoke-WPFFeatureInstall\",\r\n    \"link\": \"https://winutil.christitus.com/dev/features/features/install\"\r\n  },\r\n  \"WPFPanelAutologin\": {\r\n    \"Content\": \"Set Up Autologin\",\r\n    \"category\": \"Fixes\",\r\n    \"panel\": \"1\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"function\": \"Invoke-WPFPanelAutologin\",\r\n    \"link\": \"https://winutil.christitus.com/dev/features/fixes/autologin\"\r\n  },\r\n  \"WPFFixesUpdate\": {\r\n    \"Content\": \"Reset Windows Update\",\r\n    \"category\": \"Fixes\",\r\n    \"panel\": \"1\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"function\": \"Invoke-WPFFixesUpdate\",\r\n    \"link\": \"https://winutil.christitus.com/dev/features/fixes/update\"\r\n  },\r\n  \"WPFFixesNetwork\": {\r\n    \"Content\": \"Reset Network\",\r\n    \"category\": \"Fixes\",\r\n    \"panel\": \"1\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"function\": \"Invoke-WPFFixesNetwork\",\r\n    \"link\": \"https://winutil.christitus.com/dev/features/fixes/network\"\r\n  },\r\n  \"WPFPanelDISM\": {\r\n    \"Content\": \"System Corruption Scan\",\r\n    \"category\": \"Fixes\",\r\n    \"panel\": \"1\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"function\": \"Invoke-WPFSystemRepair\",\r\n    \"link\": \"https://winutil.christitus.com/dev/features/fixes/dism\"\r\n  },\r\n  \"WPFFixesWinget\": {\r\n    \"Content\": \"WinGet Reinstall\",\r\n    \"category\": \"Fixes\",\r\n    \"panel\": \"1\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"function\": \"Invoke-WPFFixesWinget\",\r\n    \"link\": \"https://winutil.christitus.com/dev/features/fixes/winget\"\r\n  },\r\n  \"WPFPanelControl\": {\r\n    \"Content\": \"Control Panel\",\r\n    \"category\": \"Legacy Windows Panels\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"InvokeScript\": [\r\n      \"control\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/legacy-windows-panels/control\"\r\n  },\r\n  \"WPFPanelComputer\": {\r\n    \"Content\": \"Computer Management\",\r\n    \"category\": \"Legacy Windows Panels\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"InvokeScript\": [\r\n      \"compmgmt.msc\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/legacy-windows-panels/computer\"\r\n  },\r\n  \"WPFPanelNetwork\": {\r\n    \"Content\": \"Network Connections\",\r\n    \"category\": \"Legacy Windows Panels\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"InvokeScript\": [\r\n      \"ncpa.cpl\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/legacy-windows-panels/network\"\r\n  },\r\n  \"WPFPanelPower\": {\r\n    \"Content\": \"Power Panel\",\r\n    \"category\": \"Legacy Windows Panels\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"InvokeScript\": [\r\n      \"powercfg.cpl\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/legacy-windows-panels/power\"\r\n  },\r\n  \"WPFPanelPrinter\": {\r\n    \"Content\": \"Printer Panel\",\r\n    \"category\": \"Legacy Windows Panels\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"InvokeScript\": [\r\n      \"Start-Process 'shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}'\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/legacy-windows-panels/printer\"\r\n  },\r\n  \"WPFPanelRegion\": {\r\n    \"Content\": \"Region\",\r\n    \"category\": \"Legacy Windows Panels\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"InvokeScript\": [\r\n      \"intl.cpl\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/legacy-windows-panels/region\"\r\n  },\r\n  \"WPFPanelRestore\": {\r\n    \"Content\": \"Windows Restore\",\r\n    \"category\": \"Legacy Windows Panels\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"InvokeScript\": [\r\n      \"rstrui.exe\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/legacy-windows-panels/restore\"\r\n  },\r\n  \"WPFPanelSound\": {\r\n    \"Content\": \"Sound Settings\",\r\n    \"category\": \"Legacy Windows Panels\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"InvokeScript\": [\r\n      \"mmsys.cpl\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/legacy-windows-panels/sound\"\r\n  },\r\n  \"WPFPanelSystem\": {\r\n    \"Content\": \"System Properties\",\r\n    \"category\": \"Legacy Windows Panels\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"InvokeScript\": [\r\n      \"sysdm.cpl\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/legacy-windows-panels/system\"\r\n  },\r\n  \"WPFPanelTimedate\": {\r\n    \"Content\": \"Time and Date\",\r\n    \"category\": \"Legacy Windows Panels\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"InvokeScript\": [\r\n      \"timedate.cpl\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/features/legacy-windows-panels/timedate\"\r\n  },\r\n  \"WPFWinUtilInstallPSProfile\": {\r\n    \"Content\": \"Install CTT PowerShell Profile\",\r\n    \"category\": \"Powershell Profile Powershell 7+ Only\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"function\": \"Invoke-WinUtilInstallPSProfile\",\r\n    \"link\": \"https://winutil.christitus.com/dev/features/powershell-profile-powershell-7--only/installpsprofile\"\r\n  },\r\n  \"WPFWinUtilUninstallPSProfile\": {\r\n    \"Content\": \"Uninstall CTT PowerShell Profile\",\r\n    \"category\": \"Powershell Profile Powershell 7+ Only\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"function\": \"Invoke-WinUtilUninstallPSProfile\",\r\n    \"link\": \"https://winutil.christitus.com/dev/features/powershell-profile-powershell-7--only/uninstallpsprofile\"\r\n  },\r\n  \"WPFWinUtilSSHServer\": {\r\n    \"Content\": \"Enable OpenSSH Server\",\r\n    \"category\": \"Remote Access\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"function\": \"Invoke-WPFSSHServer\",\r\n    \"link\": \"https://winutil.christitus.com/dev/features/remote-access/sshserver\"\r\n  }\r\n}\r\n"
  },
  {
    "path": "config/preset.json",
    "content": "{\r\n  \"Standard\": [\r\n    \"WPFTweaksActivity\",\r\n    \"WPFTweaksConsumerFeatures\",\r\n    \"WPFTweaksDisableExplorerAutoDiscovery\",\r\n    \"WPFTweaksWPBT\",\r\n    \"WPFTweaksDVR\",\r\n    \"WPFTweaksLocation\",\r\n    \"WPFTweaksServices\",\r\n    \"WPFTweaksTelemetry\",\r\n    \"WPFTweaksDiskCleanup\",\r\n    \"WPFTweaksDeleteTempFiles\",\r\n    \"WPFTweaksEndTaskOnTaskbar\",\r\n    \"WPFTweaksRestorePoint\",\r\n    \"WPFTweaksPowershell7Tele\"\r\n  ],\r\n  \"Minimal\": [\r\n    \"WPFTweaksConsumerFeatures\",\r\n    \"WPFTweaksWPBT\",\r\n    \"WPFTweaksServices\",\r\n    \"WPFTweaksTelemetry\"\r\n  ]\r\n}\r\n"
  },
  {
    "path": "config/themes.json",
    "content": "{\r\n    \"shared\":{\r\n        \"AppEntryWidth\":  \"200\",\r\n        \"AppEntryFontSize\":  \"11\",\r\n        \"AppEntryMargin\":  \"1,0,1,0\",\r\n        \"AppEntryBorderThickness\":  \"0\",\r\n        \"CustomDialogFontSize\":       \"12\",\r\n        \"CustomDialogFontSizeHeader\": \"14\",\r\n        \"CustomDialogLogoSize\":       \"25\",\r\n        \"CustomDialogWidth\":          \"400\",\r\n        \"CustomDialogHeight\":         \"200\",\r\n        \"FontSize\":         \"12\",\r\n        \"FontFamily\":       \"Arial\",\r\n        \"HeaderFontSize\":  \"16\",\r\n        \"HeaderFontFamily\": \"Consolas, Monaco\",\r\n        \"CheckBoxBulletDecoratorSize\": \"14\",\r\n        \"CheckBoxMargin\": \"15,0,0,2\",\r\n        \"TabContentMargin\":       \"5\",\r\n        \"TabButtonFontSize\":      \"14\",\r\n        \"TabButtonWidth\":         \"110\",\r\n        \"TabButtonHeight\":        \"26\",\r\n        \"TabRowHeightInPixels\":   \"50\",\r\n        \"ToolTipWidth\":         \"300\",\r\n        \"IconFontSize\":     \"14\",\r\n        \"IconButtonSize\":   \"35\",\r\n        \"SettingsIconFontSize\":   \"18\",\r\n        \"CloseIconFontSize\":      \"18\",\r\n        \"GroupBorderBackgroundColor\":  \"#232629\",\r\n        \"ButtonFontSize\":   \"12\",\r\n        \"ButtonFontFamily\": \"Arial\",\r\n        \"ButtonWidth\":      \"200\",\r\n        \"ButtonHeight\":     \"25\",\r\n        \"ConfigTabButtonFontSize\":   \"14\",\r\n        \"ConfigUpdateButtonFontSize\":   \"14\",\r\n        \"SearchBarWidth\":               \"200\",\r\n        \"SearchBarHeight\":              \"26\",\r\n        \"SearchBarTextBoxFontSize\":     \"12\",\r\n        \"SearchBarClearButtonFontSize\": \"14\",\r\n        \"CheckboxMouseOverColor\": \"#999999\",\r\n        \"ButtonBorderThickness\":  \"1\",\r\n        \"ButtonMargin\":  \"1\",\r\n        \"ButtonCornerRadius\": \"2\"\r\n    },\r\n    \"Light\": {\r\n        \"AppInstallUnselectedColor\": \"#F7F7F7\",\r\n        \"AppInstallHighlightedColor\": \"#CFCFCF\",\r\n        \"AppInstallSelectedColor\": \"#C2C2C2\",\r\n        \"AppInstallOverlayBackgroundColor\":\"#6A6D72\",\r\n        \"ComboBoxForegroundColor\":  \"#232629\",\r\n        \"ComboBoxBackgroundColor\":  \"#F7F7F7\",\r\n        \"LabelboxForegroundColor\":  \"#232629\",\r\n        \"MainForegroundColor\":  \"#232629\",\r\n        \"MainBackgroundColor\":  \"#F7F7F7\",\r\n        \"LabelBackgroundColor\":  \"#F7F7F7\",\r\n        \"LinkForegroundColor\":  \"#484848\",\r\n        \"LinkHoverForegroundColor\":  \"#232629\",\r\n        \"ScrollBarBackgroundColor\": \"#4A4D52\",\r\n        \"ScrollBarHoverColor\": \"#5A5D62\",\r\n        \"ScrollBarDraggingColor\": \"#6A6D72\",\r\n\r\n        \"ProgressBarForegroundColor\": \"#2e77ff\",\r\n        \"ProgressBarBackgroundColor\": \"Transparent\",\r\n        \"ProgressBarTextColor\": \"#232629\",\r\n        \"ButtonInstallBackgroundColor\":  \"#F7F7F7\",\r\n        \"ButtonTweaksBackgroundColor\":  \"#F7F7F7\",\r\n        \"ButtonConfigBackgroundColor\":  \"#F7F7F7\",\r\n        \"ButtonUpdatesBackgroundColor\":  \"#F7F7F7\",\r\n        \"ButtonWin11ISOBackgroundColor\": \"#F7F7F7\",\r\n        \"ButtonInstallForegroundColor\":  \"#232629\",\r\n        \"ButtonTweaksForegroundColor\":  \"#232629\",\r\n        \"ButtonConfigForegroundColor\":  \"#232629\",\r\n        \"ButtonUpdatesForegroundColor\":  \"#232629\",\r\n        \"ButtonWin11ISOForegroundColor\": \"#232629\",\r\n        \"ButtonBackgroundColor\":  \"#F5F5F5\",\r\n        \"ButtonBackgroundPressedColor\":  \"#1A1A1A\",\r\n        \"ButtonBackgroundMouseoverColor\":  \"#C2C2C2\",\r\n        \"ButtonBackgroundSelectedColor\":  \"#F0F0F0\",\r\n        \"ButtonForegroundColor\":  \"#232629\",\r\n        \"ToggleButtonOnColor\":  \"#2e77ff\",\r\n        \"ToggleButtonOffColor\": \"#707070\",\r\n        \"ToolTipBackgroundColor\": \"#F7F7F7\",\r\n        \"BorderColor\": \"#232629\",\r\n        \"BorderOpacity\": \"0.2\"\r\n\r\n    },\r\n    \"Dark\": {\r\n        \"AppInstallUnselectedColor\": \"#232629\",\r\n        \"AppInstallHighlightedColor\": \"#3C3C3C\",\r\n        \"AppInstallSelectedColor\": \"#4C4C4C\",\r\n        \"AppInstallOverlayBackgroundColor\":\"#2E3135\",\r\n        \"ComboBoxForegroundColor\":  \"#F7F7F7\",\r\n        \"ComboBoxBackgroundColor\":  \"#1E3747\",\r\n        \"LabelboxForegroundColor\":  \"#5bdcff\",\r\n        \"MainForegroundColor\":  \"#F7F7F7\",\r\n        \"MainBackgroundColor\":  \"#232629\",\r\n        \"LabelBackgroundColor\":  \"#232629\",\r\n        \"LinkForegroundColor\":  \"#add8e6\",\r\n        \"LinkHoverForegroundColor\":  \"#F7F7F7\",\r\n        \"ScrollBarBackgroundColor\": \"#2E3135\",\r\n        \"ScrollBarHoverColor\": \"#3B4252\",\r\n        \"ScrollBarDraggingColor\": \"#5E81AC\",\r\n\r\n        \"ProgressBarForegroundColor\": \"#222222\",\r\n        \"ProgressBarBackgroundColor\": \"Transparent\",\r\n        \"ProgressBarTextColor\": \"#232629\",\r\n        \"ButtonInstallBackgroundColor\":  \"#222222\",\r\n        \"ButtonTweaksBackgroundColor\":  \"#333333\",\r\n        \"ButtonConfigBackgroundColor\":  \"#444444\",\r\n        \"ButtonUpdatesBackgroundColor\":  \"#555555\",\r\n        \"ButtonWin11ISOBackgroundColor\": \"#666666\",\r\n        \"ButtonInstallForegroundColor\":  \"#F7F7F7\",\r\n        \"ButtonTweaksForegroundColor\":  \"#F7F7F7\",\r\n        \"ButtonConfigForegroundColor\":  \"#F7F7F7\",\r\n        \"ButtonUpdatesForegroundColor\":  \"#F7F7F7\",\r\n        \"ButtonWin11ISOForegroundColor\": \"#F7F7F7\",\r\n        \"ButtonBackgroundColor\":  \"#1E3747\",\r\n        \"ButtonBackgroundPressedColor\":  \"#F7F7F7\",\r\n        \"ButtonBackgroundMouseoverColor\":  \"#3B4252\",\r\n        \"ButtonBackgroundSelectedColor\":  \"#5E81AC\",\r\n        \"ButtonForegroundColor\":  \"#F7F7F7\",\r\n        \"ToggleButtonOnColor\": \"#2e77ff\",\r\n        \"ToggleButtonOffColor\": \"#707070\",\r\n        \"ToolTipBackgroundColor\": \"#2F373D\",\r\n        \"BorderColor\": \"#2F373D\",\r\n        \"BorderOpacity\": \"0.2\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "config/tweaks.json",
    "content": "{\r\n  \"WPFTweaksActivity\": {\r\n    \"Content\": \"Disable Activity History\",\r\n    \"Description\": \"Erases recent docs, clipboard, and run history.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\System\",\r\n        \"Name\": \"EnableActivityFeed\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\System\",\r\n        \"Name\": \"PublishUserActivities\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\System\",\r\n        \"Name\": \"UploadUserActivities\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/activity\"\r\n  },\r\n  \"WPFTweaksHiber\": {\r\n    \"Content\": \"Disable Hibernation\",\r\n    \"Description\": \"Hibernation is really meant for laptops as it saves what's in memory before turning the PC off. It really should never be used.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\System\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Power\",\r\n        \"Name\": \"HibernateEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\FlyoutMenuSettings\",\r\n        \"Name\": \"ShowHibernateOption\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"powercfg.exe /hibernate off\"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"powercfg.exe /hibernate on\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/hiber\"\r\n  },\r\n  \"WPFTweaksWidget\": {\r\n    \"Content\": \"Remove Widgets\",\r\n    \"Description\": \"Removes the annoying widgets in the bottom left of the Taskbar.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"\r\n      # Sometimes if you dont stop the Widgets process the removal may fail\r\n\r\n      Stop-Process -Name Widgets\r\n      Get-AppxPackage Microsoft.WidgetsPlatformRuntime -AllUsers | Remove-AppxPackage -AllUsers\r\n      Get-AppxPackage MicrosoftWindows.Client.WebExperience -AllUsers | Remove-AppxPackage -AllUsers\r\n\r\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\r\n      Write-Host \\\"Removed widgets\\\"\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      Write-Host \\\"Restoring widgets AppxPackages\\\"\r\n\r\n      Add-AppxPackage -Register \\\"C:\\\\Program Files\\\\WindowsApps\\\\Microsoft.WidgetsPlatformRuntime*\\\\AppxManifest.xml\\\" -DisableDevelopmentMode\r\n      Add-AppxPackage -Register \\\"C:\\\\Program Files\\\\WindowsApps\\\\MicrosoftWindows.Client.WebExperience*\\\\AppxManifest.xml\\\" -DisableDevelopmentMode\r\n\r\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/widget\"\r\n  },\r\n  \"WPFTweaksRevertStartMenu\": {\r\n    \"Content\": \"Revert Start Menu layout\",\r\n    \"Description\": \"Bring back the old Start Menu layout from before the gradual rollout of the new one in 25H2.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"\r\n      Invoke-WebRequest https://github.com/thebookisclosed/ViVe/releases/download/v0.3.4/ViVeTool-v0.3.4-IntelAmd.zip -OutFile ViVeTool.zip\r\n\r\n      Expand-Archive ViVeTool.zip\r\n      Remove-Item ViVeTool.zip\r\n\r\n      Start-Process 'ViVeTool\\\\ViVeTool.exe' -ArgumentList '/disable /id:47205210' -Wait -NoNewWindow\r\n\r\n      Remove-Item ViVeTool -Recurse\r\n\r\n      Write-Host 'Old start menu reverted please restart your computer to take effect'\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      Invoke-WebRequest https://github.com/thebookisclosed/ViVe/releases/download/v0.3.4/ViVeTool-v0.3.4-IntelAmd.zip -OutFile ViVeTool.zip\r\n\r\n      Expand-Archive ViVeTool.zip\r\n      Remove-Item ViVeTool.zip\r\n\r\n      Start-Process 'ViVeTool\\\\ViVeTool.exe' -ArgumentList '/enable /id:47205210' -Wait -NoNewWindow\r\n\r\n      Remove-Item ViVeTool -Recurse\r\n\r\n      Write-Host 'New start menu reverted please restart your computer to take effect'\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/revertstartmenu\"\r\n  },\r\n  \"WPFTweaksDisableStoreSearch\": {\r\n    \"Content\": \"Disable Microsoft Store search results\",\r\n    \"Description\": \"Will not display recommended Microsoft Store apps when searching for apps in the Start menu.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"icacls \\\"$Env:LocalAppData\\\\Packages\\\\Microsoft.WindowsStore_8wekyb3d8bbwe\\\\LocalState\\\\store.db\\\" /deny Everyone:F\"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"icacls \\\"$Env:LocalAppData\\\\Packages\\\\Microsoft.WindowsStore_8wekyb3d8bbwe\\\\LocalState\\\\store.db\\\" /grant Everyone:F\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/disablestoresearch\"\r\n  },\r\n  \"WPFTweaksLocation\": {\r\n    \"Content\": \"Disable Location Tracking\",\r\n    \"Description\": \"Disables Location Tracking.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\CapabilityAccessManager\\\\ConsentStore\\\\location\",\r\n        \"Name\": \"Value\",\r\n        \"Value\": \"Deny\",\r\n        \"Type\": \"String\",\r\n        \"OriginalValue\": \"Allow\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\Sensor\\\\Overrides\\\\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}\",\r\n        \"Name\": \"SensorPermissionState\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\lfsvc\\\\Service\\\\Configuration\",\r\n        \"Name\": \"Status\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\Maps\",\r\n        \"Name\": \"AutoUpdateEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/location\"\r\n  },\r\n  \"WPFTweaksServices\": {\r\n    \"Content\": \"Set Services to Manual\",\r\n    \"Description\": \"Turns a bunch of system services to manual that don't need to be running all the time. This is pretty harmless as if the service is needed, it will simply start on demand.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"service\": [\r\n      {\r\n        \"Name\": \"ALG\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"AppMgmt\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"AppReadiness\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"AppVClient\",\r\n        \"StartupType\": \"Disabled\",\r\n        \"OriginalType\": \"Disabled\"\r\n      },\r\n      {\r\n        \"Name\": \"Appinfo\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"AssignedAccessManagerSvc\",\r\n        \"StartupType\": \"Disabled\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"AudioEndpointBuilder\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"AudioSrv\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"Audiosrv\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"AxInstSV\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"BDESVC\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"BITS\",\r\n        \"StartupType\": \"AutomaticDelayedStart\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"BTAGService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"BthAvctpSvc\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"CDPSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"COMSysApp\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"CertPropSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"CryptSvc\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"CscService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"DPS\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"DevQueryBroker\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"DeviceAssociationService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"DeviceInstall\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"Dhcp\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"DiagTrack\",\r\n        \"StartupType\": \"Disabled\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"DialogBlockingService\",\r\n        \"StartupType\": \"Disabled\",\r\n        \"OriginalType\": \"Disabled\"\r\n      },\r\n      {\r\n        \"Name\": \"DispBrokerDesktopSvc\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"DisplayEnhancementService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"EFS\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"EapHost\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"EventLog\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"EventSystem\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"FDResPub\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"FontCache\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"FrameServer\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"FrameServerMonitor\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"GraphicsPerfSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"HvHost\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"IKEEXT\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"InstallService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"InventorySvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"IpxlatCfgSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"KeyIso\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"KtmRm\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"LanmanServer\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"LanmanWorkstation\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"LicenseManager\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"LxpSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"MSDTC\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"MSiSCSI\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"MapsBroker\",\r\n        \"StartupType\": \"AutomaticDelayedStart\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"McpManagementService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"MicrosoftEdgeElevationService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"NaturalAuthentication\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"NcaSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"NcbService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"NcdAutoSetup\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"NetSetupSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"NetTcpPortSharing\",\r\n        \"StartupType\": \"Disabled\",\r\n        \"OriginalType\": \"Disabled\"\r\n      },\r\n      {\r\n        \"Name\": \"Netman\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"NlaSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"PcaSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"PeerDistSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"PerfHost\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"PhoneSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"PlugPlay\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"PolicyAgent\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"Power\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"PrintNotify\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"ProfSvc\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"PushToInstall\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"QWAVE\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"RasAuto\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"RasMan\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"RemoteAccess\",\r\n        \"StartupType\": \"Disabled\",\r\n        \"OriginalType\": \"Disabled\"\r\n      },\r\n      {\r\n        \"Name\": \"RemoteRegistry\",\r\n        \"StartupType\": \"Disabled\",\r\n        \"OriginalType\": \"Disabled\"\r\n      },\r\n      {\r\n        \"Name\": \"RetailDemo\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"RmSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"RpcLocator\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SCPolicySvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SCardSvr\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SDRSVC\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SEMgrSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SENS\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"SNMPTRAP\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SNMPTrap\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SSDPSRV\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SamSs\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"ScDeviceEnum\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SensorDataService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SensorService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SensrSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SessionEnv\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"SharedAccess\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"ShellHWDetection\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"SmsRouter\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"Spooler\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"SstpSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"StiSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"StorSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"SysMain\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"TapiSrv\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"TermService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"Themes\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"TieringEngineService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"TokenBroker\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"TrkWks\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"TroubleshootingSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"TrustedInstaller\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"UevAgentService\",\r\n        \"StartupType\": \"Disabled\",\r\n        \"OriginalType\": \"Disabled\"\r\n      },\r\n      {\r\n        \"Name\": \"UmRdpService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"UserManager\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"UsoSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"VSS\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"VaultSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"W32Time\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WEPHOSTSVC\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WFDSConMgrSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WMPNetworkSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WManSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WPDBusEnum\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WSAIFabricSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"WSearch\",\r\n        \"StartupType\": \"AutomaticDelayedStart\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"WalletService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WarpJITSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WbioSrvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"Wcmsvc\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"WdiServiceHost\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WdiSystemHost\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WebClient\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"Wecsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WerSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WiaRpc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WinRM\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"Winmgmt\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"WpcMonSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"WpnService\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"XblAuthManager\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"XblGameSave\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"XboxGipSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"XboxNetApiSvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"autotimesvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"bthserv\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"camsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"cloudidsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"dcsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"defragsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"diagsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"dmwappushservice\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"dot3svc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"edgeupdate\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"edgeupdatem\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"fdPHost\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"fhsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"hidserv\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"icssvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"iphlpsvc\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"lfsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"lltdsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"lmhosts\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"netprofm\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"nsi\",\r\n        \"StartupType\": \"Automatic\",\r\n        \"OriginalType\": \"Automatic\"\r\n      },\r\n      {\r\n        \"Name\": \"perceptionsimulation\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"pla\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"seclogon\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"shpamsvc\",\r\n        \"StartupType\": \"Disabled\",\r\n        \"OriginalType\": \"Disabled\"\r\n      },\r\n      {\r\n        \"Name\": \"smphost\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"ssh-agent\",\r\n        \"StartupType\": \"Disabled\",\r\n        \"OriginalType\": \"Disabled\"\r\n      },\r\n      {\r\n        \"Name\": \"svsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"swprv\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"tzautoupdate\",\r\n        \"StartupType\": \"Disabled\",\r\n        \"OriginalType\": \"Disabled\"\r\n      },\r\n      {\r\n        \"Name\": \"upnphost\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"vds\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"vmicguestinterface\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"vmicheartbeat\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"vmickvpexchange\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"vmicrdv\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"vmicshutdown\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"vmictimesync\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"vmicvmsession\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"vmicvss\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"wbengine\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"wcncsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"webthreatdefsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"wercplsupport\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"wisvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"wlidsvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"wlpasvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"wmiApSrv\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"workfolderssvc\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      },\r\n      {\r\n        \"Name\": \"wuauserv\",\r\n        \"StartupType\": \"Manual\",\r\n        \"OriginalType\": \"Manual\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/services\"\r\n  },\r\n  \"WPFTweaksBraveDebloat\": {\r\n    \"Content\": \"Brave Debloat\",\r\n    \"Description\": \"Disables various annoyances like Brave Rewards, Leo AI, Crypto Wallet and VPN.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\BraveSoftware\\\\Brave\",\r\n        \"Name\": \"BraveRewardsDisabled\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\BraveSoftware\\\\Brave\",\r\n        \"Name\": \"BraveWalletDisabled\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\BraveSoftware\\\\Brave\",\r\n        \"Name\": \"BraveVPNDisabled\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\BraveSoftware\\\\Brave\",\r\n        \"Name\": \"BraveAIChatEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\BraveSoftware\\\\Brave\",\r\n        \"Name\": \"BraveStatsPingEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/bravedebloat\"\r\n  },\r\n  \"WPFTweaksEdgeDebloat\": {\r\n    \"Content\": \"Edge Debloat\",\r\n    \"Description\": \"Disables various telemetry options, popups, and other annoyances in Edge.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\EdgeUpdate\",\r\n        \"Name\": \"CreateDesktopShortcutDefault\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"PersonalizationReportingEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\\\\ExtensionInstallBlocklist\",\r\n        \"Name\": \"1\",\r\n        \"Value\": \"ofefcgjbeghpigppfmkologfjadafddi\",\r\n        \"Type\": \"String\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"ShowRecommendationsEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"HideFirstRunExperience\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"UserFeedbackAllowed\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"ConfigureDoNotTrack\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"AlternateErrorPagesEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"EdgeCollectionsEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"EdgeShoppingAssistantEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"MicrosoftEdgeInsiderPromotionEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"ShowMicrosoftRewards\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"WebWidgetAllowed\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"DiagnosticData\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"EdgeAssetDeliveryServiceEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\r\n        \"Name\": \"WalletDonationEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/edgedebloat\"\r\n  },\r\n  \"WPFTweaksConsumerFeatures\": {\r\n    \"Content\": \"Disable ConsumerFeatures\",\r\n    \"Description\": \"Windows will not automatically install any games, third-party apps, or application links from the Windows Store for the signed-in user. Some default Apps will be inaccessible (eg. Phone Link).\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\CloudContent\",\r\n        \"Name\": \"DisableWindowsConsumerFeatures\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/consumerfeatures\"\r\n  },\r\n  \"WPFTweaksTelemetry\": {\r\n    \"Content\": \"Disable Telemetry\",\r\n    \"Description\": \"Disables Microsoft Telemetry.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\AdvertisingInfo\",\r\n        \"Name\": \"Enabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Privacy\",\r\n        \"Name\": \"TailoredExperiencesWithDiagnosticDataEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Speech_OneCore\\\\Settings\\\\OnlineSpeechPrivacy\",\r\n        \"Name\": \"HasAccepted\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Input\\\\TIPC\",\r\n        \"Name\": \"Enabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\InputPersonalization\",\r\n        \"Name\": \"RestrictImplicitInkCollection\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\InputPersonalization\",\r\n        \"Name\": \"RestrictImplicitTextCollection\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\InputPersonalization\\\\TrainedDataStore\",\r\n        \"Name\": \"HarvestContacts\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Personalization\\\\Settings\",\r\n        \"Name\": \"AcceptedPrivacyPolicy\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\DataCollection\",\r\n        \"Name\": \"AllowTelemetry\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\r\n        \"Name\": \"Start_TrackProgs\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\System\",\r\n        \"Name\": \"PublishUserActivities\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Siuf\\\\Rules\",\r\n        \"Name\": \"NumberOfSIUFInPeriod\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"\r\n      # Disable Defender Auto Sample Submission\r\n      Set-MpPreference -SubmitSamplesConsent 2\r\n\r\n      # Disable (Connected User Experiences and Telemetry) Service\r\n      Set-Service -Name diagtrack -StartupType Disabled\r\n\r\n      # Disable (Windows Error Reporting Manager) Service\r\n      Set-Service -Name wermgr -StartupType Disabled\r\n\r\n      $Memory = (Get-CimInstance Win32_PhysicalMemory | Measure-Object Capacity -Sum).Sum / 1KB\r\n      Set-ItemProperty -Path \\\"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\" -Name SvcHostSplitThresholdInKB -Value $Memory\r\n\r\n      Remove-ItemProperty -Path \\\"HKCU:\\\\Software\\\\Microsoft\\\\Siuf\\\\Rules\\\" -Name PeriodInNanoSeconds\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      # Enable Defender Auto Sample Submission\r\n      Set-MpPreference -SubmitSamplesConsent 1\r\n\r\n      # Enable (Connected User Experiences and Telemetry) Service\r\n      Set-Service -Name diagtrack -StartupType Automatic\r\n\r\n      # Enable (Windows Error Reporting Manager) Service\r\n      Set-Service -Name wermgr -StartupType Automatic\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/telemetry\"\r\n  },\r\n  \"WPFTweaksRemoveEdge\": {\r\n    \"Content\": \"Remove Microsoft Edge\",\r\n    \"Description\": \"Unblocks Microsoft Edge uninstaller restrictions then uses that uninstaller to remove Microsoft Edge.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"Invoke-WinUtilRemoveEdge\"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      Write-Host 'Installing Microsoft Edge...'\r\n      winget install Microsoft.Edge --source winget\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/removeedge\"\r\n  },\r\n  \"WPFTweaksUTC\": {\r\n    \"Content\": \"Set Time to UTC (Dual Boot)\",\r\n    \"Description\": \"Essential for computers that are dual booting. Fixes the time sync with Linux Systems.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\TimeZoneInformation\",\r\n        \"Name\": \"RealTimeIsUniversal\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"QWord\",\r\n        \"OriginalValue\": \"0\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/utc\"\r\n  },\r\n  \"WPFTweaksRemoveOneDrive\": {\r\n    \"Content\": \"Remove OneDrive\",\r\n    \"Description\": \"Denies permission to remove OneDrive user files, then uses its own uninstaller to remove it and restores the original permission afterward.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"\r\n      # Deny permission to remove OneDrive folder\r\n      icacls $Env:OneDrive /deny \\\"Administrators:(D,DC)\\\"\r\n\r\n      Write-Host \\\"Uninstalling OneDrive...\\\"\r\n      Start-Process 'C:\\\\Windows\\\\System32\\\\OneDriveSetup.exe' -ArgumentList '/uninstall' -Wait\r\n\r\n      # Some of OneDrive files use explorer, and OneDrive uses FileCoAuth\r\n      Write-Host \\\"Removing leftover OneDrive Files...\\\"\r\n      Stop-Process -Name FileCoAuth,Explorer\r\n      Remove-Item \\\"$Env:LocalAppData\\\\Microsoft\\\\OneDrive\\\" -Recurse -Force\r\n      Remove-Item \\\"C:\\\\ProgramData\\\\Microsoft OneDrive\\\" -Recurse -Force\r\n\r\n      # Grant back permission to accses OneDrive folder\r\n      icacls $Env:OneDrive /grant \\\"Administrators:(D,DC)\\\"\r\n\r\n      # Disable OneSyncSvc\r\n      Set-Service -Name OneSyncSvc -StartupType Disabled\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      Write-Host \\\"Installing OneDrive\\\"\r\n      winget install Microsoft.Onedrive --source winget\r\n\r\n      # Enabled OneSyncSvc\r\n      Set-Service -Name OneSyncSvc -StartupType Automatic\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/removeonedrive\"\r\n  },\r\n  \"WPFTweaksRemoveHome\": {\r\n    \"Content\": \"Remove Home from Explorer\",\r\n    \"Description\": \"Removes the Home from Explorer and sets This PC as default.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"\r\n      Remove-Item \\\"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Desktop\\\\NameSpace\\\\{f874310e-b6b7-47dc-bc84-b9e6b38f5903}\\\"\r\n      Set-ItemProperty -Path \\\"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\\\" -Name LaunchTo -Value 1\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      New-Item \\\"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Desktop\\\\NameSpace\\\\{f874310e-b6b7-47dc-bc84-b9e6b38f5903}\\\"\r\n      Set-ItemProperty -Path \\\"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\\\" -Name LaunchTo -Value 0\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/removehome\"\r\n  },\r\n  \"WPFTweaksRemoveGallery\": {\r\n    \"Content\": \"Remove Gallery from explorer\",\r\n    \"Description\": \"Removes the Gallery from Explorer and sets This PC as default.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"\r\n      Remove-Item \\\"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Desktop\\\\NameSpace\\\\{e88865ea-0e1c-4e20-9aa6-edcd0212c87c}\\\"\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      New-Item \\\"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Desktop\\\\NameSpace\\\\{e88865ea-0e1c-4e20-9aa6-edcd0212c87c}\\\"\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/removegallery\"\r\n  },\r\n  \"WPFTweaksDisplay\": {\r\n    \"Content\": \"Set Display for Performance\",\r\n    \"Description\": \"Sets the system preferences to performance. You can do this manually with sysdm.cpl as well.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Desktop\",\r\n        \"Name\": \"DragFullWindows\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"String\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Desktop\",\r\n        \"Name\": \"MenuShowDelay\",\r\n        \"Value\": \"200\",\r\n        \"Type\": \"String\",\r\n        \"OriginalValue\": \"400\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Desktop\\\\WindowMetrics\",\r\n        \"Name\": \"MinAnimate\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"String\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Keyboard\",\r\n        \"Name\": \"KeyboardDelay\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\r\n        \"Name\": \"ListviewAlphaSelect\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\r\n        \"Name\": \"ListviewShadow\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\r\n        \"Name\": \"TaskbarAnimations\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\VisualEffects\",\r\n        \"Name\": \"VisualFXSetting\",\r\n        \"Value\": \"3\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\DWM\",\r\n        \"Name\": \"EnableAeroPeek\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\r\n        \"Name\": \"TaskbarMn\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\r\n        \"Name\": \"ShowTaskViewButton\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Search\",\r\n        \"Name\": \"SearchboxTaskbarMode\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"Set-ItemProperty -Path \\\"HKCU:\\\\Control Panel\\\\Desktop\\\" -Name \\\"UserPreferencesMask\\\" -Type Binary -Value ([byte[]](144,18,3,128,16,0,0,0))\"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"Remove-ItemProperty -Path \\\"HKCU:\\\\Control Panel\\\\Desktop\\\" -Name \\\"UserPreferencesMask\\\"\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/display\"\r\n  },\r\n  \"WPFTweaksXboxRemoval\": {\r\n    \"Content\": \"Remove Xbox & Gaming Components\",\r\n    \"Description\": \"Removes Xbox services, the Xbox app, Game Bar, and related authentication components.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"KCU:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\GameDVR\",\r\n        \"Name\": \"AppCaptureEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      }\r\n    ],\r\n    \"appx\": [\r\n      \"Microsoft.XboxIdentityProvider\",\r\n      \"Microsoft.XboxSpeechToTextOverlay\",\r\n      \"Microsoft.GamingApp\",\r\n      \"Microsoft.Xbox.TCUI\",\r\n      \"Microsoft.XboxGamingOverlay\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/xboxremoval\"\r\n  },\r\n  \"WPFTweaksDeBloat\": {\r\n    \"Content\": \"Remove ALL MS Store Apps - NOT RECOMMENDED\",\r\n    \"Description\": \"USE WITH CAUTION!!! This will remove ALL Microsoft Store apps.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"appx\": [\r\n      \"Microsoft.Microsoft3DViewer\",\r\n      \"Microsoft.AppConnector\",\r\n      \"Microsoft.BingFinance\",\r\n      \"Microsoft.BingNews\",\r\n      \"Microsoft.BingSports\",\r\n      \"Microsoft.BingTranslator\",\r\n      \"Microsoft.BingWeather\",\r\n      \"Microsoft.BingFoodAndDrink\",\r\n      \"Microsoft.BingHealthAndFitness\",\r\n      \"Microsoft.BingTravel\",\r\n      \"Clipchamp.Clipchamp\",\r\n      \"Microsoft.Todos\",\r\n      \"MicrosoftCorporationII.QuickAssist\",\r\n      \"Microsoft.MicrosoftStickyNotes\",\r\n      \"Microsoft.GetHelp\",\r\n      \"Microsoft.GetStarted\",\r\n      \"Microsoft.Messaging\",\r\n      \"Microsoft.MicrosoftSolitaireCollection\",\r\n      \"Microsoft.NetworkSpeedTest\",\r\n      \"Microsoft.News\",\r\n      \"Microsoft.Office.Lens\",\r\n      \"Microsoft.Office.Sway\",\r\n      \"Microsoft.Office.OneNote\",\r\n      \"Microsoft.OneConnect\",\r\n      \"Microsoft.People\",\r\n      \"Microsoft.Print3D\",\r\n      \"Microsoft.SkypeApp\",\r\n      \"Microsoft.Wallet\",\r\n      \"Microsoft.Whiteboard\",\r\n      \"Microsoft.WindowsAlarms\",\r\n      \"Microsoft.WindowsCommunicationsApps\",\r\n      \"Microsoft.WindowsFeedbackHub\",\r\n      \"Microsoft.WindowsMaps\",\r\n      \"Microsoft.WindowsSoundRecorder\",\r\n      \"Microsoft.ConnectivityStore\",\r\n      \"Microsoft.ScreenSketch\",\r\n      \"Microsoft.MixedReality.Portal\",\r\n      \"Microsoft.ZuneMusic\",\r\n      \"Microsoft.ZuneVideo\",\r\n      \"Microsoft.MicrosoftOfficeHub\",\r\n      \"MsTeams\",\r\n      \"*EclipseManager*\",\r\n      \"*ActiproSoftwareLLC*\",\r\n      \"*AdobeSystemsIncorporated.AdobePhotoshopExpress*\",\r\n      \"*Duolingo-LearnLanguagesforFree*\",\r\n      \"*PandoraMediaInc*\",\r\n      \"*CandyCrush*\",\r\n      \"*BubbleWitch3Saga*\",\r\n      \"*Wunderlist*\",\r\n      \"*Flipboard*\",\r\n      \"*Twitter*\",\r\n      \"*Facebook*\",\r\n      \"*Royal Revolt*\",\r\n      \"*Sway*\",\r\n      \"*Speed Test*\",\r\n      \"*Dolby*\",\r\n      \"*Viber*\",\r\n      \"*ACGMediaPlayer*\",\r\n      \"*Netflix*\",\r\n      \"*OneCalendar*\",\r\n      \"*LinkedInForWindows*\",\r\n      \"*HiddenCityMysteryofShadows*\",\r\n      \"*Hulu*\",\r\n      \"*HiddenCity*\",\r\n      \"*AdobePhotoshopExpress*\",\r\n      \"*HotspotShieldFreeVPN*\",\r\n      \"*Microsoft.Advertising.Xaml*\"\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"\r\n      $TeamsPath = \\\"$Env:LocalAppData\\\\Microsoft\\\\Teams\\\\Update.exe\\\"\r\n\r\n      if (Test-Path $TeamsPath) {\r\n        Write-Host \\\"Uninstalling Teams\\\"\r\n        Start-Process $TeamsPath -ArgumentList -uninstall -wait\r\n\r\n        Write-Host \\\"Deleting Teams directory\\\"\r\n        Remove-Item $TeamsPath -Recurse -Force\r\n      }\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/debloat\"\r\n  },\r\n  \"WPFTweaksRestorePoint\": {\r\n    \"Content\": \"Create Restore Point\",\r\n    \"Description\": \"Creates a restore point at runtime in case a revert is needed from WinUtil modifications.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"Checked\": \"False\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\SystemRestore\",\r\n        \"Name\": \"SystemRestorePointCreationFrequency\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1440\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"\r\n      if (-not (Get-ComputerRestorePoint)) {\r\n          Enable-ComputerRestore -Drive $Env:SystemDrive\r\n      }\r\n\r\n      Checkpoint-Computer -Description \\\"System Restore Point created by WinUtil\\\" -RestorePointType MODIFY_SETTINGS\r\n      Write-Host \\\"System Restore Point Created Successfully\\\" -ForegroundColor Green\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/restorepoint\"\r\n  },\r\n  \"WPFTweaksEndTaskOnTaskbar\": {\r\n    \"Content\": \"Enable End Task With Right Click\",\r\n    \"Description\": \"Enables option to end task when right clicking a program in the taskbar.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\\\\TaskbarDeveloperSettings\",\r\n        \"Name\": \"TaskbarEndTask\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/endtaskontaskbar\"\r\n  },\r\n  \"WPFTweaksPowershell7Tele\": {\r\n    \"Content\": \"Disable Powershell 7 Telemetry\",\r\n    \"Description\": \"Creates an Environment Variable called 'POWERSHELL_TELEMETRY_OPTOUT' with a value of '1' which will tell PowerShell 7 to not send Telemetry Data.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"[Environment]::SetEnvironmentVariable('POWERSHELL_TELEMETRY_OPTOUT', '1', 'Machine')\"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"[Environment]::SetEnvironmentVariable('POWERSHELL_TELEMETRY_OPTOUT', '', 'Machine')\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/powershell7tele\"\r\n  },\r\n  \"WPFTweaksStorage\": {\r\n    \"Content\": \"Disable Storage Sense\",\r\n    \"Description\": \"Storage Sense deletes temp files automatically.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\StorageSense\\\\Parameters\\\\StoragePolicy\",\r\n        \"Name\": \"01\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/storage\"\r\n  },\r\n  \"WPFTweaksRemoveCopilot\": {\r\n    \"Content\": \"Disable Microsoft Copilot\",\r\n    \"Description\": \"Disables MS Copilot AI built into Windows since 23H2.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\WindowsCopilot\",\r\n        \"Name\": \"TurnOffWindowsCopilot\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Policies\\\\Microsoft\\\\Windows\\\\WindowsCopilot\",\r\n        \"Name\": \"TurnOffWindowsCopilot\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\r\n        \"Name\": \"ShowCopilotButton\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\Shell\\\\Copilot\",\r\n        \"Name\": \"IsCopilotAvailable\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\Shell\\\\Copilot\",\r\n        \"Name\": \"CopilotDisabledReason\",\r\n        \"Value\": \"IsEnabledForGeographicRegionFailed\",\r\n        \"Type\": \"String\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\WindowsCopilot\",\r\n        \"Name\": \"AllowCopilotRuntime\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Shell Extensions\\\\Blocked\",\r\n        \"Name\": \"{CB3B0003-8088-4EDE-8769-8B354AB2FF8C}\",\r\n        \"Value\": \"\",\r\n        \"Type\": \"String\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\Shell\\\\Copilot\\\\BingChat\",\r\n        \"Name\": \"IsUserEligible\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"\r\n      Write-Host \\\"Remove Copilot\\\"\r\n      Get-AppxPackage -AllUsers *Copilot* | Remove-AppxPackage -AllUsers\r\n      Get-AppxPackage -AllUsers Microsoft.MicrosoftOfficeHub | Remove-AppxPackage -AllUsers\r\n\r\n      $Appx = (Get-AppxPackage MicrosoftWindows.Client.CoreAI).PackageFullName\r\n\r\n      $Sid = (Get-LocalUser $Env:UserName).Sid.Value\r\n      New-Item \\\"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Appx\\\\AppxAllUserStore\\\\EndOfLife\\\\$Sid\\\\$Appx\\\" -Force\r\n      Remove-AppxPackage $Appx\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      Write-Host \\\"Install Copilot\\\"\r\n      winget install --name Copilot --source msstore --accept-package-agreements --accept-source-agreements --silent\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/removecopilot\"\r\n  },\r\n  \"WPFTweaksWPBT\": {\r\n    \"Content\": \"Disable Windows Platform Binary Table (WPBT)\",\r\n    \"Description\": \"If enabled, WPBT allows your computer vendor to execute programs at boot time, such as anti-theft software, software drivers, as well as force install software without user consent. Poses potential security risk.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Session Manager\",\r\n        \"Name\": \"DisableWpbtExecution\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/wpbt\"\r\n  },\r\n  \"WPFTweaksRazerBlock\": {\r\n    \"Content\": \"Block Razer Software Installs\",\r\n    \"Description\": \"Blocks ALL Razer Software installations. The hardware works fine without any software.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\DriverSearching\",\r\n        \"Name\": \"SearchOrderConfig\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Device Installer\",\r\n        \"Name\": \"DisableCoInstallers\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"\r\n      $RazerPath = \\\"C:\\\\Windows\\\\Installer\\\\Razer\\\"\r\n\r\n      if (Test-Path $RazerPath) {\r\n        Remove-Item $RazerPath\\\\* -Recurse -Force\r\n      }\r\n      else {\r\n        New-Item -Path $RazerPath -ItemType Directory\r\n      }\r\n\r\n      icacls $RazerPath /deny \\\"Everyone:(W)\\\"\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      icacls \\\"C:\\\\Windows\\\\Installer\\\\Razer\\\" /remove:d Everyone\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/razerblock\"\r\n  },\r\n  \"WPFTweaksDisableNotifications\": {\r\n    \"Content\": \"Disable Notification Tray/Calendar\",\r\n    \"Description\": \"Disables all Notifications INCLUDING Calendar.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Policies\\\\Microsoft\\\\Windows\\\\Explorer\",\r\n        \"Name\": \"DisableNotificationCenter\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\PushNotifications\",\r\n        \"Name\": \"ToastEnabled\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/disablenotifications\"\r\n  },\r\n  \"WPFTweaksBlockAdobeNet\": {\r\n    \"Content\": \"Adobe Network Block\",\r\n    \"Description\": \"Reduces user interruptions by selectively blocking connections to Adobe's activation and telemetry servers. Credit: Ruddernation-Designs\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"\r\n      $hostsUrl = \\\"https://github.com/Ruddernation-Designs/Adobe-URL-Block-List/raw/refs/heads/master/hosts\\\"\r\n      $hosts = \\\"$Env:SystemRoot\\\\System32\\\\drivers\\\\etc\\\\hosts\\\"\r\n\r\n      Move-Item $hosts \\\"$hosts.bak\\\"\r\n      Invoke-WebRequest $hostsUrl -OutFile $hosts\r\n      ipconfig /flushdns\r\n\r\n      Write-Host \\\"Added Adobe url block list from host file\\\"\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      $hosts = \\\"$Env:SystemRoot\\\\System32\\\\drivers\\\\etc\\\\hosts\\\"\r\n\r\n      Remove-Item $hosts\r\n      Move-Item \\\"$hosts.bak\\\" $hosts\r\n      ipconfig /flushdns\r\n\r\n      Write-Host \\\"Removed Adobe url block list from host file\\\"\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/blockadobenet\"\r\n  },\r\n  \"WPFTweaksRightClickMenu\": {\r\n    \"Content\": \"Set Classic Right-Click Menu\",\r\n    \"Description\": \"Restores the classic context menu when right-clicking in File Explorer, replacing the simplified Windows 11 version.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"\r\n      New-Item -Path \\\"HKCU:\\\\Software\\\\Classes\\\\CLSID\\\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\\" -Name \\\"InprocServer32\\\" -force -value \\\"\\\"\r\n      Write-Host Restarting explorer.exe ...\r\n      Stop-Process -Name \\\"explorer\\\" -Force\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      Remove-Item -Path \\\"HKCU:\\\\Software\\\\Classes\\\\CLSID\\\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\\" -Recurse -Confirm:$false -Force\r\n      # Restarting Explorer in the Undo Script might not be necessary, as the Registry change without restarting Explorer does work, but just to make sure.\r\n      Write-Host Restarting explorer.exe ...\r\n      Stop-Process -Name \\\"explorer\\\" -Force\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/rightclickmenu\"\r\n  },\r\n  \"WPFTweaksDiskCleanup\": {\r\n    \"Content\": \"Run Disk Cleanup\",\r\n    \"Description\": \"Runs Disk Cleanup on Drive C: and removes old Windows Updates.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"\r\n      cleanmgr.exe /d C: /VERYLOWDISK\r\n      Dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/diskcleanup\"\r\n  },\r\n  \"WPFTweaksDeleteTempFiles\": {\r\n    \"Content\": \"Delete Temporary Files\",\r\n    \"Description\": \"Erases TEMP Folders.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"\r\n      Remove-Item -Path \\\"$Env:Temp\\\\*\\\" -Recurse -Force\r\n      Remove-Item -Path \\\"$Env:SystemRoot\\\\Temp\\\\*\\\" -Recurse -Force\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/deletetempfiles\"\r\n  },\r\n  \"WPFTweaksIPv46\": {\r\n    \"Content\": \"Prefer IPv4 over IPv6\",\r\n    \"Description\": \"Setting the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip6\\\\Parameters\",\r\n        \"Name\": \"DisabledComponents\",\r\n        \"Value\": \"32\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/ipv46\"\r\n  },\r\n  \"WPFTweaksTeredo\": {\r\n    \"Content\": \"Disable Teredo\",\r\n    \"Description\": \"Teredo network tunneling is a IPv6 feature that can cause additional latency, but may cause problems with some games.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip6\\\\Parameters\",\r\n        \"Name\": \"DisabledComponents\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"netsh interface teredo set state disabled\"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"netsh interface teredo set state default\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/teredo\"\r\n  },\r\n  \"WPFTweaksDisableIPv6\": {\r\n    \"Content\": \"Disable IPv6\",\r\n    \"Description\": \"Disables IPv6.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip6\\\\Parameters\",\r\n        \"Name\": \"DisabledComponents\",\r\n        \"Value\": \"255\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"Disable-NetAdapterBinding -Name * -ComponentID ms_tcpip6\"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"Enable-NetAdapterBinding -Name * -ComponentID ms_tcpip6\"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/disableipv6\"\r\n  },\r\n  \"WPFTweaksDisableBGapps\": {\r\n    \"Content\": \"Disable Background Apps\",\r\n    \"Description\": \"Disables all Microsoft Store apps from running in the background, which has to be done individually since Windows 11.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\BackgroundAccessApplications\",\r\n        \"Name\": \"GlobalUserDisabled\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/disablebgapps\"\r\n  },\r\n  \"WPFTweaksDisableFSO\": {\r\n    \"Content\": \"Disable Fullscreen Optimizations\",\r\n    \"Description\": \"Disables FSO in all applications. NOTE: This will disable Color Management in Exclusive Fullscreen.\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\System\\\\GameConfigStore\",\r\n        \"Name\": \"GameDVR_DXGIHonorFSEWindowsCompatible\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/disablefso\"\r\n  },\r\n  \"WPFToggleDarkMode\": {\r\n    \"Content\": \"Dark Theme for Windows\",\r\n    \"Description\": \"Enable/Disable Dark Mode.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize\",\r\n        \"Name\": \"AppsUseLightTheme\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\",\r\n        \"DefaultState\": \"false\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize\",\r\n        \"Name\": \"SystemUsesLightTheme\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\",\r\n        \"DefaultState\": \"false\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"\r\n      Invoke-WinUtilExplorerUpdate\r\n      if ($sync.ThemeButton.Content -eq [char]0xF08C) {\r\n        Invoke-WinutilThemeChange -theme \\\"Auto\\\"\r\n      }\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      Invoke-WinUtilExplorerUpdate\r\n      if ($sync.ThemeButton.Content -eq [char]0xF08C) {\r\n        Invoke-WinutilThemeChange -theme \\\"Auto\\\"\r\n      }\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/darkmode\"\r\n  },\r\n  \"WPFToggleBingSearch\": {\r\n    \"Content\": \"Bing Search in Start Menu\",\r\n    \"Description\": \"If enabled, Bing web search results will be included in your Start Menu search.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Search\",\r\n        \"Name\": \"BingSearchEnabled\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"true\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/bingsearch\"\r\n  },\r\n  \"WPFToggleStandbyFix\": {\r\n    \"Content\": \"Modern Standby fix\",\r\n    \"Description\": \"Disable network connection during S0 sleep. If network connectivity is turned on during S0 sleep it could cause overheating on modern laptops\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Power\\\\PowerSettings\\\\f15576e8-98b7-4186-b944-eafa664402d9\",\r\n        \"Name\": \"ACSettingIndex\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\",\r\n        \"DefaultState\": \"true\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/standbyfix\"\r\n  },\r\n  \"WPFToggleNumLock\": {\r\n    \"Content\": \"Num Lock on Startup\",\r\n    \"Description\": \"Toggle the Num Lock key state when your computer starts.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKU:\\\\.Default\\\\Control Panel\\\\Keyboard\",\r\n        \"Name\": \"InitialKeyboardIndicators\",\r\n        \"Value\": \"2\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"false\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Keyboard\",\r\n        \"Name\": \"InitialKeyboardIndicators\",\r\n        \"Value\": \"2\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"false\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/numlock\"\r\n  },\r\n  \"WPFToggleVerboseLogon\": {\r\n    \"Content\": \"Verbose Messages During Logon\",\r\n    \"Description\": \"Show detailed messages during the login process for troubleshooting and diagnostics.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\",\r\n        \"Name\": \"VerboseStatus\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"false\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/verboselogon\"\r\n  },\r\n  \"WPFToggleStartMenuRecommendations\": {\r\n    \"Content\": \"Recommendations in Start Menu\",\r\n    \"Description\": \"If disabled, then you will not see recommendations in the Start Menu. WARNING: This will also disable Windows Spotlight on your Lock Screen as a side effect.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\PolicyManager\\\\current\\\\device\\\\Start\",\r\n        \"Name\": \"HideRecommendedSection\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\",\r\n        \"DefaultState\": \"true\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\PolicyManager\\\\current\\\\device\\\\Education\",\r\n        \"Name\": \"IsEducationEnvironment\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\",\r\n        \"DefaultState\": \"true\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\Explorer\",\r\n        \"Name\": \"HideRecommendedSection\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\",\r\n        \"DefaultState\": \"true\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"\r\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/startmenurecommendations\"\r\n  },\r\n  \"WPFToggleHideSettingsHome\": {\r\n    \"Content\": \"Remove Settings Home Page\",\r\n    \"Description\": \"Removes the Home Page in the Windows Settings app.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\Explorer\",\r\n        \"Name\": \"SettingsPageVisibility\",\r\n        \"Value\": \"hide:home\",\r\n        \"Type\": \"String\",\r\n        \"OriginalValue\": \"show:home\",\r\n        \"DefaultState\": \"false\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/hidesettingshome\"\r\n  },\r\n  \"WPFToggleMouseAcceleration\": {\r\n    \"Content\": \"Mouse Acceleration\",\r\n    \"Description\": \"If enabled, the Cursor movement is affected by the speed of your physical mouse movements.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Mouse\",\r\n        \"Name\": \"MouseSpeed\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"true\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Mouse\",\r\n        \"Name\": \"MouseThreshold1\",\r\n        \"Value\": \"6\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"true\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Mouse\",\r\n        \"Name\": \"MouseThreshold2\",\r\n        \"Value\": \"10\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"true\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/mouseacceleration\"\r\n  },\r\n  \"WPFToggleStickyKeys\": {\r\n    \"Content\": \"Sticky Keys\",\r\n    \"Description\": \"If enabled, Sticky Keys is activated. Sticky keys is an accessibility feature of some graphical user interfaces which assists users who have physical disabilities or help users reduce repetitive strain injury.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Accessibility\\\\StickyKeys\",\r\n        \"Name\": \"Flags\",\r\n        \"Value\": \"506\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"58\",\r\n        \"DefaultState\": \"true\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/stickykeys\"\r\n  },\r\n  \"WPFToggleNewOutlook\": {\r\n    \"Content\": \"New Outlook\",\r\n    \"Description\": \"If disabled, it removes the new Outlook toggle, disables the new Outlook migration, and ensures the classic Outlook application is used.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\SOFTWARE\\\\Microsoft\\\\Office\\\\16.0\\\\Outlook\\\\Preferences\",\r\n        \"Name\": \"UseNewOutlook\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"true\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Office\\\\16.0\\\\Outlook\\\\Options\\\\General\",\r\n        \"Name\": \"HideNewOutlookToggle\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\",\r\n        \"DefaultState\": \"true\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Policies\\\\Microsoft\\\\Office\\\\16.0\\\\Outlook\\\\Options\\\\General\",\r\n        \"Name\": \"DoNewOutlookAutoMigration\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"false\"\r\n      },\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Policies\\\\Microsoft\\\\Office\\\\16.0\\\\Outlook\\\\Preferences\",\r\n        \"Name\": \"NewOutlookMigrationUserSetting\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\",\r\n        \"DefaultState\": \"true\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/newoutlook\"\r\n  },\r\n  \"WPFToggleMultiplaneOverlay\": {\r\n    \"Content\": \"Disable Multiplane Overlay\",\r\n    \"Description\": \"Disable the Multiplane Overlay which can sometimes cause issues with Graphics Cards.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\Dwm\",\r\n        \"Name\": \"OverlayTestMode\",\r\n        \"Value\": \"5\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\",\r\n        \"DefaultState\": \"false\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/multiplaneoverlay\"\r\n  },\r\n  \"WPFToggleHiddenFiles\": {\r\n    \"Content\": \"Show Hidden Files\",\r\n    \"Description\": \"If enabled, Hidden Files will be shown.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\r\n        \"Name\": \"Hidden\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"false\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"\r\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/hiddenfiles\"\r\n  },\r\n  \"WPFToggleShowExt\": {\r\n    \"Content\": \"Show File Extensions\",\r\n    \"Description\": \"If enabled, File extensions (e.g., .txt, .jpg) are visible.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\r\n        \"Name\": \"HideFileExt\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"1\",\r\n        \"DefaultState\": \"false\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"\r\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/showext\"\r\n  },\r\n  \"WPFToggleTaskbarSearch\": {\r\n    \"Content\": \"Search Button in Taskbar\",\r\n    \"Description\": \"If enabled, Search Button will be on the Taskbar.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Search\",\r\n        \"Name\": \"SearchboxTaskbarMode\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"true\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/taskbarsearch\"\r\n  },\r\n  \"WPFToggleTaskView\": {\r\n    \"Content\": \"Task View Button in Taskbar\",\r\n    \"Description\": \"If enabled, Task View Button in Taskbar will be shown.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\r\n        \"Name\": \"ShowTaskViewButton\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"true\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/taskview\"\r\n  },\r\n  \"WPFToggleTaskbarAlignment\": {\r\n    \"Content\": \"Center Taskbar Items\",\r\n    \"Description\": \"[Windows 11] If enabled, the Taskbar Items will be shown on the Center, otherwise the Taskbar Items will be shown on the Left.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\r\n        \"Name\": \"TaskbarAl\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"true\"\r\n      }\r\n    ],\r\n    \"InvokeScript\": [\r\n      \"\r\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/taskbaralignment\"\r\n  },\r\n  \"WPFToggleDetailedBSoD\": {\r\n    \"Content\": \"Detailed BSoD\",\r\n    \"Description\": \"If enabled, you will see a detailed Blue Screen of Death (BSOD) with more information.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\CrashControl\",\r\n        \"Name\": \"DisplayParameters\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"false\"\r\n      },\r\n      {\r\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\CrashControl\",\r\n        \"Name\": \"DisableEmoticon\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"false\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/detailedbsod\"\r\n  },\r\n  \"WPFToggleS3Sleep\": {\r\n    \"Content\": \"S3 Sleep\",\r\n    \"Description\": \"Toggles between Modern Standby and S3 Sleep.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Power\",\r\n        \"Name\": \"PlatformAoAcOverride\",\r\n        \"Value\": \"0\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"<RemoveEntry>\",\r\n        \"DefaultState\": \"false\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/s3sleep\"\r\n  },\r\n  \"WPFOOSUbutton\": {\r\n    \"Content\": \"Run OO Shutup 10\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"Type\": \"Button\",\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/oosubutton\"\r\n  },\r\n  \"WPFchangedns\": {\r\n    \"Content\": \"DNS\",\r\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\r\n    \"panel\": \"1\",\r\n    \"Type\": \"Combobox\",\r\n    \"ComboItems\": \"Default DHCP Google Cloudflare Cloudflare_Malware Cloudflare_Malware_Adult Open_DNS Quad9 AdGuard_Ads_Trackers AdGuard_Ads_Trackers_Malware_Adult\",\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/z--advanced-tweaks---caution/changedns\"\r\n  },\r\n  \"WPFAddUltPerf\": {\r\n    \"Content\": \"Add and Activate Ultimate Performance Profile\",\r\n    \"category\": \"Performance Plans\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/performance-plans/addultperf\"\r\n  },\r\n  \"WPFRemoveUltPerf\": {\r\n    \"Content\": \"Remove Ultimate Performance Profile\",\r\n    \"category\": \"Performance Plans\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Button\",\r\n    \"ButtonWidth\": \"300\",\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/performance-plans/removeultperf\"\r\n  },\r\n  \"WPFTweaksDisableExplorerAutoDiscovery\": {\r\n    \"Content\": \"Disable Explorer Automatic Folder Discovery\",\r\n    \"Description\": \"Windows Explorer automatically tries to guess the type of the folder based on its contents, slowing down the browsing experience. WARNING! Will disable File Explorer grouping.\",\r\n    \"category\": \"Essential Tweaks\",\r\n    \"panel\": \"1\",\r\n    \"InvokeScript\": [\r\n      \"\r\n      # Previously detected folders\r\n      $bags = \\\"HKCU:\\\\Software\\\\Classes\\\\Local Settings\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Bags\\\"\r\n\r\n      # Folder types lookup table\r\n      $bagMRU = \\\"HKCU:\\\\Software\\\\Classes\\\\Local Settings\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\BagMRU\\\"\r\n\r\n      # Flush Explorer view database\r\n      Remove-Item -Path $bags -Recurse -Force\r\n      Write-Host \\\"Removed $bags\\\"\r\n\r\n      Remove-Item -Path $bagMRU -Recurse -Force\r\n      Write-Host \\\"Removed $bagMRU\\\"\r\n\r\n      # Every folder\r\n      $allFolders = \\\"HKCU:\\\\Software\\\\Classes\\\\Local Settings\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Bags\\\\AllFolders\\\\Shell\\\"\r\n\r\n      if (!(Test-Path $allFolders)) {\r\n        New-Item -Path $allFolders -Force\r\n        Write-Host \\\"Created $allFolders\\\"\r\n      }\r\n\r\n      # Generic view\r\n      New-ItemProperty -Path $allFolders -Name \\\"FolderType\\\" -Value \\\"NotSpecified\\\" -PropertyType String -Force\r\n      Write-Host \\\"Set FolderType to NotSpecified\\\"\r\n\r\n      Write-Host Please sign out and back in, or restart your computer to apply the changes!\r\n      \"\r\n    ],\r\n    \"UndoScript\": [\r\n      \"\r\n      # Previously detected folders\r\n      $bags = \\\"HKCU:\\\\Software\\\\Classes\\\\Local Settings\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Bags\\\"\r\n\r\n      # Folder types lookup table\r\n      $bagMRU = \\\"HKCU:\\\\Software\\\\Classes\\\\Local Settings\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\BagMRU\\\"\r\n\r\n      # Flush Explorer view database\r\n      Remove-Item -Path $bags -Recurse -Force\r\n      Write-Host \\\"Removed $bags\\\"\r\n\r\n      Remove-Item -Path $bagMRU -Recurse -Force\r\n      Write-Host \\\"Removed $bagMRU\\\"\r\n\r\n      Write-Host Please sign out and back in, or restart your computer to apply the changes!\r\n      \"\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/essential-tweaks/disableexplorerautodiscovery\"\r\n  },\r\n  \"WPFToggleDisableCrossDeviceResume\": {\r\n    \"Content\": \"Cross-Device Resume\",\r\n    \"Description\": \"This tweak controls the Resume function in Windows 11 24H2 and later, which allows you to resume an activity from a mobile device and vice-versa.\",\r\n    \"category\": \"Customize Preferences\",\r\n    \"panel\": \"2\",\r\n    \"Type\": \"Toggle\",\r\n    \"registry\": [\r\n      {\r\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\CrossDeviceResume\\\\Configuration\",\r\n        \"Name\": \"IsResumeAllowed\",\r\n        \"Value\": \"1\",\r\n        \"Type\": \"DWord\",\r\n        \"OriginalValue\": \"0\",\r\n        \"DefaultState\": \"true\"\r\n      }\r\n    ],\r\n    \"link\": \"https://winutil.christitus.com/dev/tweaks/customize-preferences/disablecrossdeviceresume\"\r\n  }\r\n}\r\n"
  },
  {
    "path": "docs/archetypes/default.md",
    "content": "---\ntitle: '{{ replace .File.ContentBaseName \"-\" \" \" | title }}'\ndescription: \"\"\ndate: '{{ .Date }}'\ndraft: true\n---\n"
  },
  {
    "path": "docs/content/CONTRIBUTING.md",
    "content": "---\ntoc: true\n---\n\n# How to Contribute?\n\n## Testing\n\n* Test the latest changes to Winutil by running the pre-release and reporting issues you are encountering to help us continually improve Winutil!\n\n#### **Run the latest pre-release**\n   ```\n   irm https://christitus.com/windev | iex\n   ```\n\n> [!WARNING]\n> This is a pre-release and should be treated as such. It exists for developers to test the utility and report or fix bugs before they get added to the stable release. Don't use it in production!\n\n## Issues\n\n* If you encounter any challenges or problems with the script, I kindly request that you submit them via the \"Issues\" tab on the GitHub repository. By filling out the provided template, you can provide specific details about the issue, allowing me (and others in the community) to promptly address any bugs or consider feature requests.\n\n## Contribute Code\n\n* Pull requests are now handled directly on the **MAIN branch**. This was done since we can now select specific releases to launch via releases in GitHub.\n\n* If you're doing code changes, then you can submit a PR to `main` branch, but I am very selective about these.\n\n> [!IMPORTANT]\n> Do not use a code formatter, make massive amounts of line changes, or make multiple feature changes. EACH FEATURE CHANGE SHOULD BE IT'S OWN PULL REQUEST!\n\n* When creating pull requests, it is essential to thoroughly document all changes made. This includes, but is not limited to, documenting any additions made to the `tweaks` section and corresponding `undo tweak`, so users are able to remove the newly added tweaks if necessary, and comprehensive documentation is required for all code changes. Document your changes and briefly explain why you made your changes in your Pull Request Description. Failure to adhere to this format may result in the denial of the pull request. Additionally, any code lacking sufficient documentation may also be denied.\n\n* By following these guidelines, we can maintain a high standard of quality and ensure that the codebase remains organized and well-documented.\n\n> [!NOTE]\n> When creating a function, please include \"WPF\" or \"Winutil\" in the file name so it can be loaded into the runspace.\n\n## Walk through\n\n* This is a guide for beginners. If you are still having issues, look at the following official GitHub documentation:\n    * [Commit through WEB](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/about-commits)\n    * [Commit through GitHub Desktop](https://docs.github.com/en/desktop/making-changes-in-a-branch/committing-and-reviewing-changes-to-your-project-in-github-desktop#about-commits)\n    * [Create a Pull Request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request)\n\n\n### Overview\n\n``` mermaid\n%%{init: {\"flowchart\": {\"curve\": \"cardinal\"}} }%%\ngraph TD\n  A[Fork Project] --> B[Clone Repository];\n  B --> C[Create New Branch];\n  C --> D[Make Changes];\n  D --> G[Test Changes];\n  G --> H{Tests Passed?};\n  H -->|Yes| E[Commit Changes];\n  H -->|No| J[Fix Issues];\n  J --> G;\n  E --> F[Push Branch];\n  F --> K[Create Pull Request];\n  K --> L[Fill out PR template];\n  classDef default stroke:#333,stroke-width:4px,font-size:12pt;\n```\n> [!NOTE]\n> This is a diagram to guide you through the process. It may vary depending on the type of change you're making.\n\n### Fork the Repo\n* Fork the Winutil Repository [here](https://github.com/ChrisTitusTech/Winutil) to create a copy that will be available in your repository list.\n\n{{< image src=\"images/Fork-Button\" alt=\"Fork Image\" >}}\n\n### Clone the Fork\n\n> [!TIP]\n> While you can make your changes directly through the Web, we recommend cloning the repo to your device using the application GitHub Desktop (available in Winutil) to test your fork easily.\n\n* Install GitHub Desktop if it is not already installed.\n* Log in using the same GitHub account you used to fork Winutil.\n* Choose the fork under \"Your Repositories\" and press \"clone {repo name}\"\n* Create a new branch and name it something relatable to your changes.\n\n* Now you can modify Winutil to your liking using your preferred text editor.\n\n\n### Testing your changes\n\n* To test to see if your changes work as intended run following commands in a powershell terminal as admin:\n\n* Change the directory where you are running the commands to the forked project.\n* `cd {path to the folder with the compile.ps1}`\n* Run the following command to compile and run Winutil:\n* `.\\Compile.ps1 -run`\n\n{{< image src=\"images/Compile\" alt=\"Compile\" >}}\n\n* After seeing that your changes work properly, feel free to commit the changes to the repository and make a PR. For help on that, follow the documentation below.\n\n### Committing the changes\n* Before committing your changes, please discard changes made to the `Winutil.ps1` file, like the following:\n\n{{< image src=\"images/Discard-GHD\" alt=\"Push Commit Image\" >}}\n\n* Now, commit your changes once you are happy with the result.\n\n{{< image src=\"images/Commit-GHD\" alt=\"Commit Image\" >}}\n\n* Push the changes to upload them to your fork on github.com.\n\n{{< image src=\"images/Push-Commit\" alt=\"Push Commit Image\" >}}\n\n### Making a PR\n* To make a PR on your repo under a new branch linking to the main branch, a button will show and say Preview and Create pull request. Click that button and fill in all the information that is provided on the template. Once all the information is filled in correctly, check your PR to make sure there is not a Winutil.ps1 file attached to the PR. Once everything is good, make the PR and wait for Chris (the maintainer) to accept or deny your PR. Once it is accepted by Chris, you will be able to see your changes in the \"/windev\" build.\n* If you do not see your feature in the main \"/win\" build, that is fine. All new changes go into the /windev build to make sure everything is working OK before going fully public.\n* Congratulations! You just submitted your first PR. Thank you so much for contributing to Winutil.\n"
  },
  {
    "path": "docs/content/KnownIssues.md",
    "content": "---\ntitle: Known Issues\ntoc: true\n---\n\n### Download not working\n\nIf `https://christitus.com/win` is not working, or you want to download the code from GitHub directly, you can use the direct download link:\n\n```\nirm https://github.com/ChrisTitusTech/Winutil/releases/latest/download/Winutil.ps1 | iex\n```\n\nIf it still isn't working in your region, it may be due to temporary ISP or network filtering of GitHub content domains. This has been reported by some users in India in the past. See: [Times of India](https://timesofindia.indiatimes.com/gadgets-news/github-content-domain-blocked-for-these-indian-users-reports/articleshow/96687992.cms).\n\nIf you are still having issues, try using a **VPN**, or changing your **DNS provider** to one of following two providers:\n\n|  Provider  | Primary DNS | Secondary DNS |\n| :--------: | :---------: | :-----------: |\n| Cloudflare |  `1.1.1.1`  |   `1.0.0.1`   |\n|   Google   |  `8.8.8.8`  |   `8.8.4.4`   |\n\n### Script Won't Run\n\nIf your PowerShell session is running in **Constrained Language Mode**, some scripts and commands may fail to execute. To check the current language mode, run:\n```powershell\n$ExecutionContext.SessionState.LanguageMode\n```\nIf it returns `ConstrainedLanguage`, you may need to switch to `FullLanguage` mode or run the script in a session with administrative privileges. Be aware that some security policies may enforce Constrained Language Mode, especially in corporate or managed environments.\n"
  },
  {
    "path": "docs/content/_index.md",
    "content": "---\ntitle: Welcome to Winutil Documentation!\ntoc: false\nwidth: full\n---\n\n<div style=\"display: flex; justify-content: center; align-items: center; width: 100%; flex-wrap: wrap; gap: 5px;margin-top:30px;\" >\n  <a href=\"https://github.com/ChrisTitusTech/Winutil/releases/latest\"><img src=\"https://img.shields.io/github/v/release/ChrisTitusTech/Winutil?color=%230567ff&label=Latest%20Release&style=for-the-badge\" alt=\"Version\" style=\"height: 28px; width: auto; min-width: 10px; object-fit: contain; margin: 0;\"></a>\n  <img src=\"https://img.shields.io/github/downloads/ChrisTitusTech/Winutil/Winutil.ps1?label=Total%20Downloads&style=for-the-badge\" alt=\"GitHub Downloads\" style=\"height: 28px; width: auto; min-width: 10px; object-fit: contain; margin: 0;\">\n  <a href=\"https://discord.gg/RUbZUZyByQ\"><img src=\"https://dcbadge.limes.pink/api/server/https://discord.gg/RUbZUZyByQ\" alt=\"Discord Community Server\" style=\"height: 28px; width: auto; min-width: 10px; object-fit: contain; margin: 0;\"></a>\n</div>\n\nWelcome to the official documentation for Winutil, your go-to utility for optimizing and managing your Windows environment. Whether you’re an IT professional, power user, or regular user, Winutil provides a comprehensive set of tools to enhance your Windows experience.\n\n## Running the latest release of Winutil\n\n* You will first need to start a Powershell terminal **as Admin**.\n* Now you can run the following command:\n\n```\nirm \"https://christitus.com/win\" | iex\n```\n\n\n> [!IMPORTANT]\n> Winutil is updated frequently as of the time of writing. Consequently, features and functionalities may evolve, and the documentation may not always reflect the most current images or information.\n"
  },
  {
    "path": "docs/content/dev/_index.md",
    "content": "---\ntitle: Developer Reference\nweight: 3\ntoc: false\n---\n\n> [!NOTE]\n> This section contains technical documentation for developers. For end-user documentation, see the [User Guide](../userguide/).\n\n## Architecture\n\n- [Architecture & Design](architecture/) - Code structure, data flow, and how Winutil works internally\n\n## Tweaks\n\n### Essential Tweaks\n\n{{< autolinks section=\"dev/tweaks/essential-tweaks\" >}}\n\n### Advanced Tweaks (CAUTION)\n\n{{< autolinks section=\"dev/tweaks/z--advanced-tweaks---caution\" >}}\n\n### Customize Preferences\n\n{{< autolinks section=\"dev/tweaks/customize-preferences\" >}}\n\n### Performance Plans\n\n{{< autolinks section=\"dev/tweaks/performance-plans\" >}}\n\n## Features\n\n### Fixes\n\n{{< autolinks section=\"dev/features/fixes\" >}}\n\n### Legacy Windows Panels\n\n{{< autolinks section=\"dev/features/legacy-windows-panels\" >}}\n\n### Features\n\n{{< autolinks section=\"dev/features/features\" >}}\n\n### Remote Access\n\n{{< autolinks section=\"dev/features/remote-access\" >}}\n\n### Powershell Profile Powershell 7+ Only\n\n{{< autolinks section=\"dev/features/powershell-profile-powershell-7--only\" >}}\n"
  },
  {
    "path": "docs/content/dev/architecture.md",
    "content": "---\ntitle: Architecture & Design\nweight: 1\ntoc: true\n---\n\n## Overview\n\nWinutil is a PowerShell-based Windows utility with a WPF (Windows Presentation Foundation) GUI. This document explains the architecture, code structure, and how different components work together.\n\n## High-Level Architecture\n\n```\n┌─────────────────────────────────────────────────────┐\n│                    Winutil GUI                      │\n│              (WPF XAML Interface)                   │\n└──────────────────┬──────────────────────────────────┘\n                   │\n         ┌─────────┴─────────┐\n         │                   │\n┌────────▼──────┐   ┌───────▼────────┐\n│  Public APIs  │   │  Private APIs  │\n│  (User-facing)│   │   (Internal)   │\n└───────┬───────┘   └───────┬────────┘\n        │                   │\n        └────────┬──────────┘\n                 │\n    ┌────────────▼────────────┐\n    │   Configuration Files   │\n    │  (JSON definitions)     │\n    └────────────┬────────────┘\n                 │\n    ┌────────────▼────────────┐\n    │   External Tools        │\n    │  (WinGet, Chocolatey)   │\n    └─────────────────────────┘\n```\n\n## Project Structure\n\n### Directory Layout\n\n```\nwinutil/\n├── Compile.ps1                 # Build script that combines all files\n├── winutil.ps1                 # Compiled output (generated)\n├── scripts/\n│   ├── main.ps1               # Entry point and GUI initialization\n│   └── start.ps1              # Startup logic\n├── functions/\n│   ├── private/               # Internal helper functions\n│   │   ├── Get-WinUtilVariables.ps1\n│   │   ├── Install-WinUtilWinget.ps1\n│   │   └── ...\n│   ├── public/                # User-facing functions\n│   │   ├── Initialize-WPFUI.ps1\n│   │   └── ...\n├── config/                    # JSON configuration files\n│   ├── applications.json      # Application definitions\n│   ├── tweaks.json           # Tweak definitions\n│   ├── feature.json          # Windows feature definitions\n│   └── preset.json           # Preset configurations\n├── xaml/\n│   └── inputXML.xaml         # GUI layout definition\n└── docs/                     # Documentation\n```\n\n### Key Components\n\n#### 1. Compile.ps1\n**Purpose**: Combines all separate script files into a single `winutil.ps1` for distribution.\n\n**Process**:\n1. Reads all function files from `/functions/`\n2. Includes configuration JSON files\n3. Embeds XAML GUI definition\n4. Combines into single script\n5. Outputs `winutil.ps1`\n\n**Why**: Makes distribution easier (single file) and improves load time.\n\n#### 2. scripts/main.ps1\n**Purpose**: Entry point that initializes the GUI and event system.\n\n**Responsibilities**:\n- Load XAML and create WPF window\n- Initialize form elements\n- Set up event handlers\n- Load configurations\n- Display the GUI\n\n#### 3. functions/public/\n**Purpose**: User-facing functions that implement main features.\n\n**Key Functions**:\n- `Initialize-WPFUI.ps1`: Sets up the GUI\n- `Invoke-WPFTweak*`: Applies system tweaks\n- `Invoke-WPFFeature*`: Enables Windows features\n- `Install-WinUtilProgram*`: Installs applications\n\n**Naming Convention**: Functions start with `WPF` or `Winutil` to be loaded into the runspace.\n\n#### 4. functions/private/\n**Purpose**: Internal helper functions not directly called by users.\n\n**Key Functions**:\n- `Get-WinUtilVariables.ps1`: Retrieves UI element references\n- `Install-WinUtilWinget.ps1`: Ensures WinGet is installed\n- `Get-WinUtilCheckBoxes.ps1`: Gets checkbox states\n- `Invoke-WinUtilCurrentSystem.ps1`: Gets system information\n\n#### 5. config/*.json\n**Purpose**: Define available applications, tweaks, and features declaratively.\n\n**Files**:\n- `applications.json`: Application definitions with WinGet/Choco IDs\n- `tweaks.json`: Registry tweaks and their undo actions\n- `feature.json`: Windows features that can be enabled/disabled\n- `preset.json`: Predefined tweak combinations\n- `dns.json`: DNS provider configurations\n\n#### 6. xaml/inputXML.xaml\n**Purpose**: WPF GUI layout and design.\n\n**Structure**:\n- Buttons with event handlers\n- TextBoxes for input\n- CheckBoxes for options\n- ListBoxes for selections\n\n## Win11 Creator Architecture\n\nThe **Win11 Creator** is a specialized subsystem within Winutil that creates customized Windows 11 ISOs. It operates independently from the main package installation and tweak system.\n\n### Win11 Creator Components\n\n**Core Functions** (`functions/private/`):\n- `Invoke-WinUtilISO.ps1`: Main orchestrator containing all Win11 Creator functions\n  - `Invoke-WinUtilISOBrowse`: ISO file selection dialog\n  - `Invoke-WinUtilISOMountAndVerify`: Validates and mounts ISO, verifies it's official Windows 11\n  - `Invoke-WinUtilISOModify`: Launches modification in background runspace\n  - `Invoke-WinUtilISOExport`: Handles ISO and USB export\n  - `Invoke-WinUtilISOCheckExistingWork`: Recovers incomplete work sessions\n  - `Invoke-WinUtilISOCleanAndReset`: Cleans up temp directories and resets UI\n\n- `Invoke-WinUtilISOScript.ps1`: Applies modifications to mounted install.wim\n  - Removes provisioned AppX packages (40+ bloatware apps)\n  - Injects drivers (optional) from current system\n  - Removes OneDrive setup files\n  - Applies offline registry tweaks (hardware bypass, privacy, telemetry, OOBE)\n  - Deletes telemetry scheduled task definitions\n  - Pre-stages setup scripts from autounattend.xml\n  - Removes unused Windows editions\n  - Cleans component store via DISM\n\n### Win11 Creator Data Flow\n\n```\nUser selects official Windows 11 ISO\n    ↓\nInvoke-WinUtilISOBrowse → OpenFileDialog, validates file size\n    ↓\nInvoke-WinUtilISOMountAndVerify\n    ├─ Mount ISO via Mount-DiskImage\n    ├─ Verify install.wim or install.esd exists\n    ├─ Check for \"Windows 11\" in image metadata\n    ├─ Extract available editions (Home, Pro, Enterprise, etc.)\n    └─ Store ISO path, drive letter, WIM path, image info in $sync\n    ↓\nUser optionally enables Driver Injection checkbox\n    ↓\nInvoke-WinUtilISOModify (runs in background runspace)\n    ├─ Create work directory: ~WinUtil_Win11ISO_[timestamp]\n    ├─ Copy ISO contents to disk (~5-6 GB)\n    ├─ Mount install.wim at selected edition/index\n    ├─ Invoke-WinUtilISOScript:\n    │   ├─ Remove 40+ bloat AppX packages\n    │   ├─ Export and inject drivers (if enabled)\n    │   ├─ Remove OneDrive setup\n    │   ├─ Load offline registry hives\n    │   ├─ Apply 50+ registry tweaks (hardware bypass, privacy, telemetry, OOBE, etc.)\n    │   ├─ Delete telemetry scheduled task files\n    │   ├─ Pre-stage setup scripts from autounattend.xml to C:\\Windows\\Setup\\Scripts\\\n    │   └─ Unload registry hives\n    ├─ DISM /Cleanup-Image /StartComponentCleanup /ResetBase (saves 300-800 MB)\n    ├─ Dismount and save modified install.wim (~10+ minutes, slowest step)\n    ├─ Export selected edition only (removes all other editions, saves 1-2 GB each)\n    ├─ Dismount source ISO\n    └─ Report completion, enable export options\n    ↓\nInvoke-WinUtilISOExport (user chooses output)\n    ├─ Option 1: Save as ISO\n    │   ├─ Build bootable ISO via oscdimg.exe (BIOS/UEFI dual-boot)\n    │   └─ Output: Win11_Modified_[date].iso (2.5-3.5 GB)\n    │\n    └─ Option 2: Write to USB\n        ├─ Format USB as GPT\n        ├─ Create 512 MB EFI partition\n        ├─ Copy modified ISO contents\n        └─ Output: Bootable USB (minimum 8 GB)\n    ↓\nInvoke-WinUtilISOCleanAndReset (optional)\n    └─ Delete temp working directory (~10-15 GB)\n    └─ Reset UI to initial state\n```\n\n### Win11 Creator Validation & Safety\n\n**ISO Validation**:\n- Only accepts official Microsoft Windows 11 ISOs\n- Validates presence of install.wim or install.esd\n- Checks image metadata for \"Windows 11\" string\n- Rejects custom, modified, or non-Windows 11 ISOs\n\n**Work Session Recovery**:\n- Auto-detects incomplete work from previous sessions\n- Allows resuming Step 4 (export) without re-running Steps 1-3\n- Prevents redundant modifications\n\n**Modification Safety**:\n- All registry changes are documented in script (reversible)\n- Original ISO never modified; only working copy\n- Logged to `WinUtil_Win11ISO.log` for debugging\n- DISM handles image dismount with automatic cleanup on error\n\n### Win11 Creator Registry Tweaks\n\nThe `Invoke-WinUtilISOScript` function applies **50+ offline registry tweaks**:\n\n**Hardware Bypass**:\n- TPM 2.0 check bypass\n- Secure Boot requirement bypass\n- CPU compatibility bypass\n- RAM requirement bypass\n- Storage check bypass\n\n**Privacy & Telemetry**:\n- Disable advertising ID\n- Disable tailored experiences\n- Disable input personalization\n- Disable speech online privacy\n- Disable cloud content suggestions\n- Disable app suggestion subscriptions\n- Remove CEIP, Appraiser, WaaSMedic, etc.\n\n**OOBE & Setup**:\n- Enable local account setup\n- Skip Microsoft account requirement\n- Dark mode by default\n- Empty taskbar and Start Menu\n\n**Post-Setup Installations**:\n- Prevent DevHome auto-installation\n- Prevent new Outlook Mail app installation\n- Prevent Teams auto-installation\n\n**System Features**:\n- Disable BitLocker and device encryption\n- Disable Chat icon from taskbar\n- Disable OneDrive folder backup\n- Disable Copilot\n- Disable Windows Update during OOBE (re-enabled at first login)\n\n### Driver Injection Feature\n\n**Optional Enhancement**: When enabled, exports all drivers from the running system and injects them into both:\n- `install.wim` (main OS image)\n- `boot.wim` index 2 (Windows Setup PE environment)\n\n**Use Case**: Enables offline installation on systems with missing drivers.\n\n### Disk Space Requirements\n\n- **Temporary working directory**: ~10-15 GB\n- **Original ISO**: 4-6 GB\n- **Modified ISO**: 2.5-3.5 GB\n- **Total needed**: ~25 GB for safe operation\n\n## Data Flow\n\n### Application Installation Flow\n\n```\nUser clicks \"Install\"\n    ↓\nGet-WinUtilCheckBoxes → Retrieves selected apps\n    ↓\nFor each selected app:\n    ↓\nCheck if WinGet/Choco installed\n    ↓\nInstall-WinUtilWinget/Choco (if needed)\n    ↓\nInstall-WinUtilProgramWinget/Choco → Install app\n    ↓\nUpdate UI with progress\n    ↓\nDisplay completion message\n```\n\n### Tweak Application Flow\n\n```\nUser selects tweaks and clicks \"Run Tweaks\"\n    ↓\nGet-WinUtilCheckBoxes → Get selected tweaks\n    ↓\nFor each selected tweak:\n    ↓\nLoad tweak definition from tweaks.json\n    ↓\nInvoke-WPFTweak → Apply registry/service changes\n    ↓\nLog changes\n    ↓\nStore original values (for undo)\n    ↓\nUpdate UI\n    ↓\nDisplay completion\n```\n\n### Undo Tweak Flow\n\n```\nUser selects tweaks and clicks \"Undo\"\n    ↓\nGet-WinUtilCheckBoxes → Get selected tweaks\n    ↓\nFor each tweak:\n    ↓\nRetrieve \"OriginalState\" from tweak definition\n    ↓\nInvoke-WPFUndoTweak → Restore original values\n    ↓\nRemove from applied tweaks log\n    ↓\nUpdate UI\n```\n\n## Configuration File Format\n\n### applications.json Structure\n\n```json {filename=\"config/applications.json\"}\n{\n  \"WPFInstall<AppName>\": {\n    \"category\": \"Browsers\",\n    \"choco\": \"googlechrome\",\n    \"content\": \"Google Chrome\",\n    \"description\": \"Google Chrome browser\",\n    \"link\": \"https://chrome.google.com\",\n    \"winget\": \"Google.Chrome\"\n  }\n}\n```\n\n**Fields**:\n- `category`: Which section in the Install tab\n- `content`: Display name in GUI\n- `description`: Tooltip/description text\n- `winget`: WinGet package ID\n- `choco`: Chocolatey package name\n- `link`: Official website\n\n### tweaks.json Structure\n\n```json {filename=\"config/tweaks.json\"}\n{\n  \"WPFTweaksTelemetry\": {\n    \"Content\": \"Disable Telemetry\",\n    \"Description\": \"Disables Microsoft Telemetry\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\DataCollection\",\n        \"Name\": \"AllowTelemetry\",\n        \"Type\": \"DWord\",\n        \"Value\": \"0\",\n        \"OriginalValue\": \"1\"\n      }\n    ],\n    \"ScheduledTask\": [\n      {\n        \"Name\": \"Microsoft\\\\Windows\\\\Autochk\\\\Proxy\",\n        \"State\": \"Disabled\",\n        \"OriginalState\": \"Enabled\"\n      }\n    ]\n  }\n}\n```\n\n**Fields**:\n- `Content`: Display name\n- `Description`: What it does\n- `category`: Essential/Advanced/Customize\n- `registry`: Registry changes to make\n- `ScheduledTask`: Scheduled tasks to modify\n- `service`: Services to change\n- `OriginalValue/State`: For undo functionality\n\n## PowerShell Runspace\n\nWinutil uses PowerShell runspaces for the GUI to remain responsive:\n\n```powershell\n# Create runspace\n$sync.runspace = [runspacefactory]::CreateRunspace()\n$sync.runspace.Open()\n$sync.runspace.SessionStateProxy.SetVariable(\"sync\", $sync)\n\n# Run code in background\n$powershell = [powershell]::Create().AddScript($scriptblock)\n$powershell.Runspace = $sync.runspace\n$handle = $powershell.BeginInvoke()\n```\n\n**Why**: Prevents UI freezing during long-running operations.\n\n## WPF Event Handling\n\nEvents are wired up via XAML element names:\n\n```powershell\n# Get all named elements\n$sync.keys | ForEach-Object {\n    if($sync.$_.GetType().Name -eq \"Button\") {\n        $sync.$_.Add_Click({\n            $button = $sync.$($args[0].Name)\n            & \"Invoke-$($args[0].Name)\"\n        })\n    }\n}\n```\n\n**Convention**: Button named `WPFInstallButton` calls function `Invoke-WPFInstallButton`.\n\n## Package Manager Integration\n\n### WinGet Integration\n\n```powershell\n# Check if installed\nif (!(Get-Command winget -ErrorAction SilentlyContinue)) {\n    Install-WinUtilWinget\n}\n\n# Install package\nwinget install --id $app.winget --silent --accept-source-agreements\n```\n\n### Chocolatey Integration\n\n```powershell\n# Check if installed\nif (!(Get-Command choco -ErrorAction SilentlyContinue)) {\n    Install-WinUtilChoco\n}\n\n# Install package\nchoco install $app.choco -y\n```\n\n## Error Handling\n\nWinutil uses PowerShell error handling:\n\n```powershell\ntry {\n    # Attempt operation\n    Invoke-SomeOperation\n}\ncatch {\n    Write-Host \"Error: $_\" -ForegroundColor Red\n    # Log error\n    Add-Content -Path $logfile -Value \"ERROR: $_\"\n}\n```\n\n**Logging**: Errors and operations are logged for debugging.\n\n## Configuration Loading\n\nAt startup, Winutil loads all configurations:\n\n```powershell\n# Load JSON configs\n$sync.configs = @{}\n$sync.configs.applications = Get-Content \"config/applications.json\" | ConvertFrom-Json\n$sync.configs.tweaks = Get-Content \"config/tweaks.json\" | ConvertFrom-Json\n$sync.configs.features = Get-Content \"config/feature.json\" | ConvertFrom-Json\n```\n\n**Sync Hash**: `$sync` hashtable shares state across runspaces.\n\n## UI Update Pattern\n\nUI updates must happen on the UI thread:\n\n```powershell\n$sync.form.Dispatcher.Invoke([action]{\n    $sync.WPFStatusLabel.Content = \"Installing...\"\n}, \"Normal\")\n```\n\n**Why**: WPF requires UI updates on the main thread.\n\n## Adding New Features\n\n### Adding a New Application\n\n1. Edit `config/applications.json`:\n```json {filename=\"config/applications.json\"}\n{\n  \"WPFInstallNewApp\": {\n    \"category\": \"Utilities\",\n    \"content\": \"New App\",\n    \"description\": \"Description of new app\",\n    \"winget\": \"Publisher.AppName\",\n    \"choco\": \"appname\"\n  }\n}\n```\n\n2. Recompile: `.\\Compile.ps1`\n3. The app appears automatically in Install tab\n\n### Adding a New Tweak\n\n1. Edit `config/tweaks.json`:\n```json {filename=\"config/tweaks.json\"}\n{\n  \"WPFTweaksNewTweak\": {\n    \"Content\": \"New Tweak\",\n    \"Description\": \"What it does\",\n    \"category\": \"Essential Tweaks\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\Path\\\\To\\\\Key\",\n        \"Name\": \"ValueName\",\n        \"Type\": \"DWord\",\n        \"Value\": \"1\",\n        \"OriginalValue\": \"0\"\n      }\n    ]\n  }\n}\n```\n\n2. Recompile: `.\\Compile.ps1`\n3. Tweak appears in Tweaks tab\n\n### Adding a New Function\n\n1. Create file in `functions/public/` or `functions/private/`:\n```powershell\n# functions/public/Invoke-WPFNewFeature.ps1\nfunction Invoke-WPFNewFeature {\n    <#\n    .SYNOPSIS\n    Does something new\n    #>\n    # Implementation\n}\n```\n\n2. File naming must include \"WPF\" or \"Winutil\" to load\n3. Recompile: `.\\Compile.ps1`\n\n## Testing\n\n### Manual Testing\n\n```powershell\n# Compile and run with -run flag\n.\\Compile.ps1 -run\n```\n\n### Automated Tests\n\nTests are in `/pester/`:\n- `configs.Tests.ps1`: Validates JSON configurations\n- `functions.Tests.ps1`: Tests PowerShell functions\n\nRun tests:\n```powershell\nInvoke-Pester\n```\n\n## Build Process\n\n### Development Build\n\n```powershell\n.\\Compile.ps1\n```\n\nOutputs `winutil.ps1` in the root directory.\n\n### Production Release\n\n1. Tag release in Git\n2. GitHub Actions builds and uploads `winutil.ps1`\n3. Release appears on GitHub Releases\n4. Users download via `irm christitus.com/win`\n\n## Dependencies\n\n**Required**:\n- PowerShell 5.1+\n- .NET Framework 4.5+\n- Windows 11\n\n**Optional (auto-installed)**:\n- WinGet (Windows Package Manager)\n- Chocolatey\n\n## Performance Considerations\n\n**Optimization Strategies**:\n- Lazy-load configurations (only when needed)\n- Use runspaces for long operations\n- Cache expensive lookups\n- Minimize registry reads/writes\n- Batch operations when possible\n\n## Security Considerations\n\n**Safety Measures**:\n- All operations logged\n- Registry backups for undo\n- No credential storage\n- Open source (auditable)\n- Digitally signed (future)\n\n## Contributing Guidelines\n\n**Code Standards**:\n- Use proper PowerShell cmdlet naming (Verb-Noun)\n- Include comment-based help\n- Follow existing code style\n- Test thoroughly before PR\n- Document significant changes\n\n**File Naming**:\n- Public functions: `Invoke-WPF*.ps1` or `Invoke-Winutil*.ps1`\n- Private functions: `Get-WinUtil*.ps1` or verb-WinUtil*.ps1`\n- Must include \"WPF\" or \"Winutil\" to load\n\n## Future Architecture Plans\n\n**Roadmap Considerations**:\n- Plugin system for community extensions\n- Config import/export\n- Cloud sync for configurations\n- Enhanced logging dashboard\n- Modular compilation (choose features)\n\n## Related Documentation\n\n- [Contributing Guide](../../contributing/) - How to contribute code\n- [User Guide](../../userguide/) - End-user documentation\n- [Win11 Creator Guide](../../userguide/win11Creator/) - Building customized Windows 11 ISOs\n- [FAQ](../../faq/) - Common questions\n\n## Additional Resources\n\n- **GitHub Repository**: [ChrisTitusTech/winutil](https://github.com/ChrisTitusTech/winutil)\n- **PowerShell Docs**: [Microsoft Docs](https://docs.microsoft.com/powershell/)\n- **WPF Guide**: [WPF Documentation](https://docs.microsoft.com/dotnet/desktop/wpf/)\n\n---\n\n**Last Updated**: January 2026\n**Maintainers**: Chris Titus Tech and contributors\n"
  },
  {
    "path": "docs/content/dev/features/Features/DisableLegacyRecovery.md",
    "content": "---\ntitle: \"Disable Legacy F8 Boot Recovery\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=100}\n  \"WPFFeatureDisableLegacyRecovery\": {\n    \"Content\": \"Disable Legacy F8 Boot Recovery\",\n    \"Description\": \"Disables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes.\",\n    \"category\": \"Features\",\n    \"panel\": \"1\",\n    \"feature\": [],\n    \"InvokeScript\": [\n      \"bcdedit /set bootmenupolicy standard\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Features/EnableLegacyRecovery.md",
    "content": "---\ntitle: \"Enable Legacy F8 Boot Recovery\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=89}\n  \"WPFFeatureEnableLegacyRecovery\": {\n    \"Content\": \"Enable Legacy F8 Boot Recovery\",\n    \"Description\": \"Enables Advanced Boot Options screen that lets you start Windows in advanced troubleshooting modes.\",\n    \"category\": \"Features\",\n    \"panel\": \"1\",\n    \"feature\": [],\n    \"InvokeScript\": [\n      \"bcdedit /set bootmenupolicy legacy\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Features/RegBackup.md",
    "content": "---\ntitle: \"Enable Daily Registry Backup Task 12.30am\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=72}\n  \"WPFFeatureRegBackup\": {\n    \"Content\": \"Enable Daily Registry Backup Task 12.30am\",\n    \"Description\": \"Enables daily registry backup, previously disabled by Microsoft in Windows 10 1803.\",\n    \"category\": \"Features\",\n    \"panel\": \"1\",\n    \"feature\": [],\n    \"InvokeScript\": [\n      \"\n      New-ItemProperty -Path 'HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Configuration Manager' -Name 'EnablePeriodicBackup' -Type DWord -Value 1 -Force\n      New-ItemProperty -Path 'HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Configuration Manager' -Name 'BackupCount' -Type DWord -Value 2 -Force\n      $action = New-ScheduledTaskAction -Execute 'schtasks' -Argument '/run /i /tn \\\"\\\\Microsoft\\\\Windows\\\\Registry\\\\RegIdleBackup\\\"'\n      $trigger = New-ScheduledTaskTrigger -Daily -At 00:30\n      Register-ScheduledTask -Action $action -Trigger $trigger -TaskName 'AutoRegBackup' -Description 'Create System Registry Backups' -User 'System'\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Features/Sandbox.md",
    "content": "---\ntitle: \"Windows Sandbox\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=111}\n  \"WPFFeaturesSandbox\": {\n    \"Content\": \"Windows Sandbox\",\n    \"Description\": \"Windows Sandbox is a lightweight virtual machine that provides a temporary desktop environment to safely run applications and programs in isolation.\",\n    \"category\": \"Features\",\n    \"panel\": \"1\",\n    \"feature\": [\n      \"Containers-DisposableClientVM\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Features/_index.md",
    "content": "---\ntitle: \"Features\"\nweight: 1\ntoc: false\n---\n\n{{< autolinks section=\"dev/features/features\" >}}\n"
  },
  {
    "path": "docs/content/dev/features/Features/dotnet.md",
    "content": "---\ntitle: \"All .Net Framework (2,3,4)\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=2}\n  \"WPFFeaturesdotnet\": {\n    \"Content\": \"All .Net Framework (2,3,4)\",\n    \"Description\": \".NET and .NET Framework is a developer platform made up of tools, programming languages, and libraries for building many different types of applications.\",\n    \"category\": \"Features\",\n    \"panel\": \"1\",\n    \"feature\": [\n      \"NetFx4-AdvSrvs\",\n      \"NetFx3\"\n    ],\n    \"InvokeScript\": [],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Features/hyperv.md",
    "content": "---\ntitle: \"HyperV Virtualization\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=14}\n  \"WPFFeatureshyperv\": {\n    \"Content\": \"HyperV Virtualization\",\n    \"Description\": \"Hyper-V is a hardware virtualization product developed by Microsoft that allows users to create and manage virtual machines.\",\n    \"category\": \"Features\",\n    \"panel\": \"1\",\n    \"feature\": [\n      \"Microsoft-Hyper-V-All\"\n    ],\n    \"InvokeScript\": [\n      \"bcdedit /set hypervisorschedulertype classic\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Features/legacymedia.md",
    "content": "---\ntitle: \"Legacy Media (WMP, DirectPlay)\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=27}\n  \"WPFFeatureslegacymedia\": {\n    \"Content\": \"Legacy Media (WMP, DirectPlay)\",\n    \"Description\": \"Enables legacy programs from previous versions of Windows.\",\n    \"category\": \"Features\",\n    \"panel\": \"1\",\n    \"feature\": [\n      \"WindowsMediaPlayer\",\n      \"MediaPlayback\",\n      \"DirectPlay\",\n      \"LegacyComponents\"\n    ],\n    \"InvokeScript\": [],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Features/nfs.md",
    "content": "---\ntitle: \"NFS - Network File System\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=53}\n  \"WPFFeaturenfs\": {\n    \"Content\": \"NFS - Network File System\",\n    \"Description\": \"Network File System (NFS) is a mechanism for storing files on a network.\",\n    \"category\": \"Features\",\n    \"panel\": \"1\",\n    \"feature\": [\n      \"ServicesForNFS-ClientOnly\",\n      \"ClientForNFS-Infrastructure\",\n      \"NFS-Administration\"\n    ],\n    \"InvokeScript\": [\n      \"nfsadmin client stop\",\n      \"Set-ItemProperty -Path 'HKLM:\\\\SOFTWARE\\\\Microsoft\\\\ClientForNFS\\\\CurrentVersion\\\\Default' -Name 'AnonymousUID' -Type DWord -Value 0\",\n      \"Set-ItemProperty -Path 'HKLM:\\\\SOFTWARE\\\\Microsoft\\\\ClientForNFS\\\\CurrentVersion\\\\Default' -Name 'AnonymousGID' -Type DWord -Value 0\",\n      \"nfsadmin client start\",\n      \"nfsadmin client localhost config fileaccess=755 SecFlavors=+sys -krb5 -krb5i\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Features/wsl.md",
    "content": "---\ntitle: \"Windows Subsystem for Linux\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=41}\n  \"WPFFeaturewsl\": {\n    \"Content\": \"Windows Subsystem for Linux\",\n    \"Description\": \"Windows Subsystem for Linux is an optional feature of Windows that allows Linux programs to run natively on Windows without the need for a separate virtual machine or dual booting.\",\n    \"category\": \"Features\",\n    \"panel\": \"1\",\n    \"feature\": [\n      \"VirtualMachinePlatform\",\n      \"Microsoft-Windows-Subsystem-Linux\"\n    ],\n    \"InvokeScript\": [],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Fixes/Autologin.md",
    "content": "---\ntitle: \"Set Up Autologin\"\ndescription: \"\"\n---\n\n```powershell {filename=\"functions/public/Invoke-WPFPanelAutologin.ps1\",linenos=inline,linenostart=1}\nfunction Invoke-WPFPanelAutologin {\n    <#\n\n    .SYNOPSIS\n        Enables autologin using Sysinternals Autologon.exe\n\n    #>\n\n    # Official Microsoft recommendation: https://learn.microsoft.com/en-us/sysinternals/downloads/autologon\n    Invoke-WebRequest -Uri \"https://live.sysinternals.com/Autologon.exe\" -OutFile \"$env:temp\\autologin.exe\"\n    cmd /c \"$env:temp\\autologin.exe\" /accepteula\n}\n```\n"
  },
  {
    "path": "docs/content/dev/features/Fixes/DISM.md",
    "content": "---\ntitle: \"System Corruption Scan\"\ndescription: \"\"\n---\n\n```powershell {filename=\"functions/public/Invoke-WPFSystemRepair.ps1\",linenos=inline,linenostart=1}\nfunction Invoke-WPFSystemRepair {\n    <#\n    .SYNOPSIS\n        Checks for system corruption using SFC, and DISM\n        Checks for disk failure using Chkdsk\n\n    .DESCRIPTION\n        1. Chkdsk - Checks for disk errors, which can cause system file corruption and notifies of early disk failure\n        2. SFC - scans protected system files for corruption and fixes them\n        3. DISM - Repair a corrupted Windows operating system image\n    #>\n\n    Start-Process cmd.exe -ArgumentList \"/c chkdsk /scan /perf\" -NoNewWindow -Wait\n    Start-Process cmd.exe -ArgumentList \"/c sfc /scannow\" -NoNewWindow -Wait\n    Start-Process cmd.exe -ArgumentList \"/c dism /online /cleanup-image /restorehealth\" -NoNewWindow -Wait\n\n    Write-Host \"==> Finished System Repair\"\n    Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\"\n}\n```\n"
  },
  {
    "path": "docs/content/dev/features/Fixes/Network.md",
    "content": "---\ntitle: \"Reset Network\"\ndescription: \"\"\n---\n\n```powershell {filename=\"functions/public/Invoke-WPFFixesNetwork.ps1\",linenos=inline,linenostart=1}\nfunction Invoke-WPFFixesNetwork {\n    <#\n\n    .SYNOPSIS\n        Resets various network configurations\n\n    #>\n\n    Write-Host \"Resetting Network with netsh\"\n\n    Set-WinUtilTaskbaritem -state \"Normal\" -value 0.01 -overlay \"logo\"\n    # Reset WinSock catalog to a clean state\n    Start-Process -NoNewWindow -FilePath \"netsh\" -ArgumentList \"winsock\", \"reset\"\n\n    Set-WinUtilTaskbaritem -state \"Normal\" -value 0.35 -overlay \"logo\"\n    # Resets WinHTTP proxy setting to DIRECT\n    Start-Process -NoNewWindow -FilePath \"netsh\" -ArgumentList \"winhttp\", \"reset\", \"proxy\"\n\n    Set-WinUtilTaskbaritem -state \"Normal\" -value 0.7 -overlay \"logo\"\n    # Removes all user configured IP settings\n    Start-Process -NoNewWindow -FilePath \"netsh\" -ArgumentList \"int\", \"ip\", \"reset\"\n\n    Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\"\n\n    Write-Host \"Process complete. Please reboot your computer.\"\n\n    $ButtonType = [System.Windows.MessageBoxButton]::OK\n    $MessageboxTitle = \"Network Reset \"\n    $Messageboxbody = (\"Stock settings loaded.`n Please reboot your computer\")\n    $MessageIcon = [System.Windows.MessageBoxImage]::Information\n\n    [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)\n    Write-Host \"==========================================\"\n    Write-Host \"-- Network Configuration has been Reset --\"\n    Write-Host \"==========================================\"\n}\n```\n"
  },
  {
    "path": "docs/content/dev/features/Fixes/Update.md",
    "content": "---\ntitle: \"Reset Windows Update\"\ndescription: \"\"\n---\n\n```powershell {filename=\"functions/public/Invoke-WPFFixesUpdate.ps1\",linenos=inline,linenostart=1}\nfunction Invoke-WPFFixesUpdate {\n\n    <#\n\n    .SYNOPSIS\n        Performs various tasks in an attempt to repair Windows Update\n\n    .DESCRIPTION\n        1. (Aggressive Only) Scans the system for corruption using the Invoke-WPFSystemRepair function\n        2. Stops Windows Update Services\n        3. Remove the QMGR Data file, which stores BITS jobs\n        4. (Aggressive Only) Renames the DataStore and CatRoot2 folders\n            DataStore - Contains the Windows Update History and Log Files\n            CatRoot2 - Contains the Signatures for Windows Update Packages\n        5. Renames the Windows Update Download Folder\n        6. Deletes the Windows Update Log\n        7. (Aggressive Only) Resets the Security Descriptors on the Windows Update Services\n        8. Reregisters the BITS and Windows Update DLLs\n        9. Removes the WSUS client settings\n        10. Resets WinSock\n        11. Gets and deletes all BITS jobs\n        12. Sets the startup type of the Windows Update Services then starts them\n        13. Forces Windows Update to check for updates\n\n    .PARAMETER Aggressive\n        If specified, the script will take additional steps to repair Windows Update that are more dangerous, take a significant amount of time, or are generally unnecessary\n\n    #>\n\n    param($Aggressive = $false)\n\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -PercentComplete 0\n    Set-WinUtilTaskbaritem -state \"Indeterminate\" -overlay \"logo\"\n    Write-Host \"Starting Windows Update Repair...\"\n    # Wait for the first progress bar to show, otherwise the second one won't show\n    Start-Sleep -Milliseconds 200\n\n    if ($Aggressive) {\n        Invoke-WPFSystemRepair\n    }\n\n\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Stopping Windows Update Services...\" -PercentComplete 10\n    # Stop the Windows Update Services\n    Write-Progress -Id 2 -ParentId 0 -Activity \"Stopping Services\" -Status \"Stopping BITS...\" -PercentComplete 0\n    Stop-Service -Name BITS -Force\n    Write-Progress -Id 2 -ParentId 0 -Activity \"Stopping Services\" -Status \"Stopping wuauserv...\" -PercentComplete 20\n    Stop-Service -Name wuauserv -Force\n    Write-Progress -Id 2 -ParentId 0 -Activity \"Stopping Services\" -Status \"Stopping appidsvc...\" -PercentComplete 40\n    Stop-Service -Name appidsvc -Force\n    Write-Progress -Id 2 -ParentId 0 -Activity \"Stopping Services\" -Status \"Stopping cryptsvc...\" -PercentComplete 60\n    Stop-Service -Name cryptsvc -Force\n    Write-Progress -Id 2 -ParentId 0 -Activity \"Stopping Services\" -Status \"Completed\" -PercentComplete 100\n\n\n    # Remove the QMGR Data file\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Renaming/Removing Files...\" -PercentComplete 20\n    Write-Progress -Id 3 -ParentId 0 -Activity \"Renaming/Removing Files\" -Status \"Removing QMGR Data files...\" -PercentComplete 0\n    Remove-Item \"$env:allusersprofile\\Application Data\\Microsoft\\Network\\Downloader\\qmgr*.dat\" -ErrorAction SilentlyContinue\n\n\n    if ($Aggressive) {\n        # Rename the Windows Update Log and Signature Folders\n        Write-Progress -Id 3 -ParentId 0 -Activity \"Renaming/Removing Files\" -Status \"Renaming the Windows Update Log, Download, and Signature Folder...\" -PercentComplete 20\n        Rename-Item $env:systemroot\\SoftwareDistribution\\DataStore DataStore.bak -ErrorAction SilentlyContinue\n        Rename-Item $env:systemroot\\System32\\Catroot2 catroot2.bak -ErrorAction SilentlyContinue\n    }\n\n    # Rename the Windows Update Download Folder\n    Write-Progress -Id 3 -ParentId 0 -Activity \"Renaming/Removing Files\" -Status \"Renaming the Windows Update Download Folder...\" -PercentComplete 20\n    Rename-Item $env:systemroot\\SoftwareDistribution\\Download Download.bak -ErrorAction SilentlyContinue\n\n    # Delete the legacy Windows Update Log\n    Write-Progress -Id 3 -ParentId 0 -Activity \"Renaming/Removing Files\" -Status \"Removing the old Windows Update log...\" -PercentComplete 80\n    Remove-Item $env:systemroot\\WindowsUpdate.log -ErrorAction SilentlyContinue\n    Write-Progress -Id 3 -ParentId 0 -Activity \"Renaming/Removing Files\" -Status \"Completed\" -PercentComplete 100\n\n\n    if ($Aggressive) {\n        # Reset the Security Descriptors on the Windows Update Services\n        Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Resetting the WU Service Security Descriptors...\" -PercentComplete 25\n        Write-Progress -Id 4 -ParentId 0 -Activity \"Resetting the WU Service Security Descriptors\" -Status \"Resetting the BITS Security Descriptor...\" -PercentComplete 0\n        Start-Process -NoNewWindow -FilePath \"sc.exe\" -ArgumentList \"sdset\", \"bits\", \"D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)\" -Wait\n        Write-Progress -Id 4 -ParentId 0 -Activity \"Resetting the WU Service Security Descriptors\" -Status \"Resetting the wuauserv Security Descriptor...\" -PercentComplete 50\n        Start-Process -NoNewWindow -FilePath \"sc.exe\" -ArgumentList \"sdset\", \"wuauserv\", \"D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)\" -Wait\n        Write-Progress -Id 4 -ParentId 0 -Activity \"Resetting the WU Service Security Descriptors\" -Status \"Completed\" -PercentComplete 100\n    }\n\n\n    # Reregister the BITS and Windows Update DLLs\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Reregistering DLLs...\" -PercentComplete 40\n    $oldLocation = Get-Location\n    Set-Location $env:systemroot\\system32\n    $i = 0\n    $DLLs = @(\n        \"atl.dll\", \"urlmon.dll\", \"mshtml.dll\", \"shdocvw.dll\", \"browseui.dll\",\n        \"jscript.dll\", \"vbscript.dll\", \"scrrun.dll\", \"msxml.dll\", \"msxml3.dll\",\n        \"msxml6.dll\", \"actxprxy.dll\", \"softpub.dll\", \"wintrust.dll\", \"dssenh.dll\",\n        \"rsaenh.dll\", \"gpkcsp.dll\", \"sccbase.dll\", \"slbcsp.dll\", \"cryptdlg.dll\",\n        \"oleaut32.dll\", \"ole32.dll\", \"shell32.dll\", \"initpki.dll\", \"wuapi.dll\",\n        \"wuaueng.dll\", \"wuaueng1.dll\", \"wucltui.dll\", \"wups.dll\", \"wups2.dll\",\n        \"wuweb.dll\", \"qmgr.dll\", \"qmgrprxy.dll\", \"wucltux.dll\", \"muweb.dll\", \"wuwebv.dll\"\n    )\n    foreach ($dll in $DLLs) {\n        Write-Progress -Id 5 -ParentId 0 -Activity \"Reregistering DLLs\" -Status \"Registering $dll...\" -PercentComplete ($i / $DLLs.Count * 100)\n        $i++\n        Start-Process -NoNewWindow -FilePath \"regsvr32.exe\" -ArgumentList \"/s\", $dll\n    }\n    Set-Location $oldLocation\n    Write-Progress -Id 5 -ParentId 0 -Activity \"Reregistering DLLs\" -Status \"Completed\" -PercentComplete 100\n\n\n    # Remove the WSUS client settings\n    if (Test-Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\") {\n        Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Removing WSUS client settings...\" -PercentComplete 60\n        Write-Progress -Id 6 -ParentId 0 -Activity \"Removing WSUS client settings\" -PercentComplete 0\n        Start-Process -NoNewWindow -FilePath \"REG\" -ArgumentList \"DELETE\", \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\", \"/v\", \"AccountDomainSid\", \"/f\" -RedirectStandardError \"NUL\"\n        Start-Process -NoNewWindow -FilePath \"REG\" -ArgumentList \"DELETE\", \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\", \"/v\", \"PingID\", \"/f\" -RedirectStandardError \"NUL\"\n        Start-Process -NoNewWindow -FilePath \"REG\" -ArgumentList \"DELETE\", \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\", \"/v\", \"SusClientId\", \"/f\" -RedirectStandardError \"NUL\"\n        Write-Progress -Id 6 -ParentId 0 -Activity \"Removing WSUS client settings\" -Status \"Completed\" -PercentComplete 100\n    }\n\n    # Remove Group Policy Windows Update settings\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Removing Group Policy Windows Update settings...\" -PercentComplete 60\n    Write-Progress -Id 7 -ParentId 0 -Activity \"Removing Group Policy Windows Update settings\" -PercentComplete 0\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\" -Name \"ExcludeWUDriversInQualityUpdate\" -ErrorAction SilentlyContinue\n    Write-Host \"Defaulting driver offering through Windows Update...\"\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Device Metadata\" -Name \"PreventDeviceMetadataFromNetwork\" -ErrorAction SilentlyContinue\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DriverSearching\" -Name \"DontPromptForWindowsUpdate\" -ErrorAction SilentlyContinue\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DriverSearching\" -Name \"DontSearchWindowsUpdate\" -ErrorAction SilentlyContinue\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DriverSearching\" -Name \"DriverUpdateWizardWuSearchEnabled\" -ErrorAction SilentlyContinue\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\" -Name \"ExcludeWUDriversInQualityUpdate\" -ErrorAction SilentlyContinue\n    Write-Host \"Defaulting Windows Update automatic restart...\"\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" -Name \"NoAutoRebootWithLoggedOnUsers\" -ErrorAction SilentlyContinue\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" -Name \"AUPowerManagement\" -ErrorAction SilentlyContinue\n    Write-Host \"Clearing ANY Windows Update Policy settings...\"\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings\" -Name \"BranchReadinessLevel\" -ErrorAction SilentlyContinue\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings\" -Name \"DeferFeatureUpdatesPeriodInDays\" -ErrorAction SilentlyContinue\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings\" -Name \"DeferQualityUpdatesPeriodInDays\" -ErrorAction SilentlyContinue\n    Remove-Item -Path \"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\n    Remove-Item -Path \"HKCU:\\Software\\Microsoft\\WindowsSelfHost\" -Recurse -Force -ErrorAction SilentlyContinue\n    Remove-Item -Path \"HKCU:\\Software\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\n    Remove-Item -Path \"HKLM:\\Software\\Microsoft\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\n    Remove-Item -Path \"HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\n    Remove-Item -Path \"HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\WindowsStore\\WindowsUpdate\" -Recurse -Force -ErrorAction SilentlyContinue\n    Remove-Item -Path \"HKLM:\\Software\\Microsoft\\WindowsSelfHost\" -Recurse -Force -ErrorAction SilentlyContinue\n    Remove-Item -Path \"HKLM:\\Software\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\n    Remove-Item -Path \"HKLM:\\Software\\WOW6432Node\\Microsoft\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\n    Remove-Item -Path \"HKLM:\\Software\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\n    Remove-Item -Path \"HKLM:\\Software\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\WindowsStore\\WindowsUpdate\" -Recurse -Force -ErrorAction SilentlyContinue\n    Start-Process -NoNewWindow -FilePath \"secedit\" -ArgumentList \"/configure\", \"/cfg\", \"$env:windir\\inf\\defltbase.inf\", \"/db\", \"defltbase.sdb\", \"/verbose\" -Wait\n    Start-Process -NoNewWindow -FilePath \"cmd.exe\" -ArgumentList \"/c RD /S /Q $env:WinDir\\System32\\GroupPolicyUsers\" -Wait\n    Start-Process -NoNewWindow -FilePath \"cmd.exe\" -ArgumentList \"/c RD /S /Q $env:WinDir\\System32\\GroupPolicy\" -Wait\n    Start-Process -NoNewWindow -FilePath \"gpupdate\" -ArgumentList \"/force\" -Wait\n    Write-Progress -Id 7 -ParentId 0 -Activity \"Removing Group Policy Windows Update settings\" -Status \"Completed\" -PercentComplete 100\n\n\n    # Reset WinSock\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Resetting WinSock...\" -PercentComplete 65\n    Write-Progress -Id 7 -ParentId 0 -Activity \"Resetting WinSock\" -Status \"Resetting WinSock...\" -PercentComplete 0\n    Start-Process -NoNewWindow -FilePath \"netsh\" -ArgumentList \"winsock\", \"reset\"\n    Start-Process -NoNewWindow -FilePath \"netsh\" -ArgumentList \"winhttp\", \"reset\", \"proxy\"\n    Start-Process -NoNewWindow -FilePath \"netsh\" -ArgumentList \"int\", \"ip\", \"reset\"\n    Write-Progress -Id 7 -ParentId 0 -Activity \"Resetting WinSock\" -Status \"Completed\" -PercentComplete 100\n\n\n    # Get and delete all BITS jobs\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Deleting BITS jobs...\" -PercentComplete 75\n    Write-Progress -Id 8 -ParentId 0 -Activity \"Deleting BITS jobs\" -Status \"Deleting BITS jobs...\" -PercentComplete 0\n    Get-BitsTransfer | Remove-BitsTransfer\n    Write-Progress -Id 8 -ParentId 0 -Activity \"Deleting BITS jobs\" -Status \"Completed\" -PercentComplete 100\n\n\n    # Change the startup type of the Windows Update Services and start them\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Starting Windows Update Services...\" -PercentComplete 90\n    Write-Progress -Id 9 -ParentId 0 -Activity \"Starting Windows Update Services\" -Status \"Starting BITS...\" -PercentComplete 0\n    Get-Service BITS | Set-Service -StartupType Manual -PassThru | Start-Service\n    Write-Progress -Id 9 -ParentId 0 -Activity \"Starting Windows Update Services\" -Status \"Starting wuauserv...\" -PercentComplete 25\n    Get-Service wuauserv | Set-Service -StartupType Manual -PassThru | Start-Service\n    Write-Progress -Id 9 -ParentId 0 -Activity \"Starting Windows Update Services\" -Status \"Starting AppIDSvc...\" -PercentComplete 50\n    # The AppIDSvc service is protected, so the startup type has to be changed in the registry\n    Set-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\Services\\AppIDSvc\" -Name \"Start\" -Value \"3\" # Manual\n    Start-Service AppIDSvc\n    Write-Progress -Id 9 -ParentId 0 -Activity \"Starting Windows Update Services\" -Status \"Starting CryptSvc...\" -PercentComplete 75\n    Get-Service CryptSvc | Set-Service -StartupType Manual -PassThru | Start-Service\n    Write-Progress -Id 9 -ParentId 0 -Activity \"Starting Windows Update Services\" -Status \"Completed\" -PercentComplete 100\n\n\n    # Force Windows Update to check for updates\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Forcing discovery...\" -PercentComplete 95\n    Write-Progress -Id 10 -ParentId 0 -Activity \"Forcing discovery\" -Status \"Forcing discovery...\" -PercentComplete 0\n    try {\n        (New-Object -ComObject Microsoft.Update.AutoUpdate).DetectNow()\n    } catch {\n        Set-WinUtilTaskbaritem -state \"Error\" -overlay \"warning\"\n        Write-Warning \"Failed to create Windows Update COM object: $_\"\n    }\n    Start-Process -NoNewWindow -FilePath \"wuauclt\" -ArgumentList \"/resetauthorization\", \"/detectnow\"\n    Write-Progress -Id 10 -ParentId 0 -Activity \"Forcing discovery\" -Status \"Completed\" -PercentComplete 100\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Completed\" -PercentComplete 100\n\n    Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\"\n\n    $ButtonType = [System.Windows.MessageBoxButton]::OK\n    $MessageboxTitle = \"Reset Windows Update \"\n    $Messageboxbody = (\"Stock settings loaded.`n Please reboot your computer\")\n    $MessageIcon = [System.Windows.MessageBoxImage]::Information\n\n    [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)\n    Write-Host \"===============================================\"\n    Write-Host \"-- Reset All Windows Update Settings to Stock -\"\n    Write-Host \"===============================================\"\n\n    # Remove the progress bars\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Completed\n    Write-Progress -Id 1 -Activity \"Scanning for corruption\" -Completed\n    Write-Progress -Id 2 -Activity \"Stopping Services\" -Completed\n    Write-Progress -Id 3 -Activity \"Renaming/Removing Files\" -Completed\n    Write-Progress -Id 4 -Activity \"Resetting the WU Service Security Descriptors\" -Completed\n    Write-Progress -Id 5 -Activity \"Reregistering DLLs\" -Completed\n    Write-Progress -Id 6 -Activity \"Removing Group Policy Windows Update settings\" -Completed\n    Write-Progress -Id 7 -Activity \"Resetting WinSock\" -Completed\n    Write-Progress -Id 8 -Activity \"Deleting BITS jobs\" -Completed\n    Write-Progress -Id 9 -Activity \"Starting Windows Update Services\" -Completed\n    Write-Progress -Id 10 -Activity \"Forcing discovery\" -Completed\n}\n```\n"
  },
  {
    "path": "docs/content/dev/features/Fixes/Winget.md",
    "content": "---\ntitle: \"WinGet Reinstall\"\ndescription: \"\"\n---\n\n```powershell {filename=\"functions/public/Invoke-WPFFixesWinget.ps1\",linenos=inline,linenostart=1}\nfunction Invoke-WPFFixesWinget {\n\n    <#\n\n    .SYNOPSIS\n        Fixes Winget by running choco install winget\n    .DESCRIPTION\n        BravoNorris for the fantastic idea of a button to reinstall winget\n    #>\n    # Install Choco if not already present\n    try {\n        Set-WinUtilTaskbaritem -state \"Indeterminate\" -overlay \"logo\"\n        Write-Host \"==> Starting Winget Repair\"\n        Install-WinUtilWinget\n    } catch {\n        Write-Error \"Failed to install winget: $_\"\n        Set-WinUtilTaskbaritem -state \"Error\" -overlay \"warning\"\n    } finally {\n        Write-Host \"==> Finished Winget Repair\"\n        Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\"\n    }\n\n}\n```\n"
  },
  {
    "path": "docs/content/dev/features/Fixes/_index.md",
    "content": "---\ntitle: \"Fixes\"\nweight: 2\ntoc: false\n---\n\n{{< autolinks section=\"dev/features/fixes\" >}}\n"
  },
  {
    "path": "docs/content/dev/features/Legacy-Windows-Panels/Computer.md",
    "content": "---\ntitle: \"Computer Management\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=186}\n  \"WPFPanelComputer\": {\n    \"Content\": \"Computer Management\",\n    \"category\": \"Legacy Windows Panels\",\n    \"panel\": \"2\",\n    \"Type\": \"Button\",\n    \"ButtonWidth\": \"300\",\n    \"InvokeScript\": [\n      \"compmgmt.msc\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Legacy-Windows-Panels/Control.md",
    "content": "---\ntitle: \"Control Panel\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=175}\n  \"WPFPanelControl\": {\n    \"Content\": \"Control Panel\",\n    \"category\": \"Legacy Windows Panels\",\n    \"panel\": \"2\",\n    \"Type\": \"Button\",\n    \"ButtonWidth\": \"300\",\n    \"InvokeScript\": [\n      \"control\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Legacy-Windows-Panels/Network.md",
    "content": "---\ntitle: \"Network Connections\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=197}\n  \"WPFPanelNetwork\": {\n    \"Content\": \"Network Connections\",\n    \"category\": \"Legacy Windows Panels\",\n    \"panel\": \"2\",\n    \"Type\": \"Button\",\n    \"ButtonWidth\": \"300\",\n    \"InvokeScript\": [\n      \"ncpa.cpl\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Legacy-Windows-Panels/Power.md",
    "content": "---\ntitle: \"Power Panel\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=208}\n  \"WPFPanelPower\": {\n    \"Content\": \"Power Panel\",\n    \"category\": \"Legacy Windows Panels\",\n    \"panel\": \"2\",\n    \"Type\": \"Button\",\n    \"ButtonWidth\": \"300\",\n    \"InvokeScript\": [\n      \"powercfg.cpl\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Legacy-Windows-Panels/Printer.md",
    "content": "---\ntitle: \"Printer Panel\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=219}\n  \"WPFPanelPrinter\": {\n    \"Content\": \"Printer Panel\",\n    \"category\": \"Legacy Windows Panels\",\n    \"panel\": \"2\",\n    \"Type\": \"Button\",\n    \"ButtonWidth\": \"300\",\n    \"InvokeScript\": [\n      \"Start-Process 'shell:::{A8A91A66-3A7D-4424-8D24-04E180695C7A}'\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Legacy-Windows-Panels/Region.md",
    "content": "---\ntitle: \"Region\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=230}\n  \"WPFPanelRegion\": {\n    \"Content\": \"Region\",\n    \"category\": \"Legacy Windows Panels\",\n    \"panel\": \"2\",\n    \"Type\": \"Button\",\n    \"ButtonWidth\": \"300\",\n    \"InvokeScript\": [\n      \"intl.cpl\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Legacy-Windows-Panels/Restore.md",
    "content": "---\ntitle: \"Windows Restore\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=241}\n  \"WPFPanelRestore\": {\n    \"Content\": \"Windows Restore\",\n    \"category\": \"Legacy Windows Panels\",\n    \"panel\": \"2\",\n    \"Type\": \"Button\",\n    \"ButtonWidth\": \"300\",\n    \"InvokeScript\": [\n      \"rstrui.exe\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Legacy-Windows-Panels/Sound.md",
    "content": "---\ntitle: \"Sound Settings\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=252}\n  \"WPFPanelSound\": {\n    \"Content\": \"Sound Settings\",\n    \"category\": \"Legacy Windows Panels\",\n    \"panel\": \"2\",\n    \"Type\": \"Button\",\n    \"ButtonWidth\": \"300\",\n    \"InvokeScript\": [\n      \"mmsys.cpl\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Legacy-Windows-Panels/System.md",
    "content": "---\ntitle: \"System Properties\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=263}\n  \"WPFPanelSystem\": {\n    \"Content\": \"System Properties\",\n    \"category\": \"Legacy Windows Panels\",\n    \"panel\": \"2\",\n    \"Type\": \"Button\",\n    \"ButtonWidth\": \"300\",\n    \"InvokeScript\": [\n      \"sysdm.cpl\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Legacy-Windows-Panels/Timedate.md",
    "content": "---\ntitle: \"Time and Date\"\ndescription: \"\"\n---\n\n```json {filename=\"config/feature.json\",linenos=inline,linenostart=274}\n  \"WPFPanelTimedate\": {\n    \"Content\": \"Time and Date\",\n    \"category\": \"Legacy Windows Panels\",\n    \"panel\": \"2\",\n    \"Type\": \"Button\",\n    \"ButtonWidth\": \"300\",\n    \"InvokeScript\": [\n      \"timedate.cpl\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/features/Legacy-Windows-Panels/_index.md",
    "content": "---\ntitle: \"Legacy Windows Panels\"\nweight: 3\ntoc: false\n---\n\n{{< autolinks section=\"dev/features/legacy-windows-panels\" >}}\n"
  },
  {
    "path": "docs/content/dev/features/Powershell-Profile-Powershell-7--Only/InstallPSProfile.md",
    "content": "---\ntitle: \"Install CTT PowerShell Profile\"\ndescription: \"\"\n---\n\n```powershell {filename=\"functions/private/Invoke-WinUtilInstallPSProfile.ps1\",linenos=inline,linenostart=1}\nfunction Invoke-WinUtilInstallPSProfile {\n\n    if (Test-Path $Profile) {\n        Rename-Item $Profile -NewName ($Profile + '.bak')\n    }\n\n    Start-Process pwsh -ArgumentList '-Command \"irm https://github.com/ChrisTitusTech/powershell-profile/raw/main/setup.ps1 | iex\"'\n}\n```\n"
  },
  {
    "path": "docs/content/dev/features/Powershell-Profile-Powershell-7--Only/UninstallPSProfile.md",
    "content": "---\ntitle: \"Uninstall CTT PowerShell Profile\"\ndescription: \"\"\n---\n\n```powershell {filename=\"functions/private/Invoke-WinUtilUninstallPSProfile.ps1\",linenos=inline,linenostart=1}\nfunction Invoke-WinUtilUninstallPSProfile {\n    if (Test-Path ($Profile + '.bak')) {\n        Remove-Item $Profile\n        Rename-Item ($Profile + '.bak') -NewName $Profile\n    }\n    else {\n        Remove-Item $Profile\n    }\n\n    Write-Host \"Successfully uninstalled CTT Powershell Profile\" -ForegroundColor Green\n}\n```\n"
  },
  {
    "path": "docs/content/dev/features/Powershell-Profile-Powershell-7--Only/_index.md",
    "content": "---\ntitle: \"Powershell Profile Powershell 7+ Only\"\nweight: 5\ntoc: false\n---\n\n{{< autolinks section=\"dev/features/powershell-profile-powershell-7--only\" >}}\n"
  },
  {
    "path": "docs/content/dev/features/Remote-Access/SSHServer.md",
    "content": "---\ntitle: \"Enable OpenSSH Server\"\ndescription: \"\"\n---\n\n```powershell {filename=\"functions/public/Invoke-WPFSSHServer.ps1\",linenos=inline,linenostart=1}\nfunction Invoke-WPFSSHServer {\n    <#\n\n    .SYNOPSIS\n        Invokes the OpenSSH Server install in a runspace\n\n  #>\n\n    Invoke-WPFRunspace -ScriptBlock {\n\n        Invoke-WinUtilSSHServer\n\n        Write-Host \"=======================================\"\n        Write-Host \"--     OpenSSH Server installed!    ---\"\n        Write-Host \"=======================================\"\n    }\n}\n```\n"
  },
  {
    "path": "docs/content/dev/features/Remote-Access/_index.md",
    "content": "---\ntitle: \"Remote Access\"\nweight: 4\ntoc: false\n---\n\n{{< autolinks section=\"dev/features/remote-access\" >}}\n"
  },
  {
    "path": "docs/content/dev/features/_index.md",
    "content": "---\ntitle: \"Features\"\nweight: 1\ntoc: false\n---\n\n### Fixes\n\n{{< autolinks section=\"dev/features/fixes\" >}}\n\n### Legacy Windows Panels\n\n{{< autolinks section=\"dev/features/legacy-windows-panels\" >}}\n\n### Features\n\n{{< autolinks section=\"dev/features/features\" >}}\n\n### Remote Access\n\n{{< autolinks section=\"dev/features/remote-access\" >}}\n\n### Powershell Profile Powershell 7+ Only\n\n{{< autolinks section=\"dev/features/powershell-profile-powershell-7--only\" >}}\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/BingSearch.md",
    "content": "---\ntitle: \"Bing Search in Start Menu\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2207}\n  \"WPFToggleBingSearch\": {\n    \"Content\": \"Bing Search in Start Menu\",\n    \"Description\": \"If enabled, Bing web search results will be included in your Start Menu search.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Search\",\n        \"Name\": \"BingSearchEnabled\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"true\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/DarkMode.md",
    "content": "---\ntitle: \"Dark Theme for Windows\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2165}\n  \"WPFToggleDarkMode\": {\n    \"Content\": \"Dark Theme for Windows\",\n    \"Description\": \"Enable/Disable Dark Mode.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize\",\n        \"Name\": \"AppsUseLightTheme\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\",\n        \"DefaultState\": \"false\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize\",\n        \"Name\": \"SystemUsesLightTheme\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\",\n        \"DefaultState\": \"false\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"\n      Invoke-WinUtilExplorerUpdate\n      if ($sync.ThemeButton.Content -eq [char]0xF08C) {\n        Invoke-WinutilThemeChange -theme \\\"Auto\\\"\n      }\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      Invoke-WinUtilExplorerUpdate\n      if ($sync.ThemeButton.Content -eq [char]0xF08C) {\n        Invoke-WinutilThemeChange -theme \\\"Auto\\\"\n      }\n      \"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/DetailedBSoD.md",
    "content": "---\ntitle: \"Detailed BSoD\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2581}\n  \"WPFToggleDetailedBSoD\": {\n    \"Content\": \"Detailed BSoD\",\n    \"Description\": \"If enabled, you will see a detailed Blue Screen of Death (BSOD) with more information.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\CrashControl\",\n        \"Name\": \"DisplayParameters\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"false\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\CrashControl\",\n        \"Name\": \"DisableEmoticon\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"false\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/DisableCrossDeviceResume.md",
    "content": "---\ntitle: \"Cross-Device Resume\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2711}\n  \"WPFToggleDisableCrossDeviceResume\": {\n    \"Content\": \"Cross-Device Resume\",\n    \"Description\": \"This tweak controls the Resume function in Windows 11 24H2 and later, which allows you to resume an activity from a mobile device and vice-versa.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\CrossDeviceResume\\\\Configuration\",\n        \"Name\": \"IsResumeAllowed\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"true\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/HiddenFiles.md",
    "content": "---\ntitle: \"Show Hidden Files\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2461}\n  \"WPFToggleHiddenFiles\": {\n    \"Content\": \"Show Hidden Files\",\n    \"Description\": \"If enabled, Hidden Files will be shown.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\n        \"Name\": \"Hidden\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"false\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\n      \"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/HideSettingsHome.md",
    "content": "---\ntitle: \"Remove Settings Home Page\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2331}\n  \"WPFToggleHideSettingsHome\": {\n    \"Content\": \"Remove Settings Home Page\",\n    \"Description\": \"Removes the Home Page in the Windows Settings app.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\Explorer\",\n        \"Name\": \"SettingsPageVisibility\",\n        \"Value\": \"hide:home\",\n        \"Type\": \"String\",\n        \"OriginalValue\": \"show:home\",\n        \"DefaultState\": \"false\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/MouseAcceleration.md",
    "content": "---\ntitle: \"Mouse Acceleration\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2349}\n  \"WPFToggleMouseAcceleration\": {\n    \"Content\": \"Mouse Acceleration\",\n    \"Description\": \"If enabled, the Cursor movement is affected by the speed of your physical mouse movements.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Mouse\",\n        \"Name\": \"MouseSpeed\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"true\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Mouse\",\n        \"Name\": \"MouseThreshold1\",\n        \"Value\": \"6\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"true\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Mouse\",\n        \"Name\": \"MouseThreshold2\",\n        \"Value\": \"10\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"true\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/MultiplaneOverlay.md",
    "content": "---\ntitle: \"Disable Multiplane Overlay\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2443}\n  \"WPFToggleMultiplaneOverlay\": {\n    \"Content\": \"Disable Multiplane Overlay\",\n    \"Description\": \"Disable the Multiplane Overlay which can sometimes cause issues with Graphics Cards.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\Dwm\",\n        \"Name\": \"OverlayTestMode\",\n        \"Value\": \"5\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\",\n        \"DefaultState\": \"false\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/NewOutlook.md",
    "content": "---\ntitle: \"New Outlook\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2401}\n  \"WPFToggleNewOutlook\": {\n    \"Content\": \"New Outlook\",\n    \"Description\": \"If disabled, it removes the new Outlook toggle, disables the new Outlook migration, and ensures the classic Outlook application is used.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\SOFTWARE\\\\Microsoft\\\\Office\\\\16.0\\\\Outlook\\\\Preferences\",\n        \"Name\": \"UseNewOutlook\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"true\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Office\\\\16.0\\\\Outlook\\\\Options\\\\General\",\n        \"Name\": \"HideNewOutlookToggle\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\",\n        \"DefaultState\": \"true\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Policies\\\\Microsoft\\\\Office\\\\16.0\\\\Outlook\\\\Options\\\\General\",\n        \"Name\": \"DoNewOutlookAutoMigration\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"false\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Policies\\\\Microsoft\\\\Office\\\\16.0\\\\Outlook\\\\Preferences\",\n        \"Name\": \"NewOutlookMigrationUserSetting\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\",\n        \"DefaultState\": \"true\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/NumLock.md",
    "content": "---\ntitle: \"Num Lock on Startup\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2243}\n  \"WPFToggleNumLock\": {\n    \"Content\": \"Num Lock on Startup\",\n    \"Description\": \"Toggle the Num Lock key state when your computer starts.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKU:\\\\.Default\\\\Control Panel\\\\Keyboard\",\n        \"Name\": \"InitialKeyboardIndicators\",\n        \"Value\": \"2\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"false\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Keyboard\",\n        \"Name\": \"InitialKeyboardIndicators\",\n        \"Value\": \"2\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"false\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/S3Sleep.md",
    "content": "---\ntitle: \"S3 Sleep\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2607}\n  \"WPFToggleS3Sleep\": {\n    \"Content\": \"S3 Sleep\",\n    \"Description\": \"Toggles between Modern Standby and S3 Sleep.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Power\",\n        \"Name\": \"PlatformAoAcOverride\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\",\n        \"DefaultState\": \"false\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/ShowExt.md",
    "content": "---\ntitle: \"Show File Extensions\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2489}\n  \"WPFToggleShowExt\": {\n    \"Content\": \"Show File Extensions\",\n    \"Description\": \"If enabled, File extensions (e.g., .txt, .jpg) are visible.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\n        \"Name\": \"HideFileExt\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\",\n        \"DefaultState\": \"false\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\n      \"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/StandbyFix.md",
    "content": "---\ntitle: \"Modern Standby fix\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2225}\n  \"WPFToggleStandbyFix\": {\n    \"Content\": \"Modern Standby fix\",\n    \"Description\": \"Disable network connection during S0 sleep. If network connectivity is turned on during S0 sleep it could cause overheating on modern laptops\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Power\\\\PowerSettings\\\\f15576e8-98b7-4186-b944-eafa664402d9\",\n        \"Name\": \"ACSettingIndex\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\",\n        \"DefaultState\": \"true\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/StartMenuRecommendations.md",
    "content": "---\ntitle: \"Recommendations in Start Menu\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2287}\n  \"WPFToggleStartMenuRecommendations\": {\n    \"Content\": \"Recommendations in Start Menu\",\n    \"Description\": \"If disabled, then you will not see recommendations in the Start Menu. WARNING: This will also disable Windows Spotlight on your Lock Screen as a side effect.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\PolicyManager\\\\current\\\\device\\\\Start\",\n        \"Name\": \"HideRecommendedSection\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\",\n        \"DefaultState\": \"true\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\PolicyManager\\\\current\\\\device\\\\Education\",\n        \"Name\": \"IsEducationEnvironment\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\",\n        \"DefaultState\": \"true\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\Explorer\",\n        \"Name\": \"HideRecommendedSection\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\",\n        \"DefaultState\": \"true\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\n      \"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/StickyKeys.md",
    "content": "---\ntitle: \"Sticky Keys\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2383}\n  \"WPFToggleStickyKeys\": {\n    \"Content\": \"Sticky Keys\",\n    \"Description\": \"If enabled, Sticky Keys is activated. Sticky keys is an accessibility feature of some graphical user interfaces which assists users who have physical disabilities or help users reduce repetitive strain injury.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Accessibility\\\\StickyKeys\",\n        \"Name\": \"Flags\",\n        \"Value\": \"506\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"58\",\n        \"DefaultState\": \"true\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/TaskView.md",
    "content": "---\ntitle: \"Task View Button in Taskbar\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2535}\n  \"WPFToggleTaskView\": {\n    \"Content\": \"Task View Button in Taskbar\",\n    \"Description\": \"If enabled, Task View Button in Taskbar will be shown.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\n        \"Name\": \"ShowTaskViewButton\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"true\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/TaskbarAlignment.md",
    "content": "---\ntitle: \"Center Taskbar Items\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2553}\n  \"WPFToggleTaskbarAlignment\": {\n    \"Content\": \"Center Taskbar Items\",\n    \"Description\": \"[Windows 11] If enabled, the Taskbar Items will be shown on the Center, otherwise the Taskbar Items will be shown on the Left.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\n        \"Name\": \"TaskbarAl\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"true\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\n      \"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/TaskbarSearch.md",
    "content": "---\ntitle: \"Search Button in Taskbar\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2517}\n  \"WPFToggleTaskbarSearch\": {\n    \"Content\": \"Search Button in Taskbar\",\n    \"Description\": \"If enabled, Search Button will be on the Taskbar.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Search\",\n        \"Name\": \"SearchboxTaskbarMode\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"true\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/VerboseLogon.md",
    "content": "---\ntitle: \"Verbose Messages During Logon\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2269}\n  \"WPFToggleVerboseLogon\": {\n    \"Content\": \"Verbose Messages During Logon\",\n    \"Description\": \"Show detailed messages during the login process for troubleshooting and diagnostics.\",\n    \"category\": \"Customize Preferences\",\n    \"panel\": \"2\",\n    \"Type\": \"Toggle\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\System\",\n        \"Name\": \"VerboseStatus\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\",\n        \"DefaultState\": \"false\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Customize-Preferences/_index.md",
    "content": "---\ntitle: \"Customize Preferences\"\nweight: 3\ntoc: false\n---\n\n### Customize Preferences\n\n{{< autolinks section=\"dev/tweaks/customize-preferences\" >}}\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/Activity.md",
    "content": "---\ntitle: \"Disable Activity History\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2}\n  \"WPFTweaksActivity\": {\n    \"Content\": \"Disable Activity History\",\n    \"Description\": \"Erases recent docs, clipboard, and run history.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\System\",\n        \"Name\": \"EnableActivityFeed\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\System\",\n        \"Name\": \"PublishUserActivities\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\System\",\n        \"Name\": \"UploadUserActivities\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/ConsumerFeatures.md",
    "content": "---\ntitle: \"Disable ConsumerFeatures\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1304}\n  \"WPFTweaksConsumerFeatures\": {\n    \"Content\": \"Disable ConsumerFeatures\",\n    \"Description\": \"Windows will not automatically install any games, third-party apps, or application links from the Windows Store for the signed-in user. Some default Apps will be inaccessible (eg. Phone Link).\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\CloudContent\",\n        \"Name\": \"DisableWindowsConsumerFeatures\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/DeleteTempFiles.md",
    "content": "---\ntitle: \"Delete Temporary Files\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2060}\n  \"WPFTweaksDeleteTempFiles\": {\n    \"Content\": \"Delete Temporary Files\",\n    \"Description\": \"Erases TEMP Folders.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"\n      Remove-Item -Path \\\"$Env:Temp\\\\*\\\" -Recurse -Force\n      Remove-Item -Path \\\"$Env:SystemRoot\\\\Temp\\\\*\\\" -Recurse -Force\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/DisableExplorerAutoDiscovery.md",
    "content": "---\ntitle: \"Disable Explorer Automatic Folder Discovery\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2656}\n  \"WPFTweaksDisableExplorerAutoDiscovery\": {\n    \"Content\": \"Disable Explorer Automatic Folder Discovery\",\n    \"Description\": \"Windows Explorer automatically tries to guess the type of the folder based on its contents, slowing down the browsing experience. WARNING! Will disable File Explorer grouping.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"\n      # Previously detected folders\n      $bags = \\\"HKCU:\\\\Software\\\\Classes\\\\Local Settings\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Bags\\\"\n\n      # Folder types lookup table\n      $bagMRU = \\\"HKCU:\\\\Software\\\\Classes\\\\Local Settings\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\BagMRU\\\"\n\n      # Flush Explorer view database\n      Remove-Item -Path $bags -Recurse -Force\n      Write-Host \\\"Removed $bags\\\"\n\n      Remove-Item -Path $bagMRU -Recurse -Force\n      Write-Host \\\"Removed $bagMRU\\\"\n\n      # Every folder\n      $allFolders = \\\"HKCU:\\\\Software\\\\Classes\\\\Local Settings\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Bags\\\\AllFolders\\\\Shell\\\"\n\n      if (!(Test-Path $allFolders)) {\n        New-Item -Path $allFolders -Force\n        Write-Host \\\"Created $allFolders\\\"\n      }\n\n      # Generic view\n      New-ItemProperty -Path $allFolders -Name \\\"FolderType\\\" -Value \\\"NotSpecified\\\" -PropertyType String -Force\n      Write-Host \\\"Set FolderType to NotSpecified\\\"\n\n      Write-Host Please sign out and back in, or restart your computer to apply the changes!\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      # Previously detected folders\n      $bags = \\\"HKCU:\\\\Software\\\\Classes\\\\Local Settings\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Bags\\\"\n\n      # Folder types lookup table\n      $bagMRU = \\\"HKCU:\\\\Software\\\\Classes\\\\Local Settings\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\BagMRU\\\"\n\n      # Flush Explorer view database\n      Remove-Item -Path $bags -Recurse -Force\n      Write-Host \\\"Removed $bags\\\"\n\n      Remove-Item -Path $bagMRU -Recurse -Force\n      Write-Host \\\"Removed $bagMRU\\\"\n\n      Write-Host Please sign out and back in, or restart your computer to apply the changes!\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/DisableStoreSearch.md",
    "content": "---\ntitle: \"Disable Microsoft Store search results\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=125}\n  \"WPFTweaksDisableStoreSearch\": {\n    \"Content\": \"Disable Microsoft Store search results\",\n    \"Description\": \"Will not display recommended Microsoft Store apps when searching for apps in the Start menu.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"icacls \\\"$Env:LocalAppData\\\\Packages\\\\Microsoft.WindowsStore_8wekyb3d8bbwe\\\\LocalState\\\\store.db\\\" /deny Everyone:F\"\n    ],\n    \"UndoScript\": [\n      \"icacls \\\"$Env:LocalAppData\\\\Packages\\\\Microsoft.WindowsStore_8wekyb3d8bbwe\\\\LocalState\\\\store.db\\\" /grant Everyone:F\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/DiskCleanup.md",
    "content": "---\ntitle: \"Run Disk Cleanup\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2047}\n  \"WPFTweaksDiskCleanup\": {\n    \"Content\": \"Run Disk Cleanup\",\n    \"Description\": \"Runs Disk Cleanup on Drive C: and removes old Windows Updates.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"\n      cleanmgr.exe /d C: /VERYLOWDISK\n      Dism.exe /online /Cleanup-Image /StartComponentCleanup /ResetBase\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/EndTaskOnTaskbar.md",
    "content": "---\ntitle: \"Enable End Task With Right Click\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1785}\n  \"WPFTweaksEndTaskOnTaskbar\": {\n    \"Content\": \"Enable End Task With Right Click\",\n    \"Description\": \"Enables option to end task when right clicking a program in the taskbar.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\\\\TaskbarDeveloperSettings\",\n        \"Name\": \"TaskbarEndTask\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/Hiber.md",
    "content": "---\ntitle: \"Disable Hibernation\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=32}\n  \"WPFTweaksHiber\": {\n    \"Content\": \"Disable Hibernation\",\n    \"Description\": \"Hibernation is really meant for laptops as it saves what's in memory before turning the PC off. It really should never be used.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\System\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Power\",\n        \"Name\": \"HibernateEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\FlyoutMenuSettings\",\n        \"Name\": \"ShowHibernateOption\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"powercfg.exe /hibernate off\"\n    ],\n    \"UndoScript\": [\n      \"powercfg.exe /hibernate on\"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/Location.md",
    "content": "---\ntitle: \"Disable Location Tracking\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=138}\n  \"WPFTweaksLocation\": {\n    \"Content\": \"Disable Location Tracking\",\n    \"Description\": \"Disables Location Tracking.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\CapabilityAccessManager\\\\ConsentStore\\\\location\",\n        \"Name\": \"Value\",\n        \"Value\": \"Deny\",\n        \"Type\": \"String\",\n        \"OriginalValue\": \"Allow\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\Sensor\\\\Overrides\\\\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}\",\n        \"Name\": \"SensorPermissionState\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\lfsvc\\\\Service\\\\Configuration\",\n        \"Name\": \"Status\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\Maps\",\n        \"Name\": \"AutoUpdateEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/Powershell7Tele.md",
    "content": "---\ntitle: \"Disable Powershell 7 Telemetry\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1801}\n  \"WPFTweaksPowershell7Tele\": {\n    \"Content\": \"Disable Powershell 7 Telemetry\",\n    \"Description\": \"Creates an Environment Variable called 'POWERSHELL_TELEMETRY_OPTOUT' with a value of '1' which will tell PowerShell 7 to not send Telemetry Data.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"[Environment]::SetEnvironmentVariable('POWERSHELL_TELEMETRY_OPTOUT', '1', 'Machine')\"\n    ],\n    \"UndoScript\": [\n      \"[Environment]::SetEnvironmentVariable('POWERSHELL_TELEMETRY_OPTOUT', '', 'Machine')\"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/RestorePoint.md",
    "content": "---\ntitle: \"Create Restore Point\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1758}\n  \"WPFTweaksRestorePoint\": {\n    \"Content\": \"Create Restore Point\",\n    \"Description\": \"Creates a restore point at runtime in case a revert is needed from WinUtil modifications.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"Checked\": \"False\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\SystemRestore\",\n        \"Name\": \"SystemRestorePointCreationFrequency\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1440\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"\n      if (-not (Get-ComputerRestorePoint)) {\n          Enable-ComputerRestore -Drive $Env:SystemDrive\n      }\n\n      Checkpoint-Computer -Description \\\"System Restore Point created by WinUtil\\\" -RestorePointType MODIFY_SETTINGS\n      Write-Host \\\"System Restore Point Created Successfully\\\" -ForegroundColor Green\n      \"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/RevertStartMenu.md",
    "content": "---\ntitle: \"Revert Start Menu layout\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=90}\n  \"WPFTweaksRevertStartMenu\": {\n    \"Content\": \"Revert Start Menu layout\",\n    \"Description\": \"Bring back the old Start Menu layout from before the gradual rollout of the new one in 25H2.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"\n      Invoke-WebRequest https://github.com/thebookisclosed/ViVe/releases/download/v0.3.4/ViVeTool-v0.3.4-IntelAmd.zip -OutFile ViVeTool.zip\n\n      Expand-Archive ViVeTool.zip\n      Remove-Item ViVeTool.zip\n\n      Start-Process 'ViVeTool\\\\ViVeTool.exe' -ArgumentList '/disable /id:47205210' -Wait -NoNewWindow\n\n      Remove-Item ViVeTool -Recurse\n\n      Write-Host 'Old start menu reverted please restart your computer to take effect'\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      Invoke-WebRequest https://github.com/thebookisclosed/ViVe/releases/download/v0.3.4/ViVeTool-v0.3.4-IntelAmd.zip -OutFile ViVeTool.zip\n\n      Expand-Archive ViVeTool.zip\n      Remove-Item ViVeTool.zip\n\n      Start-Process 'ViVeTool\\\\ViVeTool.exe' -ArgumentList '/enable /id:47205210' -Wait -NoNewWindow\n\n      Remove-Item ViVeTool -Recurse\n\n      Write-Host 'New start menu reverted please restart your computer to take effect'\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/Services.md",
    "content": "---\ntitle: \"Set Services to Manual\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=175}\n  \"WPFTweaksServices\": {\n    \"Content\": \"Set Services to Manual\",\n    \"Description\": \"Turns a bunch of system services to manual that don't need to be running all the time. This is pretty harmless as if the service is needed, it will simply start on demand.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"service\": [\n      {\n        \"Name\": \"ALG\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"AppMgmt\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"AppReadiness\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"AppVClient\",\n        \"StartupType\": \"Disabled\",\n        \"OriginalType\": \"Disabled\"\n      },\n      {\n        \"Name\": \"Appinfo\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"AssignedAccessManagerSvc\",\n        \"StartupType\": \"Disabled\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"AudioEndpointBuilder\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"AudioSrv\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"Audiosrv\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"AxInstSV\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"BDESVC\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"BITS\",\n        \"StartupType\": \"AutomaticDelayedStart\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"BTAGService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"BthAvctpSvc\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"CDPSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"COMSysApp\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"CertPropSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"CryptSvc\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"CscService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"DPS\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"DevQueryBroker\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"DeviceAssociationService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"DeviceInstall\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"Dhcp\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"DiagTrack\",\n        \"StartupType\": \"Disabled\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"DialogBlockingService\",\n        \"StartupType\": \"Disabled\",\n        \"OriginalType\": \"Disabled\"\n      },\n      {\n        \"Name\": \"DispBrokerDesktopSvc\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"DisplayEnhancementService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"EFS\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"EapHost\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"EventLog\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"EventSystem\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"FDResPub\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"FontCache\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"FrameServer\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"FrameServerMonitor\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"GraphicsPerfSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"HvHost\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"IKEEXT\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"InstallService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"InventorySvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"IpxlatCfgSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"KeyIso\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"KtmRm\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"LanmanServer\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"LanmanWorkstation\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"LicenseManager\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"LxpSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"MSDTC\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"MSiSCSI\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"MapsBroker\",\n        \"StartupType\": \"AutomaticDelayedStart\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"McpManagementService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"MicrosoftEdgeElevationService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"NaturalAuthentication\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"NcaSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"NcbService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"NcdAutoSetup\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"NetSetupSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"NetTcpPortSharing\",\n        \"StartupType\": \"Disabled\",\n        \"OriginalType\": \"Disabled\"\n      },\n      {\n        \"Name\": \"Netman\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"NlaSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"PcaSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"PeerDistSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"PerfHost\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"PhoneSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"PlugPlay\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"PolicyAgent\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"Power\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"PrintNotify\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"ProfSvc\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"PushToInstall\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"QWAVE\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"RasAuto\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"RasMan\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"RemoteAccess\",\n        \"StartupType\": \"Disabled\",\n        \"OriginalType\": \"Disabled\"\n      },\n      {\n        \"Name\": \"RemoteRegistry\",\n        \"StartupType\": \"Disabled\",\n        \"OriginalType\": \"Disabled\"\n      },\n      {\n        \"Name\": \"RetailDemo\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"RmSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"RpcLocator\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SCPolicySvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SCardSvr\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SDRSVC\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SEMgrSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SENS\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"SNMPTRAP\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SNMPTrap\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SSDPSRV\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SamSs\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"ScDeviceEnum\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SensorDataService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SensorService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SensrSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SessionEnv\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"SharedAccess\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"ShellHWDetection\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"SmsRouter\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"Spooler\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"SstpSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"StiSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"StorSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"SysMain\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"TapiSrv\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"TermService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"Themes\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"TieringEngineService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"TokenBroker\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"TrkWks\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"TroubleshootingSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"TrustedInstaller\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"UevAgentService\",\n        \"StartupType\": \"Disabled\",\n        \"OriginalType\": \"Disabled\"\n      },\n      {\n        \"Name\": \"UmRdpService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"UserManager\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"UsoSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"VSS\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"VaultSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"W32Time\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WEPHOSTSVC\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WFDSConMgrSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WMPNetworkSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WManSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WPDBusEnum\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WSAIFabricSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"WSearch\",\n        \"StartupType\": \"AutomaticDelayedStart\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"WalletService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WarpJITSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WbioSrvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"Wcmsvc\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"WdiServiceHost\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WdiSystemHost\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WebClient\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"Wecsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WerSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WiaRpc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WinRM\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"Winmgmt\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"WpcMonSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"WpnService\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"XblAuthManager\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"XblGameSave\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"XboxGipSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"XboxNetApiSvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"autotimesvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"bthserv\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"camsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"cloudidsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"dcsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"defragsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"diagsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"dmwappushservice\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"dot3svc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"edgeupdate\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"edgeupdatem\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"fdPHost\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"fhsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"hidserv\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"icssvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"iphlpsvc\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"lfsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"lltdsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"lmhosts\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"netprofm\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"nsi\",\n        \"StartupType\": \"Automatic\",\n        \"OriginalType\": \"Automatic\"\n      },\n      {\n        \"Name\": \"perceptionsimulation\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"pla\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"seclogon\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"shpamsvc\",\n        \"StartupType\": \"Disabled\",\n        \"OriginalType\": \"Disabled\"\n      },\n      {\n        \"Name\": \"smphost\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"ssh-agent\",\n        \"StartupType\": \"Disabled\",\n        \"OriginalType\": \"Disabled\"\n      },\n      {\n        \"Name\": \"svsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"swprv\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"tzautoupdate\",\n        \"StartupType\": \"Disabled\",\n        \"OriginalType\": \"Disabled\"\n      },\n      {\n        \"Name\": \"upnphost\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"vds\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"vmicguestinterface\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"vmicheartbeat\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"vmickvpexchange\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"vmicrdv\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"vmicshutdown\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"vmictimesync\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"vmicvmsession\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"vmicvss\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"wbengine\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"wcncsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"webthreatdefsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"wercplsupport\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"wisvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"wlidsvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"wlpasvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"wmiApSrv\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"workfolderssvc\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      },\n      {\n        \"Name\": \"wuauserv\",\n        \"StartupType\": \"Manual\",\n        \"OriginalType\": \"Manual\"\n      }\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/Telemetry.md",
    "content": "---\ntitle: \"Disable Telemetry\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1320}\n  \"WPFTweaksTelemetry\": {\n    \"Content\": \"Disable Telemetry\",\n    \"Description\": \"Disables Microsoft Telemetry.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\AdvertisingInfo\",\n        \"Name\": \"Enabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Privacy\",\n        \"Name\": \"TailoredExperiencesWithDiagnosticDataEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Speech_OneCore\\\\Settings\\\\OnlineSpeechPrivacy\",\n        \"Name\": \"HasAccepted\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Input\\\\TIPC\",\n        \"Name\": \"Enabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\InputPersonalization\",\n        \"Name\": \"RestrictImplicitInkCollection\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\InputPersonalization\",\n        \"Name\": \"RestrictImplicitTextCollection\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\InputPersonalization\\\\TrainedDataStore\",\n        \"Name\": \"HarvestContacts\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Personalization\\\\Settings\",\n        \"Name\": \"AcceptedPrivacyPolicy\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Policies\\\\DataCollection\",\n        \"Name\": \"AllowTelemetry\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\n        \"Name\": \"Start_TrackProgs\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\System\",\n        \"Name\": \"PublishUserActivities\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Siuf\\\\Rules\",\n        \"Name\": \"NumberOfSIUFInPeriod\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"\n      # Disable Defender Auto Sample Submission\n      Set-MpPreference -SubmitSamplesConsent 2\n\n      # Disable (Connected User Experiences and Telemetry) Service\n      Set-Service -Name diagtrack -StartupType Disabled\n\n      # Disable (Windows Error Reporting Manager) Service\n      Set-Service -Name wermgr -StartupType Disabled\n\n      $Memory = (Get-CimInstance Win32_PhysicalMemory | Measure-Object Capacity -Sum).Sum / 1KB\n      Set-ItemProperty -Path \\\"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\" -Name SvcHostSplitThresholdInKB -Value $Memory\n\n      Remove-ItemProperty -Path \\\"HKCU:\\\\Software\\\\Microsoft\\\\Siuf\\\\Rules\\\" -Name PeriodInNanoSeconds\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      # Enable Defender Auto Sample Submission\n      Set-MpPreference -SubmitSamplesConsent 1\n\n      # Enable (Connected User Experiences and Telemetry) Service\n      Set-Service -Name diagtrack -StartupType Automatic\n\n      # Enable (Windows Error Reporting Manager) Service\n      Set-Service -Name wermgr -StartupType Automatic\n      \"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/WPBT.md",
    "content": "---\ntitle: \"Disable Windows Platform Binary Table (WPBT)\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1914}\n  \"WPFTweaksWPBT\": {\n    \"Content\": \"Disable Windows Platform Binary Table (WPBT)\",\n    \"Description\": \"If enabled, WPBT allows your computer vendor to execute programs at boot time, such as anti-theft software, software drivers, as well as force install software without user consent. Poses potential security risk.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Session Manager\",\n        \"Name\": \"DisableWpbtExecution\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/Widget.md",
    "content": "---\ntitle: \"Remove Widgets\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=61}\n  \"WPFTweaksWidget\": {\n    \"Content\": \"Remove Widgets\",\n    \"Description\": \"Removes the annoying widgets in the bottom left of the Taskbar.\",\n    \"category\": \"Essential Tweaks\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"\n      # Sometimes if you dont stop the Widgets process the removal may fail\n\n      Stop-Process -Name Widgets\n      Get-AppxPackage Microsoft.WidgetsPlatformRuntime -AllUsers | Remove-AppxPackage -AllUsers\n      Get-AppxPackage MicrosoftWindows.Client.WebExperience -AllUsers | Remove-AppxPackage -AllUsers\n\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\n      Write-Host \\\"Removed widgets\\\"\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      Write-Host \\\"Restoring widgets AppxPackages\\\"\n\n      Add-AppxPackage -Register \\\"C:\\\\Program Files\\\\WindowsApps\\\\Microsoft.WidgetsPlatformRuntime*\\\\AppxManifest.xml\\\" -DisableDevelopmentMode\n      Add-AppxPackage -Register \\\"C:\\\\Program Files\\\\WindowsApps\\\\MicrosoftWindows.Client.WebExperience*\\\\AppxManifest.xml\\\" -DisableDevelopmentMode\n\n      Invoke-WinUtilExplorerUpdate -action \\\"restart\\\"\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/Essential-Tweaks/_index.md",
    "content": "---\ntitle: \"Essential Tweaks\"\nweight: 1\ntoc: false\n---\n\n### Essential Tweaks\n\n{{< autolinks section=\"dev/tweaks/essential-tweaks\" >}}\n"
  },
  {
    "path": "docs/content/dev/tweaks/Performance-Plans/AddUltPerf.md",
    "content": "---\ntitle: \"Add and Activate Ultimate Performance Profile\"\ndescription: \"\"\n---\n\n```powershell {filename=\"functions/public/Invoke-WPFUltimatePerformance.ps1\",linenos=inline,linenostart=1}\nFunction Invoke-WPFUltimatePerformance {\n    <#\n\n    .SYNOPSIS\n        Enables or disables the Ultimate Performance power scheme based on its GUID.\n\n    .PARAMETER State\n        Specifies whether to \"Enable\" or \"Disable\" the Ultimate Performance power scheme.\n\n    #>\n    param(\n        [Parameter(Mandatory = $true)]\n        [ValidateSet(\"Enable\", \"Disable\")]\n        [string]$State\n    )\n\n    try {\n        # GUID of the Ultimate Performance power plan\n        $ultimateGUID = \"e9a42b02-d5df-448d-aa00-03f14749eb61\"\n\n        switch ($State) {\n            \"Enable\" {\n                # Duplicate the Ultimate Performance power plan using its GUID\n                $duplicateOutput = powercfg /duplicatescheme $ultimateGUID\n\n                $guid = $null\n                $nameFromFile = \"ChrisTitus - Ultimate Power Plan\"\n                $description = \"Ultimate Power Plan, added via WinUtils\"\n\n                # Extract the new GUID from the duplicateOutput\n                foreach ($line in $duplicateOutput) {\n                    if ($line -match \"\\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\\b\") {\n                        $guid = $matches[0]  # $matches[0] will contain the first match, which is the GUID\n                        Write-Output \"GUID: $guid has been extracted and stored in the variable.\"\n                        break\n                    }\n                }\n\n                if (-not $guid) {\n                    Write-Output \"No GUID found in the duplicateOutput. Check the output format.\"\n                    exit 1\n                }\n\n                # Change the name of the power plan and set its description\n                $changeNameOutput = powercfg /changename $guid \"$nameFromFile\" \"$description\"\n                Write-Output \"The power plan name and description have been changed. Output:\"\n                Write-Output $changeNameOutput\n\n                # Set the duplicated Ultimate Performance plan as active\n                $setActiveOutput = powercfg /setactive $guid\n                Write-Output \"The power plan has been set as active. Output:\"\n                Write-Output $setActiveOutput\n\n                Write-Host \"> Ultimate Performance plan installed and set as active.\"\n            }\n            \"Disable\" {\n                # Check if the Ultimate Performance plan is installed by GUID\n                $installedPlan = powercfg -list | Select-String -Pattern \"ChrisTitus - Ultimate Power Plan\"\n\n                if ($installedPlan) {\n                    # Extract the GUID of the installed Ultimate Performance plan\n                    $ultimatePlanGUID = $installedPlan.Line.Split()[3]\n\n                    # Set a different power plan as active before deleting the Ultimate Performance plan\n                    $balancedPlanGUID = \"381b4222-f694-41f0-9685-ff5bb260df2e\"\n                    powercfg -setactive $balancedPlanGUID\n\n                    # Delete the Ultimate Performance plan by GUID\n                    powercfg -delete $ultimatePlanGUID\n\n                    Write-Host \"Ultimate Performance plan has been uninstalled.\"\n                    Write-Host \"> Balanced plan is now active.\"\n                } else {\n                    Write-Host \"Ultimate Performance plan is not installed.\"\n                }\n            }\n            default {\n                Write-Host \"Invalid state. Please use 'Enable' or 'Disable'.\"\n            }\n        }\n    } catch {\n        Write-Error \"Error occurred: $_\"\n    }\n}\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/Performance-Plans/RemoveUltPerf.md",
    "content": "---\ntitle: \"Remove Ultimate Performance Profile\"\ndescription: \"\"\n---\n\n```powershell {filename=\"functions/public/Invoke-WPFUltimatePerformance.ps1\",linenos=inline,linenostart=1}\nFunction Invoke-WPFUltimatePerformance {\n    <#\n\n    .SYNOPSIS\n        Enables or disables the Ultimate Performance power scheme based on its GUID.\n\n    .PARAMETER State\n        Specifies whether to \"Enable\" or \"Disable\" the Ultimate Performance power scheme.\n\n    #>\n    param(\n        [Parameter(Mandatory = $true)]\n        [ValidateSet(\"Enable\", \"Disable\")]\n        [string]$State\n    )\n\n    try {\n        # GUID of the Ultimate Performance power plan\n        $ultimateGUID = \"e9a42b02-d5df-448d-aa00-03f14749eb61\"\n\n        switch ($State) {\n            \"Enable\" {\n                # Duplicate the Ultimate Performance power plan using its GUID\n                $duplicateOutput = powercfg /duplicatescheme $ultimateGUID\n\n                $guid = $null\n                $nameFromFile = \"ChrisTitus - Ultimate Power Plan\"\n                $description = \"Ultimate Power Plan, added via WinUtils\"\n\n                # Extract the new GUID from the duplicateOutput\n                foreach ($line in $duplicateOutput) {\n                    if ($line -match \"\\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\\b\") {\n                        $guid = $matches[0]  # $matches[0] will contain the first match, which is the GUID\n                        Write-Output \"GUID: $guid has been extracted and stored in the variable.\"\n                        break\n                    }\n                }\n\n                if (-not $guid) {\n                    Write-Output \"No GUID found in the duplicateOutput. Check the output format.\"\n                    exit 1\n                }\n\n                # Change the name of the power plan and set its description\n                $changeNameOutput = powercfg /changename $guid \"$nameFromFile\" \"$description\"\n                Write-Output \"The power plan name and description have been changed. Output:\"\n                Write-Output $changeNameOutput\n\n                # Set the duplicated Ultimate Performance plan as active\n                $setActiveOutput = powercfg /setactive $guid\n                Write-Output \"The power plan has been set as active. Output:\"\n                Write-Output $setActiveOutput\n\n                Write-Host \"> Ultimate Performance plan installed and set as active.\"\n            }\n            \"Disable\" {\n                # Check if the Ultimate Performance plan is installed by GUID\n                $installedPlan = powercfg -list | Select-String -Pattern \"ChrisTitus - Ultimate Power Plan\"\n\n                if ($installedPlan) {\n                    # Extract the GUID of the installed Ultimate Performance plan\n                    $ultimatePlanGUID = $installedPlan.Line.Split()[3]\n\n                    # Set a different power plan as active before deleting the Ultimate Performance plan\n                    $balancedPlanGUID = \"381b4222-f694-41f0-9685-ff5bb260df2e\"\n                    powercfg -setactive $balancedPlanGUID\n\n                    # Delete the Ultimate Performance plan by GUID\n                    powercfg -delete $ultimatePlanGUID\n\n                    Write-Host \"Ultimate Performance plan has been uninstalled.\"\n                    Write-Host \"> Balanced plan is now active.\"\n                } else {\n                    Write-Host \"Ultimate Performance plan is not installed.\"\n                }\n            }\n            default {\n                Write-Host \"Invalid state. Please use 'Enable' or 'Disable'.\"\n            }\n        }\n    } catch {\n        Write-Error \"Error occurred: $_\"\n    }\n}\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/Performance-Plans/_index.md",
    "content": "---\ntitle: \"Performance Plans\"\nweight: 4\ntoc: false\n---\n\n### Performance Plans\n\n{{< autolinks section=\"dev/tweaks/performance-plans\" >}}\n"
  },
  {
    "path": "docs/content/dev/tweaks/_index.md",
    "content": "---\ntitle: \"Tweaks\"\nweight: 2\ntoc: false\n---\n\n### Essential Tweaks\n\n{{< autolinks section=\"dev/tweaks/essential-tweaks\" >}}\n\n### Advanced Tweaks (CAUTION)\n\n{{< autolinks section=\"dev/tweaks/z--advanced-tweaks---caution\" >}}\n\n### Customize Preferences\n\n{{< autolinks section=\"dev/tweaks/customize-preferences\" >}}\n\n### Performance Plans\n\n{{< autolinks section=\"dev/tweaks/performance-plans\" >}}\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/BlockAdobeNet.md",
    "content": "---\ntitle: \"Adobe Network Block\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1995}\n  \"WPFTweaksBlockAdobeNet\": {\n    \"Content\": \"Adobe Network Block\",\n    \"Description\": \"Reduces user interruptions by selectively blocking connections to Adobe's activation and telemetry servers. Credit: Ruddernation-Designs\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"\n      $hostsUrl = \\\"https://github.com/Ruddernation-Designs/Adobe-URL-Block-List/raw/refs/heads/master/hosts\\\"\n      $hosts = \\\"$Env:SystemRoot\\\\System32\\\\drivers\\\\etc\\\\hosts\\\"\n\n      Move-Item $hosts \\\"$hosts.bak\\\"\n      Invoke-WebRequest $hostsUrl -OutFile $hosts\n      ipconfig /flushdns\n\n      Write-Host \\\"Added Adobe url block list from host file\\\"\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      $hosts = \\\"$Env:SystemRoot\\\\System32\\\\drivers\\\\etc\\\\hosts\\\"\n\n      Remove-Item $hosts\n      Move-Item \\\"$hosts.bak\\\" $hosts\n      ipconfig /flushdns\n\n      Write-Host \\\"Removed Adobe url block list from host file\\\"\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/BraveDebloat.md",
    "content": "---\ntitle: \"Brave Debloat\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1139}\n  \"WPFTweaksBraveDebloat\": {\n    \"Content\": \"Brave Debloat\",\n    \"Description\": \"Disables various annoyances like Brave Rewards, Leo AI, Crypto Wallet and VPN.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\BraveSoftware\\\\Brave\",\n        \"Name\": \"BraveRewardsDisabled\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\BraveSoftware\\\\Brave\",\n        \"Name\": \"BraveWalletDisabled\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\BraveSoftware\\\\Brave\",\n        \"Name\": \"BraveVPNDisabled\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\BraveSoftware\\\\Brave\",\n        \"Name\": \"BraveAIChatEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\BraveSoftware\\\\Brave\",\n        \"Name\": \"BraveStatsPingEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/DeBloat.md",
    "content": "---\ntitle: \"Remove ALL MS Store Apps - NOT RECOMMENDED\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1669}\n  \"WPFTweaksDeBloat\": {\n    \"Content\": \"Remove ALL MS Store Apps - NOT RECOMMENDED\",\n    \"Description\": \"USE WITH CAUTION!!! This will remove ALL Microsoft Store apps.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"appx\": [\n      \"Microsoft.Microsoft3DViewer\",\n      \"Microsoft.AppConnector\",\n      \"Microsoft.BingFinance\",\n      \"Microsoft.BingNews\",\n      \"Microsoft.BingSports\",\n      \"Microsoft.BingTranslator\",\n      \"Microsoft.BingWeather\",\n      \"Microsoft.BingFoodAndDrink\",\n      \"Microsoft.BingHealthAndFitness\",\n      \"Microsoft.BingTravel\",\n      \"Clipchamp.Clipchamp\",\n      \"Microsoft.Todos\",\n      \"MicrosoftCorporationII.QuickAssist\",\n      \"Microsoft.MicrosoftStickyNotes\",\n      \"Microsoft.GetHelp\",\n      \"Microsoft.GetStarted\",\n      \"Microsoft.Messaging\",\n      \"Microsoft.MicrosoftSolitaireCollection\",\n      \"Microsoft.NetworkSpeedTest\",\n      \"Microsoft.News\",\n      \"Microsoft.Office.Lens\",\n      \"Microsoft.Office.Sway\",\n      \"Microsoft.Office.OneNote\",\n      \"Microsoft.OneConnect\",\n      \"Microsoft.People\",\n      \"Microsoft.Print3D\",\n      \"Microsoft.SkypeApp\",\n      \"Microsoft.Wallet\",\n      \"Microsoft.Whiteboard\",\n      \"Microsoft.WindowsAlarms\",\n      \"Microsoft.WindowsCommunicationsApps\",\n      \"Microsoft.WindowsFeedbackHub\",\n      \"Microsoft.WindowsMaps\",\n      \"Microsoft.WindowsSoundRecorder\",\n      \"Microsoft.ConnectivityStore\",\n      \"Microsoft.ScreenSketch\",\n      \"Microsoft.MixedReality.Portal\",\n      \"Microsoft.ZuneMusic\",\n      \"Microsoft.ZuneVideo\",\n      \"Microsoft.MicrosoftOfficeHub\",\n      \"MsTeams\",\n      \"*EclipseManager*\",\n      \"*ActiproSoftwareLLC*\",\n      \"*AdobeSystemsIncorporated.AdobePhotoshopExpress*\",\n      \"*Duolingo-LearnLanguagesforFree*\",\n      \"*PandoraMediaInc*\",\n      \"*CandyCrush*\",\n      \"*BubbleWitch3Saga*\",\n      \"*Wunderlist*\",\n      \"*Flipboard*\",\n      \"*Twitter*\",\n      \"*Facebook*\",\n      \"*Royal Revolt*\",\n      \"*Sway*\",\n      \"*Speed Test*\",\n      \"*Dolby*\",\n      \"*Viber*\",\n      \"*ACGMediaPlayer*\",\n      \"*Netflix*\",\n      \"*OneCalendar*\",\n      \"*LinkedInForWindows*\",\n      \"*HiddenCityMysteryofShadows*\",\n      \"*Hulu*\",\n      \"*HiddenCity*\",\n      \"*AdobePhotoshopExpress*\",\n      \"*HotspotShieldFreeVPN*\",\n      \"*Microsoft.Advertising.Xaml*\"\n    ],\n    \"InvokeScript\": [\n      \"\n      $TeamsPath = \\\"$Env:LocalAppData\\\\Microsoft\\\\Teams\\\\Update.exe\\\"\n\n      if (Test-Path $TeamsPath) {\n        Write-Host \\\"Uninstalling Teams\\\"\n        Start-Process $TeamsPath -ArgumentList -uninstall -wait\n\n        Write-Host \\\"Deleting Teams directory\\\"\n        Remove-Item $TeamsPath -Recurse -Force\n      }\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableBGapps.md",
    "content": "---\ntitle: \"Disable Background Apps\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2133}\n  \"WPFTweaksDisableBGapps\": {\n    \"Content\": \"Disable Background Apps\",\n    \"Description\": \"Disables all Microsoft Store apps from running in the background, which has to be done individually since Windows 11.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\BackgroundAccessApplications\",\n        \"Name\": \"GlobalUserDisabled\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableFSO.md",
    "content": "---\ntitle: \"Disable Fullscreen Optimizations\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2149}\n  \"WPFTweaksDisableFSO\": {\n    \"Content\": \"Disable Fullscreen Optimizations\",\n    \"Description\": \"Disables FSO in all applications. NOTE: This will disable Color Management in Exclusive Fullscreen.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\System\\\\GameConfigStore\",\n        \"Name\": \"GameDVR_DXGIHonorFSEWindowsCompatible\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableIPv6.md",
    "content": "---\ntitle: \"Disable IPv6\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2111}\n  \"WPFTweaksDisableIPv6\": {\n    \"Content\": \"Disable IPv6\",\n    \"Description\": \"Disables IPv6.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip6\\\\Parameters\",\n        \"Name\": \"DisabledComponents\",\n        \"Value\": \"255\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"Disable-NetAdapterBinding -Name * -ComponentID ms_tcpip6\"\n    ],\n    \"UndoScript\": [\n      \"Enable-NetAdapterBinding -Name * -ComponentID ms_tcpip6\"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/DisableNotifications.md",
    "content": "---\ntitle: \"Disable Notification Tray/Calendar\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1972}\n  \"WPFTweaksDisableNotifications\": {\n    \"Content\": \"Disable Notification Tray/Calendar\",\n    \"Description\": \"Disables all Notifications INCLUDING Calendar.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Policies\\\\Microsoft\\\\Windows\\\\Explorer\",\n        \"Name\": \"DisableNotificationCenter\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\PushNotifications\",\n        \"Name\": \"ToastEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/Display.md",
    "content": "---\ntitle: \"Set Display for Performance\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1547}\n  \"WPFTweaksDisplay\": {\n    \"Content\": \"Set Display for Performance\",\n    \"Description\": \"Sets the system preferences to performance. You can do this manually with sysdm.cpl as well.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Desktop\",\n        \"Name\": \"DragFullWindows\",\n        \"Value\": \"0\",\n        \"Type\": \"String\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Desktop\",\n        \"Name\": \"MenuShowDelay\",\n        \"Value\": \"200\",\n        \"Type\": \"String\",\n        \"OriginalValue\": \"400\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Desktop\\\\WindowMetrics\",\n        \"Name\": \"MinAnimate\",\n        \"Value\": \"0\",\n        \"Type\": \"String\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Control Panel\\\\Keyboard\",\n        \"Name\": \"KeyboardDelay\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\n        \"Name\": \"ListviewAlphaSelect\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\n        \"Name\": \"ListviewShadow\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\n        \"Name\": \"TaskbarAnimations\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\VisualEffects\",\n        \"Name\": \"VisualFXSetting\",\n        \"Value\": \"3\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\DWM\",\n        \"Name\": \"EnableAeroPeek\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\n        \"Name\": \"TaskbarMn\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\n        \"Name\": \"ShowTaskViewButton\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Search\",\n        \"Name\": \"SearchboxTaskbarMode\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"Set-ItemProperty -Path \\\"HKCU:\\\\Control Panel\\\\Desktop\\\" -Name \\\"UserPreferencesMask\\\" -Type Binary -Value ([byte[]](144,18,3,128,16,0,0,0))\"\n    ],\n    \"UndoScript\": [\n      \"Remove-ItemProperty -Path \\\"HKCU:\\\\Control Panel\\\\Desktop\\\" -Name \\\"UserPreferencesMask\\\"\"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/EdgeDebloat.md",
    "content": "---\ntitle: \"Edge Debloat\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1183}\n  \"WPFTweaksEdgeDebloat\": {\n    \"Content\": \"Edge Debloat\",\n    \"Description\": \"Disables various telemetry options, popups, and other annoyances in Edge.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\EdgeUpdate\",\n        \"Name\": \"CreateDesktopShortcutDefault\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"PersonalizationReportingEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\\\\ExtensionInstallBlocklist\",\n        \"Name\": \"1\",\n        \"Value\": \"ofefcgjbeghpigppfmkologfjadafddi\",\n        \"Type\": \"String\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"ShowRecommendationsEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"HideFirstRunExperience\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"UserFeedbackAllowed\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"ConfigureDoNotTrack\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"AlternateErrorPagesEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"EdgeCollectionsEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"EdgeShoppingAssistantEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"MicrosoftEdgeInsiderPromotionEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"ShowMicrosoftRewards\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"WebWidgetAllowed\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"DiagnosticData\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"EdgeAssetDeliveryServiceEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Edge\",\n        \"Name\": \"WalletDonationEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/IPv46.md",
    "content": "---\ntitle: \"Prefer IPv4 over IPv6\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2073}\n  \"WPFTweaksIPv46\": {\n    \"Content\": \"Prefer IPv4 over IPv6\",\n    \"Description\": \"Setting the IPv4 preference can have latency and security benefits on private networks where IPv6 is not configured.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip6\\\\Parameters\",\n        \"Name\": \"DisabledComponents\",\n        \"Value\": \"32\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/OOSUbutton.md",
    "content": "---\ntitle: \"Run OO Shutup 10\"\ndescription: \"\"\n---\n\n```powershell {filename=\"functions/public/Invoke-WPFOOSU.ps1\",linenos=inline,linenostart=1}\nfunction Invoke-WPFOOSU {\n    <#\n    .SYNOPSIS\n        Downloads and runs OO Shutup 10\n    #>\n    try {\n        $OOSU_filepath = \"$ENV:temp\\OOSU10.exe\"\n        $Initial_ProgressPreference = $ProgressPreference\n        $ProgressPreference = \"SilentlyContinue\" # Disables the Progress Bar to drasticly speed up Invoke-WebRequest\n        Invoke-WebRequest -Uri \"https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe\" -OutFile $OOSU_filepath\n        Write-Host \"Starting OO Shutup 10 ...\"\n        Start-Process $OOSU_filepath\n    } catch {\n        Write-Host \"Error Downloading and Running OO Shutup 10\" -ForegroundColor Red\n    }\n    finally {\n        $ProgressPreference = $Initial_ProgressPreference\n    }\n}\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/RazerBlock.md",
    "content": "---\ntitle: \"Block Razer Software Installs\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1930}\n  \"WPFTweaksRazerBlock\": {\n    \"Content\": \"Block Razer Software Installs\",\n    \"Description\": \"Blocks ALL Razer Software installations. The hardware works fine without any software.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\DriverSearching\",\n        \"Name\": \"SearchOrderConfig\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Device Installer\",\n        \"Name\": \"DisableCoInstallers\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"\n      $RazerPath = \\\"C:\\\\Windows\\\\Installer\\\\Razer\\\"\n\n      if (Test-Path $RazerPath) {\n        Remove-Item $RazerPath\\\\* -Recurse -Force\n      }\n      else {\n        New-Item -Path $RazerPath -ItemType Directory\n      }\n\n      icacls $RazerPath /deny \\\"Everyone:(W)\\\"\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      icacls \\\"C:\\\\Windows\\\\Installer\\\\Razer\\\" /remove:d Everyone\n      \"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveCopilot.md",
    "content": "---\ntitle: \"Disable Microsoft Copilot\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1830}\n  \"WPFTweaksRemoveCopilot\": {\n    \"Content\": \"Disable Microsoft Copilot\",\n    \"Description\": \"Disables MS Copilot AI built into Windows since 23H2.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Windows\\\\WindowsCopilot\",\n        \"Name\": \"TurnOffWindowsCopilot\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Policies\\\\Microsoft\\\\Windows\\\\WindowsCopilot\",\n        \"Name\": \"TurnOffWindowsCopilot\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\",\n        \"Name\": \"ShowCopilotButton\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\Shell\\\\Copilot\",\n        \"Name\": \"IsCopilotAvailable\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\Shell\\\\Copilot\",\n        \"Name\": \"CopilotDisabledReason\",\n        \"Value\": \"IsEnabledForGeographicRegionFailed\",\n        \"Type\": \"String\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKCU:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\WindowsCopilot\",\n        \"Name\": \"AllowCopilotRuntime\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Shell Extensions\\\\Blocked\",\n        \"Name\": \"{CB3B0003-8088-4EDE-8769-8B354AB2FF8C}\",\n        \"Value\": \"\",\n        \"Type\": \"String\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      },\n      {\n        \"Path\": \"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\Shell\\\\Copilot\\\\BingChat\",\n        \"Name\": \"IsUserEligible\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"<RemoveEntry>\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"\n      Write-Host \\\"Remove Copilot\\\"\n      Get-AppxPackage -AllUsers *Copilot* | Remove-AppxPackage -AllUsers\n      Get-AppxPackage -AllUsers Microsoft.MicrosoftOfficeHub | Remove-AppxPackage -AllUsers\n\n      $Appx = (Get-AppxPackage MicrosoftWindows.Client.CoreAI).PackageFullName\n\n      $Sid = (Get-LocalUser $Env:UserName).Sid.Value\n      New-Item \\\"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Appx\\\\AppxAllUserStore\\\\EndOfLife\\\\$Sid\\\\$Appx\\\" -Force\n      Remove-AppxPackage $Appx\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      Write-Host \\\"Install Copilot\\\"\n      winget install --name Copilot --source msstore --accept-package-agreements --accept-source-agreements --silent\n      \"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveEdge.md",
    "content": "---\ntitle: \"Remove Microsoft Edge\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1442}\n  \"WPFTweaksRemoveEdge\": {\n    \"Content\": \"Remove Microsoft Edge\",\n    \"Description\": \"Unblocks Microsoft Edge uninstaller restrictions then uses that uninstaller to remove Microsoft Edge.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"Invoke-WinUtilRemoveEdge\"\n    ],\n    \"UndoScript\": [\n      \"\n      Write-Host 'Installing Microsoft Edge...'\n      winget install Microsoft.Edge --source winget\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveGallery.md",
    "content": "---\ntitle: \"Remove Gallery from explorer\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1530}\n  \"WPFTweaksRemoveGallery\": {\n    \"Content\": \"Remove Gallery from explorer\",\n    \"Description\": \"Removes the Gallery from Explorer and sets This PC as default.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"\n      Remove-Item \\\"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Desktop\\\\NameSpace\\\\{e88865ea-0e1c-4e20-9aa6-edcd0212c87c}\\\"\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      New-Item \\\"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Desktop\\\\NameSpace\\\\{e88865ea-0e1c-4e20-9aa6-edcd0212c87c}\\\"\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveHome.md",
    "content": "---\ntitle: \"Remove Home from Explorer\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1511}\n  \"WPFTweaksRemoveHome\": {\n    \"Content\": \"Remove Home from Explorer\",\n    \"Description\": \"Removes the Home from Explorer and sets This PC as default.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"\n      Remove-Item \\\"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Desktop\\\\NameSpace\\\\{f874310e-b6b7-47dc-bc84-b9e6b38f5903}\\\"\n      Set-ItemProperty -Path \\\"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\\\" -Name LaunchTo -Value 1\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      New-Item \\\"HKLM:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Desktop\\\\NameSpace\\\\{f874310e-b6b7-47dc-bc84-b9e6b38f5903}\\\"\n      Set-ItemProperty -Path \\\"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Advanced\\\" -Name LaunchTo -Value 0\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/RemoveOneDrive.md",
    "content": "---\ntitle: \"Remove OneDrive\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1474}\n  \"WPFTweaksRemoveOneDrive\": {\n    \"Content\": \"Remove OneDrive\",\n    \"Description\": \"Denies permission to remove OneDrive user files, then uses its own uninstaller to remove it and restores the original permission afterward.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"\n      # Deny permission to remove OneDrive folder\n      icacls $Env:OneDrive /deny \\\"Administrators:(D,DC)\\\"\n\n      Write-Host \\\"Uninstalling OneDrive...\\\"\n      Start-Process 'C:\\\\Windows\\\\System32\\\\OneDriveSetup.exe' -ArgumentList '/uninstall' -Wait\n\n      # Some of OneDrive files use explorer, and OneDrive uses FileCoAuth\n      Write-Host \\\"Removing leftover OneDrive Files...\\\"\n      Stop-Process -Name FileCoAuth,Explorer\n      Remove-Item \\\"$Env:LocalAppData\\\\Microsoft\\\\OneDrive\\\" -Recurse -Force\n      Remove-Item \\\"C:\\\\ProgramData\\\\Microsoft OneDrive\\\" -Recurse -Force\n\n      # Grant back permission to accses OneDrive folder\n      icacls $Env:OneDrive /grant \\\"Administrators:(D,DC)\\\"\n\n      # Disable OneSyncSvc\n      Set-Service -Name OneSyncSvc -StartupType Disabled\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      Write-Host \\\"Installing OneDrive\\\"\n      winget install Microsoft.Onedrive --source winget\n\n      # Enabled OneSyncSvc\n      Set-Service -Name OneSyncSvc -StartupType Automatic\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/RightClickMenu.md",
    "content": "---\ntitle: \"Set Classic Right-Click Menu\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2025}\n  \"WPFTweaksRightClickMenu\": {\n    \"Content\": \"Set Classic Right-Click Menu\",\n    \"Description\": \"Restores the classic context menu when right-clicking in File Explorer, replacing the simplified Windows 11 version.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"InvokeScript\": [\n      \"\n      New-Item -Path \\\"HKCU:\\\\Software\\\\Classes\\\\CLSID\\\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\\" -Name \\\"InprocServer32\\\" -force -value \\\"\\\"\n      Write-Host Restarting explorer.exe ...\n      Stop-Process -Name \\\"explorer\\\" -Force\n      \"\n    ],\n    \"UndoScript\": [\n      \"\n      Remove-Item -Path \\\"HKCU:\\\\Software\\\\Classes\\\\CLSID\\\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\\" -Recurse -Confirm:$false -Force\n      # Restarting Explorer in the Undo Script might not be necessary, as the Registry change without restarting Explorer does work, but just to make sure.\n      Write-Host Restarting explorer.exe ...\n      Stop-Process -Name \\\"explorer\\\" -Force\n      \"\n    ],\n```\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/Storage.md",
    "content": "---\ntitle: \"Disable Storage Sense\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1814}\n  \"WPFTweaksStorage\": {\n    \"Content\": \"Disable Storage Sense\",\n    \"Description\": \"Storage Sense deletes temp files automatically.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKCU:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\StorageSense\\\\Parameters\\\\StoragePolicy\",\n        \"Name\": \"01\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/Teredo.md",
    "content": "---\ntitle: \"Disable Teredo\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2089}\n  \"WPFTweaksTeredo\": {\n    \"Content\": \"Disable Teredo\",\n    \"Description\": \"Teredo network tunneling is a IPv6 feature that can cause additional latency, but may cause problems with some games.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip6\\\\Parameters\",\n        \"Name\": \"DisabledComponents\",\n        \"Value\": \"1\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"0\"\n      }\n    ],\n    \"InvokeScript\": [\n      \"netsh interface teredo set state disabled\"\n    ],\n    \"UndoScript\": [\n      \"netsh interface teredo set state default\"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/UTC.md",
    "content": "---\ntitle: \"Set Time to UTC (Dual Boot)\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1458}\n  \"WPFTweaksUTC\": {\n    \"Content\": \"Set Time to UTC (Dual Boot)\",\n    \"Description\": \"Essential for computers that are dual booting. Fixes the time sync with Linux Systems.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"HKLM:\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\TimeZoneInformation\",\n        \"Name\": \"RealTimeIsUniversal\",\n        \"Value\": \"1\",\n        \"Type\": \"QWord\",\n        \"OriginalValue\": \"0\"\n      }\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/XboxRemoval.md",
    "content": "---\ntitle: \"Remove Xbox & Gaming Components\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=1646}\n  \"WPFTweaksXboxRemoval\": {\n    \"Content\": \"Remove Xbox & Gaming Components\",\n    \"Description\": \"Removes Xbox services, the Xbox app, Game Bar, and related authentication components.\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"registry\": [\n      {\n        \"Path\": \"KCU:\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\GameDVR\",\n        \"Name\": \"AppCaptureEnabled\",\n        \"Value\": \"0\",\n        \"Type\": \"DWord\",\n        \"OriginalValue\": \"1\"\n      }\n    ],\n    \"appx\": [\n      \"Microsoft.XboxIdentityProvider\",\n      \"Microsoft.XboxSpeechToTextOverlay\",\n      \"Microsoft.GamingApp\",\n      \"Microsoft.Xbox.TCUI\",\n      \"Microsoft.XboxGamingOverlay\"\n    ],\n```\n\n## Registry Changes\n\nApplications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.\n\nYou can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/_index.md",
    "content": "---\ntitle: \"Advanced Tweaks (CAUTION)\"\nweight: 2\ntoc: false\n---\n\n### Advanced Tweaks (CAUTION)\n\n{{< autolinks section=\"dev/tweaks/z--advanced-tweaks---caution\" >}}\n"
  },
  {
    "path": "docs/content/dev/tweaks/z--Advanced-Tweaks---CAUTION/changedns.md",
    "content": "---\ntitle: \"DNS\"\ndescription: \"\"\n---\n\n```json {filename=\"config/tweaks.json\",linenos=inline,linenostart=2632}\n  \"WPFchangedns\": {\n    \"Content\": \"DNS\",\n    \"category\": \"z__Advanced Tweaks - CAUTION\",\n    \"panel\": \"1\",\n    \"Type\": \"Combobox\",\n    \"ComboItems\": \"Default DHCP Google Cloudflare Cloudflare_Malware Cloudflare_Malware_Adult Open_DNS Quad9 AdGuard_Ads_Trackers AdGuard_Ads_Trackers_Malware_Adult\",\n```\n"
  },
  {
    "path": "docs/content/faq.md",
    "content": "---\ntitle: Frequently Asked Questions\ntoc: true\n---\n\n## General Questions\n\n### Is Windows 10 still supported?\nNo. Windows 10 is no longer supported by Winutil because it reached end of support on **October 14, 2025**.\nWinutil is focused on Windows 11.\n\n### How do I uninstall Winutil?\nYou do not need to uninstall Winutil. Because it runs as a PowerShell script, it is loaded into memory only while it is open. Once you close it, it is removed from memory and does not remain installed on your system.\n\n### Is Winutil safe to use?\nYes, Winutil is open source and the code is publicly available on GitHub. Thousands of users run it daily. However, like any system modification tool, you should:\n- Run it as Administrator (required)\n- Create a restore point before major changes\n- Understand what tweaks you're applying\n- Download only from official sources\n\n### Do I need to keep running Winutil?\nNo. Once you've applied tweaks or installed applications, you can close Winutil. Changes persist after closing. You only need to run Winutil again when you want to make additional changes or undo tweaks.\n\n### Does Winutil require internet access?\n- **For downloading**: Yes, installing applications requires internet\n- **For tweaks**: No, most tweaks work offline\n- **Initial run**: Yes, to download the latest script\n\n### How often is Winutil updated?\nWinutil is actively maintained with frequent updates. New features, bug fixes, and application additions are released regularly. The script auto-downloads the latest version each time you run it.\n\n## Installation & Running\n\n### How do I run Winutil?\n1. Open PowerShell as Administrator\n2. Run: `irm \"https://christitus.com/win\" | iex`\n3. Wait for the GUI to appear\n\n### Why do I need Administrator rights?\nWinutil makes system-level changes (registry edits, service modifications, software installation) that require elevated permissions. Without admin rights, most features won't work.\n\n### The script won't download. What do I do?\nTry these solutions in order:\n\n1. **Use the direct GitHub link**:\n   ```powershell\n   irm https://github.com/ChrisTitusTech/Winutil/releases/latest/download/Winutil.ps1 | iex\n   ```\n\n2. **Force TLS 1.2**:\n   ```powershell\n   [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\n   irm \"https://christitus.com/win\" | iex\n   ```\n\n   > [!NOTE]\n   > On Windows 11, you usually do not need the TLS 1.2 command. Use it only if you hit download or security protocol errors.\n\n3. **Change DNS** to Cloudflare (1.1.1.1) or Google (8.8.8.8)\n\n4. **Use a VPN** if GitHub is blocked in your region\n\n### I get an \"Execution Policy\" error. How do I fix it?\nRun this command first to allow script execution:\n```powershell\nSet-ExecutionPolicy Unrestricted -Scope Process -Force\nirm \"https://christitus.com/win\" | iex\n```\n\nThis only affects the current PowerShell session and is safe.\n\n## Tweaks & Modifications\n\n### I applied a tweak and now something doesn't work. What do I do?\nIf you applied a tweak and it breaks something, you can revert it:\n1. Open Winutil again\n2. Go to the **Tweaks** tab\n3. Select the same tweak you applied\n4. Click **Undo Selected Tweaks**\n5. The system will revert to the previous state\n\nAlternatively, use System Restore if you created a restore point.\n\n### Which tweaks are safe to apply?\n**Safe for everyone (Essential Tweaks)**:\n- Disable Telemetry\n- Disable Activity History\n- Disable Location Tracking\n- Delete Temporary Files\n- Run Disk Cleanup\n- Create Restore Point\n\n**Caution needed (Advanced Tweaks)**:\n- Remove Microsoft Store\n- Disable Windows Defender\n- Remove all bloatware\n- Disable system services\n\nStart with Essential Tweaks. Only use Advanced Tweaks if you understand the implications.\n\n### Will tweaks survive Windows Updates?\nMost tweaks persist through updates, but some may be reset by major Windows feature updates. You may need to reapply certain tweaks afterward.\n\n### Can I create my own tweak presets?\nCurrently, Winutil uses predefined presets (Desktop, Laptop, Minimal, Standard). Custom presets aren't directly supported in the GUI, but you can script your preferred configuration.\n\n### What's the difference between Essential and Advanced tweaks?\n- **Essential Tweaks**: Safe for most users, improve performance/privacy with minimal risk\n- **Advanced Tweaks**: More aggressive changes that may break functionality or compatibility. Use with caution.\n\n## Application Installation\n\n### How does Winutil install applications?\nWinutil uses Windows Package Manager (WinGet) and Chocolatey to automate installations. It downloads applications from official sources and installs them silently without bloatware.\n\n### Can I install multiple applications at once?\nYes! Check the boxes for all applications you want, then click \"Install Selected\". They'll install sequentially.\n\n### WinGet isn't working. How do I fix it?\n1. Go to the **Config** tab\n2. Find the **Fixes** section\n3. Click **WinGet Reinstall**\n4. Wait for completion\n5. Try installing applications again\n\n### Do installed applications have bloatware or bundled software?\nNo. WinGet and Chocolatey install clean versions of applications without bundled offers, toolbars, or bloatware.\n\n### Can I uninstall applications through Winutil?\nWinutil focuses on installation. To uninstall:\n- Use Windows Settings > Apps > Installed Apps\n- Or use the application's built-in uninstaller\n\n### Will installed apps auto-update?\nApplications with built-in update mechanisms will auto-update. You can also update them via WinGet/Chocolatey commands or through Winutil's \"Upgrade Selected\" feature.\n\n## Updates & Maintenance\n\n### Should I disable Windows Updates?\nGenerally, **no**. Security updates are important. However, you might:\n- Use \"Security Updates Only\" to avoid feature updates\n- Pause updates temporarily for stability\n- Disable only during critical work periods\n\n### How do I re-enable updates after disabling them?\n1. Open Winutil\n2. Go to the **Updates** tab\n3. Click **Enable Updates**\n4. Updates will resume normally\n\n### What's the difference between \"Security Updates Only\" and \"Disable Updates\"?\n- **Security Updates Only**: Installs critical security patches, blocks feature updates (major versions)\n- **Disable Updates**: Blocks ALL updates including security (not recommended)\n\n## Troubleshooting\n\n### Winutil won't open after running the command\nPossible causes:\n1. **Antivirus blocking**: Add PowerShell exception\n2. **Not run as Admin**: Restart PowerShell as Administrator\n3. **Corrupted download**: Close PowerShell, reopen, try again\n4. **Windows Defender**: Allow the script\n\n### My antivirus flags Winutil as malicious\nThis is a false positive. Winutil makes system changes that antivirus programs may flag. The code is open source and audited. Add an exception if needed.\n\n### An application failed to install\nTroubleshooting steps:\n1. Check your internet connection\n2. Try installing just that one application\n3. Review error messages in the output panel\n4. Check if antivirus is blocking\n5. Try the WinGet Reinstall fix\n\n### Network tweaks broke my internet connection\n1. Open Winutil\n2. Go to **Config** > **Fixes**\n3. Click **Reset Network**\n4. Restart your computer\n5. Connection should be restored\n\n### I can't access certain Windows features after applying tweaks\nUndo the tweaks that might have affected those features:\n1. Reopen Winutil\n2. Select the tweaks you applied\n3. Click **Undo Selected Tweaks**\n\nIf that doesn't work, use System Restore to revert to a previous state.\n\n## Advanced Topics\n\n### Can I run Winutil on Windows Server?\nYes, Winutil works on Windows Server editions, though some features may not be applicable or may behave differently.\n\n### Does Winutil work with Windows LTSC?\nYes, Winutil works with Windows 10/11 LTSC editions. Some applications may not be available depending on your configuration.\n\n### Can I use Winutil in a corporate/enterprise environment?\nYes, but check your organization's policies first. Some tweaks may conflict with Group Policy or other corporate requirements.\n\n### How do I automate Winutil for multiple PCs?\nSee the [Automation Guide](/userguide/automation/) for details on:\n- Configuration files\n- PowerShell parameters\n- Batch deployment\n- Silent installation\n\n### Can I contribute to Winutil?\nYes! Contributions are welcome:\n- Report bugs on GitHub Issues\n- Submit pull requests for fixes/features\n- Improve documentation\n- Help others in Discord\n\nSee the [Contributing Guide](/contributing/) for details.\n\n## Privacy & Security\n\n### Does Winutil collect any data?\nNo, Winutil itself doesn't collect or transmit any user data. It's a local PowerShell script.\n\n### What telemetry does the Disable Telemetry tweak block?\nIt disables:\n- Windows diagnostic data collection\n- Activity history tracking\n- Feedback requests\n- Usage statistics\n- Error reporting (optional)\n\n### Is it safe to disable Windows Defender?\n**Generally not recommended**. Only disable Defender if:\n- You have alternative antivirus installed\n- You understand the security risks\n- You're in a controlled/isolated environment\n\n### Will removing Microsoft Store affect security updates?\nNo, Windows security updates are independent of the Microsoft Store.\n\n## Performance\n\n### Will Winutil make my PC faster?\nTweaks can improve performance by:\n- Reducing background processes\n- Disabling unnecessary services\n- Cleaning temporary files\n- Optimizing startup programs\n\nResults vary depending on your system and which tweaks you apply.\n\n### What's the best preset for gaming?\nUse the **Desktop** preset, then additionally apply:\n- Disable GameDVR\n- Ultimate Performance power plan\n- Disable fullscreen optimizations (Advanced)\n- Set display for performance (Advanced)\n\n### How much RAM does Winutil use?\nWinutil itself uses about 50-100 MB while running. Once closed, it is removed from memory.\n\n## Error Messages\n\n### \"Access Denied\" errors\n- Ensure PowerShell is running as Administrator\n- Check if antivirus is blocking changes\n- Verify you have ownership of files/registry keys\n\n### WinGet configuration prompt won't go away\nType `Y` and press Enter in the PowerShell window. This only happens on first use and configures WinGet for your system.\n\n## Still Need Help?\n\nCan't find your answer? Try these resources:\n\n- **[Known Issues](/knownissues/)** - Check if it's a known problem\n- **[User Guide](/userguide/)** - Comprehensive documentation\n- **[Discord Community](https://discord.gg/RUbZUZyByQ)** - Get help from other users\n- **[GitHub Issues](https://github.com/ChrisTitusTech/winutil/issues)** - Report bugs\n- **[YouTube Tutorial](https://www.youtube.com/watch?v=6UQZ5oQg8XA)** - Video walkthrough\n\n---\n\n**Last Updated**: January 2026\n**Found this helpful?** Consider starring the project on [GitHub](https://github.com/ChrisTitusTech/winutil)!\n"
  },
  {
    "path": "docs/content/userguide/_index.md",
    "content": "---\ntitle: User Guide\nweight: 2\n---\n\nWelcome to the official User Guide for **Winutil**, your all-in-one Windows toolkit.\n\n> [!IMPORTANT]\n> Windows 10 is not supported by Winutil. Windows 10 reached end of support on **October 14, 2025**.\n\n## What is Winutil?\n\nWinutil (Chris Titus Tech's Windows Utility) is a comprehensive PowerShell-based tool that helps you:\n\n- **Install Applications**: Quickly install popular software without manual downloads\n- **Apply Tweaks**: Optimize Windows for performance, privacy, and usability\n- **Fix Issues**: Troubleshoot common Windows problems with one-click fixes\n- **Manage Updates**: Control how and when Windows updates install\n- **Access Tools**: Quick access to Windows panels and utilities\n\n## Who Should Use Winutil?\n\nWinutil is designed for:\n\n- **Home Users**: People who want to optimize their personal PCs\n- **Power Users**: Users who want fine-grained control over Windows\n- **IT Professionals**: Teams managing multiple systems efficiently\n- **Gamers**: Users optimizing systems for gaming performance\n- **Privacy-Conscious Users**: People reducing telemetry and data collection\n- **Developers**: Users setting up clean development environments\n\n## Getting Started\n\nNew to Winutil? Start here:\n\n1. **[Getting Started Guide](getting-started/)** - Installation and first steps\n2. **[Applications Guide](application/)** - Learn to install, upgrade, and uninstall software\n3. **[Tweaks Guide](tweaks/)** - Optimize your system\n4. **[Features & Fixes](features/)** - Troubleshoot common issues\n5. **[Win11 Creator](win11Creator/)** - Build a custom debloated Windows 11 ISO\n\n## Main Features\n\n### 🚀 Application Installation\n\nBrowse and install hundreds of popular applications with a single click. No more hunting for download links or dealing with installer bloat.\n\n**[Read the Applications Guide →](application/)**\n\n### ⚙️ System Tweaks\n\nApply optimizations for performance, privacy, and usability. Choose from preset configurations or customize individual tweaks.\n\n**[Read the Tweaks Guide →](tweaks/)**\n\n### 🛠️ Config & Fixes\n\nQuick fixes for common Windows problems:\n- Reset network settings\n- Fix Windows Update issues\n- Repair system files\n- Access legacy Windows panels\n\n**[Read the Features Guide →](features/)**\n\n### 🔄 Update Management\n\nTake control of Windows Updates with options to:\n- Enable/disable updates\n- Security updates only\n- Pause updates\n- Manage driver updates\n\n**[Read the Updates Guide →](updates/)**\n\n### 🤖 Automation\n\nAutomate Winutil configurations for:\n- Multiple PC setups\n- Enterprise deployments\n- Consistent configurations\n- Scripted installations\n\n**[Read the Automation Guide →](automation/)**\n\n### 💿 Windows 11 Creator\n\nBuild a custom Windows 11 ISO with bloatware removed, telemetry disabled, and hardware requirement checks bypassed. You can then export it as an ISO file or write it directly to a USB drive.\n\n**[Read the Win11 Creator Guide →](win11Creator/)**\n\n## Quick Links\n\n| I want to... | Go to... |\n|--------------|----------|\n| Install Winutil for the first time | [Getting Started](getting-started/) |\n| Install, upgrade, or uninstall apps | [Applications Guide](application/) |\n| Speed up my computer | [Tweaks Guide](tweaks/) |\n| Fix Windows Update problems | [Features - Fixes](features/) |\n| Automate setup for multiple PCs | [Automation](automation/) |\n| Understand what tweaks do | [Tweaks Guide](tweaks/) |\n| Build a custom Windows 11 ISO | [Win11 Creator](win11Creator/) |\n\n## Safety and Best Practices\n\nBefore using Winutil:\n\n✅ **Always**:\n- Run PowerShell as Administrator\n- Create a system restore point before major changes\n- Understand what tweaks do before applying them\n- Start with Essential Tweaks before Advanced ones\n- Keep backups of important data\n\n❌ **Never**:\n- Apply all tweaks without understanding them\n- Skip creating restore points\n- Use on production systems without testing\n- Disable security features unnecessarily\n\n## System Requirements\n\n- **Operating System**: Windows 11\n- **PowerShell**: Version 5.1 or later (included in Windows 11)\n- **Permissions**: Administrator access required\n- **Internet**: Required for downloading apps and updates\n- **.NET Framework**: 4.5+ (usually pre-installed)\n\n## Getting Help\n\nNeed help?\n\n- **📖 Documentation**: You're reading it! Use the navigation menu\n- **❓ FAQ**: Check [Frequently Asked Questions](../faq/)\n- **🐛 Known Issues**: Review [Known Issues](../knownissues/)\n- **💬 Discord**: Join the [community Discord](https://discord.gg/RUbZUZyByQ)\n- **🐙 GitHub**: Report bugs on [GitHub Issues](https://github.com/ChrisTitusTech/winutil/issues)\n- **📺 YouTube**: Watch [video tutorials](https://www.youtube.com/watch?v=6UQZ5oQg8XA)\n\n## Contributing\n\nWant to help improve Winutil?\n\n- **Report Bugs**: Submit issues on GitHub\n- **Suggest Features**: Open feature requests\n- **Contribute Code**: Submit pull requests\n- **Improve Docs**: Help expand this documentation\n- **Share Knowledge**: Help others in Discord\n\n**[Read Contributing Guide →](../contributing/)**\n\n## What's in This Guide?\n\nThis User Guide covers everything you need to know:\n\n1. **[Getting Started](getting-started/)** - Installation, first run, basic usage\n2. **[Applications](application/)** - Installing, upgrading, and uninstalling software\n3. **[Tweaks](tweaks/)** - System optimizations and customizations\n4. **[Features & Fixes](features/)** - Troubleshooting tools and utilities\n5. **[Win11 Creator](win11Creator/)** - Build a custom debloated Windows 11 ISO\n6. **[Updates](updates/)** - Managing Windows Update behavior\n7. **[Automation](automation/)** - Scripting and batch deployments\n\n## Video Tutorial\n\nWatch the complete Winutil overview:\n\n{{< youtube id=6UQZ5oQg8XA loading=lazy >}}\n\nReady to get started? Head to the **[Getting Started Guide](getting-started/)**.\n"
  },
  {
    "path": "docs/content/userguide/application/_index.md",
    "content": "---\ntitle: Applications\nweight: 3\n---\n\n{{< tabs >}}\n\n  {{< tab name=\"Installation & Updates\" selected=true >}}\n    * Choose the applications you want to install or upgrade.\n        * For programs not currently installed, this action will install them.\n        * For programs already installed, this action will update them to the latest version.\n    * Click the `Install/Upgrade Selected` button to start the installation or upgrade process.\n  {{< /tab >}}\n\n  {{< tab name=\"Upgrade All\" >}}\n    * Simply press the `Upgrade All` button.\n    * This will upgrade all applicable programs that are installed without the need for individual selection.\n  {{< /tab >}}\n\n  {{< tab name=\"Uninstall\" >}}\n    * Select the programs you wish to uninstall.\n    * Click the `Uninstall Selected` button to remove the selected programs.\n  {{< /tab >}}\n\n  {{< tab name=\"Get Installed\" >}}\n    * Click the `Show Installed Apps` button.\n    * This scans for and selects installed applications supported by WinGet.\n  {{< /tab >}}\n\n  {{< tab name=\"Clear Selection\" >}}\n    * Click the `Clear Selection` button.\n    * This will unselect all checked programs.\n  {{< /tab >}}\n{{< /tabs >}}\n\n{{< image src=\"images/Install-Tab\" alt=\"Install Image\" >}}\n\n> [!TIP]\n> If you have trouble finding an application, press `Ctrl + F` and search for its name. The list filters as you type.\n"
  },
  {
    "path": "docs/content/userguide/automation/_index.md",
    "content": "---\ntitle: Automation\nweight: 7\n---\n\nUse Automation to run Winutil from an exported configuration file.\n\nTo create a config file:\n\n1. Open Winutil.\n2. Click the gear icon in the top-right corner.\n3. Choose **Export**.\n4. Save the exported JSON file.\n\nOnce you have exported a config, launch Winutil with it using this command:\n```powershell\n& ([ScriptBlock]::Create((irm \"https://christitus.com/win\"))) -Config \"C:\\Path\\To\\Config.json\" -Run\n```\n\nThis is useful for:\n\n- Applying the same Winutil configuration across multiple Windows 11 PCs\n- Reusing a known-good baseline after reinstalling Windows\n- Standardizing deployments for labs, workstations, or personal setups\n\n> [!NOTE]\n> Run the command in an elevated PowerShell session so Winutil can apply system-level changes.\n"
  },
  {
    "path": "docs/content/userguide/features/_index.md",
    "content": "---\ntitle: Features\nweight: 5\n---\n\nUse the **Features** and **Fixes** sections to install optional Windows components and run common repair tasks.\n\n## Windows Features\n\nInstall common **Windows features** by selecting the feature checkboxes and clicking **Install Features**.\n\n* All .NET Frameworks (2, 3, 4)\n* Hyper-V Virtualization\n* Legacy Media (WMP, DirectPlay)\n* NFS - Network File System\n* Enable Daily Registry Backup Task 12:30am\n* Enable Legacy F8 Boot Recovery\n* Disable Legacy F8 Boot Recovery\n* Windows Subsystem for Linux\n* Windows Sandbox\n\n## Fixes\n\nUse these one-click fixes for common system problems.\n\n* Set Up Autologin\n* Reset Windows Update\n* Reset Network\n* System Corruption Scan\n* WinGet Reinstall\n* Remove Adobe Creative Cloud\n\n## Legacy Windows Panels\n\nOpen old-school Windows panels directly from Winutil. Available panels include:\n\n* Control Panel\n* Network Connections\n* Power Panel\n* Region\n* Sound Settings\n* System Properties\n* User Accounts\n\n## Remote Access\n\nEnable an OpenSSH server on your Windows machine for remote access.\n"
  },
  {
    "path": "docs/content/userguide/getting-started/_index.md",
    "content": "---\ntitle: Getting Started\nweight: 2\n---\n\n## Welcome to Winutil!\n\nWinutil is a powerful Windows utility that helps you optimize, customize, and maintain your system. This guide walks you through everything you need to get started.\n\n## System Requirements\n\nBefore running Winutil, ensure your system meets these requirements:\n\n> [!IMPORTANT]\n> Windows 10 is not supported by Winutil. Windows 10 reached end of support on **October 14, 2025**.\n\n- **Operating System**: Windows 11\n- **PowerShell**: Version 5.1 or later (included by default in Windows 11)\n- **Administrator Access**: Required for system-level changes\n- **Internet Connection**: Required for downloading applications and updates\n- **.NET Framework**: Version 4.5 or later (usually pre-installed)\n\n## Installation\n\nWinutil doesn't require traditional installation. It runs directly from PowerShell as a script.\n\n### Step 1: Open PowerShell as Administrator\n\nThere are several ways to open PowerShell with admin rights:\n\n**Method 1: Start Menu (Recommended)**\n\n1. Right-click the Windows Start button\n2. Select \"Terminal (Admin)\"\n\n**Method 2: Search Method**\n\n1. Press the `Windows` key\n2. Type \"PowerShell\" or \"Terminal\"\n3. Press `Ctrl + Shift + Enter` to launch as administrator\n4. Or right-click and select \"Run as administrator\"\n\n**Method 3: Run Dialog**\n\n1. Press `Windows + R`\n2. Type `powershell`\n3. Press `Ctrl + Shift + Enter`\n\n### Step 2: Run the Launch Command\n\nOnce PowerShell is open with administrator privileges, run one of these commands:\n\n**Stable Release (Recommended for most users)**\n\n```powershell\nirm \"https://christitus.com/win\" | iex\n```\n\n**Development Branch (For testing latest features)**\n\n```powershell\nirm \"https://christitus.com/windev\" | iex\n```\n\n> [!NOTE]\n> The `irm` command downloads the script, and `iex` executes it. This is safe when downloading from the official source.\n\n### Step 3: Wait for Winutil to Load\n\nThe first time you run Winutil, it may take a few moments to:\n\n- Download the latest version\n- Initialize the interface\n- Load all features and settings\n\n## First Time Setup\n\n### Configure WinGet (If Prompted)\n\nOn your first run, you may be prompted to configure WinGet (Windows Package Manager). This is normal.\n\n1. When prompted, type `Y` and press Enter\n2. Accept the terms and conditions\n3. This only needs to be done once\n\n### Understanding the Interface\n\nWinutil opens with a clean, tabbed interface:\n\n**Main Tabs**:\n\n- **Install**: Browse and install applications\n- **Tweaks**: Apply system optimizations and customizations\n- **Config**: Access system tools and utilities\n- **Updates**: Manage Windows updates\n\n## Your First Actions\n\nHere are some recommended first steps for new users:\n\n### 1. Create a Restore Point\n\nBefore making any changes, create a system restore point:\n\n1. Go to the **Tweaks** tab\n2. Find \"Create Restore Point\" under Essential Tweaks\n3. Check the box and click **Run Tweaks**\n\nThis gives you a rollback point if needed.\n\n### 2. Install Essential Applications\n\n1. Navigate to the **Install** tab\n2. Browse categories or use the search bar\n3. Check applications you want to install\n4. Click \"Install/Upgrade Selected\" at the bottom\n\n### 3. Apply Basic Tweaks\n\nFor a better Windows experience with minimal risk:\n\n1. Go to the **Tweaks** tab\n2. Select the **\"Desktop\" preset** for a balanced configuration\n3. Review the selected tweaks\n4. Click **Run Tweaks**\n\n## Common Tasks\n\n### Installing Applications\n\n**Single Application**:\n\n1. Open the **Install** tab\n2. Search for the application name\n3. Check the box next to it\n4. Click \"Install/Upgrade Selected\"\n\n**Multiple Applications**:\n\n1. Check multiple application boxes\n2. All checked apps will install in sequence\n3. Progress is shown in the bottom panel\n\n### Applying Tweaks\n\n**Essential Tweaks** (Safe for all users):\n\n1. Go to the **Tweaks** tab\n2. Select from the Essential Tweaks section\n3. Click **Run Tweaks**\n\n**Advanced Tweaks** (Use with caution):\n\n1. Only modify if you understand the implications\n2. Always create a restore point first\n3. Review documentation for each tweak\n\n**Undoing Tweaks**:\n\n1. Select the same tweaks you applied\n2. Click **Undo Selected Tweaks**\n3. The system reverts to the previous state\n\n### Using Quick Fixes\n\nFor common Windows issues:\n\n1. Go to the **Config** tab\n2. Navigate to the **Fixes** section\n3. Select the appropriate fix:\n   - **Reset Network**: Fixes network connectivity issues\n   - **Reset Windows Update**: Resolves update problems\n   - **System Corruption Scan**: Repairs corrupted system files\n   - **WinGet Reinstall**: Fixes package manager issues\n\n### Changing DNS Servers\n\nFor improved privacy and speed:\n\n1. Go to the **Config** tab or the **Tweaks** tab\n2. Find the DNS section\n3. Select a provider:\n   - **Cloudflare**: Fast and privacy-focused\n   - **Google**: Reliable and widely used\n   - **Quad9**: Security-focused with malware blocking\n   - **AdGuard**: Blocks ads and trackers\n4. Click **Apply**\n\n## Understanding Presets\n\nWinutil offers several preset configurations:\n\n- **Minimal**: Minimal changes that keep most Windows features\n- **Standard**: A good middle ground for most users\n\n## Safety Tips\n\n✅ **DO**:\n\n- Create restore points before major changes\n- Read tweak descriptions before applying\n- Start with Essential Tweaks\n- Keep Windows up to date\n- Back up important data\n\n❌ **DON'T**:\n\n- Apply all tweaks at once without understanding them\n- Skip creating restore points\n- Use Advanced Tweaks without research\n- Disable security features unless necessary\n- Run on production systems without testing\n\n## Troubleshooting First Run\n\n### Script Won't Download\n\n**If the download fails**:\n\n1. Try the direct GitHub link:\n\n```powershell\nirm https://github.com/ChrisTitusTech/Winutil/releases/latest/download/Winutil.ps1 | iex\n```\n\n2. Force TLS 1.2:\n\n```powershell\n[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\nirm \"https://christitus.com/win\" | iex\n```\n\n> [!NOTE]\n> On Windows 11, you usually do not need the TLS 1.2 command. Use it only if you hit download or security protocol errors.\n\n### Execution Policy Error\n\nIf you get an execution policy error:\n\n```powershell\nSet-ExecutionPolicy Unrestricted -Scope Process -Force\nirm \"https://christitus.com/win\" | iex\n```\n\n### Download Blocked (India/Certain Regions)\n\nIf downloads are blocked in your region:\n\n1. Use a VPN service\n2. Change DNS to Cloudflare (1.1.1.1) or Google (8.8.8.8)\n3. Try again\n\n### Interface Doesn't Appear\n\nIf Winutil downloads but doesn't open:\n\n1. Check if antivirus is blocking it\n2. Ensure you ran PowerShell as administrator\n3. Try closing and reopening PowerShell\n4. Check Windows Defender exclusions\n\n## Next Steps\n\nNow that you're set up, explore these guides:\n\n- [Applications Guide](../application/) - Learn about installing, upgrading, and uninstalling software\n- [Tweaks Guide](../tweaks/) - Understand system optimizations\n- [FAQ](/faq/) - Common questions and answers\n\n## Getting Help\n\nIf you need assistance:\n\n- **Documentation**: Browse this documentation site\n- **Known Issues**: Check the [Known Issues](/knownissues/) page\n- **Discord**: Join the [community Discord server](https://discord.gg/RUbZUZyByQ)\n- **GitHub Issues**: Report bugs on [GitHub](https://github.com/ChrisTitusTech/winutil/issues)\n- **YouTube**: Watch [video tutorials](https://www.youtube.com/watch?v=6UQZ5oQg8XA)\n\n## Quick Reference Card\n\n| Task | Location | Action |\n| ---- | -------- | ------ |\n| Install or upgrade apps | Install tab | Check boxes -> Install/Upgrade Selected |\n| Uninstall apps | Install tab | Check boxes -> Uninstall Selected |\n| Apply tweaks | Tweaks tab | Select tweaks -> Run Tweaks |\n| Undo tweaks | Tweaks tab | Select tweaks -> Undo Selected Tweaks |\n| Create restore point | Tweaks tab | Essential Tweaks section |\n| Fix network | Config tab | Fixes -> Reset Network |\n| Change DNS | Tweaks tab | DNS section |\n| Open Control Panel | Config tab | Legacy Windows Panels |\n\nHappy optimizing!\n"
  },
  {
    "path": "docs/content/userguide/tweaks/_index.md",
    "content": "---\ntitle: Tweaks\nweight: 4\n---\n\n{{< image src=\"images/Tweaks-Tab\" alt=\"Image of Tweaks Tab\" >}}\n\n### Run Tweaks\n* **Open the Tweaks tab**: Navigate to the **Tweaks** tab in the application.\n* **Select Tweaks**: Choose the tweaks you want to apply. You can use the presets available at the top for convenience.\n* **Run Tweaks**: After selecting the desired tweaks, click **Run Tweaks** at the bottom of the screen.\n\n### Undo Tweaks\n* **Open the Tweaks tab**: Go to the **Tweaks** tab located next to **Install**.\n* **Select Tweaks to Remove**: Choose the tweaks you want to disable or remove.\n* **Undo Tweaks**: Click **Undo Selected Tweaks** at the bottom of the screen to apply the changes.\n\n### Essential Tweaks\nEssential Tweaks are modifications and optimizations that are generally safe for most users to implement. These tweaks are designed to enhance system performance, improve privacy, and reduce unnecessary system activities. They are considered low-risk and are recommended for users who want to ensure their system runs smoothly and efficiently without delving too deeply into complex configurations. The goal of Essential Tweaks is to provide noticeable improvements with minimal risk, making them suitable for a wide range of users, including those who may not have advanced technical knowledge.\n\n### Advanced Tweaks (CAUTION)\nAdvanced Tweaks are intended for experienced users who have a solid understanding of their system and the potential implications of making deep-level changes. These tweaks involve more significant alterations to the operating system and can provide substantial customization. However, they also carry a higher risk of causing system instability or unintended side effects if not implemented correctly. Users who choose to apply Advanced Tweaks should proceed with caution, ensuring they have adequate knowledge and backups in place to recover if something goes wrong. These tweaks are not recommended for novice users or those unfamiliar with the inner workings of their operating system.\n\n### O&O ShutUp10++\n[O&O ShutUp10++](https://www.oo-software.com/en/shutup10) can be launched from Winutil with one click. It is a free privacy tool for Windows that helps users manage telemetry, update behavior, and app permission settings.\n\n{{< youtube id=3HvNr8eMcv0 loading=lazy >}}\n\n\n### DNS\n\nThe utility provides a convenient DNS selection feature, allowing users to choose between various DNS providers for both IPv4 and IPv6. This enables users to optimize their internet connection for speed, security, and privacy according to their specific needs. Here are the available options:\n\n* **Default**: Uses the default DNS settings configured by your ISP or network.\n* **DHCP**: Automatically acquires DNS settings from the DHCP server.\n* [**Google**](https://developers.google.com/speed/public-dns?hl=en): A reliable and fast DNS service provided by Google.\n* [**Cloudflare**](https://developers.cloudflare.com/1.1.1.1/): Known for speed and privacy, Cloudflare DNS is a popular choice for enhancing internet performance.\n* [**Cloudflare_Malware**](https://developers.cloudflare.com/1.1.1.1/setup/#:~:text=Use%20the%20following%20DNS%20resolvers%20to%20block%20malicious%20content%3A): Provides additional protection by blocking malware sites.\n* [**Cloudflare_Malware_Adult**](https://developers.cloudflare.com/1.1.1.1/setup/#:~:text=Use%20the%20following%20DNS%20resolvers%20to%20block%20malware%20and%20adult%20content%3A): Blocks both malware and adult content, offering more comprehensive filtering.\n* [**Open_DNS**](https://www.opendns.com/setupguide/#familyshield): Offers customizable filtering and enhanced security features.\n* [**Quad9**](https://quad9.net/): Focuses on security by blocking known malicious domains.\n* [**AdGuard_Ads_Trackers**](https://adguard-dns.io/en/welcome.html): AdGuard DNS blocks ads, trackers, and other unwanted DNS requests. Visit the website and sign in for a dashboard, statistics, and additional server-side customization.\n* [**AdGuard_Ads_Trackers_Malware_Adult**](https://adguard-dns.io/en/welcome.html): AdGuard DNS blocks ads, trackers, malware, and adult content, and enables Safe Search and Safe Mode where possible.\n\n### Customize Preferences\n\nThe Customize Preferences section allows users to personalize their Windows experience by toggling visual and functional settings.\n\n### Performance Plans\n\nThe Performance Plans section allows users to manage the Ultimate Performance Profile for maximum performance.\n\n#### Add and activate the Ultimate Performance Profile:\n* Enables and activates the Ultimate Performance Profile to enhance system performance by minimizing latency and increasing efficiency.\n#### Remove Ultimate Performance Profile:\n* Deactivates the Ultimate Performance Profile, changing the system to the Balanced Profile.\n"
  },
  {
    "path": "docs/content/userguide/updates/_index.md",
    "content": "---\ntitle: Updates\nweight: 6\n---\n\nWinutil provides three update modes so you can choose how aggressively Windows Update is managed on your system:\n\n- **Default (Out of Box) Settings**: Restores standard Windows Update behavior\n- **Security (Recommended) Settings**: Prioritizes stability while still receiving security updates\n- **Disable ALL Updates**: Turns off Windows Update entirely and should only be used with extreme caution\n\n### Default (Out of Box) Settings\n\n- **What it does**: Restores the default Windows Update configuration.\n- **Best for**: Systems where you want Windows to manage updates normally.\n- **Notes**: This removes custom update settings previously applied by Winutil. If update errors continue, use the reset option in the **Config** tab to restore Microsoft Update services to their default state.\n\n### Security (Recommended) Settings\n\n- **What it does**: Applies a more conservative update strategy designed for most users.\n- **Feature updates**: Delayed by **365 days** to reduce the chance of disruption from major Windows changes.\n- **Security updates**: Delayed by **4 days** to allow time for early issues to surface while still keeping the system protected.\n- **Why use it**: This mode offers the best balance between security and stability, which is why it is the recommended option for most PCs.\n\n### Disable ALL Updates (NOT RECOMMENDED!)\n\n- **What it does**: Disables all Windows updates.\n- **Best for**: Highly controlled or special-purpose systems where updates must remain off temporarily.\n- **Warning**: This leaves the system without security patches and significantly increases security risk.\n- **Recommendation**: Avoid this mode unless you fully understand the tradeoffs and have a specific reason to use it.\n"
  },
  {
    "path": "docs/content/userguide/win11Creator/_index.md",
    "content": "---\ntitle: Win11 Creator\nweight: 8\n---\n\n## Using Winutil's Win11 Creator\n\nWinutil includes a built-in **Win11 Creator** tool that lets you take an official Windows 11 ISO and produce a customized, debloated version. The resulting image can remove telemetry, bypass hardware requirement checks, and enable local account setup out of the box. You can export the result as a new ISO file or write it directly to a USB drive.\n\n> [!IMPORTANT]\n> You need an **official Windows 11 ISO** from [Microsoft's website](https://www.microsoft.com/en-us/software-download/windows11) before starting. Custom, modified, or non-official ISOs are not supported. The process uses ~10–15 GB of temporary disk space, so make sure you have room.\n\n---\n\n### Step 1 — Select Your Official Windows 11 ISO\n\n1. Open Winutil and go to the **Win11 Creator** tab.\n2. Click **Browse** and select your **official Windows 11 ISO file** from Microsoft (must be 4 GB or larger). Custom or modified ISOs are not supported.\n3. The file path and size will appear on screen once selected.\n\n---\n\n### Step 2 — Mount & Verify\n\n1. Click **Mount & Verify ISO**.\n2. Winutil mounts the ISO, checks for a valid `install.wim` or `install.esd`, and reads the available editions (Home, Pro, Enterprise, etc.).\n3. Once verified, select your desired **edition** from the dropdown — Pro is selected by default if available.\n\n> [!NOTE]\n> This step takes around 10–30 seconds depending on your drive speed.\n\n---\n\n### Step 3 — Run the Modification\n\nClick **Run Windows ISO Modification and Creator** to start the customization process. Winutil will:\n\n**App & Component Removal:**\n- **Remove 40+ bloat apps** — Clipchamp, Teams, Copilot, Dev Home, new Outlook, Bing apps, Solitaire, and more\n- **Delete OneDrive setup** from the image\n\n**System Customization:**\n- **Bypass hardware checks** — removes TPM, Secure Boot, CPU, RAM, and storage requirement enforcement so the ISO installs on unsupported hardware\n- **Enable local account setup** — injects an `autounattend.xml` that skips the Microsoft account screen during OOBE\n- **Disable BitLocker and device encryption** — removes startup overhead\n- **Disable Chat icon** — removes chat taskbar button\n- **Strip unused editions** — keeps only your selected edition, saving 1–2 GB per removed edition\n- **Clean the component store** — runs DISM cleanup to reclaim another 300–800 MB\n\n**Privacy & Telemetry Tweaks:**\n- **Disable telemetry** — advertising ID, tailored experiences, input personalization, speech online privacy\n- **Disable cloud content features** — app suggestions, Microsoft Store recommendations\n- **Remove telemetry scheduled tasks** — CEIP, Appraiser, WaaSMedic, and others\n- **Disable OneDrive folder backup** — prevents automatic backups to cloud\n- **Prevent DevHome and Outlook post-setup installation**\n- **Prevent Teams installation** — blocks auto-install after OOBE\n- **Prevent new Outlook Mail app installation**\n- **Disable Windows Update during OOBE** — re-enabled automatically on first login\n- **Disable Copilot and search box suggestions**\n\n**Optional: Driver Injection**\n- If enabled, injects all drivers from your current system into the install.wim and boot.wim — useful for offline installations on machines with missing drivers. This is an optional checkbox in Step 3.\n\nA live log shows progress as each step completes. This stage usually takes **10–30 minutes** depending on disk speed. The WIM dismount near the end is the slowest part, so do not close Winutil while it is running.\n\n---\n\n### Step 4 — Export Your Result\n\nOnce modification is complete, choose how to save your image:\n\n{{< tabs >}}\n\n  {{< tab name=\"Save as ISO\" selected=true >}}\n  1. Click **Save as an ISO File**.\n  2. Choose a save location (defaults to your Desktop as `Win11_Modified_yyyyMMdd.iso`).\n  3. Winutil builds a dual BIOS/UEFI bootable ISO using `oscdimg.exe`.\n\n  > [!NOTE]\n  > `oscdimg.exe` (part of the Windows ADK) is required. If it's not found, Winutil will attempt to install it automatically via winget. If that fails, install it manually: `winget install -e --id Microsoft.OSCDIMG`\n\n  **Typical output size:** 2.5–3.5 GB (down from 5–6 GB original)\n  {{< /tab >}}\n\n  {{< tab name=\"Write to USB\" >}}\n  1. Click **Write Directly to a USB Drive**.\n  2. Select your USB drive from the dropdown (click **Refresh** if it doesn't appear).\n  3. Click **Erase & Write to USB** and confirm the warning — **all data on the drive will be permanently erased**.\n  4. Winutil formats the drive as GPT with a 512 MB EFI partition and copies the modified Windows files.\n\n  > [!WARNING]\n  > Double-check you have selected the correct drive before confirming. This operation cannot be undone.\n\n  **Minimum USB size:** 8 GB recommended. Writing takes 10–20 minutes.\n  {{< /tab >}}\n\n{{< /tabs >}}\n\n---\n\n### Step 5 — Clean Up (Optional)\n\nClick **Clean & Reset** to delete the temporary working directory (~10–15 GB) and return the tool to its initial state, ready for a new ISO. You will be asked to confirm before anything is deleted.\n\n---\n\n### What the Modified ISO Does Differently\n\nWhen you install Windows 11 from your modified ISO:\n\n- **No Microsoft account required** — create a local account directly during setup\n- **No hardware checks** — installs on machines without TPM 2.0, Secure Boot, or supported CPUs\n- **Dark mode enabled by default**\n- **Empty taskbar and Start Menu** — no pinned apps, Chat icon removed\n- **Windows Update disabled during OOBE** — automatically re-enabled on first login to prevent setup interruptions\n- **BitLocker disabled** — removes startup overhead on first boot\n\n---\n\n### Troubleshooting\n\n| Problem | Fix |\n|---------|-----|\n| \"install.wim not found\" | Not a valid Windows 11 ISO — download a fresh one from Microsoft |\n| \"oscdimg.exe not found\" | Run `winget install -e --id Microsoft.OSCDIMG` then retry |\n| USB drive not showing up | Plug it in, wait a few seconds, then click **Refresh** |\n| Modification seems stuck | The WIM dismount step is slow — wait at least 10 minutes before assuming it's frozen |\n| \"Access Denied\" error | Make sure Winutil is running as Administrator |\n\n---\n\nBelow is a list of free and open-source tools for downloading, creating, and flashing Windows ISOs.\n\n## Download Windows ISOs\n\n| Tool | Description | Website |\n|------|-------------|---------|\n| **[UUP Dump](https://uupdump.net/)** | Download Windows UUP files directly from Microsoft's servers and convert them into a clean ISO — great for getting the latest builds | [uupdump.net](https://uupdump.net/) |\n| **[Microsoft Media Creation Tool](https://www.microsoft.com/en-us/software-download/windows11)** | Microsoft's official tool for downloading and creating Windows 11 installation media | [microsoft.com](https://www.microsoft.com/en-us/software-download/windows11) |\n\n\n## Customize Windows ISOs\n\n| Tool | Description | Website |\n|------|-------------|---------|\n| **[MicroWin](https://github.com/CodingWonders/microwin)** | A C# desktop app for building stripped-down, customized Windows ISOs — the original predecessor to Winutil's old MicroWin feature | [github.com](https://github.com/CodingWonders/microwin) |\n| **[Tiny11 Builder](https://github.com/ntdevlabs/tiny11builder)** | PowerShell script that strips a Windows 11 ISO down to the bare minimum — removes bloatware and bypasses hardware requirements | [github.com](https://github.com/ntdevlabs/tiny11builder) |\n| **[NTLite](https://www.ntlite.com/)** | Remove Windows components, integrate drivers and updates, and build a custom ISO before installation | [ntlite.com](https://www.ntlite.com/) |\n\n\n## Flash ISOs to USB\n\n| Tool | Description | Website |\n|------|-------------|---------|\n| **[Rufus](https://rufus.ie/)** | The go-to tool for creating bootable Windows USB drives. Supports bypassing Windows 11 TPM/Secure Boot requirements and downloading ISOs directly | [rufus.ie](https://rufus.ie/) |\n| **[Ventoy](https://www.ventoy.net/)** | Install once, then just copy any ISO files onto the USB — supports booting multiple ISOs from a single drive without re-flashing | [ventoy.net](https://www.ventoy.net/) |\n| **[balenaEtcher](https://etcher.balena.io/)** | Simple, beginner-friendly ISO flasher with a clean interface | [etcher.balena.io](https://etcher.balena.io/) |\n\n\n\n---\n\n> [!TIP]\n> Already have a Windows 11 ISO? Skip the third-party tools and use Winutil's built-in **[Win11 Creator](#using-winutils-win11-creator)** at the top of this page.\n\n> [!NOTE]\n> Always download Windows ISOs from official Microsoft sources or trusted tools like Rufus/UUP Dump to avoid tampered images.\n\n> [!NOTE]\n> Newer Windows 11 ISOs may not boot correctly on older versions of Ventoy — make sure Ventoy is up to date before use. If issues persist after updating, this is a Ventoy compatibility limitation outside of Winutil's control.\n"
  },
  {
    "path": "docs/go.mod",
    "content": "module github.com/ChrisTitusTech/WinUtil\n\ngo 1.26\n\nrequire github.com/imfing/hextra v0.12.0 // indirect\n"
  },
  {
    "path": "docs/go.sum",
    "content": "github.com/imfing/hextra v0.9.7 h1:Zg5n24us36Bn/S/5mEUPkRW6uwE6vHHEqWSgN0bPXaM=\ngithub.com/imfing/hextra v0.9.7/go.mod h1:cEfel3lU/bSx7lTE/+uuR4GJaphyOyiwNR3PTqFTXpI=\ngithub.com/imfing/hextra v0.11.1 h1:8pTc4ReYbzGTHAnyiebmlT3ijFfIXiGu1r7tM/UGjFI=\ngithub.com/imfing/hextra v0.11.1/go.mod h1:cEfel3lU/bSx7lTE/+uuR4GJaphyOyiwNR3PTqFTXpI=\ngithub.com/imfing/hextra v0.12.0 h1:f6y35hW/WDJEcx9S0dOmbICOBxYE0PmP6IJFsTUgVyY=\ngithub.com/imfing/hextra v0.12.0/go.mod h1:YAv8XRNSmcqjieFwI7fVQK1AoY2Do+45DO9HGqxSGu4=\n"
  },
  {
    "path": "docs/hugo.toml",
    "content": "baseURL = \"https://winutil.christitus.com/\"\nlanguageCode = \"en-us\"\ntitle = \"Winutil Documentation\"\nenableGitInfo = true\ncanonifyURLs = true\n\n[[module.mounts]]\n  source = \"assets\"\n  target = \"assets\"\n\n[[module.imports]]\npath = \"github.com/imfing/hextra\"\n\n[[menu.main]]\nidentifier = \"userguide\"\nname = \"User Guides\"\npageRef = \"/userguide\"\nweight = 1\n\n[[menu.main]]\nidentifier = \"documentation\"\nname = \"Developer Documentation\"\nweight = 2\n\n[[menu.main]]\nidentifier = \"contribution-guides\"\nname = \"Contribution Guides\"\npageRef = \"CONTRIBUTING.md\"\nweight = 1\nparent = \"documentation\"\n\n[[menu.main]]\nidentifier = \"developer-documentation\"\nname = \"Developer Docs\"\npageRef = \"/dev\"\nweight = 2\nparent = \"documentation\"\n\n[[menu.main]]\nidentifier = \"help\"\nname = \"Help\"\nweight = 3\n\n[[menu.main]]\nidentifier = \"faq\"\nname = \"FAQ\"\npageRef = \"faq.md\"\nweight = 1\nparent = \"help\"\n\n[[menu.main]]\nidentifier = \"known-issues\"\nname = \"Known Issues\"\npageRef = \"KnownIssues.md\"\nweight = 2\nparent = \"help\"\n\n[[menu.main]]\nname = \"Store\"\nurl = \"https://christitus.com/downloads/\"\nweight = 5\n\n[[menu.main]]\nname = \"Search\"\nweight = 6\n\n  [menu.main.params]\n  type = \"search\"\n\n[[menu.main]]\nname = \"GitHub\"\nweight = 7\nurl = \"https://github.com/christitustech/Winutil\"\n\n  [menu.main.params]\n  icon = \"github\"\n\n[params]\ndescription = \"Chris Titus Tech's Windows Utility - Install Programs, Tweaks, Fixes, and Updates\"\ndisplayUpdatedDate = true\ndateFormat = \"January 2, 2006\"\n\n  [params.navbar]\n  displayTitle = false\n  displayLogo = true\n\n    [params.navbar.logo]\n    path = \"navlogo.png\"\n    dark = \"navlogo.png\"\n    link = \"/\"\n    width = 150\n    height = 50\n\n  [params.theme]\n  default = \"system\"\n  displayToggle = true\n\n  [params.page]\n  width = \"wide\"\n\n  [params.footer]\n  enable = true\n  displayCopyright = true\n  displayPoweredBy = false\n  width = \"normal\"\n\n[params.highlight.copy]\nenable = true\ndisplay = \"hover\"\n\n[menu]\n\n  [[menu.sidebar]]\n  name = \"Links\"\n  weight = 1\n    [menu.sidebar.params]\n    type = \"separator\"\n\n  [[menu.sidebar]]\n  name = \"Github Repo ↗\"\n  url = \"https://github.com/ChrisTitusTech/winutil\"\n  weight = 2\n\n  [[menu.sidebar]]\n  name = \"Discord Server ↗\"\n  url = \"https://discord.gg/RUbZUZyByQ\"\n  weight = 3\n\n\n[markup]\n  [markup.goldmark]\n    [markup.goldmark.renderer]\n      unsafe = true\n"
  },
  {
    "path": "docs/i18n/en.yaml",
    "content": "copyright: \"&copy; <script>document.write(new Date().getFullYear())</script>&nbsp;<a href='https://christitus.com'>Chris Titus Tech</a>. All rights reserved.\"\nbackToTop: \"Scroll to top\"\nchangeLanguage: \"Change language\"\nchangeTheme: \"Change theme\"\ncopy: \"Copy\"\ncopied: \"Copied!\"\ncopyAsMarkdown: \"Copy as Markdown\"\ncopyPage: \"Copy Page\"\ncopyCode: \"Copy code\"\ndark: \"Dark\"\neditThisPage: \"Edit this page on GitHub →\"\nlastUpdated: \"Last updated on\"\nlight: \"Light\"\nnext: \"Next\"\nnoResultsFound: \"No results found.\"\nonThisPage: \"On this page\"\npoweredBy: \"Powered by Chris Titus Tech\"\nprevious: \"Prev\"\nreadMore: \"Read more →\"\nsearchPlaceholder: \"Search...\"\nsystem: \"System\"\ntags: \"Tags\"\nviewAsMarkdown: \"View as Markdown\"\n"
  },
  {
    "path": "docs/layouts/shortcodes/autolinks.html",
    "content": "{{- $section := .Get \"section\" | lower -}}\n{{- $pages := slice -}}\n{{- range .Site.RegularPages -}}\n{{- if in .RelPermalink $section -}}\n{{- $pageTitle := .Title -}}\n{{- if eq $pageTitle \"\" -}}\n  {{- $pageTitle = .File.BaseFileName | humanize | title -}}\n{{- end -}}\n{{- $pageDesc := .Description -}}\n{{- $pages = $pages | append (dict \"title\" $pageTitle \"description\" $pageDesc \"url\" .RelPermalink) -}}\n{{- end -}}\n{{- end -}}\n<ul>\n{{- range sort $pages \"title\" \"asc\" }}\n<li><a href=\"{{ .url }}\">{{ .title }}</a>{{ with .description }} - {{ . }}{{ end }}</li>\n{{- end }}\n</ul>\n"
  },
  {
    "path": "docs/layouts/shortcodes/image.html",
    "content": "{{/*Retrive Passed Shortcode Parameters*/}}\n{{ $src := .Get \"src\" }}\n{{ $alt := .Get \"alt\" }}\n\n{{/*Define sizes*/}}\n{{ $Small := 200 }}\n{{ $Medium := 600 }}\n{{ $Large := 1000 }}\n\n{{/*Define Image variables as global variables to make them easily accessible in this shortcode*/}}\n{{ $DarkImage := \"\" }} {{ $DarkSmallImage := \"\" }} {{ $DarkMediumImage := \"\" }} {{ $DarkLargeImage := \"\" }}\n{{ $LightImage := \"\" }} {{ $LightSmallImage := \"\" }} {{ $LightMediumImage := \"\" }} {{ $LightLargeImage := \"\" }}\n{{ $SingleImage := \"\" }} {{ $SingleSmallImage := \"\" }} {{ $SingleMediumImage := \"\" }} {{ $SingleLargeImage := \"\" }}\n\n{{/*Find images and update the previous Single,Dark,Light Images variables*/}}\n{{ with resources.GetMatch (print $src \".jpg\") }} {{ $SingleImage = . }} {{ end }}\n{{ with resources.GetMatch (print $src \"-Dark\" \".jpg\") }} {{ $DarkImage = . }} {{ end }}\n{{ with resources.GetMatch (print $src \"-Light\" \".jpg\") }} {{ $LightImage = . }} {{ end }}\n{{ with resources.GetMatch (print $src \".png\") }} {{ $SingleImage = . }} {{ end }}\n{{ with resources.GetMatch (print $src \"-Dark\" \".png\") }} {{ $DarkImage = . }} {{ end }}\n{{ with resources.GetMatch (print $src \"-Light\" \".png\") }} {{ $LightImage = . }} {{ end }}\n\n{{/*Applying Image Processing*/}}\n{{ with $SingleImage }}\n    {{ with .Resize (printf \"%dx%d webp q50\" .Width .Height) }}\n        {{ $SingleImage = . }}\n    {{ end }}\n{{ end }}\n{{ with $DarkImage }}\n    {{ with .Resize (printf \"%dx%d webp q50\" .Width .Height) }}\n        {{ $DarkImage = . }}\n    {{ end }}\n{{ end }}\n{{ with $LightImage }}\n    {{ with .Resize (printf \"%dx%d webp q50\" .Width .Height) }}\n        {{ $LightImage = . }}\n    {{ end }}\n{{ end }}\n\n{{/*Make different sized versions to images if applicable*/}}\n{{ with $SingleImage }}\n    {{ if gt (.Width) ($Small) }}\n        {{ with .Resize (printf \"%dx\" $Small) }}\n            {{ $SingleSmallImage = . }}\n        {{ end }}\n    {{ end }}\n    {{ if gt (.Width) ($Medium) }}\n        {{ with .Resize (printf \"%dx\" $Medium) }}\n            {{ $SingleMediumImage = . }}\n        {{ end }}\n    {{ end }}\n    {{ if gt (.Width) ($Large) }}\n        {{ with .Resize (printf \"%dx\" $Large) }}\n            {{ $SingleLargeImage = . }}\n        {{ end }}\n    {{ end }}\n{{ end }}\n{{ with $DarkImage }}\n    {{ if gt (.Width) ($Small) }}\n        {{ with .Resize (printf \"%dx\" $Small) }}\n            {{ $DarkSmallImage = . }}\n        {{ end }}\n    {{ end }}\n    {{ if gt (.Width) ($Medium) }}\n        {{ with .Resize (printf \"%dx\" $Medium) }}\n            {{ $DarkMediumImage = . }}\n        {{ end }}\n    {{ end }}\n    {{ if gt (.Width) ($Large) }}\n        {{ with .Resize (printf \"%dx\" $Large) }}\n            {{ $DarkLargeImage = . }}\n        {{ end }}\n    {{ end }}\n{{ end }}\n{{ with $LightImage }}\n    {{ if gt (.Width) ($Small) }}\n        {{ with .Resize (printf \"%dx\" $Small) }}\n            {{ $LightSmallImage = . }}\n        {{ end }}\n    {{ end }}\n    {{ if gt (.Width) ($Medium) }}\n        {{ with .Resize (printf \"%dx\" $Medium) }}\n            {{ $LightMediumImage = . }}\n        {{ end }}\n    {{ end }}\n    {{ if gt (.Width) ($Large) }}\n        {{ with .Resize (printf \"%dx\" $Large) }}\n            {{ $LightLargeImage = . }}\n        {{ end }}\n    {{ end }}\n{{ end }}\n\n\n{{ if $SingleImage }}\n<picture>\n    {{ with $SingleSmallImage }}<source media='(max-width: {{ printf \"%dpx\" $Small}})' srcset='{{ .RelPermalink }}'>{{ end }}\n    {{ with $SingleMediumImage }}<source media='(min-width: {{ printf \"%dpx\" $Small}}) and (max-width: {{ printf \"%dpx\" $Medium}})' srcset='{{ .RelPermalink }}'>{{ end }}\n    {{ with $SingleLargeImage }}<source media='(min-width: {{ printf \"%dpx\" $Medium}}) and (max-width: {{ printf \"%dpx\" $Large}})' srcset='{{ .RelPermalink }}'>{{ end }}\n    {{ with $SingleImage }}<img loading=\"lazy\" src=\"{{ .RelPermalink }}\" Width=\"{{ .Width }}\" height=\"{{ .Height }}\" {{ with $alt }}alt=\"{{.}}\"{{ else }}alt=\"\"{{ end }}/>{{ end }}\n</picture>\n{{ else }}\n<picture>\n    {{ with $DarkSmallImage }}<source media='(max-width: {{ printf \"%dpx\" $Small}}) and (prefers-color-scheme: dark)' srcset='{{ .RelPermalink }}'>{{ end }}\n    {{ with $DarkMediumImage }}<source media='(min-width: {{ printf \"%dpx\" $Small}}) and (max-width: {{ printf \"%dpx\" $Medium}}) and (prefers-color-scheme: dark)' srcset='{{ .RelPermalink }}'>{{ end }}\n    {{ with $DarkLargeImage }}<source media='(min-width: {{ printf \"%dpx\" $Medium}}) and (max-width: {{ printf \"%dpx\" $Large}}) and (prefers-color-scheme: dark)' srcset='{{ .RelPermalink }}'>{{ end }}\n    {{ with $DarkImage }}<source media='(prefers-color-scheme: dark)' srcset='{{ .RelPermalink }}'>{{ end }}\n    {{ with $LightSmallImage }}<source media='(max-width: {{ printf \"%dpx\" $Small}}) and (prefers-color-scheme: light)' srcset='{{ .RelPermalink }}'>{{ end }}\n    {{ with $LightMediumImage }}<source media='(min-width: {{ printf \"%dpx\" $Small}}) and (max-width: {{ printf \"%dpx\" $Medium}}) and (prefers-color-scheme: light)' srcset='{{ .RelPermalink }}'>{{ end }}\n    {{ with $LightLargeImage }}<source media='(min-width: {{ printf \"%dpx\" $Medium}}) and (max-width: {{ printf \"%dpx\" $Large}}) and (prefers-color-scheme: light)' srcset='{{ .RelPermalink }}'>{{ end }}\n    {{ with $LightImage }}<source media='(prefers-color-scheme: light)' srcset='{{ .RelPermalink }}'>{{ end }}\n    {{ with $LightImage }}<img loading=\"lazy\" src=\"{{ .RelPermalink }}\" Width=\"{{ .Width }}\" height=\"{{ .Height }}\" {{ with $alt }}alt=\"{{.}}\"{{ else }}alt=\"\"{{ end }}/>\n    {{ else with $DarkImage }}<img loading=\"lazy\" src=\"{{ .RelPermalink }}\" Width=\"{{ .Width }}\" height=\"{{ .Height }}\" {{ with $alt }}alt=\"{{.}}\"{{ else }}alt=\"\"{{ end }}/>{{ end }}\n</picture>\n{{ end }}\n"
  },
  {
    "path": "docs/static/CNAME",
    "content": "winutil.christitus.com\n"
  },
  {
    "path": "docs/static/site.webmanifest",
    "content": "{\"name\":\"\",\"short_name\":\"\",\"icons\":[{\"src\":\"/android-chrome-192x192.png\",\"sizes\":\"192x192\",\"type\":\"image/png\"},{\"src\":\"/android-chrome-512x512.png\",\"sizes\":\"512x512\",\"type\":\"image/png\"}],\"theme_color\":\"#ffffff\",\"background_color\":\"#ffffff\",\"display\":\"standalone\"}\n"
  },
  {
    "path": "functions/private/Add-SelectedAppsMenuItem.ps1",
    "content": "    function Add-SelectedAppsMenuItem {\r\n        <#\r\n        .SYNOPSIS\r\n            This is a helper function that generates and adds the Menu Items to the Selected Apps Popup.\r\n\r\n        .Parameter name\r\n            The actual Name of an App like \"Chrome\" or \"Brave\"\r\n            This name is contained in the \"Content\" property inside the applications.json\r\n        .PARAMETER key\r\n            The key which identifies an app object in applications.json\r\n            For Chrome this would be \"WPFInstallchrome\" because \"WPFInstall\" is prepended automatically for each key in applications.json\r\n        #>\r\n\r\n        param ([string]$name, [string]$key)\r\n\r\n        $selectedAppGrid = New-Object Windows.Controls.Grid\r\n\r\n        $selectedAppGrid.ColumnDefinitions.Add((New-Object System.Windows.Controls.ColumnDefinition -Property @{Width = \"*\"}))\r\n        $selectedAppGrid.ColumnDefinitions.Add((New-Object System.Windows.Controls.ColumnDefinition -Property @{Width = \"30\"}))\r\n\r\n        # Sets the name to the Content as well as the Tooltip, because the parent Popup Border has a fixed width and text could \"overflow\".\r\n        # With the tooltip, you can still read the whole entry on hover\r\n        $selectedAppLabel = New-Object Windows.Controls.Label\r\n        $selectedAppLabel.Content = $name\r\n        $selectedAppLabel.ToolTip = $name\r\n        $selectedAppLabel.HorizontalAlignment = \"Left\"\r\n        $selectedAppLabel.SetResourceReference([Windows.Controls.Control]::ForegroundProperty, \"MainForegroundColor\")\r\n        [System.Windows.Controls.Grid]::SetColumn($selectedAppLabel, 0)\r\n        $selectedAppGrid.Children.Add($selectedAppLabel)\r\n\r\n        $selectedAppRemoveButton = New-Object Windows.Controls.Button\r\n        $selectedAppRemoveButton.FontFamily = \"Segoe MDL2 Assets\"\r\n        $selectedAppRemoveButton.Content = [string]([char]0xE711)\r\n        $selectedAppRemoveButton.HorizontalAlignment = \"Center\"\r\n        $selectedAppRemoveButton.Tag = $key\r\n        $selectedAppRemoveButton.ToolTip = \"Remove the App from Selection\"\r\n        $selectedAppRemoveButton.SetResourceReference([Windows.Controls.Control]::ForegroundProperty, \"MainForegroundColor\")\r\n        $selectedAppRemoveButton.SetResourceReference([Windows.Controls.Control]::StyleProperty, \"HoverButtonStyle\")\r\n\r\n        # Highlight the Remove icon on Hover\r\n        $selectedAppRemoveButton.Add_MouseEnter({ $this.Foreground = \"Red\" })\r\n        $selectedAppRemoveButton.Add_MouseLeave({ $this.SetResourceReference([Windows.Controls.Control]::ForegroundProperty, \"MainForegroundColor\") })\r\n        $selectedAppRemoveButton.Add_Click({\r\n            $sync.($this.Tag).isChecked = $false # On click of the remove button, we only have to uncheck the corresponding checkbox. This will kick of all necessary changes to update the UI\r\n        })\r\n        [System.Windows.Controls.Grid]::SetColumn($selectedAppRemoveButton, 1)\r\n        $selectedAppGrid.Children.Add($selectedAppRemoveButton)\r\n        # Add new Element to Popup\r\n        $sync.selectedAppsstackPanel.Children.Add($selectedAppGrid)\r\n    }\r\n"
  },
  {
    "path": "functions/private/Find-AppsByNameOrDescription.ps1",
    "content": "function Find-AppsByNameOrDescription {\r\n    <#\r\n        .SYNOPSIS\r\n            Searches through the Apps on the Install Tab and hides all entries that do not match the string\r\n\r\n        .PARAMETER SearchString\r\n            The string to be searched for\r\n    #>\r\n    param(\r\n        [Parameter(Mandatory=$false)]\r\n        [string]$SearchString = \"\"\r\n    )\r\n    # Reset the visibility if the search string is empty or the search is cleared\r\n    if ([string]::IsNullOrWhiteSpace($SearchString)) {\r\n        $sync.ItemsControl.Items | ForEach-Object {\r\n            # Each item is a StackPanel container\r\n            $_.Visibility = [Windows.Visibility]::Visible\r\n\r\n            if ($_.Children.Count -ge 2) {\r\n                $categoryLabel = $_.Children[0]\r\n                $wrapPanel = $_.Children[1]\r\n\r\n                # Keep category label visible\r\n                $categoryLabel.Visibility = [Windows.Visibility]::Visible\r\n\r\n                # Respect the collapsed state of categories (indicated by + prefix)\r\n                if ($categoryLabel.Content -like \"+*\") {\r\n                    $wrapPanel.Visibility = [Windows.Visibility]::Collapsed\r\n                } else {\r\n                    $wrapPanel.Visibility = [Windows.Visibility]::Visible\r\n                }\r\n\r\n                # Show all apps within the category\r\n                $wrapPanel.Children | ForEach-Object {\r\n                    $_.Visibility = [Windows.Visibility]::Visible\r\n                }\r\n            }\r\n        }\r\n        return\r\n    }\r\n\r\n    # Perform search\r\n    $sync.ItemsControl.Items | ForEach-Object {\r\n        # Each item is a StackPanel container with Children[0] = label, Children[1] = WrapPanel\r\n        if ($_.Children.Count -ge 2) {\r\n            $categoryLabel = $_.Children[0]\r\n            $wrapPanel = $_.Children[1]\r\n            $categoryHasMatch = $false\r\n\r\n            # Keep category label visible\r\n            $categoryLabel.Visibility = [Windows.Visibility]::Visible\r\n\r\n            # Search through apps in this category\r\n            $wrapPanel.Children | ForEach-Object {\r\n                $appEntry = $sync.configs.applicationsHashtable.$($_.Tag)\r\n                if ($appEntry.Content -like \"*$SearchString*\" -or $appEntry.Description -like \"*$SearchString*\") {\r\n                    # Show the App and mark that this category has a match\r\n                    $_.Visibility = [Windows.Visibility]::Visible\r\n                    $categoryHasMatch = $true\r\n                }\r\n                else {\r\n                    $_.Visibility = [Windows.Visibility]::Collapsed\r\n                }\r\n            }\r\n\r\n            # If category has matches, show the WrapPanel and update the category label to expanded state\r\n            if ($categoryHasMatch) {\r\n                $wrapPanel.Visibility = [Windows.Visibility]::Visible\r\n                $_.Visibility = [Windows.Visibility]::Visible\r\n                # Update category label to show expanded state (-)\r\n                if ($categoryLabel.Content -like \"+*\") {\r\n                    $categoryLabel.Content = $categoryLabel.Content -replace \"^\\+ \", \"- \"\r\n                }\r\n            } else {\r\n                # Hide the entire category container if no matches\r\n                $_.Visibility = [Windows.Visibility]::Collapsed\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Find-TweaksByNameOrDescription.ps1",
    "content": "function Find-TweaksByNameOrDescription {\r\n    <#\r\n        .SYNOPSIS\r\n            Searches through the Tweaks on the Tweaks Tab and hides all entries that do not match the search string\r\n\r\n        .PARAMETER SearchString\r\n            The string to be searched for\r\n    #>\r\n    param(\r\n        [Parameter(Mandatory=$false)]\r\n        [string]$SearchString = \"\"\r\n    )\r\n\r\n    # Reset the visibility if the search string is empty or the search is cleared\r\n    if ([string]::IsNullOrWhiteSpace($SearchString)) {\r\n        # Show all categories\r\n        $tweakspanel = $sync.Form.FindName(\"tweakspanel\")\r\n        $tweakspanel.Children | ForEach-Object {\r\n            $_.Visibility = [Windows.Visibility]::Visible\r\n\r\n            # Foreach category section, show all items\r\n            if ($_ -is [Windows.Controls.Border]) {\r\n                $_.Visibility = [Windows.Visibility]::Visible\r\n\r\n                # Find ItemsControl\r\n                $dockPanel = $_.Child\r\n                if ($dockPanel -is [Windows.Controls.DockPanel]) {\r\n                    $itemsControl = $dockPanel.Children | Where-Object { $_ -is [Windows.Controls.ItemsControl] }\r\n                    if ($itemsControl) {\r\n                        # Show items in the category\r\n                        foreach ($item in $itemsControl.Items) {\r\n                            if ($item -is [Windows.Controls.Label]) {\r\n                                $item.Visibility = [Windows.Visibility]::Visible\r\n                            } elseif ($item -is [Windows.Controls.DockPanel] -or\r\n                                      $item -is [Windows.Controls.StackPanel]) {\r\n                                $item.Visibility = [Windows.Visibility]::Visible\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        return\r\n    }\r\n\r\n    # Search for matching tweaks when search string is not null\r\n    $tweakspanel = $sync.Form.FindName(\"tweakspanel\")\r\n\r\n    $tweakspanel.Children | ForEach-Object {\r\n        $categoryBorder = $_\r\n        $categoryVisible = $false\r\n\r\n        if ($_ -is [Windows.Controls.Border]) {\r\n            # Find the ItemsControl\r\n            $dockPanel = $_.Child\r\n            if ($dockPanel -is [Windows.Controls.DockPanel]) {\r\n                $itemsControl = $dockPanel.Children | Where-Object { $_ -is [Windows.Controls.ItemsControl] }\r\n                if ($itemsControl) {\r\n                    $categoryLabel = $null\r\n\r\n                    # Process all items in the ItemsControl\r\n                    for ($i = 0; $i -lt $itemsControl.Items.Count; $i++) {\r\n                        $item = $itemsControl.Items[$i]\r\n\r\n                        if ($item -is [Windows.Controls.Label]) {\r\n                            $categoryLabel = $item\r\n                            $item.Visibility = [Windows.Visibility]::Collapsed\r\n                        } elseif ($item -is [Windows.Controls.DockPanel]) {\r\n                            $checkbox = $item.Children | Where-Object { $_ -is [Windows.Controls.CheckBox] } | Select-Object -First 1\r\n                            $label = $item.Children | Where-Object { $_ -is [Windows.Controls.Label] } | Select-Object -First 1\r\n\r\n                            if ($label -and ($label.Content -like \"*$SearchString*\" -or $label.ToolTip -like \"*$SearchString*\")) {\r\n                                $item.Visibility = [Windows.Visibility]::Visible\r\n                                if ($categoryLabel) { $categoryLabel.Visibility = [Windows.Visibility]::Visible }\r\n                                $categoryVisible = $true\r\n                            } else {\r\n                                $item.Visibility = [Windows.Visibility]::Collapsed\r\n                            }\r\n                        } elseif ($item -is [Windows.Controls.StackPanel]) {\r\n                            # StackPanel which contain checkboxes or other elements\r\n                            $checkbox = $item.Children | Where-Object { $_ -is [Windows.Controls.CheckBox] } | Select-Object -First 1\r\n\r\n                            if ($checkbox -and ($checkbox.Content -like \"*$SearchString*\" -or $checkbox.ToolTip -like \"*$SearchString*\")) {\r\n                                $item.Visibility = [Windows.Visibility]::Visible\r\n                                if ($categoryLabel) { $categoryLabel.Visibility = [Windows.Visibility]::Visible }\r\n                                $categoryVisible = $true\r\n                            } else {\r\n                                $item.Visibility = [Windows.Visibility]::Collapsed\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            # Set the visibility based on if any item matched\r\n            $categoryBorder.Visibility = if ($categoryVisible) { [Windows.Visibility]::Visible } else { [Windows.Visibility]::Collapsed }\r\n\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Get-LocalizedYesNo.ps1",
    "content": "function Get-LocalizedYesNo {\r\n    <#\r\n    .SYNOPSIS\r\n    This function runs choice.exe and captures its output to extract yes no in a localized Windows\r\n\r\n    .DESCRIPTION\r\n    The function retrieves the output of the command 'cmd /c \"choice <nul 2>nul\"' and converts the default output for Yes and No\r\n    in the localized format, such as \"Yes=<first character>, No=<second character>\".\r\n\r\n    .EXAMPLE\r\n    $yesNoArray = Get-LocalizedYesNo\r\n    Write-Host \"Yes=$($yesNoArray[0]), No=$($yesNoArray[1])\"\r\n    #>\r\n\r\n    # Run choice and capture its options as output\r\n    # The output shows the options for Yes and No as \"[Y,N]?\" in the (partially) localized format.\r\n    # eg. English: [Y,N]?\r\n    # Dutch: [Y,N]?\r\n    # German: [J,N]?\r\n    # French: [O,N]?\r\n    # Spanish: [S,N]?\r\n    # Italian: [S,N]?\r\n    # Russian: [Y,N]?\r\n\r\n    $line = cmd /c \"choice <nul 2>nul\"\r\n    $charactersArray = @()\r\n    $regexPattern = '([a-zA-Z])'\r\n    $charactersArray = [regex]::Matches($line, $regexPattern) | ForEach-Object { $_.Groups[1].Value }\r\n\r\n    Write-Debug \"According to takeown.exe local Yes is $charactersArray[0]\"\r\n    # Return the array of characters\r\n    return $charactersArray\r\n\r\n  }\r\n"
  },
  {
    "path": "functions/private/Get-WPFObjectName.ps1",
    "content": "function Get-WPFObjectName {\r\n    <#\r\n        .SYNOPSIS\r\n            This is a helper function that generates an objectname with the prefix WPF that can be used as a Powershell Variable after compilation.\r\n            To achieve this, all characters that are not a-z, A-Z or 0-9 are simply removed from the name.\r\n\r\n        .PARAMETER type\r\n            The type of object for which the name should be generated. (e.g. Label, Button, CheckBox...)\r\n\r\n        .PARAMETER name\r\n            The name or description to be used for the object. (invalid characters are removed)\r\n\r\n        .OUTPUTS\r\n            A string that can be used as a object/variable name in powershell.\r\n            For example: WPFLabelMicrosoftTools\r\n\r\n        .EXAMPLE\r\n            Get-WPFObjectName -type Label -name \"Microsoft Tools\"\r\n    #>\r\n\r\n    param(\r\n        [Parameter(Mandatory, position=0)]\r\n        [string]$type,\r\n\r\n        [Parameter(position=1)]\r\n        [string]$name\r\n    )\r\n\r\n    $Output = $(\"WPF\"+$type+$name) -replace '[^a-zA-Z0-9]', ''\r\n    return $Output\r\n}\r\n"
  },
  {
    "path": "functions/private/Get-WinUtilInstallerProcess.ps1",
    "content": "function Get-WinUtilInstallerProcess {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Checks if the given process is running\r\n\r\n    .PARAMETER Process\r\n        The process to check\r\n\r\n    .OUTPUTS\r\n        Boolean - True if the process is running\r\n\r\n    #>\r\n\r\n    param($Process)\r\n\r\n    if ($Null -eq $Process) {\r\n        return $false\r\n    }\r\n    if (Get-Process -Id $Process.Id -ErrorAction SilentlyContinue) {\r\n        return $true\r\n    }\r\n    return $false\r\n}\r\n"
  },
  {
    "path": "functions/private/Get-WinUtilSelectedPackages.ps1",
    "content": "function Get-WinUtilSelectedPackages\r\n{\r\n     <#\r\n    .SYNOPSIS\r\n        Sorts given packages based on installer preference and availability.\r\n\r\n    .OUTPUTS\r\n        Hashtable. Key = Package Manager, Value = ArrayList of packages to install\r\n    #>\r\n    param (\r\n        [Parameter(Mandatory=$true)]\r\n        $PackageList,\r\n        [Parameter(Mandatory=$true)]\r\n        [PackageManagers]$Preference\r\n    )\r\n\r\n    if ($PackageList.count -eq 1) {\r\n        Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Indeterminate\" -value 0.01 -overlay \"logo\" }\r\n    } else {\r\n        Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Normal\" -value 0.01 -overlay \"logo\" }\r\n    }\r\n\r\n    $packages = [System.Collections.Hashtable]::new()\r\n    $packagesWinget = [System.Collections.ArrayList]::new()\r\n    $packagesChoco = [System.Collections.ArrayList]::new()\r\n    $packages[[PackageManagers]::Winget] = $packagesWinget\r\n    $packages[[PackageManagers]::Choco] = $packagesChoco\r\n\r\n    Write-Debug \"Checking packages using Preference '$($Preference)'\"\r\n\r\n    foreach ($package in $PackageList) {\r\n        switch ($Preference) {\r\n            \"Choco\" {\r\n                if ($package.choco -eq \"na\") {\r\n                    Write-Debug \"$($package.content) has no Choco value.\"\r\n                    $null = $packagesWinget.add($($package.winget))\r\n                    Write-Host \"Queueing $($package.winget) for Winget\"\r\n                } else {\r\n                    $null = $packagesChoco.add($package.choco)\r\n                    Write-Host \"Queueing $($package.choco) for Chocolatey\"\r\n                }\r\n                break\r\n            }\r\n            \"Winget\" {\r\n                if ($package.winget -eq \"na\") {\r\n                    Write-Debug \"$($package.content) has no Winget value.\"\r\n                    $null = $packagesChoco.add($package.choco)\r\n                    Write-Host \"Queueing $($package.choco) for Chocolatey\"\r\n                } else {\r\n                    $null = $packagesWinget.add($($package.winget))\r\n                    Write-Host \"Queueing $($package.winget) for Winget\"\r\n                }\r\n                break\r\n            }\r\n        }\r\n    }\r\n\r\n    return $packages\r\n}\r\n"
  },
  {
    "path": "functions/private/Get-WinUtilToggleStatus.ps1",
    "content": "Function Get-WinUtilToggleStatus {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Pulls the registry keys for the given toggle switch and checks whether the toggle should be checked or unchecked\r\n\r\n    .PARAMETER ToggleSwitch\r\n        The name of the toggle to check\r\n\r\n    .OUTPUTS\r\n        Boolean to set the toggle's status to\r\n\r\n    #>\r\n\r\n    Param($ToggleSwitch)\r\n\r\n    $ToggleSwitchReg = $sync.configs.tweaks.$ToggleSwitch.registry\r\n\r\n    try {\r\n        if (($ToggleSwitchReg.path -imatch \"hku\") -and !(Get-PSDrive -Name HKU -ErrorAction SilentlyContinue)) {\r\n            $null = (New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS)\r\n            if (Get-PSDrive -Name HKU -ErrorAction SilentlyContinue) {\r\n                Write-Debug \"HKU drive created successfully\"\r\n            } else {\r\n                Write-Debug \"Failed to create HKU drive\"\r\n            }\r\n        }\r\n    } catch {\r\n        Write-Error \"An error occurred regarding the HKU Drive: $_\"\r\n        return $false\r\n    }\r\n\r\n    if ($ToggleSwitchReg) {\r\n        $count = 0\r\n\r\n        foreach ($regentry in $ToggleSwitchReg) {\r\n            try {\r\n                if (!(Test-Path $regentry.Path)) {\r\n                    New-Item -Path $regentry.Path -Force | Out-Null\r\n                }\r\n                $regstate = (Get-ItemProperty -path $regentry.Path).$($regentry.Name)\r\n                if ($regstate -eq $regentry.Value) {\r\n                    $count += 1\r\n                    Write-Debug \"$($regentry.Name) is true (state: $regstate, value: $($regentry.Value), original: $($regentry.OriginalValue))\"\r\n                } else {\r\n                    Write-Debug \"$($regentry.Name) is false (state: $regstate, value: $($regentry.Value), original: $($regentry.OriginalValue))\"\r\n                }\r\n                if ($null -eq $regstate) {\r\n                    switch ($regentry.DefaultState) {\r\n                        \"true\" {\r\n                            $regstate = $regentry.Value\r\n                            $count += 1\r\n                        }\r\n                        \"false\" {\r\n                            $regstate = $regentry.OriginalValue\r\n                        }\r\n                        default {\r\n                            Write-Error \"Entry for $($regentry.Name) does not exist and no DefaultState is defined.\"\r\n                            $regstate = $regentry.OriginalValue\r\n                        }\r\n                    }\r\n                }\r\n            } catch {\r\n                Write-Error \"An unexpected error occurred: $_\"\r\n            }\r\n        }\r\n\r\n        if ($count -eq $ToggleSwitchReg.Count) {\r\n            Write-Debug \"$($ToggleSwitchReg.Name) is true (count: $count)\"\r\n            return $true\r\n        } else {\r\n            Write-Debug \"$($ToggleSwitchReg.Name) is false (count: $count)\"\r\n            return $false\r\n        }\r\n    } else {\r\n        return $false\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Get-WinUtilVariables.ps1",
    "content": "function Get-WinUtilVariables {\r\n\r\n    <#\r\n    .SYNOPSIS\r\n        Gets every form object of the provided type\r\n\r\n    .OUTPUTS\r\n        List containing every object that matches the provided type\r\n    #>\r\n    param (\r\n        [Parameter()]\r\n        [string[]]$Type\r\n    )\r\n    $keys = ($sync.keys).where{ $_ -like \"WPF*\" }\r\n    if ($Type) {\r\n        $output = $keys | ForEach-Object {\r\n            try {\r\n                $objType = $sync[\"$psitem\"].GetType().Name\r\n                if ($Type -contains $objType) {\r\n                    Write-Output $psitem\r\n                }\r\n            } catch {\r\n                <#I am here so errors don't get outputted for a couple variables that don't have the .GetType() attribute#>\r\n            }\r\n        }\r\n        return $output\r\n    }\r\n    return $keys\r\n}\r\n"
  },
  {
    "path": "functions/private/Hide-WPFInstallAppBusy.ps1",
    "content": "function Hide-WPFInstallAppBusy {\r\n    <#\r\n    .SYNOPSIS\r\n        Hides the busy overlay in the install app area of the WPF form.\r\n        This is used to indicate that an install or uninstall has finished.\r\n    #>\r\n    Invoke-WPFUIThread -ScriptBlock {\r\n        $sync.InstallAppAreaOverlay.Visibility = [Windows.Visibility]::Collapsed\r\n        $sync.InstallAppAreaBorder.IsEnabled = $true\r\n        $sync.InstallAppAreaScrollViewer.Effect.Radius = 0\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Initialize-InstallAppArea.ps1",
    "content": "    function Initialize-InstallAppArea {\r\n        <#\r\n            .SYNOPSIS\r\n                Creates a [Windows.Controls.ScrollViewer] containing a [Windows.Controls.ItemsControl] which is setup to use Virtualization to only load the visible elements for performance reasons.\r\n                This is used as the parent object for all category and app entries on the install tab\r\n                Used to as part of the Install Tab UI generation\r\n\r\n                Also creates an overlay with a progress bar and text to indicate that an install or uninstall is in progress\r\n\r\n            .PARAMETER TargetElement\r\n                The element to which the AppArea should be added\r\n\r\n        #>\r\n        param($TargetElement)\r\n        $targetGrid = $sync.Form.FindName($TargetElement)\r\n        $null = $targetGrid.Children.Clear()\r\n\r\n        # Create the outer Border for the aren where the apps will be placed\r\n        $Border = New-Object Windows.Controls.Border\r\n        $Border.VerticalAlignment = \"Stretch\"\r\n        $Border.SetResourceReference([Windows.Controls.Control]::StyleProperty, \"BorderStyle\")\r\n        $sync.InstallAppAreaBorder = $Border\r\n\r\n        # Add a ScrollViewer, because the ItemsControl does not support scrolling by itself\r\n        $scrollViewer = New-Object Windows.Controls.ScrollViewer\r\n        $scrollViewer.VerticalScrollBarVisibility = 'Auto'\r\n        $scrollViewer.HorizontalAlignment = 'Stretch'\r\n        $scrollViewer.VerticalAlignment = 'Stretch'\r\n        $scrollViewer.CanContentScroll = $true\r\n        $sync.InstallAppAreaScrollViewer = $scrollViewer\r\n        $Border.Child = $scrollViewer\r\n\r\n        # Initialize the Blur Effect for the ScrollViewer, which will be used to indicate that an install/uninstall is in progress\r\n        $blurEffect = New-Object Windows.Media.Effects.BlurEffect\r\n        $blurEffect.Radius = 0\r\n        $scrollViewer.Effect = $blurEffect\r\n\r\n        ## Create the ItemsControl, which will be the parent of all the app entries\r\n        $itemsControl = New-Object Windows.Controls.ItemsControl\r\n        $itemsControl.HorizontalAlignment = 'Stretch'\r\n        $itemsControl.VerticalAlignment = 'Stretch'\r\n        $scrollViewer.Content = $itemsControl\r\n\r\n        # Use WrapPanel to create dynamic columns based on AppEntryWidth and window width\r\n        $itemsPanelTemplate = New-Object Windows.Controls.ItemsPanelTemplate\r\n        $factory = New-Object Windows.FrameworkElementFactory ([Windows.Controls.WrapPanel])\r\n        $factory.SetValue([Windows.Controls.WrapPanel]::OrientationProperty, [Windows.Controls.Orientation]::Horizontal)\r\n        $factory.SetValue([Windows.Controls.WrapPanel]::HorizontalAlignmentProperty, [Windows.HorizontalAlignment]::Left)\r\n        $itemsPanelTemplate.VisualTree = $factory\r\n        $itemsControl.ItemsPanel = $itemsPanelTemplate\r\n\r\n        # Add the Border containing the App Area to the target Grid\r\n        $targetGrid.Children.Add($Border) | Out-Null\r\n\r\n        $overlay = New-Object Windows.Controls.Border\r\n        $overlay.CornerRadius = New-Object Windows.CornerRadius(10)\r\n        $overlay.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, \"AppInstallOverlayBackgroundColor\")\r\n        $overlay.Visibility = [Windows.Visibility]::Collapsed\r\n\r\n        # Also add the overlay to the target Grid on top of the App Area\r\n        $targetGrid.Children.Add($overlay) | Out-Null\r\n        $sync.InstallAppAreaOverlay = $overlay\r\n\r\n        $overlayText = New-Object Windows.Controls.TextBlock\r\n        $overlayText.Text = \"Installing apps...\"\r\n        $overlayText.HorizontalAlignment = 'Center'\r\n        $overlayText.VerticalAlignment = 'Center'\r\n        $overlayText.SetResourceReference([Windows.Controls.TextBlock]::ForegroundProperty, \"MainForegroundColor\")\r\n        $overlayText.Background = \"Transparent\"\r\n        $overlayText.SetResourceReference([Windows.Controls.TextBlock]::FontSizeProperty, \"HeaderFontSize\")\r\n        $overlayText.SetResourceReference([Windows.Controls.TextBlock]::FontFamilyProperty, \"MainFontFamily\")\r\n        $overlayText.SetResourceReference([Windows.Controls.TextBlock]::FontWeightProperty, \"MainFontWeight\")\r\n        $overlayText.SetResourceReference([Windows.Controls.TextBlock]::MarginProperty, \"MainMargin\")\r\n        $sync.InstallAppAreaOverlayText = $overlayText\r\n\r\n        $progressbar = New-Object Windows.Controls.ProgressBar\r\n        $progressbar.Name = \"ProgressBar\"\r\n        $progressbar.Width = 250\r\n        $progressbar.Height = 50\r\n        $sync.ProgressBar = $progressbar\r\n\r\n        # Add a TextBlock overlay for the progress bar text\r\n        $progressBarTextBlock = New-Object Windows.Controls.TextBlock\r\n        $progressBarTextBlock.Name = \"progressBarTextBlock\"\r\n        $progressBarTextBlock.FontWeight = [Windows.FontWeights]::Bold\r\n        $progressBarTextBlock.FontSize = 16\r\n        $progressBarTextBlock.Width = $progressbar.Width\r\n        $progressBarTextBlock.Height = $progressbar.Height\r\n        $progressBarTextBlock.SetResourceReference([Windows.Controls.TextBlock]::ForegroundProperty, \"ProgressBarTextColor\")\r\n        $progressBarTextBlock.TextTrimming = \"CharacterEllipsis\"\r\n        $progressBarTextBlock.Background = \"Transparent\"\r\n        $sync.progressBarTextBlock = $progressBarTextBlock\r\n\r\n        # Create a Grid to overlay the text on the progress bar\r\n        $progressGrid = New-Object Windows.Controls.Grid\r\n        $progressGrid.Width = $progressbar.Width\r\n        $progressGrid.Height = $progressbar.Height\r\n        $progressGrid.Margin = \"0,10,0,10\"\r\n        $progressGrid.Children.Add($progressbar) | Out-Null\r\n        $progressGrid.Children.Add($progressBarTextBlock) | Out-Null\r\n\r\n        $overlayStackPanel = New-Object Windows.Controls.StackPanel\r\n        $overlayStackPanel.Orientation = \"Vertical\"\r\n        $overlayStackPanel.HorizontalAlignment = 'Center'\r\n        $overlayStackPanel.VerticalAlignment = 'Center'\r\n        $overlayStackPanel.Children.Add($overlayText) | Out-Null\r\n        $overlayStackPanel.Children.Add($progressGrid) | Out-Null\r\n\r\n        $overlay.Child = $overlayStackPanel\r\n\r\n        return $itemsControl\r\n    }\r\n"
  },
  {
    "path": "functions/private/Initialize-InstallAppEntry.ps1",
    "content": "function Initialize-InstallAppEntry {\r\n    <#\r\n        .SYNOPSIS\r\n            Creates the app entry to be placed on the install tab for a given app\r\n            Used to as part of the Install Tab UI generation\r\n        .PARAMETER TargetElement\r\n            The Element into which the Apps should be placed\r\n        .PARAMETER appKey\r\n            The Key of the app inside the $sync.configs.applicationsHashtable\r\n    #>\r\n        param(\r\n            [Windows.Controls.WrapPanel]$TargetElement,\r\n            $appKey\r\n        )\r\n\r\n        # Create the outer Border for the application type\r\n        $border = New-Object Windows.Controls.Border\r\n        $border.Style = $sync.Form.Resources.AppEntryBorderStyle\r\n        $border.Tag = $appKey\r\n        $border.ToolTip = $Apps.$appKey.description\r\n        $border.Add_MouseLeftButtonUp({\r\n            $childCheckbox = ($this.Child | Where-Object {$_.Template.TargetType -eq [System.Windows.Controls.Checkbox]})[0]\r\n            $childCheckBox.isChecked = -not $childCheckbox.IsChecked\r\n        })\r\n        $border.Add_MouseEnter({\r\n            if (($sync.$($this.Tag).IsChecked) -eq $false) {\r\n                $this.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, \"AppInstallHighlightedColor\")\r\n            }\r\n        })\r\n        $border.Add_MouseLeave({\r\n            if (($sync.$($this.Tag).IsChecked) -eq $false) {\r\n                $this.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, \"AppInstallUnselectedColor\")\r\n            }\r\n        })\r\n        $border.Add_MouseRightButtonUp({\r\n            # Store the selected app in a global variable so it can be used in the popup\r\n            $sync.appPopupSelectedApp = $this.Tag\r\n            # Set the popup position to the current mouse position\r\n            $sync.appPopup.PlacementTarget = $this\r\n            $sync.appPopup.IsOpen = $true\r\n        })\r\n\r\n        $checkBox = New-Object Windows.Controls.CheckBox\r\n        # Sanitize the name for WPF\r\n        $checkBox.Name = $appKey -replace '-', '_'\r\n        # Store the original appKey in Tag\r\n        $checkBox.Tag = $appKey\r\n        $checkbox.Style = $sync.Form.Resources.AppEntryCheckboxStyle\r\n        $checkbox.Add_Checked({\r\n            Invoke-WPFSelectedCheckboxesUpdate -type \"Add\" -checkboxName $this.Parent.Tag\r\n            $borderElement = $this.Parent\r\n            $borderElement.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, \"AppInstallSelectedColor\")\r\n        })\r\n\r\n        $checkbox.Add_Unchecked({\r\n            Invoke-WPFSelectedCheckboxesUpdate -type \"Remove\" -checkboxName $this.Parent.Tag\r\n            $borderElement = $this.Parent\r\n            $borderElement.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, \"AppInstallUnselectedColor\")\r\n        })\r\n\r\n        # Create the TextBlock for the application name\r\n        $appName = New-Object Windows.Controls.TextBlock\r\n        $appName.Style = $sync.Form.Resources.AppEntryNameStyle\r\n        $appName.Text = $Apps.$appKey.content\r\n\r\n        # Change color to Green if FOSS\r\n        if ($Apps.$appKey.foss -eq $true) {\r\n            $appName.SetResourceReference([Windows.Controls.Control]::ForegroundProperty, \"FOSSColor\")\r\n            $appName.FontWeight = \"Bold\"\r\n        }\r\n\r\n        # Add the name to the Checkbox\r\n        $checkBox.Content = $appName\r\n\r\n        # Add accessibility properties to make the elements screen reader friendly\r\n        $checkBox.SetValue([Windows.Automation.AutomationProperties]::NameProperty, $Apps.$appKey.content)\r\n        $border.SetValue([Windows.Automation.AutomationProperties]::NameProperty, $Apps.$appKey.content)\r\n\r\n        $border.Child = $checkBox\r\n        # Add the border to the corresponding Category\r\n        $TargetElement.Children.Add($border) | Out-Null\r\n        return $checkbox\r\n    }\r\n"
  },
  {
    "path": "functions/private/Initialize-InstallCategoryAppList.ps1",
    "content": "function Initialize-InstallCategoryAppList {\r\n    <#\r\n        .SYNOPSIS\r\n            Clears the Target Element and sets up a \"Loading\" message. This is done, because loading of all apps can take a bit of time in some scenarios\r\n            Iterates through all Categories and Apps and adds them to the UI\r\n            Used to as part of the Install Tab UI generation\r\n        .PARAMETER TargetElement\r\n            The Element into which the Categories and Apps should be placed\r\n        .PARAMETER Apps\r\n            The Hashtable of Apps to be added to the UI\r\n            The Categories are also extracted from the Apps Hashtable\r\n\r\n    #>\r\n        param(\r\n            $TargetElement,\r\n            $Apps\r\n        )\r\n\r\n        # Pre-group apps by category\r\n        $appsByCategory = @{}\r\n        foreach ($appKey in $Apps.Keys) {\r\n            $category = $Apps.$appKey.Category\r\n            if (-not $appsByCategory.ContainsKey($category)) {\r\n                $appsByCategory[$category] = @()\r\n            }\r\n            $appsByCategory[$category] += $appKey\r\n        }\r\n        foreach ($category in $($appsByCategory.Keys | Sort-Object)) {\r\n            # Create a container for category label + apps\r\n            $categoryContainer = New-Object Windows.Controls.StackPanel\r\n            $categoryContainer.Orientation = \"Vertical\"\r\n            $categoryContainer.Margin = New-Object Windows.Thickness(0, 0, 0, 0)\r\n            $categoryContainer.HorizontalAlignment = [Windows.HorizontalAlignment]::Stretch\r\n\r\n            # Bind Width to the ItemsControl's ActualWidth to force full-row layout in WrapPanel\r\n            $binding = New-Object Windows.Data.Binding\r\n            $binding.Path = New-Object Windows.PropertyPath(\"ActualWidth\")\r\n            $binding.RelativeSource = New-Object Windows.Data.RelativeSource([Windows.Data.RelativeSourceMode]::FindAncestor, [Windows.Controls.ItemsControl], 1)\r\n            [void][Windows.Data.BindingOperations]::SetBinding($categoryContainer, [Windows.FrameworkElement]::WidthProperty, $binding)\r\n\r\n            # Add category label to container\r\n            $toggleButton = New-Object Windows.Controls.Label\r\n            $toggleButton.Content = \"- $Category\"\r\n            $toggleButton.Tag = \"CategoryToggleButton\"\r\n            $toggleButton.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, \"HeaderFontSize\")\r\n            $toggleButton.SetResourceReference([Windows.Controls.Control]::FontFamilyProperty, \"HeaderFontFamily\")\r\n            $toggleButton.SetResourceReference([Windows.Controls.Control]::ForegroundProperty, \"LabelboxForegroundColor\")\r\n            $toggleButton.Cursor = [System.Windows.Input.Cursors]::Hand\r\n            $toggleButton.HorizontalAlignment = [Windows.HorizontalAlignment]::Stretch\r\n            $sync.$Category = $toggleButton\r\n\r\n            # Add click handler to toggle category visibility\r\n            $toggleButton.Add_MouseLeftButtonUp({\r\n                param($sender, $e)\r\n\r\n                # Find the parent StackPanel (categoryContainer)\r\n                $categoryContainer = $sender.Parent\r\n                if ($categoryContainer -and $categoryContainer.Children.Count -ge 2) {\r\n                    # The WrapPanel is the second child\r\n                    $wrapPanel = $categoryContainer.Children[1]\r\n\r\n                    # Toggle visibility\r\n                    if ($wrapPanel.Visibility -eq [Windows.Visibility]::Visible) {\r\n                        $wrapPanel.Visibility = [Windows.Visibility]::Collapsed\r\n                        # Change - to +\r\n                        $sender.Content = $sender.Content -replace \"^- \", \"+ \"\r\n                    } else {\r\n                        $wrapPanel.Visibility = [Windows.Visibility]::Visible\r\n                        # Change + to -\r\n                        $sender.Content = $sender.Content -replace \"^\\+ \", \"- \"\r\n                    }\r\n                }\r\n            })\r\n\r\n            $null = $categoryContainer.Children.Add($toggleButton)\r\n\r\n            # Add wrap panel for apps to container\r\n            $wrapPanel = New-Object Windows.Controls.WrapPanel\r\n            $wrapPanel.Orientation = \"Horizontal\"\r\n            $wrapPanel.HorizontalAlignment = \"Left\"\r\n            $wrapPanel.VerticalAlignment = \"Top\"\r\n            $wrapPanel.Margin = New-Object Windows.Thickness(0, 0, 0, 0)\r\n            $wrapPanel.Visibility = [Windows.Visibility]::Visible\r\n            $wrapPanel.Tag = \"CategoryWrapPanel_$category\"\r\n\r\n            $null = $categoryContainer.Children.Add($wrapPanel)\r\n\r\n            # Add the entire category container to the target element\r\n            $null = $TargetElement.Items.Add($categoryContainer)\r\n\r\n            # Add apps to the wrap panel\r\n            $appsByCategory[$category] | Sort-Object | ForEach-Object {\r\n                $sync.$_ = $(Initialize-InstallAppEntry -TargetElement $wrapPanel -AppKey $_)\r\n            }\r\n        }\r\n    }\r\n"
  },
  {
    "path": "functions/private/Install-WinUtilChoco.ps1",
    "content": "function Install-WinUtilChoco {\r\n\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Installs Chocolatey if it is not already installed\r\n\r\n    #>\r\n    if ((Test-WinUtilPackageManager -choco) -eq \"installed\") {\r\n        return\r\n    }\r\n\r\n    Write-Host \"Chocolatey is not installed, installing now.\"\r\n    Invoke-WebRequest -Uri https://community.chocolatey.org/install.ps1 -UseBasicParsing | Invoke-Expression\r\n}\r\n"
  },
  {
    "path": "functions/private/Install-WinUtilProgramChoco.ps1",
    "content": "function Install-WinUtilProgramChoco {\r\n    <#\r\n    .SYNOPSIS\r\n    Manages the installation or uninstallation of a list of Chocolatey packages.\r\n\r\n    .PARAMETER Programs\r\n    A string array containing the programs to be installed or uninstalled.\r\n\r\n    .PARAMETER Action\r\n    Specifies the action to perform: \"Install\" or \"Uninstall\". The default value is \"Install\".\r\n\r\n    .DESCRIPTION\r\n    This function processes a list of programs to be managed using Chocolatey. Depending on the specified action, it either installs or uninstalls each program in the list, updating the taskbar progress accordingly. After all operations are completed, temporary output files are cleaned up.\r\n\r\n    .EXAMPLE\r\n    Install-WinUtilProgramChoco -Programs @(\"7zip\",\"chrome\") -Action \"Uninstall\"\r\n    #>\r\n\r\n    param(\r\n        [Parameter(Mandatory, Position = 0)]\r\n        [string[]]$Programs,\r\n\r\n        [Parameter(Position = 1)]\r\n        [String]$Action = \"Install\"\r\n    )\r\n\r\n    function Initialize-OutputFile {\r\n        <#\r\n        .SYNOPSIS\r\n        Initializes an output file by removing any existing file and creating a new, empty file at the specified path.\r\n\r\n        .PARAMETER filePath\r\n        The full path to the file to be initialized.\r\n\r\n        .DESCRIPTION\r\n        This function ensures that the specified file is reset by removing any existing file at the provided path and then creating a new, empty file. It is useful when preparing a log or output file for subsequent operations.\r\n\r\n        .EXAMPLE\r\n        Initialize-OutputFile -filePath \"C:\\temp\\output.txt\"\r\n        #>\r\n\r\n        param ($filePath)\r\n        Remove-Item -Path $filePath -Force -ErrorAction SilentlyContinue\r\n        New-Item -ItemType File -Path $filePath | Out-Null\r\n    }\r\n\r\n    function Invoke-ChocoCommand {\r\n        <#\r\n        .SYNOPSIS\r\n        Executes a Chocolatey command with the specified arguments and returns the exit code.\r\n\r\n        .PARAMETER arguments\r\n        The arguments to be passed to the Chocolatey command.\r\n\r\n        .DESCRIPTION\r\n        This function runs a specified Chocolatey command by passing the provided arguments to the `choco` executable. It waits for the process to complete and then returns the exit code, allowing the caller to determine success or failure based on the exit code.\r\n\r\n        .RETURNS\r\n        [int]\r\n        The exit code of the Chocolatey command.\r\n\r\n        .EXAMPLE\r\n        $exitCode = Invoke-ChocoCommand -arguments \"install 7zip -y\"\r\n        #>\r\n\r\n        param ($arguments)\r\n        return (Start-Process -FilePath \"choco\" -ArgumentList $arguments -Wait -PassThru).ExitCode\r\n    }\r\n\r\n    function Test-UpgradeNeeded {\r\n        <#\r\n        .SYNOPSIS\r\n        Checks if an upgrade is needed for a Chocolatey package based on the content of a log file.\r\n\r\n        .PARAMETER filePath\r\n        The path to the log file that contains the output of a Chocolatey install command.\r\n\r\n        .DESCRIPTION\r\n        This function reads the specified log file and checks for keywords that indicate whether an upgrade is needed. It returns a boolean value indicating whether the terms \"reinstall\" or \"already installed\" are present, which suggests that the package might need an upgrade.\r\n\r\n        .RETURNS\r\n        [bool]\r\n        True if the log file indicates that an upgrade is needed; otherwise, false.\r\n\r\n        .EXAMPLE\r\n        $isUpgradeNeeded = Test-UpgradeNeeded -filePath \"C:\\temp\\install-output.txt\"\r\n        #>\r\n\r\n        param ($filePath)\r\n        return Get-Content -Path $filePath | Select-String -Pattern \"reinstall|already installed\" -Quiet\r\n    }\r\n\r\n    function Update-TaskbarProgress {\r\n        <#\r\n        .SYNOPSIS\r\n        Updates the taskbar progress based on the current installation progress.\r\n\r\n        .PARAMETER currentIndex\r\n        The current index of the program being installed or uninstalled.\r\n\r\n        .PARAMETER totalPrograms\r\n        The total number of programs to be installed or uninstalled.\r\n\r\n        .DESCRIPTION\r\n        This function calculates the progress of the installation or uninstallation process and updates the taskbar accordingly. The taskbar is set to \"Normal\" if all programs have been processed, otherwise, it is set to \"Error\" as a placeholder.\r\n\r\n        .EXAMPLE\r\n        Update-TaskbarProgress -currentIndex 3 -totalPrograms 10\r\n        #>\r\n\r\n        param (\r\n            [int]$currentIndex,\r\n            [int]$totalPrograms\r\n        )\r\n        $progressState = if ($currentIndex -eq $totalPrograms) { \"Normal\" } else { \"Error\" }\r\n        Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state $progressState -value ($currentIndex / $totalPrograms) }\r\n    }\r\n\r\n    function Install-ChocoPackage {\r\n        <#\r\n        .SYNOPSIS\r\n        Installs a Chocolatey package and optionally upgrades it if needed.\r\n\r\n        .PARAMETER Program\r\n        A string containing the name of the Chocolatey package to be installed.\r\n\r\n        .PARAMETER currentIndex\r\n        The current index of the program in the list of programs to be managed.\r\n\r\n        .PARAMETER totalPrograms\r\n        The total number of programs to be installed.\r\n\r\n        .DESCRIPTION\r\n        This function installs a Chocolatey package by running the `choco install` command. If the installation output indicates that an upgrade might be needed, the function will attempt to upgrade the package. The taskbar progress is updated after each package is processed.\r\n\r\n        .EXAMPLE\r\n        Install-ChocoPackage -Program $Program -currentIndex 0 -totalPrograms 5\r\n        #>\r\n\r\n        param (\r\n            [string]$Program,\r\n            [int]$currentIndex,\r\n            [int]$totalPrograms\r\n        )\r\n\r\n        $installOutputFile = \"$env:TEMP\\Install-WinUtilProgramChoco.install-command.output.txt\"\r\n        Initialize-OutputFile $installOutputFile\r\n\r\n        Write-Host \"Starting installation of $Program with Chocolatey.\"\r\n\r\n        try {\r\n            $installStatusCode = Invoke-ChocoCommand \"install $Program -y --log-file $installOutputFile\"\r\n            if ($installStatusCode -eq 0) {\r\n\r\n                if (Test-UpgradeNeeded $installOutputFile) {\r\n                    $upgradeStatusCode = Invoke-ChocoCommand \"upgrade $Program -y\"\r\n                    Write-Host \"$Program was\" $(if ($upgradeStatusCode -eq 0) { \"upgraded successfully.\" } else { \"not upgraded.\" })\r\n                }\r\n                else {\r\n                    Write-Host \"$Program installed successfully.\"\r\n                }\r\n            }\r\n            else {\r\n                Write-Host \"Failed to install $Program.\"\r\n            }\r\n        }\r\n        catch {\r\n            Write-Host \"Failed to install $Program due to an error: $_\"\r\n        }\r\n        finally {\r\n            Update-TaskbarProgress $currentIndex $totalPrograms\r\n        }\r\n    }\r\n\r\n    function Uninstall-ChocoPackage {\r\n        <#\r\n        .SYNOPSIS\r\n        Uninstalls a Chocolatey package and any related metapackages.\r\n\r\n        .PARAMETER Program\r\n        A string containing the name of the Chocolatey package to be uninstalled.\r\n\r\n        .PARAMETER currentIndex\r\n        The current index of the program in the list of programs to be managed.\r\n\r\n        .PARAMETER totalPrograms\r\n        The total number of programs to be uninstalled.\r\n\r\n        .DESCRIPTION\r\n        This function uninstalls a Chocolatey package and any related metapackages (e.g., .install or .portable variants). It updates the taskbar progress after processing each package.\r\n\r\n        .EXAMPLE\r\n        Uninstall-ChocoPackage -Program $Program -currentIndex 0 -totalPrograms 5\r\n        #>\r\n\r\n        param (\r\n            [string]$Program,\r\n            [int]$currentIndex,\r\n            [int]$totalPrograms\r\n        )\r\n\r\n        $uninstallOutputFile = \"$env:TEMP\\Install-WinUtilProgramChoco.uninstall-command.output.txt\"\r\n        Initialize-OutputFile $uninstallOutputFile\r\n\r\n        Write-Host \"Searching for metapackages of $Program (.install or .portable)\"\r\n        $chocoPackages = ((choco list | Select-String -Pattern \"$Program(\\.install|\\.portable)?\").Matches.Value) -join \" \"\r\n        if ($chocoPackages) {\r\n            Write-Host \"Starting uninstallation of $chocoPackages with Chocolatey.\"\r\n            try {\r\n                $uninstallStatusCode = Invoke-ChocoCommand \"uninstall $chocoPackages -y\"\r\n                Write-Host \"$Program\" $(if ($uninstallStatusCode -eq 0) { \"uninstalled successfully.\" } else { \"failed to uninstall.\" })\r\n            }\r\n            catch {\r\n                Write-Host \"Failed to uninstall $Program due to an error: $_\"\r\n            }\r\n            finally {\r\n                Update-TaskbarProgress $currentIndex $totalPrograms\r\n            }\r\n        }\r\n        else {\r\n            Write-Host \"$Program is not installed.\"\r\n        }\r\n    }\r\n\r\n    $totalPrograms = $Programs.Count\r\n    if ($totalPrograms -le 0) {\r\n        throw \"Parameter 'Programs' must have at least one item.\"\r\n    }\r\n\r\n    Write-Host \"===========================================\"\r\n    Write-Host \"--   Configuring Chocolatey packages   ---\"\r\n    Write-Host \"===========================================\"\r\n\r\n    for ($currentIndex = 0; $currentIndex -lt $totalPrograms; $currentIndex++) {\r\n        $Program = $Programs[$currentIndex]\r\n        Set-WinUtilProgressBar -label \"$Action $($Program)\" -percent ($currentIndex / $totalPrograms * 100)\r\n        Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -value ($currentIndex / $totalPrograms)}\r\n\r\n        switch ($Action) {\r\n            \"Install\" {\r\n                Install-ChocoPackage -Program $Program -currentIndex $currentIndex -totalPrograms $totalPrograms\r\n            }\r\n            \"Uninstall\" {\r\n                Uninstall-ChocoPackage -Program $Program -currentIndex $currentIndex -totalPrograms $totalPrograms\r\n            }\r\n            default {\r\n                throw \"Invalid action parameter value: '$Action'.\"\r\n            }\r\n        }\r\n    }\r\n    Set-WinUtilProgressBar -label \"$($Action)ation done\" -percent 100\r\n    # Cleanup Output Files\r\n    $outputFiles = @(\"$env:TEMP\\Install-WinUtilProgramChoco.install-command.output.txt\", \"$env:TEMP\\Install-WinUtilProgramChoco.uninstall-command.output.txt\")\r\n    foreach ($filePath in $outputFiles) {\r\n        Remove-Item -Path $filePath -Force -ErrorAction SilentlyContinue\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "functions/private/Install-WinUtilProgramWinget.ps1",
    "content": "Function Install-WinUtilProgramWinget {\r\n    <#\r\n    .SYNOPSIS\r\n    Runs the designated action on the provided programs using Winget\r\n\r\n    .PARAMETER Programs\r\n    A list of programs to process\r\n\r\n    .PARAMETER action\r\n    The action to perform on the programs, can be either 'Install' or 'Uninstall'\r\n\r\n    .NOTES\r\n    The triple quotes are required any time you need a \" in a normal script block.\r\n    The winget Return codes are documented here: https://github.com/microsoft/winget-cli/blob/master/doc/windows/package-actionr/winget/returnCodes.md\r\n    #>\r\n\r\n    param(\r\n        [Parameter(Mandatory, Position=0)]$Programs,\r\n\r\n        [Parameter(Mandatory, Position=1)]\r\n        [ValidateSet(\"Install\", \"Uninstall\")]\r\n        [String]$Action\r\n    )\r\n\r\n    Function Invoke-Winget {\r\n    <#\r\n    .SYNOPSIS\r\n    Invokes the winget.exe with the provided arguments and return the exit code\r\n\r\n    .PARAMETER wingetId\r\n    The Id of the Program that Winget should Install/Uninstall\r\n\r\n    .NOTES\r\n    Invoke Winget uses the public variable $Action defined outside the function to determine if a Program should be installed or removed\r\n    #>\r\n        param (\r\n            [string]$wingetId\r\n        )\r\n\r\n        $commonArguments = \"--id $wingetId --silent\"\r\n        $arguments = if ($Action -eq \"Install\") {\r\n            \"install $commonArguments --accept-source-agreements --accept-package-agreements --source winget\"\r\n        } else {\r\n            \"uninstall $commonArguments --source winget\"\r\n        }\r\n\r\n        $processParams = @{\r\n            FilePath = \"winget\"\r\n            ArgumentList = $arguments\r\n            Wait = $true\r\n            PassThru = $true\r\n            NoNewWindow = $true\r\n        }\r\n\r\n        return (Start-Process @processParams).ExitCode\r\n    }\r\n\r\n    Function Invoke-Install {\r\n    <#\r\n    .SYNOPSIS\r\n    Contains the Install Logic and return code handling from winget\r\n\r\n    .PARAMETER Program\r\n    The Winget ID of the Program that should be installed\r\n    #>\r\n        param (\r\n            [string]$Program\r\n        )\r\n        $status = Invoke-Winget -wingetId $Program\r\n        if ($status -eq 0) {\r\n            Write-Host \"$($Program) installed successfully.\"\r\n            return $true\r\n        } elseif ($status -eq -1978335189) {\r\n            Write-Host \"$($Program) No applicable update found\"\r\n            return $true\r\n        }\r\n\r\n        Write-Host \"Failed to install $($Program).\"\r\n        return $false\r\n    }\r\n\r\n    Function Invoke-Uninstall {\r\n        <#\r\n        .SYNOPSIS\r\n        Contains the Uninstall Logic and return code handling from winget\r\n\r\n        .PARAMETER Program\r\n        The Winget ID of the Program that should be uninstalled\r\n        #>\r\n        param (\r\n            [string]$Program\r\n        )\r\n\r\n        try {\r\n            $status = Invoke-Winget -wingetId $Program\r\n            if ($status -eq 0) {\r\n                Write-Host \"$($Program) uninstalled successfully.\"\r\n                return $true\r\n            } else {\r\n                Write-Host \"Failed to uninstall $($Program).\"\r\n                return $false\r\n            }\r\n        } catch {\r\n            Write-Host \"Failed to uninstall $($Program) due to an error: $_\"\r\n            return $false\r\n        }\r\n    }\r\n\r\n    $count = $Programs.Count\r\n    $failedPackages = @()\r\n\r\n    Write-Host \"===========================================\"\r\n    Write-Host \"--    Configuring winget packages       ---\"\r\n    Write-Host \"===========================================\"\r\n\r\n    for ($i = 0; $i -lt $count; $i++) {\r\n        $Program = $Programs[$i]\r\n        $result = $false\r\n        Set-WinUtilProgressBar -label \"$Action $($Program)\" -percent ($i / $count * 100)\r\n        Invoke-WPFUIThread -ScriptBlock{ Set-WinUtilTaskbaritem -value ($i / $count)}\r\n\r\n        $result = switch ($Action) {\r\n            \"Install\" {Invoke-Install -Program $Program}\r\n            \"Uninstall\" {Invoke-Uninstall -Program $Program}\r\n            default {throw \"[Install-WinUtilProgramWinget] Invalid action: $Action\"}\r\n        }\r\n\r\n        if (-not $result) {\r\n            $failedPackages += $Program\r\n        }\r\n    }\r\n\r\n    Set-WinUtilProgressBar -label \"$($Action)ation done\" -percent 100\r\n    return $failedPackages\r\n}\r\n"
  },
  {
    "path": "functions/private/Install-WinUtilWinget.ps1",
    "content": "function Install-WinUtilWinget {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Installs Winget if not already installed.\r\n\r\n    .DESCRIPTION\r\n        installs winget if needed\r\n    #>\r\n    if ((Test-WinUtilPackageManager -winget) -eq \"installed\") {\r\n        return\r\n    }\r\n\r\n    Write-Host \"Winget is not Installed. Installing.\" -ForegroundColor Red\r\n    Set-PSRepository -Name PSGallery -InstallationPolicy Trusted\r\n\r\n    Install-PackageProvider -Name NuGet -Force\r\n    Install-Module Microsoft.WinGet.Client -Force\r\n    Import-Module Microsoft.WinGet.Client\r\n    Repair-WinGetPackageManager\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilAssets.ps1",
    "content": "function Invoke-WinUtilAssets {\r\n  param (\r\n      $type,\r\n      $Size,\r\n      [switch]$render\r\n  )\r\n\r\n  # Create the Viewbox and set its size\r\n  $LogoViewbox = New-Object Windows.Controls.Viewbox\r\n  $LogoViewbox.Width = $Size\r\n  $LogoViewbox.Height = $Size\r\n\r\n  # Create a Canvas to hold the paths\r\n  $canvas = New-Object Windows.Controls.Canvas\r\n  $canvas.Width = 100\r\n  $canvas.Height = 100\r\n\r\n  # Define a scale factor for the content inside the Canvas\r\n  $scaleFactor = $Size / 100\r\n\r\n  # Apply a scale transform to the Canvas content\r\n  $scaleTransform = New-Object Windows.Media.ScaleTransform($scaleFactor, $scaleFactor)\r\n  $canvas.LayoutTransform = $scaleTransform\r\n\r\n  switch ($type) {\r\n      'logo' {\r\n          $LogoPathData1 = @\"\r\nM 18.00,14.00\r\nC 18.00,14.00 45.00,27.74 45.00,27.74\r\n45.00,27.74 57.40,34.63 57.40,34.63\r\n57.40,34.63 59.00,43.00 59.00,43.00\r\n59.00,43.00 59.00,83.00 59.00,83.00\r\n55.35,81.66 46.99,77.79 44.72,74.79\r\n41.17,70.10 42.01,59.80 42.00,54.00\r\n42.00,51.62 42.20,48.29 40.98,46.21\r\n38.34,41.74 25.78,38.60 21.28,33.79\r\n16.81,29.02 18.00,20.20 18.00,14.00 Z\r\n\"@\r\n          $LogoPath1 = New-Object Windows.Shapes.Path\r\n          $LogoPath1.Data = [Windows.Media.Geometry]::Parse($LogoPathData1)\r\n          $LogoPath1.Fill = [System.Windows.Media.BrushConverter]::new().ConvertFromString(\"#0567ff\")\r\n\r\n          $LogoPathData2 = @\"\r\nM 107.00,14.00\r\nC 109.01,19.06 108.93,30.37 104.66,34.21\r\n100.47,37.98 86.38,43.10 84.60,47.21\r\n83.94,48.74 84.01,51.32 84.00,53.00\r\n83.97,57.04 84.46,68.90 83.26,72.00\r\n81.06,77.70 72.54,81.42 67.00,83.00\r\n67.00,83.00 67.00,43.00 67.00,43.00\r\n67.00,43.00 67.99,35.63 67.99,35.63\r\n67.99,35.63 80.00,28.26 80.00,28.26\r\n80.00,28.26 107.00,14.00 107.00,14.00 Z\r\n\"@\r\n          $LogoPath2 = New-Object Windows.Shapes.Path\r\n          $LogoPath2.Data = [Windows.Media.Geometry]::Parse($LogoPathData2)\r\n          $LogoPath2.Fill = [System.Windows.Media.BrushConverter]::new().ConvertFromString(\"#0567ff\")\r\n\r\n          $LogoPathData3 = @\"\r\nM 19.00,46.00\r\nC 21.36,47.14 28.67,50.71 30.01,52.63\r\n31.17,54.30 30.99,57.04 31.00,59.00\r\n31.04,65.41 30.35,72.16 33.56,78.00\r\n38.19,86.45 46.10,89.04 54.00,93.31\r\n56.55,94.69 60.10,97.20 63.00,97.22\r\n65.50,97.24 68.77,95.36 71.00,94.25\r\n76.42,91.55 84.51,87.78 88.82,83.68\r\n94.56,78.20 95.96,70.59 96.00,63.00\r\n96.01,60.24 95.59,54.63 97.02,52.39\r\n98.80,49.60 103.95,47.87 107.00,47.00\r\n107.00,47.00 107.00,67.00 107.00,67.00\r\n106.90,87.69 96.10,93.85 80.00,103.00\r\n76.51,104.98 66.66,110.67 63.00,110.52\r\n60.33,110.41 55.55,107.53 53.00,106.25\r\n46.21,102.83 36.63,98.57 31.04,93.68\r\n16.88,81.28 19.00,62.88 19.00,46.00 Z\r\n\"@\r\n          $LogoPath3 = New-Object Windows.Shapes.Path\r\n          $LogoPath3.Data = [Windows.Media.Geometry]::Parse($LogoPathData3)\r\n          $LogoPath3.Fill = [System.Windows.Media.BrushConverter]::new().ConvertFromString(\"#a3a4a6\")\r\n\r\n          $canvas.Children.Add($LogoPath1) | Out-Null\r\n          $canvas.Children.Add($LogoPath2) | Out-Null\r\n          $canvas.Children.Add($LogoPath3) | Out-Null\r\n      }\r\n      'checkmark' {\r\n          $canvas.Width = 512\r\n          $canvas.Height = 512\r\n\r\n          $scaleFactor = $Size / 2.54\r\n          $scaleTransform = New-Object Windows.Media.ScaleTransform($scaleFactor, $scaleFactor)\r\n          $canvas.LayoutTransform = $scaleTransform\r\n\r\n          # Define the circle path\r\n          $circlePathData = \"M 1.27,0 A 1.27,1.27 0 1,0 1.27,2.54 A 1.27,1.27 0 1,0 1.27,0\"\r\n          $circlePath = New-Object Windows.Shapes.Path\r\n          $circlePath.Data = [Windows.Media.Geometry]::Parse($circlePathData)\r\n          $circlePath.Fill = [System.Windows.Media.BrushConverter]::new().ConvertFromString(\"#39ba00\")\r\n\r\n          # Define the checkmark path\r\n          $checkmarkPathData = \"M 0.873 1.89 L 0.41 1.391 A 0.17 0.17 0 0 1 0.418 1.151 A 0.17 0.17 0 0 1 0.658 1.16 L 1.016 1.543 L 1.583 1.013 A 0.17 0.17 0 0 1 1.599 1 L 1.865 0.751 A 0.17 0.17 0 0 1 2.105 0.759 A 0.17 0.17 0 0 1 2.097 0.999 L 1.282 1.759 L 0.999 2.022 L 0.874 1.888 Z\"\r\n          $checkmarkPath = New-Object Windows.Shapes.Path\r\n          $checkmarkPath.Data = [Windows.Media.Geometry]::Parse($checkmarkPathData)\r\n          $checkmarkPath.Fill = [Windows.Media.Brushes]::White\r\n\r\n          # Add the paths to the Canvas\r\n          $canvas.Children.Add($circlePath) | Out-Null\r\n          $canvas.Children.Add($checkmarkPath) | Out-Null\r\n      }\r\n      'warning' {\r\n          $canvas.Width = 512\r\n          $canvas.Height = 512\r\n\r\n          # Define a scale factor for the content inside the Canvas\r\n          $scaleFactor = $Size / 512  # Adjust scaling based on the canvas size\r\n          $scaleTransform = New-Object Windows.Media.ScaleTransform($scaleFactor, $scaleFactor)\r\n          $canvas.LayoutTransform = $scaleTransform\r\n\r\n          # Define the circle path\r\n          $circlePathData = \"M 256,0 A 256,256 0 1,0 256,512 A 256,256 0 1,0 256,0\"\r\n          $circlePath = New-Object Windows.Shapes.Path\r\n          $circlePath.Data = [Windows.Media.Geometry]::Parse($circlePathData)\r\n          $circlePath.Fill = [System.Windows.Media.BrushConverter]::new().ConvertFromString(\"#f41b43\")\r\n\r\n          # Define the exclamation mark path\r\n          $exclamationPathData = \"M 256 307.2 A 35.89 35.89 0 0 1 220.14 272.74 L 215.41 153.3 A 35.89 35.89 0 0 1 251.27 116 H 260.73 A 35.89 35.89 0 0 1 296.59 153.3 L 291.86 272.74 A 35.89 35.89 0 0 1 256 307.2 Z\"\r\n          $exclamationPath = New-Object Windows.Shapes.Path\r\n          $exclamationPath.Data = [Windows.Media.Geometry]::Parse($exclamationPathData)\r\n          $exclamationPath.Fill = [Windows.Media.Brushes]::White\r\n\r\n          # Get the bounds of the exclamation mark path\r\n          $exclamationBounds = $exclamationPath.Data.Bounds\r\n\r\n          # Calculate the center position for the exclamation mark path\r\n          $exclamationCenterX = ($canvas.Width - $exclamationBounds.Width) / 2 - $exclamationBounds.X\r\n          $exclamationPath.SetValue([Windows.Controls.Canvas]::LeftProperty, $exclamationCenterX)\r\n\r\n          # Define the rounded rectangle at the bottom (dot of exclamation mark)\r\n          $roundedRectangle = New-Object Windows.Shapes.Rectangle\r\n          $roundedRectangle.Width = 80\r\n          $roundedRectangle.Height = 80\r\n          $roundedRectangle.RadiusX = 30\r\n          $roundedRectangle.RadiusY = 30\r\n          $roundedRectangle.Fill = [Windows.Media.Brushes]::White\r\n\r\n          # Calculate the center position for the rounded rectangle\r\n          $centerX = ($canvas.Width - $roundedRectangle.Width) / 2\r\n          $roundedRectangle.SetValue([Windows.Controls.Canvas]::LeftProperty, $centerX)\r\n          $roundedRectangle.SetValue([Windows.Controls.Canvas]::TopProperty, 324.34)\r\n\r\n          # Add the paths to the Canvas\r\n          $canvas.Children.Add($circlePath) | Out-Null\r\n          $canvas.Children.Add($exclamationPath) | Out-Null\r\n          $canvas.Children.Add($roundedRectangle) | Out-Null\r\n      }\r\n      default {\r\n          Write-Host \"Invalid type: $type\"\r\n      }\r\n  }\r\n\r\n  # Add the Canvas to the Viewbox\r\n  $LogoViewbox.Child = $canvas\r\n\r\n  if ($render) {\r\n      # Measure and arrange the canvas to ensure proper rendering\r\n      $canvas.Measure([Windows.Size]::new($canvas.Width, $canvas.Height))\r\n      $canvas.Arrange([Windows.Rect]::new(0, 0, $canvas.Width, $canvas.Height))\r\n      $canvas.UpdateLayout()\r\n\r\n      # Initialize RenderTargetBitmap correctly with dimensions\r\n      $renderTargetBitmap = New-Object Windows.Media.Imaging.RenderTargetBitmap($canvas.Width, $canvas.Height, 96, 96, [Windows.Media.PixelFormats]::Pbgra32)\r\n\r\n      # Render the canvas to the bitmap\r\n      $renderTargetBitmap.Render($canvas)\r\n\r\n      # Create a BitmapFrame from the RenderTargetBitmap\r\n      $bitmapFrame = [Windows.Media.Imaging.BitmapFrame]::Create($renderTargetBitmap)\r\n\r\n      # Create a PngBitmapEncoder and add the frame\r\n      $bitmapEncoder = [Windows.Media.Imaging.PngBitmapEncoder]::new()\r\n      $bitmapEncoder.Frames.Add($bitmapFrame)\r\n\r\n      # Save to a memory stream\r\n      $imageStream = New-Object System.IO.MemoryStream\r\n      $bitmapEncoder.Save($imageStream)\r\n      $imageStream.Position = 0\r\n\r\n      # Load the stream into a BitmapImage\r\n      $bitmapImage = [Windows.Media.Imaging.BitmapImage]::new()\r\n      $bitmapImage.BeginInit()\r\n      $bitmapImage.StreamSource = $imageStream\r\n      $bitmapImage.CacheOption = [Windows.Media.Imaging.BitmapCacheOption]::OnLoad\r\n      $bitmapImage.EndInit()\r\n\r\n      return $bitmapImage\r\n  } else {\r\n      return $LogoViewbox\r\n  }\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilCurrentSystem.ps1",
    "content": "Function Invoke-WinUtilCurrentSystem {\r\n\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Checks to see what tweaks have already been applied and what programs are installed, and checks the according boxes\r\n\r\n    .EXAMPLE\r\n        InvokeWinUtilCurrentSystem -Checkbox \"winget\"\r\n\r\n    #>\r\n\r\n    param(\r\n        $CheckBox\r\n    )\r\n    if ($CheckBox -eq \"choco\") {\r\n        $apps = (choco list | Select-String -Pattern \"^\\S+\").Matches.Value\r\n        $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like \"WPFInstall*\"}\r\n        $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object {\r\n            $dependencies = @($sync.configs.applications.$($psitem.Key).choco -split \";\")\r\n            if ($dependencies -in $apps) {\r\n                Write-Output $psitem.name\r\n            }\r\n        }\r\n    }\r\n\r\n    if ($checkbox -eq \"winget\") {\r\n\r\n        $originalEncoding = [Console]::OutputEncoding\r\n        [Console]::OutputEncoding = [System.Text.UTF8Encoding]::new()\r\n        $Sync.InstalledPrograms = winget list -s winget | Select-Object -skip 3 | ConvertFrom-String -PropertyNames \"Name\", \"Id\", \"Version\", \"Available\" -Delimiter '\\s{2,}'\r\n        [Console]::OutputEncoding = $originalEncoding\r\n\r\n        $filter = Get-WinUtilVariables -Type Checkbox | Where-Object {$psitem -like \"WPFInstall*\"}\r\n        $sync.GetEnumerator() | Where-Object {$psitem.Key -in $filter} | ForEach-Object {\r\n            $dependencies = @($sync.configs.applications.$($psitem.Key).winget -split \";\")\r\n\r\n            if ($dependencies[-1] -in $sync.InstalledPrograms.Id) {\r\n                Write-Output $psitem.name\r\n            }\r\n        }\r\n    }\r\n\r\n    if ($CheckBox -eq \"tweaks\") {\r\n\r\n        if (!(Test-Path 'HKU:\\')) {$null = (New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS)}\r\n        $ScheduledTasks = Get-ScheduledTask\r\n\r\n        $sync.configs.tweaks | Get-Member -MemberType NoteProperty | ForEach-Object {\r\n\r\n            $Config = $psitem.Name\r\n            #WPFEssTweaksTele\r\n            $entry = $sync.configs.tweaks.$Config\r\n            $registryKeys = $entry.registry\r\n            $scheduledtaskKeys = $entry.scheduledtask\r\n            $serviceKeys = $entry.service\r\n            $appxKeys = $entry.appx\r\n            $invokeScript = $entry.InvokeScript\r\n            $entryType = $entry.Type\r\n\r\n            if ($registryKeys -or $scheduledtaskKeys -or $serviceKeys) {\r\n                $Values = @()\r\n\r\n                if ($entryType -eq \"Toggle\") {\r\n                    if (-not (Get-WinUtilToggleStatus $Config)) {\r\n                        $values += $False\r\n                    }\r\n                } else {\r\n                    $registryMatchCount = 0\r\n                    $registryTotal = 0\r\n\r\n                    Foreach ($tweaks in $registryKeys) {\r\n                        Foreach ($tweak in $tweaks) {\r\n                            $registryTotal++\r\n                            $regstate = $null\r\n\r\n                            if (Test-Path $tweak.Path) {\r\n                                $regstate = Get-ItemProperty -Name $tweak.Name -Path $tweak.Path -ErrorAction SilentlyContinue | Select-Object -ExpandProperty $($tweak.Name)\r\n                            }\r\n\r\n                            if ($null -eq $regstate) {\r\n                                switch ($tweak.DefaultState) {\r\n                                    \"true\" {\r\n                                        $regstate = $tweak.Value\r\n                                    }\r\n                                    \"false\" {\r\n                                        $regstate = $tweak.OriginalValue\r\n                                    }\r\n                                    default {\r\n                                        $regstate = $tweak.OriginalValue\r\n                                    }\r\n                                }\r\n                            }\r\n\r\n                            if ($regstate -eq $tweak.Value) {\r\n                                $registryMatchCount++\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if ($registryTotal -gt 0 -and $registryMatchCount -ne $registryTotal) {\r\n                        $values += $False\r\n                    }\r\n                }\r\n\r\n                Foreach ($tweaks in $scheduledtaskKeys) {\r\n                    Foreach ($tweak in $tweaks) {\r\n                        $task = $ScheduledTasks | Where-Object {$($psitem.TaskPath + $psitem.TaskName) -like \"\\$($tweak.name)\"}\r\n\r\n                        if ($task) {\r\n                            $actualValue = $task.State\r\n                            $expectedValue = $tweak.State\r\n                            if ($expectedValue -ne $actualValue) {\r\n                                $values += $False\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                Foreach ($tweaks in $serviceKeys) {\r\n                    Foreach ($tweak in $tweaks) {\r\n                        $Service = Get-Service -Name $tweak.Name\r\n\r\n                        if ($Service) {\r\n                            $actualValue = $Service.StartType\r\n                            $expectedValue = $tweak.StartupType\r\n                            if ($expectedValue -ne $actualValue) {\r\n                                $values += $False\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if ($values -notcontains $false) {\r\n                    Write-Output $Config\r\n                }\r\n            } else {\r\n                if ($invokeScript -or $appxKeys) {\r\n                    Write-Debug \"Skipping $Config in Get Installed: no detectable registry, scheduled task, or service state.\"\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilExplorerUpdate.ps1",
    "content": "function Invoke-WinUtilExplorerUpdate {\r\n     <#\r\n    .SYNOPSIS\r\n        Refreshes the Windows Explorer\r\n    #>\r\n    param (\r\n        [string]$action = \"refresh\"\r\n    )\r\n\r\n    if ($action -eq \"refresh\") {\r\n        Invoke-WPFRunspace -ScriptBlock {\r\n            # Define the Win32 type only if it doesn't exist\r\n            if (-not ([System.Management.Automation.PSTypeName]'Win32').Type) {\r\n                Add-Type -TypeDefinition @\"\r\nusing System;\r\nusing System.Runtime.InteropServices;\r\npublic class Win32 {\r\n    [DllImport(\"user32.dll\", CharSet = CharSet.Auto, SetLastError = false)]\r\n    public static extern IntPtr SendMessageTimeout(\r\n        IntPtr hWnd, uint Msg, IntPtr wParam, string lParam,\r\n        uint fuFlags, uint uTimeout, out IntPtr lpdwResult);\r\n}\r\n\"@\r\n            }\r\n\r\n            $HWND_BROADCAST = [IntPtr]0xffff\r\n            $WM_SETTINGCHANGE = 0x1A\r\n            $SMTO_ABORTIFHUNG = 0x2\r\n\r\n            [Win32]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE,\r\n                [IntPtr]::Zero, \"ImmersiveColorSet\", $SMTO_ABORTIFHUNG, 100,\r\n                [ref]([IntPtr]::Zero))\r\n        }\r\n    } elseif ($action -eq \"restart\") {\r\n        taskkill.exe /F /IM \"explorer.exe\"\r\n        Start-Process \"explorer.exe\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilFeatureInstall.ps1",
    "content": "function Invoke-WinUtilFeatureInstall {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Converts all the values from the tweaks.json and routes them to the appropriate function\r\n\r\n    #>\r\n\r\n    param(\r\n        $CheckBox\r\n    )\r\n\r\n    if($sync.configs.feature.$CheckBox.feature) {\r\n        Foreach( $feature in $sync.configs.feature.$CheckBox.feature ) {\r\n            try {\r\n                Write-Host \"Installing $feature\"\r\n                Enable-WindowsOptionalFeature -Online -FeatureName $feature -All -NoRestart\r\n            } catch {\r\n                if ($CheckBox.Exception.Message -like \"*requires elevation*\") {\r\n                    Write-Warning \"Unable to Install $feature due to permissions. Are you running as admin?\"\r\n                    Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Error\" }\r\n                } else {\r\n\r\n                    Write-Warning \"Unable to Install $feature due to unhandled exception\"\r\n                    Write-Warning $CheckBox.Exception.StackTrace\r\n                }\r\n            }\r\n        }\r\n    }\r\n    if($sync.configs.feature.$CheckBox.InvokeScript) {\r\n        Foreach( $script in $sync.configs.feature.$CheckBox.InvokeScript ) {\r\n            try {\r\n                $Scriptblock = [scriptblock]::Create($script)\r\n\r\n                Write-Host \"Running Script for $CheckBox\"\r\n                Invoke-Command $scriptblock -ErrorAction stop\r\n            } catch {\r\n                if ($CheckBox.Exception.Message -like \"*requires elevation*\") {\r\n                    Write-Warning \"Unable to Install $feature due to permissions. Are you running as admin?\"\r\n                    Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Error\" }\r\n                } else {\r\n                    Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Error\" }\r\n                    Write-Warning \"Unable to Install $feature due to unhandled exception\"\r\n                    Write-Warning $CheckBox.Exception.StackTrace\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilFontScaling.ps1",
    "content": "function Invoke-WinUtilFontScaling {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Applies UI and font scaling for accessibility\r\n\r\n    .PARAMETER ScaleFactor\r\n        Sets the scaling from 0.75 and 2.0.\r\n        Default is 1.0 (100% - no scaling)\r\n\r\n    .EXAMPLE\r\n        Invoke-WinUtilFontScaling -ScaleFactor 1.25\r\n        # Applies 125% scaling\r\n    #>\r\n\r\n    param (\r\n        [double]$ScaleFactor = 1.0\r\n    )\r\n\r\n    # Validate if scale factor is within the range\r\n    if ($ScaleFactor -lt 0.75 -or $ScaleFactor -gt 2.0) {\r\n        Write-Warning \"Scale factor must be between 0.75 and 2.0. Using 1.0 instead.\"\r\n        $ScaleFactor = 1.0\r\n    }\r\n\r\n    # Define an array for resources to be scaled\r\n    $fontResources = @(\r\n        # Fonts\r\n        \"FontSize\",\r\n        \"ButtonFontSize\",\r\n        \"HeaderFontSize\",\r\n        \"TabButtonFontSize\",\r\n        \"ConfigTabButtonFontSize\",\r\n        \"IconFontSize\",\r\n        \"SettingsIconFontSize\",\r\n        \"CloseIconFontSize\",\r\n        \"AppEntryFontSize\",\r\n        \"SearchBarTextBoxFontSize\",\r\n        \"SearchBarClearButtonFontSize\",\r\n        \"CustomDialogFontSize\",\r\n        \"CustomDialogFontSizeHeader\",\r\n        \"ConfigUpdateButtonFontSize\",\r\n        # Buttons and UI\r\n        \"CheckBoxBulletDecoratorSize\",\r\n        \"ButtonWidth\",\r\n        \"ButtonHeight\",\r\n        \"TabButtonWidth\",\r\n        \"TabButtonHeight\",\r\n        \"IconButtonSize\",\r\n        \"AppEntryWidth\",\r\n        \"SearchBarWidth\",\r\n        \"SearchBarHeight\",\r\n        \"CustomDialogWidth\",\r\n        \"CustomDialogHeight\",\r\n        \"CustomDialogLogoSize\",\r\n        \"ToolTipWidth\"\r\n    )\r\n\r\n    # Apply scaling to each resource\r\n    foreach ($resourceName in $fontResources) {\r\n        try {\r\n            # Get the default font size from the theme configuration\r\n            $originalValue = $sync.configs.themes.shared.$resourceName\r\n            if ($originalValue) {\r\n                # Convert string to double since values are stored as strings\r\n                $originalValue = [double]$originalValue\r\n                # Calculates and applies the new font size\r\n                $newValue = [math]::Round($originalValue * $ScaleFactor, 1)\r\n                $sync.Form.Resources[$resourceName] = $newValue\r\n                Write-Debug \"Scaled $resourceName from original $originalValue to $newValue (factor: $ScaleFactor)\"\r\n            }\r\n        }\r\n        catch {\r\n            Write-Warning \"Failed to scale resource $resourceName : $_\"\r\n        }\r\n    }\r\n\r\n    # Update the font scaling percentage displayed on the UI\r\n    if ($sync.FontScalingValue) {\r\n        $percentage = [math]::Round($ScaleFactor * 100)\r\n        $sync.FontScalingValue.Text = \"$percentage%\"\r\n    }\r\n\r\n    Write-Debug \"Font scaling applied with factor: $ScaleFactor\"\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilISO.ps1",
    "content": "function Write-Win11ISOLog {\r\n    param([string]$Message)\r\n    $ts = (Get-Date).ToString(\"HH:mm:ss\")\r\n    $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n        $current = $sync[\"WPFWin11ISOStatusLog\"].Text\r\n        if ($current -eq \"Ready. Please select a Windows 11 ISO to begin.\") {\r\n            $sync[\"WPFWin11ISOStatusLog\"].Text = \"[$ts] $Message\"\r\n        } else {\r\n            $sync[\"WPFWin11ISOStatusLog\"].Text += \"`n[$ts] $Message\"\r\n        }\r\n        $sync[\"WPFWin11ISOStatusLog\"].CaretIndex = $sync[\"WPFWin11ISOStatusLog\"].Text.Length\r\n        $sync[\"WPFWin11ISOStatusLog\"].ScrollToEnd()\r\n    })\r\n}\r\n\r\nfunction Invoke-WinUtilISOBrowse {\r\n    Add-Type -AssemblyName System.Windows.Forms\r\n\r\n    $dlg = [System.Windows.Forms.OpenFileDialog]::new()\r\n    $dlg.Title            = \"Select Windows 11 ISO\"\r\n    $dlg.Filter           = \"ISO files (*.iso)|*.iso|All files (*.*)|*.*\"\r\n    $dlg.InitialDirectory = [System.Environment]::GetFolderPath(\"Desktop\")\r\n\r\n    if ($dlg.ShowDialog() -ne [System.Windows.Forms.DialogResult]::OK) { return }\r\n\r\n    $isoPath    = $dlg.FileName\r\n    $fileSizeGB = [math]::Round((Get-Item $isoPath).Length / 1GB, 2)\r\n\r\n    $sync[\"WPFWin11ISOPath\"].Text           = $isoPath\r\n    $sync[\"WPFWin11ISOFileInfo\"].Text       = \"File size: $fileSizeGB GB\"\r\n    $sync[\"WPFWin11ISOFileInfo\"].Visibility = \"Visible\"\r\n    $sync[\"WPFWin11ISOMountSection\"].Visibility       = \"Visible\"\r\n    $sync[\"WPFWin11ISOVerifyResultPanel\"].Visibility  = \"Collapsed\"\r\n    $sync[\"WPFWin11ISOModifySection\"].Visibility      = \"Collapsed\"\r\n    $sync[\"WPFWin11ISOOutputSection\"].Visibility      = \"Collapsed\"\r\n\r\n    Write-Win11ISOLog \"ISO selected: $isoPath  ($fileSizeGB GB)\"\r\n}\r\n\r\nfunction Invoke-WinUtilISOMountAndVerify {\r\n    $isoPath = $sync[\"WPFWin11ISOPath\"].Text\r\n\r\n    if ([string]::IsNullOrWhiteSpace($isoPath) -or $isoPath -eq \"No ISO selected...\") {\r\n        [System.Windows.MessageBox]::Show(\"Please select an ISO file first.\", \"No ISO Selected\", \"OK\", \"Warning\")\r\n        return\r\n    }\r\n\r\n    Write-Win11ISOLog \"Mounting ISO: $isoPath\"\r\n    Set-WinUtilProgressBar -Label \"Mounting ISO...\" -Percent 10\r\n\r\n    try {\r\n        Mount-DiskImage -ImagePath $isoPath -ErrorAction Stop | Out-Null\r\n\r\n        do {\r\n            Start-Sleep -Milliseconds 500\r\n        } until ((Get-DiskImage -ImagePath $isoPath | Get-Volume).DriveLetter)\r\n\r\n        $driveLetter = (Get-DiskImage -ImagePath $isoPath | Get-Volume).DriveLetter + \":\"\r\n        Write-Win11ISOLog \"Mounted at drive $driveLetter\"\r\n\r\n        Set-WinUtilProgressBar -Label \"Verifying ISO contents...\" -Percent 30\r\n\r\n        $wimPath = Join-Path $driveLetter \"sources\\install.wim\"\r\n        $esdPath = Join-Path $driveLetter \"sources\\install.esd\"\r\n\r\n        if (-not (Test-Path $wimPath) -and -not (Test-Path $esdPath)) {\r\n            Dismount-DiskImage -ImagePath $isoPath | Out-Null\r\n            Write-Win11ISOLog \"ERROR: install.wim/install.esd not found — not a valid Windows ISO.\"\r\n            [System.Windows.MessageBox]::Show(\r\n                \"This does not appear to be a valid Windows ISO.`n`ninstall.wim / install.esd was not found.\",\r\n                \"Invalid ISO\", \"OK\", \"Error\")\r\n            Set-WinUtilProgressBar -Label \"\" -Percent 0\r\n            return\r\n        }\r\n\r\n        $activeWim = if (Test-Path $wimPath) { $wimPath } else { $esdPath }\r\n\r\n        Set-WinUtilProgressBar -Label \"Reading image metadata...\" -Percent 55\r\n        $imageInfo = Get-WindowsImage -ImagePath $activeWim | Select-Object ImageIndex, ImageName\r\n\r\n        if (-not ($imageInfo | Where-Object { $_.ImageName -match \"Windows 11\" })) {\r\n            Dismount-DiskImage -ImagePath $isoPath | Out-Null\r\n            Write-Win11ISOLog \"ERROR: No 'Windows 11' edition found in the image.\"\r\n            [System.Windows.MessageBox]::Show(\r\n                \"No Windows 11 edition was found in this ISO.`n`nOnly official Windows 11 ISOs are supported.\",\r\n                \"Not a Windows 11 ISO\", \"OK\", \"Error\")\r\n            Set-WinUtilProgressBar -Label \"\" -Percent 0\r\n            return\r\n        }\r\n\r\n        $sync[\"Win11ISOImageInfo\"] = $imageInfo\r\n\r\n        $sync[\"WPFWin11ISOMountDriveLetter\"].Text = \"Mounted at: $driveLetter   |   Image file: $(Split-Path $activeWim -Leaf)\"\r\n        $sync[\"WPFWin11ISOEditionComboBox\"].Dispatcher.Invoke([action]{\r\n            $sync[\"WPFWin11ISOEditionComboBox\"].Items.Clear()\r\n            foreach ($img in $imageInfo) {\r\n                [void]$sync[\"WPFWin11ISOEditionComboBox\"].Items.Add(\"$($img.ImageIndex): $($img.ImageName)\")\r\n            }\r\n            if ($sync[\"WPFWin11ISOEditionComboBox\"].Items.Count -gt 0) {\r\n                $proIndex = -1\r\n                for ($i = 0; $i -lt $sync[\"WPFWin11ISOEditionComboBox\"].Items.Count; $i++) {\r\n                    if ($sync[\"WPFWin11ISOEditionComboBox\"].Items[$i] -match \"Windows 11 Pro(?![\\w ])\") {\r\n                        $proIndex = $i; break\r\n                    }\r\n                }\r\n                $sync[\"WPFWin11ISOEditionComboBox\"].SelectedIndex = if ($proIndex -ge 0) { $proIndex } else { 0 }\r\n            }\r\n        })\r\n        $sync[\"WPFWin11ISOVerifyResultPanel\"].Visibility = \"Visible\"\r\n\r\n        $sync[\"Win11ISODriveLetter\"] = $driveLetter\r\n        $sync[\"Win11ISOWimPath\"]     = $activeWim\r\n        $sync[\"Win11ISOImagePath\"]   = $isoPath\r\n        $sync[\"WPFWin11ISOModifySection\"].Visibility = \"Visible\"\r\n\r\n        Set-WinUtilProgressBar -Label \"ISO verified\" -Percent 100\r\n        Write-Win11ISOLog \"ISO verified OK.  Editions found: $($imageInfo.Count)\"\r\n    } catch {\r\n        Write-Win11ISOLog \"ERROR during mount/verify: $_\"\r\n        [System.Windows.MessageBox]::Show(\r\n            \"An error occurred while mounting or verifying the ISO:`n`n$_\",\r\n            \"Error\", \"OK\", \"Error\")\r\n    } finally {\r\n        Start-Sleep -Milliseconds 800\r\n        Set-WinUtilProgressBar -Label \"\" -Percent 0\r\n    }\r\n}\r\n\r\nfunction Invoke-WinUtilISOModify {\r\n    $isoPath     = $sync[\"Win11ISOImagePath\"]\r\n    $driveLetter = $sync[\"Win11ISODriveLetter\"]\r\n    $wimPath     = $sync[\"Win11ISOWimPath\"]\r\n\r\n    if (-not $isoPath) {\r\n        [System.Windows.MessageBox]::Show(\r\n            \"No verified ISO found.  Please complete Steps 1 and 2 first.\",\r\n            \"Not Ready\", \"OK\", \"Warning\")\r\n        return\r\n    }\r\n\r\n    $selectedItem     = $sync[\"WPFWin11ISOEditionComboBox\"].SelectedItem\r\n    $selectedWimIndex = 1\r\n    if ($selectedItem -and $selectedItem -match '^(\\d+):') {\r\n        $selectedWimIndex = [int]$Matches[1]\r\n    } elseif ($sync[\"Win11ISOImageInfo\"]) {\r\n        $selectedWimIndex = $sync[\"Win11ISOImageInfo\"][0].ImageIndex\r\n    }\r\n    $selectedEditionName = if ($selectedItem) { ($selectedItem -replace '^\\d+:\\s*', '') } else { \"Unknown\" }\r\n    Write-Win11ISOLog \"Selected edition: $selectedEditionName (Index $selectedWimIndex)\"\r\n\r\n    $sync[\"WPFWin11ISOModifyButton\"].IsEnabled = $false\r\n    $sync[\"Win11ISOModifying\"] = $true\r\n\r\n    $existingWorkDir = Get-Item -Path (Join-Path $env:TEMP \"WinUtil_Win11ISO*\") -ErrorAction SilentlyContinue |\r\n        Where-Object { $_.PSIsContainer } | Sort-Object LastWriteTime -Descending | Select-Object -First 1\r\n\r\n    $workDir = if ($existingWorkDir) {\r\n        Write-Win11ISOLog \"Reusing existing temp directory: $($existingWorkDir.FullName)\"\r\n        $existingWorkDir.FullName\r\n    } else {\r\n        Join-Path $env:TEMP \"WinUtil_Win11ISO_$(Get-Date -Format 'yyyyMMdd_HHmmss')\"\r\n    }\r\n\r\n    $autounattendContent = if ($WinUtilAutounattendXml) {\r\n        $WinUtilAutounattendXml\r\n    } else {\r\n        $toolsXml = Join-Path $PSScriptRoot \"..\\..\\tools\\autounattend.xml\"\r\n        if (Test-Path $toolsXml) { Get-Content $toolsXml -Raw } else { \"\" }\r\n    }\r\n\r\n    $runspace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()\r\n    $runspace.ApartmentState = \"STA\"\r\n    $runspace.ThreadOptions  = \"ReuseThread\"\r\n    $runspace.Open()\r\n    $injectDrivers = $sync[\"WPFWin11ISOInjectDrivers\"].IsChecked -eq $true\r\n\r\n    $runspace.SessionStateProxy.SetVariable(\"sync\",                $sync)\r\n    $runspace.SessionStateProxy.SetVariable(\"isoPath\",             $isoPath)\r\n    $runspace.SessionStateProxy.SetVariable(\"driveLetter\",         $driveLetter)\r\n    $runspace.SessionStateProxy.SetVariable(\"wimPath\",             $wimPath)\r\n    $runspace.SessionStateProxy.SetVariable(\"workDir\",             $workDir)\r\n    $runspace.SessionStateProxy.SetVariable(\"selectedWimIndex\",    $selectedWimIndex)\r\n    $runspace.SessionStateProxy.SetVariable(\"selectedEditionName\", $selectedEditionName)\r\n    $runspace.SessionStateProxy.SetVariable(\"autounattendContent\", $autounattendContent)\r\n    $runspace.SessionStateProxy.SetVariable(\"injectDrivers\",       $injectDrivers)\r\n\r\n    $isoScriptFuncDef   = \"function Invoke-WinUtilISOScript {`n\" + ${function:Invoke-WinUtilISOScript}.ToString() + \"`n}\"\r\n    $win11ISOLogFuncDef = \"function Write-Win11ISOLog {`n\"       + ${function:Write-Win11ISOLog}.ToString()       + \"`n}\"\r\n    $runspace.SessionStateProxy.SetVariable(\"isoScriptFuncDef\",   $isoScriptFuncDef)\r\n    $runspace.SessionStateProxy.SetVariable(\"win11ISOLogFuncDef\", $win11ISOLogFuncDef)\r\n\r\n    $script = [Management.Automation.PowerShell]::Create()\r\n    $script.Runspace = $runspace\r\n    $script.AddScript({\r\n        . ([scriptblock]::Create($isoScriptFuncDef))\r\n        . ([scriptblock]::Create($win11ISOLogFuncDef))\r\n\r\n        function Log($msg) {\r\n            $ts = (Get-Date).ToString(\"HH:mm:ss\")\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync[\"WPFWin11ISOStatusLog\"].Text += \"`n[$ts] $msg\"\r\n                $sync[\"WPFWin11ISOStatusLog\"].CaretIndex = $sync[\"WPFWin11ISOStatusLog\"].Text.Length\r\n                $sync[\"WPFWin11ISOStatusLog\"].ScrollToEnd()\r\n            })\r\n            Add-Content -Path (Join-Path $workDir \"WinUtil_Win11ISO.log\") -Value \"[$ts] $msg\" -ErrorAction SilentlyContinue\r\n        }\r\n\r\n        function SetProgress($label, $pct) {\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync.progressBarTextBlock.Text    = $label\r\n                $sync.progressBarTextBlock.ToolTip = $label\r\n                $sync.ProgressBar.Value            = [Math]::Max($pct, 5)\r\n            })\r\n        }\r\n\r\n        try {\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync[\"WPFWin11ISOSelectSection\"].Visibility = \"Collapsed\"\r\n                $sync[\"WPFWin11ISOMountSection\"].Visibility  = \"Collapsed\"\r\n                $sync[\"WPFWin11ISOModifySection\"].Visibility = \"Collapsed\"\r\n            })\r\n\r\n            Log \"Creating working directory: $workDir\"\r\n            $isoContents = Join-Path $workDir \"iso_contents\"\r\n            $mountDir    = Join-Path $workDir \"wim_mount\"\r\n            New-Item -ItemType Directory -Path $isoContents, $mountDir -Force | Out-Null\r\n            SetProgress \"Copying ISO contents...\" 10\r\n\r\n            Log \"Copying ISO contents from $driveLetter to $isoContents...\"\r\n            & robocopy $driveLetter $isoContents /E /NFL /NDL /NJH /NJS | Out-Null\r\n            Log \"ISO contents copied.\"\r\n            SetProgress \"Mounting install.wim...\" 25\r\n\r\n            $localWim = Join-Path $isoContents \"sources\\install.wim\"\r\n            if (-not (Test-Path $localWim)) { $localWim = Join-Path $isoContents \"sources\\install.esd\" }\r\n            Set-ItemProperty -Path $localWim -Name IsReadOnly -Value $false\r\n\r\n            Log \"Mounting install.wim (Index ${selectedWimIndex}: $selectedEditionName) at $mountDir...\"\r\n            Mount-WindowsImage -ImagePath $localWim -Index $selectedWimIndex -Path $mountDir -ErrorAction Stop | Out-Null\r\n            SetProgress \"Modifying install.wim...\" 45\r\n\r\n            Log \"Applying WinUtil modifications to install.wim...\"\r\n            Invoke-WinUtilISOScript -ScratchDir $mountDir -ISOContentsDir $isoContents -AutoUnattendXml $autounattendContent -InjectCurrentSystemDrivers $injectDrivers -Log { param($m) Log $m }\r\n\r\n            SetProgress \"Cleaning up component store (WinSxS)...\" 56\r\n            Log \"Running DISM component store cleanup (/ResetBase)...\"\r\n            & dism /English \"/image:$mountDir\" /Cleanup-Image /StartComponentCleanup /ResetBase | ForEach-Object { Log $_ }\r\n            Log \"Component store cleanup complete.\"\r\n\r\n            SetProgress \"Saving modified install.wim...\" 65\r\n            Log \"Dismounting and saving install.wim. This will take several minutes...\"\r\n            Dismount-WindowsImage -Path $mountDir -Save -ErrorAction Stop | Out-Null\r\n            Log \"install.wim saved.\"\r\n\r\n            SetProgress \"Removing unused editions from install.wim...\" 70\r\n            Log \"Exporting edition '$selectedEditionName' (Index $selectedWimIndex) to a single-edition install.wim...\"\r\n            $exportWim = Join-Path $isoContents \"sources\\install_export.wim\"\r\n            Export-WindowsImage -SourceImagePath $localWim -SourceIndex $selectedWimIndex -DestinationImagePath $exportWim -ErrorAction Stop | Out-Null\r\n            Remove-Item -Path $localWim -Force\r\n            Rename-Item -Path $exportWim -NewName \"install.wim\" -Force\r\n            $localWim = Join-Path $isoContents \"sources\\install.wim\"\r\n            Log \"Unused editions removed. install.wim now contains only '$selectedEditionName'.\"\r\n\r\n            SetProgress \"Dismounting source ISO...\" 80\r\n            Log \"Dismounting original ISO...\"\r\n            Dismount-DiskImage -ImagePath $isoPath | Out-Null\r\n\r\n            $sync[\"Win11ISOWorkDir\"]     = $workDir\r\n            $sync[\"Win11ISOContentsDir\"] = $isoContents\r\n\r\n            SetProgress \"Modification complete\" 100\r\n            Log \"install.wim modification complete. Choose an output option in Step 4.\"\r\n\r\n            $sync[\"WPFWin11ISOOutputSection\"].Dispatcher.Invoke([action]{\r\n                $sync[\"WPFWin11ISOOutputSection\"].Visibility = \"Visible\"\r\n            })\r\n        } catch {\r\n            Log \"ERROR during modification: $_\"\r\n\r\n            try {\r\n                if (Test-Path $mountDir) {\r\n                    $mountedImages = Get-WindowsImage -Mounted -ErrorAction SilentlyContinue | Where-Object { $_.Path -eq $mountDir }\r\n                    if ($mountedImages) {\r\n                        Log \"Cleaning up: dismounting install.wim (discarding changes)...\"\r\n                        Dismount-WindowsImage -Path $mountDir -Discard -ErrorAction SilentlyContinue | Out-Null\r\n                    }\r\n                }\r\n            } catch { Log \"Warning: could not dismount install.wim during cleanup: $_\" }\r\n\r\n            try {\r\n                $mountedISO = Get-DiskImage -ImagePath $isoPath -ErrorAction SilentlyContinue\r\n                if ($mountedISO -and $mountedISO.Attached) {\r\n                    Log \"Cleaning up: dismounting source ISO...\"\r\n                    Dismount-DiskImage -ImagePath $isoPath -ErrorAction SilentlyContinue | Out-Null\r\n                }\r\n            } catch { Log \"Warning: could not dismount ISO during cleanup: $_\" }\r\n\r\n            try {\r\n                if (Test-Path $workDir) {\r\n                    Log \"Cleaning up: removing temp directory $workDir...\"\r\n                    Remove-Item -Path $workDir -Recurse -Force -ErrorAction SilentlyContinue\r\n                }\r\n            } catch { Log \"Warning: could not remove temp directory during cleanup: $_\" }\r\n\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                [System.Windows.MessageBox]::Show(\r\n                    \"An error occurred during install.wim modification:`n`n$_\",\r\n                    \"Modification Error\", \"OK\", \"Error\")\r\n            })\r\n        } finally {\r\n            Start-Sleep -Milliseconds 800\r\n            $sync[\"Win11ISOModifying\"] = $false\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync.progressBarTextBlock.Text    = \"\"\r\n                $sync.progressBarTextBlock.ToolTip = \"\"\r\n                $sync.ProgressBar.Value            = 0\r\n                $sync[\"WPFWin11ISOModifyButton\"].IsEnabled = $true\r\n                if ($sync[\"WPFWin11ISOOutputSection\"].Visibility -ne \"Visible\") {\r\n                    $sync[\"WPFWin11ISOSelectSection\"].Visibility = \"Visible\"\r\n                    $sync[\"WPFWin11ISOMountSection\"].Visibility  = \"Visible\"\r\n                    $sync[\"WPFWin11ISOModifySection\"].Visibility = \"Visible\"\r\n                }\r\n            })\r\n        }\r\n    }) | Out-Null\r\n\r\n    $script.BeginInvoke() | Out-Null\r\n}\r\n\r\nfunction Invoke-WinUtilISOCheckExistingWork {\r\n    if ($sync[\"Win11ISOContentsDir\"] -and (Test-Path $sync[\"Win11ISOContentsDir\"])) { return }\r\n\r\n    # Check if ISO modification is currently in progress\r\n    if ($sync[\"Win11ISOModifying\"]) {\r\n        return\r\n    }\r\n\r\n    $existingWorkDir = Get-Item -Path (Join-Path $env:TEMP \"WinUtil_Win11ISO*\") -ErrorAction SilentlyContinue |\r\n        Where-Object { $_.PSIsContainer } | Sort-Object LastWriteTime -Descending | Select-Object -First 1\r\n\r\n    if (-not $existingWorkDir) { return }\r\n\r\n    $isoContents = Join-Path $existingWorkDir.FullName \"iso_contents\"\r\n    if (-not (Test-Path $isoContents)) { return }\r\n\r\n    $sync[\"Win11ISOWorkDir\"]     = $existingWorkDir.FullName\r\n    $sync[\"Win11ISOContentsDir\"] = $isoContents\r\n\r\n    $sync[\"WPFWin11ISOSelectSection\"].Visibility = \"Collapsed\"\r\n    $sync[\"WPFWin11ISOMountSection\"].Visibility  = \"Collapsed\"\r\n    $sync[\"WPFWin11ISOModifySection\"].Visibility = \"Collapsed\"\r\n    $sync[\"WPFWin11ISOOutputSection\"].Visibility = \"Visible\"\r\n\r\n    $modified = $existingWorkDir.LastWriteTime.ToString(\"yyyy-MM-dd HH:mm\")\r\n    Write-Win11ISOLog \"Existing working directory found: $($existingWorkDir.FullName)\"\r\n    Write-Win11ISOLog \"Last modified: $modified - Skipping Steps 1-3 and resuming at Step 4.\"\r\n    Write-Win11ISOLog \"Click 'Clean & Reset' if you want to start over with a new ISO.\"\r\n\r\n    [System.Windows.MessageBox]::Show(\r\n        \"A previous WinUtil ISO working directory was found:`n`n$($existingWorkDir.FullName)`n`n(Last modified: $modified)`n`nStep 4 (output options) has been restored so you can save the already-modified image.`n`nClick 'Clean & Reset' in Step 4 if you want to start over.\",\r\n        \"Existing Work Found\", \"OK\", \"Info\")\r\n}\r\n\r\nfunction Invoke-WinUtilISOCleanAndReset {\r\n    $workDir = $sync[\"Win11ISOWorkDir\"]\r\n\r\n    if ($workDir -and (Test-Path $workDir)) {\r\n        $confirm = [System.Windows.MessageBox]::Show(\r\n            \"This will delete the temporary working directory:`n`n$workDir`n`nAnd reset the interface back to the start.`n`nContinue?\",\r\n            \"Clean & Reset\", \"YesNo\", \"Warning\")\r\n        if ($confirm -ne \"Yes\") { return }\r\n    }\r\n\r\n    $sync[\"WPFWin11ISOCleanResetButton\"].IsEnabled = $false\r\n\r\n    $runspace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()\r\n    $runspace.ApartmentState = \"STA\"\r\n    $runspace.ThreadOptions  = \"ReuseThread\"\r\n    $runspace.Open()\r\n    $runspace.SessionStateProxy.SetVariable(\"sync\",    $sync)\r\n    $runspace.SessionStateProxy.SetVariable(\"workDir\", $workDir)\r\n\r\n    $script = [Management.Automation.PowerShell]::Create()\r\n    $script.Runspace = $runspace\r\n    $script.AddScript({\r\n\r\n        function Log($msg) {\r\n            $ts = (Get-Date).ToString(\"HH:mm:ss\")\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync[\"WPFWin11ISOStatusLog\"].Text += \"`n[$ts] $msg\"\r\n                $sync[\"WPFWin11ISOStatusLog\"].CaretIndex = $sync[\"WPFWin11ISOStatusLog\"].Text.Length\r\n                $sync[\"WPFWin11ISOStatusLog\"].ScrollToEnd()\r\n            })\r\n            Add-Content -Path (Join-Path $workDir \"WinUtil_Win11ISO.log\") -Value \"[$ts] $msg\" -ErrorAction SilentlyContinue\r\n        }\r\n\r\n        function SetProgress($label, $pct) {\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync.progressBarTextBlock.Text    = $label\r\n                $sync.progressBarTextBlock.ToolTip = $label\r\n                $sync.ProgressBar.Value            = [Math]::Max($pct, 5)\r\n            })\r\n        }\r\n\r\n        try {\r\n            if ($workDir) {\r\n                $mountDir = Join-Path $workDir \"wim_mount\"\r\n                try {\r\n                    $mountedImages = Get-WindowsImage -Mounted -ErrorAction SilentlyContinue |\r\n                                     Where-Object { $_.Path -like \"$workDir*\" }\r\n                    if ($mountedImages) {\r\n                        foreach ($img in $mountedImages) {\r\n                            Log \"Dismounting WIM at: $($img.Path) (discarding changes)...\"\r\n                            SetProgress \"Dismounting WIM image...\" 3\r\n                            Dismount-WindowsImage -Path $img.Path -Discard -ErrorAction Stop | Out-Null\r\n                            Log \"WIM dismounted successfully.\"\r\n                        }\r\n                    } elseif (Test-Path $mountDir) {\r\n                        Log \"No mounted WIM reported by Get-WindowsImage, running DISM /Cleanup-Wim as a precaution...\"\r\n                        SetProgress \"Running DISM cleanup...\" 3\r\n                        & dism /English /Cleanup-Wim 2>&1 | ForEach-Object { Log $_ }\r\n                    }\r\n                } catch {\r\n                    Log \"Warning: could not dismount WIM cleanly, attempting DISM /Cleanup-Wim fallback: $_\"\r\n                    try { & dism /English /Cleanup-Wim 2>&1 | ForEach-Object { Log $_ } }\r\n                    catch { Log \"Warning: DISM /Cleanup-Wim also failed: $_\" }\r\n                }\r\n            }\r\n\r\n            if ($workDir -and (Test-Path $workDir)) {\r\n                Log \"Scanning files to delete in: $workDir\"\r\n                SetProgress \"Scanning files...\" 5\r\n\r\n                $allFiles = @(Get-ChildItem -Path $workDir -File -Recurse -Force -ErrorAction SilentlyContinue)\r\n                $allDirs  = @(Get-ChildItem -Path $workDir -Directory -Recurse -Force -ErrorAction SilentlyContinue |\r\n                    Sort-Object { $_.FullName.Length } -Descending)\r\n                $total   = $allFiles.Count\r\n                $deleted = 0\r\n\r\n                Log \"Found $total files to delete.\"\r\n\r\n                foreach ($f in $allFiles) {\r\n                    try { Remove-Item -Path $f.FullName -Force -ErrorAction Stop } catch { Log \"WARNING: could not delete $($f.FullName): $_\" }\r\n                    $deleted++\r\n                    if ($deleted % 100 -eq 0 -or $deleted -eq $total) {\r\n                        $pct = [math]::Round(($deleted / [Math]::Max($total, 1)) * 85) + 5\r\n                        SetProgress \"Deleting files in $($f.Directory.Name)... ($deleted / $total)\" $pct\r\n                    }\r\n                }\r\n\r\n                foreach ($d in $allDirs) {\r\n                    try { Remove-Item -Path $d.FullName -Force -ErrorAction SilentlyContinue } catch {}\r\n                }\r\n\r\n                try { Remove-Item -Path $workDir -Recurse -Force -ErrorAction Stop } catch {}\r\n\r\n                if (Test-Path $workDir) {\r\n                    Log \"WARNING: some items could not be deleted in $workDir\"\r\n                } else {\r\n                    Log \"Temp directory deleted successfully.\"\r\n                }\r\n            } else {\r\n                Log \"No temp directory found — resetting UI.\"\r\n            }\r\n\r\n            SetProgress \"Resetting UI...\" 95\r\n            Log \"Resetting interface...\"\r\n\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync[\"Win11ISOWorkDir\"]     = $null\r\n                $sync[\"Win11ISOContentsDir\"] = $null\r\n                $sync[\"Win11ISOImagePath\"]   = $null\r\n                $sync[\"Win11ISODriveLetter\"] = $null\r\n                $sync[\"Win11ISOWimPath\"]     = $null\r\n                $sync[\"Win11ISOImageInfo\"]   = $null\r\n                $sync[\"Win11ISOUSBDisks\"]    = $null\r\n\r\n                $sync[\"WPFWin11ISOPath\"].Text                   = \"No ISO selected...\"\r\n                $sync[\"WPFWin11ISOFileInfo\"].Visibility          = \"Collapsed\"\r\n                $sync[\"WPFWin11ISOVerifyResultPanel\"].Visibility = \"Collapsed\"\r\n                $sync[\"WPFWin11ISOOptionUSB\"].Visibility         = \"Collapsed\"\r\n                $sync[\"WPFWin11ISOOutputSection\"].Visibility     = \"Collapsed\"\r\n                $sync[\"WPFWin11ISOModifySection\"].Visibility     = \"Collapsed\"\r\n                $sync[\"WPFWin11ISOMountSection\"].Visibility      = \"Collapsed\"\r\n                $sync[\"WPFWin11ISOSelectSection\"].Visibility     = \"Visible\"\r\n                $sync[\"WPFWin11ISOModifyButton\"].IsEnabled       = $true\r\n                $sync[\"WPFWin11ISOCleanResetButton\"].IsEnabled   = $true\r\n\r\n                $sync.progressBarTextBlock.Text    = \"\"\r\n                $sync.progressBarTextBlock.ToolTip = \"\"\r\n                $sync.ProgressBar.Value            = 0\r\n\r\n                $sync[\"WPFWin11ISOStatusLog\"].Text   = \"Ready. Please select a Windows 11 ISO to begin.\"\r\n            })\r\n        } catch {\r\n            Log \"ERROR during Clean & Reset: $_\"\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync.progressBarTextBlock.Text    = \"\"\r\n                $sync.progressBarTextBlock.ToolTip = \"\"\r\n                $sync.ProgressBar.Value            = 0\r\n                $sync[\"WPFWin11ISOCleanResetButton\"].IsEnabled = $true\r\n            })\r\n        }\r\n    }) | Out-Null\r\n\r\n    $script.BeginInvoke() | Out-Null\r\n}\r\n\r\nfunction Invoke-WinUtilISOExport {\r\n    $contentsDir = $sync[\"Win11ISOContentsDir\"]\r\n\r\n    if (-not $contentsDir -or -not (Test-Path $contentsDir)) {\r\n        [System.Windows.MessageBox]::Show(\r\n            \"No modified ISO content found.  Please complete Steps 1-3 first.\",\r\n            \"Not Ready\", \"OK\", \"Warning\")\r\n        return\r\n    }\r\n\r\n    Add-Type -AssemblyName System.Windows.Forms\r\n\r\n    $dlg = [System.Windows.Forms.SaveFileDialog]::new()\r\n    $dlg.Title            = \"Save Modified Windows 11 ISO\"\r\n    $dlg.Filter           = \"ISO files (*.iso)|*.iso\"\r\n    $dlg.FileName         = \"Win11_Modified_$(Get-Date -Format 'yyyyMMdd').iso\"\r\n    $dlg.InitialDirectory = [System.Environment]::GetFolderPath(\"Desktop\")\r\n\r\n    if ($dlg.ShowDialog() -ne [System.Windows.Forms.DialogResult]::OK) { return }\r\n\r\n    $outputISO = $dlg.FileName\r\n\r\n    # Locate oscdimg.exe (Windows ADK or winget per-user install)\r\n    $oscdimg = Get-ChildItem \"C:\\Program Files (x86)\\Windows Kits\" -Recurse -Filter \"oscdimg.exe\" -ErrorAction SilentlyContinue |\r\n               Select-Object -First 1 -ExpandProperty FullName\r\n    if (-not $oscdimg) {\r\n        $oscdimg = Get-ChildItem \"$env:LOCALAPPDATA\\Microsoft\\WinGet\\Packages\" -Recurse -Filter \"oscdimg.exe\" -ErrorAction SilentlyContinue |\r\n                   Where-Object { $_.FullName -match 'Microsoft\\.OSCDIMG' } |\r\n                   Select-Object -First 1 -ExpandProperty FullName\r\n    }\r\n\r\n    if (-not $oscdimg) {\r\n        Write-Win11ISOLog \"oscdimg.exe not found. Attempting to install via winget...\"\r\n        try {\r\n            $winget = Get-Command winget -ErrorAction Stop\r\n            $result = & $winget install -e --id Microsoft.OSCDIMG --accept-package-agreements --accept-source-agreements 2>&1\r\n            Write-Win11ISOLog \"winget output: $result\"\r\n            $oscdimg = Get-ChildItem \"$env:LOCALAPPDATA\\Microsoft\\WinGet\\Packages\" -Recurse -Filter \"oscdimg.exe\" -ErrorAction SilentlyContinue |\r\n                       Where-Object { $_.FullName -match 'Microsoft\\.OSCDIMG' } |\r\n                       Select-Object -First 1 -ExpandProperty FullName\r\n        } catch {\r\n            Write-Win11ISOLog \"winget not available or install failed: $_\"\r\n        }\r\n\r\n        if (-not $oscdimg) {\r\n            Write-Win11ISOLog \"oscdimg.exe still not found after install attempt.\"\r\n            [System.Windows.MessageBox]::Show(\r\n                \"oscdimg.exe could not be found or installed automatically.`n`nPlease install it manually:`n  winget install -e --id Microsoft.OSCDIMG`n`nOr install the Windows ADK from:`nhttps://learn.microsoft.com/windows-hardware/get-started/adk-install\",\r\n                \"oscdimg Not Found\", \"OK\", \"Warning\")\r\n            return\r\n        }\r\n        Write-Win11ISOLog \"oscdimg.exe installed successfully.\"\r\n    }\r\n\r\n    $sync[\"WPFWin11ISOChooseISOButton\"].IsEnabled = $false\r\n\r\n    $runspace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()\r\n    $runspace.ApartmentState = \"STA\"\r\n    $runspace.ThreadOptions  = \"ReuseThread\"\r\n    $runspace.Open()\r\n    $runspace.SessionStateProxy.SetVariable(\"sync\",        $sync)\r\n    $runspace.SessionStateProxy.SetVariable(\"contentsDir\", $contentsDir)\r\n    $runspace.SessionStateProxy.SetVariable(\"outputISO\",   $outputISO)\r\n    $runspace.SessionStateProxy.SetVariable(\"oscdimg\",     $oscdimg)\r\n\r\n    $win11ISOLogFuncDef = \"function Write-Win11ISOLog {`n\" + ${function:Write-Win11ISOLog}.ToString() + \"`n}\"\r\n    $runspace.SessionStateProxy.SetVariable(\"win11ISOLogFuncDef\", $win11ISOLogFuncDef)\r\n\r\n    $script = [Management.Automation.PowerShell]::Create()\r\n    $script.Runspace = $runspace\r\n    $script.AddScript({\r\n        . ([scriptblock]::Create($win11ISOLogFuncDef))\r\n\r\n        function SetProgress($label, $pct) {\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync.progressBarTextBlock.Text    = $label\r\n                $sync.progressBarTextBlock.ToolTip = $label\r\n                $sync.ProgressBar.Value            = [Math]::Max($pct, 5)\r\n            })\r\n        }\r\n\r\n        try {\r\n            Write-Win11ISOLog \"Exporting to ISO: $outputISO\"\r\n            SetProgress \"Building ISO...\" 10\r\n\r\n            $bootData    = \"2#p0,e,b`\"$contentsDir\\boot\\etfsboot.com`\"#pEF,e,b`\"$contentsDir\\efi\\microsoft\\boot\\efisys.bin`\"\"\r\n            $oscdimgArgs = @(\"-m\", \"-o\", \"-u2\", \"-udfver102\", \"-bootdata:$bootData\", \"-l`\"CTOS_MODIFIED`\"\", \"`\"$contentsDir`\"\", \"`\"$outputISO`\"\")\r\n\r\n            Write-Win11ISOLog \"Running oscdimg...\"\r\n\r\n            $psi = [System.Diagnostics.ProcessStartInfo]::new()\r\n            $psi.FileName               = $oscdimg\r\n            $psi.Arguments              = $oscdimgArgs -join \" \"\r\n            $psi.RedirectStandardOutput = $true\r\n            $psi.RedirectStandardError  = $true\r\n            $psi.UseShellExecute        = $false\r\n            $psi.CreateNoWindow         = $true\r\n\r\n            $proc = [System.Diagnostics.Process]::new()\r\n            $proc.StartInfo = $psi\r\n            $proc.Start() | Out-Null\r\n\r\n            # Stream stdout line-by-line as oscdimg runs\r\n            while (-not $proc.StandardOutput.EndOfStream) {\r\n                $line = $proc.StandardOutput.ReadLine()\r\n                if ($line.Trim()) { Write-Win11ISOLog $line }\r\n            }\r\n\r\n            $proc.WaitForExit()\r\n\r\n            # Flush any stderr after process exits\r\n            $stderr = $proc.StandardError.ReadToEnd()\r\n            foreach ($line in ($stderr -split \"`r?`n\")) {\r\n                if ($line.Trim()) { Write-Win11ISOLog \"[stderr]$line\" }\r\n            }\r\n\r\n            if ($proc.ExitCode -eq 0) {\r\n                SetProgress \"ISO exported\" 100\r\n                Write-Win11ISOLog \"ISO exported successfully: $outputISO\"\r\n                $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                    [System.Windows.MessageBox]::Show(\"ISO exported successfully!`n`n$outputISO\", \"Export Complete\", \"OK\", \"Info\")\r\n                })\r\n            } else {\r\n                Write-Win11ISOLog \"oscdimg exited with code $($proc.ExitCode).\"\r\n                $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                    [System.Windows.MessageBox]::Show(\r\n                        \"oscdimg exited with code $($proc.ExitCode).`nCheck the status log for details.\",\r\n                        \"Export Error\", \"OK\", \"Error\")\r\n                })\r\n            }\r\n        } catch {\r\n            Write-Win11ISOLog \"ERROR during ISO export: $_\"\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                [System.Windows.MessageBox]::Show(\"ISO export failed:`n`n$_\", \"Error\", \"OK\", \"Error\")\r\n            })\r\n        } finally {\r\n            Start-Sleep -Milliseconds 800\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync.progressBarTextBlock.Text    = \"\"\r\n                $sync.progressBarTextBlock.ToolTip = \"\"\r\n                $sync.ProgressBar.Value            = 0\r\n                $sync[\"WPFWin11ISOChooseISOButton\"].IsEnabled = $true\r\n            })\r\n        }\r\n    }) | Out-Null\r\n\r\n    $script.BeginInvoke() | Out-Null\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilISOScript.ps1",
    "content": "function Invoke-WinUtilISOScript {\r\n    <#\r\n    .SYNOPSIS\r\n        Applies WinUtil modifications to a mounted Windows 11 install.wim image.\r\n\r\n    .DESCRIPTION\r\n        Removes AppX bloatware and OneDrive, optionally injects all drivers exported from\r\n        the running system into install.wim and boot.wim (controlled by the\r\n        -InjectCurrentSystemDrivers switch), applies offline registry tweaks (hardware\r\n        bypass, privacy, OOBE, telemetry, update suppression), deletes CEIP/WU\r\n        scheduled-task definition files, and optionally writes autounattend.xml to the ISO\r\n        root and removes the support\\ folder from the ISO contents directory.\r\n\r\n        All setup scripts embedded in the autounattend.xml <Extensions><File> nodes are\r\n        written directly into the WIM at their target paths under C:\\Windows\\Setup\\Scripts\\\r\n        to ensure they survive Windows Setup stripping unrecognised-namespace XML elements\r\n        from the Panther copy of the answer file.\r\n\r\n        Mounting/dismounting the WIM is the caller's responsibility (e.g. Invoke-WinUtilISO).\r\n\r\n    .PARAMETER ScratchDir\r\n        Mandatory. Full path to the directory where the Windows image is currently mounted.\r\n\r\n    .PARAMETER ISOContentsDir\r\n        Optional. Root directory of the extracted ISO contents. When supplied,\r\n        autounattend.xml is written here and the support\\ folder is removed.\r\n\r\n    .PARAMETER AutoUnattendXml\r\n        Optional. Full XML content for autounattend.xml. If empty, the OOBE bypass\r\n        file is skipped and a warning is logged.\r\n\r\n    .PARAMETER InjectCurrentSystemDrivers\r\n        Optional. When $true, exports all drivers from the running system and injects\r\n        them into install.wim and boot.wim index 2 (Windows Setup PE).\r\n        Defaults to $false.\r\n\r\n    .PARAMETER Log\r\n        Optional ScriptBlock for progress/status logging. Receives a single [string] argument.\r\n\r\n    .EXAMPLE\r\n        Invoke-WinUtilISOScript -ScratchDir \"C:\\Temp\\wim_mount\"\r\n\r\n    .EXAMPLE\r\n        Invoke-WinUtilISOScript `\r\n            -ScratchDir      $mountDir `\r\n            -ISOContentsDir  $isoRoot `\r\n            -AutoUnattendXml (Get-Content .\\tools\\autounattend.xml -Raw) `\r\n            -Log             { param($m) Write-Host $m }\r\n\r\n    .NOTES\r\n        Author  : Chris Titus @christitustech\r\n        GitHub  : https://github.com/ChrisTitusTech\r\n        Version : 26.03.02\r\n    #>\r\n    param (\r\n        [Parameter(Mandatory)][string]$ScratchDir,\r\n        [string]$ISOContentsDir = \"\",\r\n        [string]$AutoUnattendXml = \"\",\r\n        [bool]$InjectCurrentSystemDrivers = $false,\r\n        [scriptblock]$Log = { param($m) Write-Output $m }\r\n    )\r\n\r\n    $adminSID   = New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544')\r\n    $adminGroup = $adminSID.Translate([System.Security.Principal.NTAccount])\r\n\r\n    function Set-ISOScriptReg {\r\n        param ([string]$path, [string]$name, [string]$type, [string]$value)\r\n        try {\r\n            & reg add $path /v $name /t $type /d $value /f\r\n            & $Log \"Set registry value: $path\\$name\"\r\n        } catch {\r\n            & $Log \"Error setting registry value: $_\"\r\n        }\r\n    }\r\n\r\n    function Remove-ISOScriptReg {\r\n        param ([string]$path)\r\n        try {\r\n            & reg delete $path /f\r\n            & $Log \"Removed registry key: $path\"\r\n        } catch {\r\n            & $Log \"Error removing registry key: $_\"\r\n        }\r\n    }\r\n\r\n    function Add-DriversToImage {\r\n        param ([string]$MountPath, [string]$DriverDir, [string]$Label = \"image\", [scriptblock]$Logger)\r\n        & dism /English \"/image:$MountPath\" /Add-Driver \"/Driver:$DriverDir\" /Recurse 2>&1 |\r\n            ForEach-Object { & $Logger \"  dism[$Label]: $_\" }\r\n    }\r\n\r\n    function Invoke-BootWimInject {\r\n        param ([string]$BootWimPath, [string]$DriverDir, [scriptblock]$Logger)\r\n        Set-ItemProperty -Path $BootWimPath -Name IsReadOnly -Value $false -ErrorAction SilentlyContinue\r\n        $mountDir = Join-Path $env:TEMP \"WinUtil_BootMount_$(Get-Random)\"\r\n        New-Item -Path $mountDir -ItemType Directory -Force | Out-Null\r\n        try {\r\n            & $Logger \"Mounting boot.wim (index 2) for driver injection...\"\r\n            Mount-WindowsImage -ImagePath $BootWimPath -Index 2 -Path $mountDir -ErrorAction Stop | Out-Null\r\n            Add-DriversToImage -MountPath $mountDir -DriverDir $DriverDir -Label \"boot\" -Logger $Logger\r\n            & $Logger \"Saving boot.wim...\"\r\n            Dismount-WindowsImage -Path $mountDir -Save -ErrorAction Stop | Out-Null\r\n            & $Logger \"boot.wim driver injection complete.\"\r\n        } catch {\r\n            & $Logger \"Warning: boot.wim driver injection failed: $_\"\r\n            try { Dismount-WindowsImage -Path $mountDir -Discard -ErrorAction SilentlyContinue | Out-Null } catch {}\r\n        } finally {\r\n            Remove-Item -Path $mountDir -Recurse -Force -ErrorAction SilentlyContinue\r\n        }\r\n    }\r\n\r\n    # ── 1. Remove provisioned AppX packages ──────────────────────────────────\r\n    & $Log \"Removing provisioned AppX packages...\"\r\n\r\n    $packages = & dism /English \"/image:$ScratchDir\" /Get-ProvisionedAppxPackages |\r\n        ForEach-Object { if ($_ -match 'PackageName : (.*)') { $matches[1] } }\r\n\r\n    $packagePrefixes = @(\r\n        'AppUp.IntelManagementandSecurityStatus',\r\n        'Clipchamp.Clipchamp',\r\n        'DolbyLaboratories.DolbyAccess',\r\n        'DolbyLaboratories.DolbyDigitalPlusDecoderOEM',\r\n        'Microsoft.BingNews',\r\n        'Microsoft.BingSearch',\r\n        'Microsoft.BingWeather',\r\n        'Microsoft.Copilot',\r\n        'Microsoft.Windows.CrossDevice',\r\n        'Microsoft.GetHelp',\r\n        'Microsoft.Getstarted',\r\n        'Microsoft.Microsoft3DViewer',\r\n        'Microsoft.MicrosoftOfficeHub',\r\n        'Microsoft.MicrosoftSolitaireCollection',\r\n        'Microsoft.MicrosoftStickyNotes',\r\n        'Microsoft.MixedReality.Portal',\r\n        'Microsoft.MSPaint',\r\n        'Microsoft.Office.OneNote',\r\n        'Microsoft.OfficePushNotificationUtility',\r\n        'Microsoft.OutlookForWindows',\r\n        'Microsoft.Paint',\r\n        'Microsoft.People',\r\n        'Microsoft.PowerAutomateDesktop',\r\n        'Microsoft.SkypeApp',\r\n        'Microsoft.StartExperiencesApp',\r\n        'Microsoft.Todos',\r\n        'Microsoft.Wallet',\r\n        'Microsoft.Windows.DevHome',\r\n        'Microsoft.Windows.Copilot',\r\n        'Microsoft.Windows.Teams',\r\n        'Microsoft.WindowsAlarms',\r\n        'Microsoft.WindowsCamera',\r\n        'microsoft.windowscommunicationsapps',\r\n        'Microsoft.WindowsFeedbackHub',\r\n        'Microsoft.WindowsMaps',\r\n        'Microsoft.WindowsSoundRecorder',\r\n        'Microsoft.ZuneMusic',\r\n        'Microsoft.ZuneVideo',\r\n        'MicrosoftCorporationII.MicrosoftFamily',\r\n        'MicrosoftCorporationII.QuickAssist',\r\n        'MSTeams',\r\n        'MicrosoftTeams'\r\n    )\r\n\r\n    $packages | Where-Object { $pkg = $_; $packagePrefixes | Where-Object { $pkg -like \"*$_*\" } } |\r\n        ForEach-Object { & dism /English \"/image:$ScratchDir\" /Remove-ProvisionedAppxPackage \"/PackageName:$_\" }\r\n\r\n    # ── 2. Inject current system drivers (optional) ───────────────────────────\r\n    if ($InjectCurrentSystemDrivers) {\r\n        & $Log \"Exporting all drivers from running system...\"\r\n        $driverExportRoot = Join-Path $env:TEMP \"WinUtil_DriverExport_$(Get-Random)\"\r\n        New-Item -Path $driverExportRoot -ItemType Directory -Force | Out-Null\r\n        try {\r\n            Export-WindowsDriver -Online -Destination $driverExportRoot | Out-Null\r\n\r\n            & $Log \"Injecting current system drivers into install.wim...\"\r\n            Add-DriversToImage -MountPath $ScratchDir -DriverDir $driverExportRoot -Label \"install\" -Logger $Log\r\n            & $Log \"install.wim driver injection complete.\"\r\n\r\n            if ($ISOContentsDir -and (Test-Path $ISOContentsDir)) {\r\n                $bootWim = Join-Path $ISOContentsDir \"sources\\boot.wim\"\r\n                if (Test-Path $bootWim) {\r\n                    & $Log \"Injecting current system drivers into boot.wim...\"\r\n                    Invoke-BootWimInject -BootWimPath $bootWim -DriverDir $driverExportRoot -Logger $Log\r\n                } else {\r\n                    & $Log \"Warning: boot.wim not found — skipping boot.wim driver injection.\"\r\n                }\r\n            }\r\n        } catch {\r\n            & $Log \"Error during driver export/injection: $_\"\r\n        } finally {\r\n            Remove-Item -Path $driverExportRoot -Recurse -Force -ErrorAction SilentlyContinue\r\n        }\r\n    } else {\r\n        & $Log \"Driver injection skipped.\"\r\n    }\r\n\r\n    # ── 3. Remove OneDrive ────────────────────────────────────────────────────\r\n    & $Log \"Removing OneDrive...\"\r\n    & takeown /f \"$ScratchDir\\Windows\\System32\\OneDriveSetup.exe\" | Out-Null\r\n    & icacls    \"$ScratchDir\\Windows\\System32\\OneDriveSetup.exe\" /grant \"$($adminGroup.Value):(F)\" /T /C | Out-Null\r\n    Remove-Item -Path \"$ScratchDir\\Windows\\System32\\OneDriveSetup.exe\" -Force -ErrorAction SilentlyContinue\r\n\r\n    # ── 4. Registry tweaks ────────────────────────────────────────────────────\r\n    & $Log \"Loading offline registry hives...\"\r\n    reg load HKLM\\zCOMPONENTS \"$ScratchDir\\Windows\\System32\\config\\COMPONENTS\"\r\n    reg load HKLM\\zDEFAULT    \"$ScratchDir\\Windows\\System32\\config\\default\"\r\n    reg load HKLM\\zNTUSER     \"$ScratchDir\\Users\\Default\\ntuser.dat\"\r\n    reg load HKLM\\zSOFTWARE   \"$ScratchDir\\Windows\\System32\\config\\SOFTWARE\"\r\n    reg load HKLM\\zSYSTEM     \"$ScratchDir\\Windows\\System32\\config\\SYSTEM\"\r\n\r\n    & $Log \"Bypassing system requirements...\"\r\n    Set-ISOScriptReg 'HKLM\\zDEFAULT\\Control Panel\\UnsupportedHardwareNotificationCache' 'SV1' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zDEFAULT\\Control Panel\\UnsupportedHardwareNotificationCache' 'SV2' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Control Panel\\UnsupportedHardwareNotificationCache'  'SV1' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Control Panel\\UnsupportedHardwareNotificationCache'  'SV2' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zSYSTEM\\Setup\\LabConfig' 'BypassCPUCheck'       'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSYSTEM\\Setup\\LabConfig' 'BypassRAMCheck'       'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSYSTEM\\Setup\\LabConfig' 'BypassSecureBootCheck' 'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSYSTEM\\Setup\\LabConfig' 'BypassStorageCheck'   'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSYSTEM\\Setup\\LabConfig' 'BypassTPMCheck'       'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSYSTEM\\Setup\\MoSetup'   'AllowUpgradesWithUnsupportedTPMOrCPU' 'REG_DWORD' '1'\r\n\r\n    & $Log \"Disabling sponsored apps...\"\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'OemPreInstalledAppsEnabled'  'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'PreInstalledAppsEnabled'     'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'SilentInstalledAppsEnabled'  'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent' 'DisableWindowsConsumerFeatures' 'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'ContentDeliveryAllowed'      'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Microsoft\\PolicyManager\\current\\device\\Start' 'ConfigureStartPins' 'REG_SZ' '{\"pinnedList\": [{}]}'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'FeatureManagementEnabled'    'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'PreInstalledAppsEverEnabled' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'SoftLandingEnabled'          'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'SubscribedContentEnabled'    'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'SubscribedContent-310093Enabled' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'SubscribedContent-338388Enabled' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'SubscribedContent-338389Enabled' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'SubscribedContent-338393Enabled' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'SubscribedContent-353694Enabled' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'SubscribedContent-353696Enabled' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager' 'SystemPaneSuggestionsEnabled' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\PushToInstall' 'DisablePushToInstall' 'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\MRT'           'DontOfferThroughWUAU' 'REG_DWORD' '1'\r\n    Remove-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager\\Subscriptions'\r\n    Remove-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\ContentDeliveryManager\\SuggestedApps'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent' 'DisableConsumerAccountStateContent' 'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent' 'DisableCloudOptimizedContent'       'REG_DWORD' '1'\r\n\r\n    & $Log \"Enabling local accounts on OOBE...\"\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\OOBE' 'BypassNRO' 'REG_DWORD' '1'\r\n\r\n    if ($AutoUnattendXml) {\r\n        try {\r\n            $xmlDoc = [xml]::new()\r\n            $xmlDoc.LoadXml($AutoUnattendXml)\r\n\r\n            $nsMgr = New-Object System.Xml.XmlNamespaceManager($xmlDoc.NameTable)\r\n            $nsMgr.AddNamespace(\"sg\", \"https://schneegans.de/windows/unattend-generator/\")\r\n\r\n            $fileNodes = $xmlDoc.SelectNodes(\"//sg:File\", $nsMgr)\r\n            if ($fileNodes -and $fileNodes.Count -gt 0) {\r\n                foreach ($fileNode in $fileNodes) {\r\n                    $absPath  = $fileNode.GetAttribute(\"path\")\r\n                    $relPath  = $absPath -replace '^[A-Za-z]:[/\\\\]', ''\r\n                    $destPath = Join-Path $ScratchDir $relPath\r\n                    New-Item -Path (Split-Path $destPath -Parent) -ItemType Directory -Force -ErrorAction SilentlyContinue | Out-Null\r\n\r\n                    $ext = [IO.Path]::GetExtension($destPath).ToLower()\r\n                    $encoding = switch ($ext) {\r\n                        { $_ -in '.ps1', '.xml' }        { [System.Text.Encoding]::UTF8 }\r\n                        { $_ -in '.reg', '.vbs', '.js' } { [System.Text.UnicodeEncoding]::new($false, $true) }\r\n                        default                          { [System.Text.Encoding]::Default }\r\n                    }\r\n                    [System.IO.File]::WriteAllBytes($destPath, ($encoding.GetPreamble() + $encoding.GetBytes($fileNode.InnerText.Trim())))\r\n                    & $Log \"Pre-staged setup script: $relPath\"\r\n                }\r\n            } else {\r\n                & $Log \"Warning: no <Extensions><File> nodes found in autounattend.xml — setup scripts not pre-staged.\"\r\n            }\r\n        } catch {\r\n            & $Log \"Warning: could not pre-stage setup scripts from autounattend.xml: $_\"\r\n        }\r\n\r\n        if ($ISOContentsDir -and (Test-Path $ISOContentsDir)) {\r\n            $isoDest = Join-Path $ISOContentsDir \"autounattend.xml\"\r\n            Set-Content -Path $isoDest -Value $AutoUnattendXml -Encoding UTF8 -Force\r\n            & $Log \"Written autounattend.xml to ISO root ($isoDest).\"\r\n        }\r\n    } else {\r\n        & $Log \"Warning: autounattend.xml content is empty — skipping OOBE bypass file.\"\r\n    }\r\n\r\n    & $Log \"Disabling reserved storage...\"\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ReserveManager' 'ShippedWithReserves' 'REG_DWORD' '0'\r\n\r\n    & $Log \"Disabling BitLocker device encryption...\"\r\n    Set-ISOScriptReg 'HKLM\\zSYSTEM\\ControlSet001\\Control\\BitLocker' 'PreventDeviceEncryption' 'REG_DWORD' '1'\r\n\r\n    & $Log \"Disabling Chat icon...\"\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\Windows Chat' 'ChatIcon' 'REG_DWORD' '3'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced' 'TaskbarMn' 'REG_DWORD' '0'\r\n\r\n    & $Log \"Disabling OneDrive folder backup...\"\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\OneDrive' 'DisableFileSyncNGSC' 'REG_DWORD' '1'\r\n\r\n    & $Log \"Disabling telemetry...\"\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\AdvertisingInfo' 'Enabled' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Windows\\CurrentVersion\\Privacy' 'TailoredExperiencesWithDiagnosticDataEnabled' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Speech_OneCore\\Settings\\OnlineSpeechPrivacy' 'HasAccepted' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Input\\TIPC' 'Enabled' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\InputPersonalization' 'RestrictImplicitInkCollection'  'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\InputPersonalization' 'RestrictImplicitTextCollection' 'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\InputPersonalization\\TrainedDataStore' 'HarvestContacts' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zNTUSER\\Software\\Microsoft\\Personalization\\Settings' 'AcceptedPrivacyPolicy' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\DataCollection' 'AllowTelemetry' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zSYSTEM\\ControlSet001\\Services\\dmwappushservice' 'Start' 'REG_DWORD' '4'\r\n\r\n    & $Log \"Preventing installation of DevHome and Outlook...\"\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Orchestrator\\UScheduler_Oobe\\OutlookUpdate' 'workCompleted' 'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Orchestrator\\UScheduler\\OutlookUpdate'      'workCompleted' 'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Orchestrator\\UScheduler\\DevHomeUpdate'      'workCompleted' 'REG_DWORD' '1'\r\n    Remove-ISOScriptReg 'HKLM\\zSOFTWARE\\Microsoft\\WindowsUpdate\\Orchestrator\\UScheduler_Oobe\\OutlookUpdate'\r\n    Remove-ISOScriptReg 'HKLM\\zSOFTWARE\\Microsoft\\WindowsUpdate\\Orchestrator\\UScheduler_Oobe\\DevHomeUpdate'\r\n\r\n    & $Log \"Disabling Copilot...\"\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\WindowsCopilot' 'TurnOffWindowsCopilot'      'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Edge'                   'HubsSidebarEnabled'          'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\Explorer'       'DisableSearchBoxSuggestions' 'REG_DWORD' '1'\r\n\r\n    & $Log \"Disabling Windows Update during OOBE (re-enabled on first logon via FirstLogon.ps1)...\"\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU' 'NoAutoUpdate'              'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU' 'AUOptions'                 'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU' 'UseWUServer'               'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate'    'DisableWindowsUpdateAccess' 'REG_DWORD' '1'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate'    'WUServer'                  'REG_SZ'    'http://localhost:8080'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate'    'WUStatusServer'            'REG_SZ'    'http://localhost:8080'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Orchestrator\\UScheduler_Oobe\\WindowsUpdate' 'workCompleted' 'REG_DWORD' '1'\r\n    Remove-ISOScriptReg 'HKLM\\zSOFTWARE\\Microsoft\\WindowsUpdate\\Orchestrator\\UScheduler_Oobe\\WindowsUpdate'\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\DeliveryOptimization\\Config' 'DODownloadMode' 'REG_DWORD' '0'\r\n    Set-ISOScriptReg 'HKLM\\zSYSTEM\\ControlSet001\\Services\\BITS'         'Start' 'REG_DWORD' '4'\r\n    Set-ISOScriptReg 'HKLM\\zSYSTEM\\ControlSet001\\Services\\wuauserv'     'Start' 'REG_DWORD' '4'\r\n    Set-ISOScriptReg 'HKLM\\zSYSTEM\\ControlSet001\\Services\\UsoSvc'       'Start' 'REG_DWORD' '4'\r\n    Set-ISOScriptReg 'HKLM\\zSYSTEM\\ControlSet001\\Services\\WaaSMedicSvc' 'Start' 'REG_DWORD' '4'\r\n\r\n    & $Log \"Preventing installation of Teams...\"\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Teams' 'DisableInstallation' 'REG_DWORD' '1'\r\n\r\n    & $Log \"Preventing installation of new Outlook...\"\r\n    Set-ISOScriptReg 'HKLM\\zSOFTWARE\\Policies\\Microsoft\\Windows\\Windows Mail' 'PreventRun' 'REG_DWORD' '1'\r\n\r\n    & $Log \"Unloading offline registry hives...\"\r\n    reg unload HKLM\\zCOMPONENTS\r\n    reg unload HKLM\\zDEFAULT\r\n    reg unload HKLM\\zNTUSER\r\n    reg unload HKLM\\zSOFTWARE\r\n    reg unload HKLM\\zSYSTEM\r\n\r\n    # ── 5. Delete scheduled task definition files ─────────────────────────────\r\n    & $Log \"Deleting scheduled task definition files...\"\r\n    $tasksPath = \"$ScratchDir\\Windows\\System32\\Tasks\"\r\n    Remove-Item \"$tasksPath\\Microsoft\\Windows\\Application Experience\\Microsoft Compatibility Appraiser\" -Force -ErrorAction SilentlyContinue\r\n    Remove-Item \"$tasksPath\\Microsoft\\Windows\\Customer Experience Improvement Program\"                  -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item \"$tasksPath\\Microsoft\\Windows\\Application Experience\\ProgramDataUpdater\"               -Force -ErrorAction SilentlyContinue\r\n    Remove-Item \"$tasksPath\\Microsoft\\Windows\\Chkdsk\\Proxy\"                                            -Force -ErrorAction SilentlyContinue\r\n    Remove-Item \"$tasksPath\\Microsoft\\Windows\\Windows Error Reporting\\QueueReporting\"                  -Force -ErrorAction SilentlyContinue\r\n    Remove-Item \"$tasksPath\\Microsoft\\Windows\\InstallService\"                                          -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item \"$tasksPath\\Microsoft\\Windows\\UpdateOrchestrator\"                                      -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item \"$tasksPath\\Microsoft\\Windows\\UpdateAssistant\"                                         -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item \"$tasksPath\\Microsoft\\Windows\\WaaSMedic\"                                               -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item \"$tasksPath\\Microsoft\\Windows\\WindowsUpdate\"                                           -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item \"$tasksPath\\Microsoft\\WindowsUpdate\"                                                   -Recurse -Force -ErrorAction SilentlyContinue\r\n    & $Log \"Scheduled task files deleted.\"\r\n\r\n    # ── 6. Remove ISO support folder ─────────────────────────────────────────\r\n    if ($ISOContentsDir -and (Test-Path $ISOContentsDir)) {\r\n        & $Log \"Removing ISO support\\ folder...\"\r\n        Remove-Item -Path (Join-Path $ISOContentsDir \"support\") -Recurse -Force -ErrorAction SilentlyContinue\r\n        & $Log \"ISO support\\ folder removed.\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilISOUSB.ps1",
    "content": "function Invoke-WinUtilISORefreshUSBDrives {\r\n    $combo    = $sync[\"WPFWin11ISOUSBDriveComboBox\"]\r\n    $removable = @(Get-Disk | Where-Object { $_.BusType -eq \"USB\" } | Sort-Object Number)\r\n\r\n    $combo.Items.Clear()\r\n\r\n    if ($removable.Count -eq 0) {\r\n        $combo.Items.Add(\"No USB drives detected\")\r\n        $combo.SelectedIndex = 0\r\n        $sync[\"Win11ISOUSBDisks\"] = @()\r\n        Write-Win11ISOLog \"No USB drives detected.\"\r\n        return\r\n    }\r\n\r\n    foreach ($disk in $removable) {\r\n        $sizeGB = [math]::Round($disk.Size / 1GB, 1)\r\n        $combo.Items.Add(\"Disk $($disk.Number): $($disk.FriendlyName)  [$sizeGB GB] - $($disk.PartitionStyle)\")\r\n    }\r\n    $combo.SelectedIndex = 0\r\n    Write-Win11ISOLog \"Found $($removable.Count) USB drive(s).\"\r\n    $sync[\"Win11ISOUSBDisks\"] = $removable\r\n}\r\n\r\nfunction Invoke-WinUtilISOWriteUSB {\r\n    $contentsDir = $sync[\"Win11ISOContentsDir\"]\r\n    $usbDisks    = $sync[\"Win11ISOUSBDisks\"]\r\n\r\n    if (-not $contentsDir -or -not (Test-Path $contentsDir)) {\r\n        [System.Windows.MessageBox]::Show(\"No modified ISO content found.  Please complete Steps 1-3 first.\", \"Not Ready\", \"OK\", \"Warning\")\r\n        return\r\n    }\r\n\r\n    $combo = $sync[\"WPFWin11ISOUSBDriveComboBox\"]\r\n    $selectedIndex = $combo.SelectedIndex\r\n    $selectedItemText = [string]$combo.SelectedItem\r\n    $usbDisks = @($usbDisks)\r\n\r\n    $targetDisk = $null\r\n    if ($selectedIndex -ge 0 -and $selectedIndex -lt $usbDisks.Count) {\r\n        $targetDisk = $usbDisks[$selectedIndex]\r\n    } elseif ($selectedItemText -match 'Disk\\s+(\\d+):') {\r\n        $selectedDiskNum = [int]$matches[1]\r\n        $targetDisk = $usbDisks | Where-Object { $_.Number -eq $selectedDiskNum } | Select-Object -First 1\r\n    }\r\n\r\n    if (-not $targetDisk) {\r\n        [System.Windows.MessageBox]::Show(\"Please select a USB drive from the dropdown.\", \"No Drive Selected\", \"OK\", \"Warning\")\r\n        return\r\n    }\r\n\r\n    $diskNum    = $targetDisk.Number\r\n    $sizeGB     = [math]::Round($targetDisk.Size / 1GB, 1)\r\n\r\n    $confirm = [System.Windows.MessageBox]::Show(\r\n        \"ALL data on Disk $diskNum ($($targetDisk.FriendlyName), $sizeGB GB) will be PERMANENTLY ERASED.`n`nAre you sure you want to continue?\",\r\n        \"Confirm USB Erase\", \"YesNo\", \"Warning\")\r\n\r\n    if ($confirm -ne \"Yes\") {\r\n        Write-Win11ISOLog \"USB write cancelled by user.\"\r\n        return\r\n    }\r\n\r\n    $sync[\"WPFWin11ISOWriteUSBButton\"].IsEnabled = $false\r\n    Write-Win11ISOLog \"Starting USB write to Disk $diskNum...\"\r\n\r\n    $runspace = [Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()\r\n    $runspace.ApartmentState = \"STA\"\r\n    $runspace.ThreadOptions  = \"ReuseThread\"\r\n    $runspace.Open()\r\n    $runspace.SessionStateProxy.SetVariable(\"sync\",        $sync)\r\n    $runspace.SessionStateProxy.SetVariable(\"diskNum\",     $diskNum)\r\n    $runspace.SessionStateProxy.SetVariable(\"contentsDir\", $contentsDir)\r\n\r\n    $script = [Management.Automation.PowerShell]::Create()\r\n    $script.Runspace = $runspace\r\n    $script.AddScript({\r\n\r\n        function Log($msg) {\r\n            $ts = (Get-Date).ToString(\"HH:mm:ss\")\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync[\"WPFWin11ISOStatusLog\"].Text += \"`n[$ts] $msg\"\r\n                $sync[\"WPFWin11ISOStatusLog\"].CaretIndex = $sync[\"WPFWin11ISOStatusLog\"].Text.Length\r\n                $sync[\"WPFWin11ISOStatusLog\"].ScrollToEnd()\r\n            })\r\n        }\r\n\r\n        function SetProgress($label, $pct) {\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync.progressBarTextBlock.Text    = $label\r\n                $sync.progressBarTextBlock.ToolTip = $label\r\n                $sync.ProgressBar.Value            = [Math]::Max($pct, 5)\r\n            })\r\n        }\r\n\r\n        function Get-FreeDriveLetter {\r\n            $used = (Get-PSDrive -PSProvider FileSystem -ErrorAction SilentlyContinue).Name\r\n            foreach ($c in [char[]](68..90)) {\r\n                if ($used -notcontains [string]$c) { return $c }\r\n            }\r\n            return $null\r\n        }\r\n\r\n        try {\r\n            SetProgress \"Formatting USB drive...\" 10\r\n\r\n            # Phase 1: Clean disk via diskpart (retry once if the drive is not yet ready)\r\n            $dpFile1 = Join-Path $env:TEMP \"winutil_diskpart_$(Get-Random).txt\"\r\n            \"select disk $diskNum`nclean`nexit\" | Set-Content -Path $dpFile1 -Encoding ASCII\r\n            Log \"Running diskpart clean on Disk $diskNum...\"\r\n            $dpCleanOut = diskpart /s $dpFile1 2>&1\r\n            $dpCleanOut | Where-Object { $_ -match '\\S' } | ForEach-Object { Log \"  diskpart: $_\" }\r\n            Remove-Item $dpFile1 -Force -ErrorAction SilentlyContinue\r\n\r\n            if (($dpCleanOut -join ' ') -match 'device is not ready') {\r\n                Log \"Disk $diskNum was not ready; waiting 5 seconds and retrying clean...\"\r\n                Start-Sleep -Seconds 5\r\n                Update-Disk -Number $diskNum -ErrorAction SilentlyContinue\r\n                $dpFile1b = Join-Path $env:TEMP \"winutil_diskpart_$(Get-Random).txt\"\r\n                \"select disk $diskNum`nclean`nexit\" | Set-Content -Path $dpFile1b -Encoding ASCII\r\n                diskpart /s $dpFile1b 2>&1 | Where-Object { $_ -match '\\S' } | ForEach-Object { Log \"  diskpart: $_\" }\r\n                Remove-Item $dpFile1b -Force -ErrorAction SilentlyContinue\r\n            }\r\n\r\n            # Phase 2: Initialize as GPT\r\n            Start-Sleep -Seconds 2\r\n            Update-Disk -Number $diskNum -ErrorAction SilentlyContinue\r\n            $diskObj = Get-Disk -Number $diskNum -ErrorAction Stop\r\n            if ($diskObj.PartitionStyle -eq 'RAW') {\r\n                Initialize-Disk -Number $diskNum -PartitionStyle GPT -ErrorAction Stop\r\n                Log \"Disk $diskNum initialized as GPT.\"\r\n            } else {\r\n                Set-Disk -Number $diskNum -PartitionStyle GPT -ErrorAction Stop\r\n                Log \"Disk $diskNum converted to GPT (was $($diskObj.PartitionStyle)).\"\r\n            }\r\n\r\n            # Phase 3: Create FAT32 partition via diskpart, then format with Format-Volume\r\n            # (diskpart's 'format' command can fail with \"no volume selected\" on fresh/never-formatted drives)\r\n            $volLabel = \"W11-\" + (Get-Date).ToString('yyMMdd')\r\n            $dpFile2  = Join-Path $env:TEMP \"winutil_diskpart2_$(Get-Random).txt\"\r\n            $maxFat32PartitionMB = 32768\r\n            $diskSizeMB = [int][Math]::Floor((Get-Disk -Number $diskNum -ErrorAction Stop).Size / 1MB)\r\n            $createPartitionCommand = \"create partition primary\"\r\n            if ($diskSizeMB -gt $maxFat32PartitionMB) {\r\n                $createPartitionCommand = \"create partition primary size=$maxFat32PartitionMB\"\r\n                Log \"Disk $diskNum is $diskSizeMB MB; creating FAT32 partition capped at $maxFat32PartitionMB MB (32 GB).\"\r\n            }\r\n\r\n            @(\r\n                \"select disk $diskNum\"\r\n                $createPartitionCommand\r\n                \"exit\"\r\n            ) | Set-Content -Path $dpFile2 -Encoding ASCII\r\n            Log \"Creating partitions on Disk $diskNum...\"\r\n            diskpart /s $dpFile2 2>&1 | Where-Object { $_ -match '\\S' } | ForEach-Object { Log \"  diskpart: $_\" }\r\n            Remove-Item $dpFile2 -Force -ErrorAction SilentlyContinue\r\n\r\n            SetProgress \"Formatting USB partition...\" 25\r\n            Start-Sleep -Seconds 3\r\n            Update-Disk -Number $diskNum -ErrorAction SilentlyContinue\r\n\r\n            $partitions = Get-Partition -DiskNumber $diskNum -ErrorAction Stop\r\n            Log \"Partitions on Disk $diskNum after creation: $($partitions.Count)\"\r\n            foreach ($p in $partitions) {\r\n                Log \"  Partition $($p.PartitionNumber)  Type=$($p.Type)  Letter=$($p.DriveLetter)  Size=$([math]::Round($p.Size/1MB))MB\"\r\n            }\r\n\r\n            $winpePart = $partitions | Where-Object { $_.Type -eq \"Basic\" } | Select-Object -Last 1\r\n            if (-not $winpePart) {\r\n                throw \"Could not find the Basic partition on Disk $diskNum after creation.\"\r\n            }\r\n\r\n            # Format using Format-Volume (reliable on fresh drives; diskpart format fails\r\n            # with 'no volume selected' when the partition has never been formatted before)\r\n            Log \"Formatting Partition $($winpePart.PartitionNumber) as FAT32 (label: $volLabel)...\"\r\n            Get-Partition -DiskNumber $diskNum -PartitionNumber $winpePart.PartitionNumber |\r\n                Format-Volume -FileSystem FAT32 -NewFileSystemLabel $volLabel -Force -Confirm:$false | Out-Null\r\n            Log \"Partition $($winpePart.PartitionNumber) formatted as FAT32.\"\r\n\r\n            SetProgress \"Assigning drive letters...\" 30\r\n            Start-Sleep -Seconds 2\r\n            Update-Disk -Number $diskNum -ErrorAction SilentlyContinue\r\n\r\n            try { Remove-PartitionAccessPath -DiskNumber $diskNum -PartitionNumber $winpePart.PartitionNumber -AccessPath \"$($winpePart.DriveLetter):\" -ErrorAction SilentlyContinue } catch {}\r\n            $usbLetter = Get-FreeDriveLetter\r\n            if (-not $usbLetter) { throw \"No free drive letters (D-Z) available to assign to the USB data partition.\" }\r\n            Set-Partition -DiskNumber $diskNum -PartitionNumber $winpePart.PartitionNumber -NewDriveLetter $usbLetter\r\n            Log \"Assigned drive letter $usbLetter to WINPE partition (Partition $($winpePart.PartitionNumber)).\"\r\n            Start-Sleep -Seconds 2\r\n\r\n            $usbDrive = \"${usbLetter}:\"\r\n            $retries = 0\r\n            while (-not (Test-Path $usbDrive) -and $retries -lt 6) {\r\n                $retries++\r\n                Log \"Waiting for $usbDrive to become accessible (attempt $retries/6)...\"\r\n                Start-Sleep -Seconds 2\r\n            }\r\n            if (-not (Test-Path $usbDrive)) { throw \"Drive $usbDrive is not accessible after letter assignment.\" }\r\n            Log \"USB data partition: $usbDrive\"\r\n\r\n            $contentSizeBytes = (Get-ChildItem -LiteralPath $contentsDir -File -Recurse -Force -ErrorAction Stop | Measure-Object -Property Length -Sum).Sum\r\n            if (-not $contentSizeBytes) { $contentSizeBytes = 0 }\r\n            $usbVolume = Get-Volume -DriveLetter $usbLetter -ErrorAction Stop\r\n            $partitionCapacityBytes = [int64]$usbVolume.Size\r\n            $partitionFreeBytes = [int64]$usbVolume.SizeRemaining\r\n\r\n            $contentSizeGB = [math]::Round($contentSizeBytes / 1GB, 2)\r\n            $partitionCapacityGB = [math]::Round($partitionCapacityBytes / 1GB, 2)\r\n            $partitionFreeGB = [math]::Round($partitionFreeBytes / 1GB, 2)\r\n\r\n            Log \"Source content size: $contentSizeGB GB. USB partition capacity: $partitionCapacityGB GB, free: $partitionFreeGB GB.\"\r\n\r\n            if ($contentSizeBytes -gt $partitionCapacityBytes) {\r\n                throw \"ISO content ($contentSizeGB GB) is larger than the USB partition capacity ($partitionCapacityGB GB). Use a larger USB drive or reduce image size.\"\r\n            }\r\n\r\n            if ($contentSizeBytes -gt $partitionFreeBytes) {\r\n                throw \"Insufficient free space on USB partition. Required: $contentSizeGB GB, available: $partitionFreeGB GB.\"\r\n            }\r\n\r\n            SetProgress \"Copying Windows 11 files to USB...\" 45\r\n\r\n            # Copy files; split install.wim if > 4 GB (FAT32 limit)\r\n            $installWim = Join-Path $contentsDir \"sources\\install.wim\"\r\n            if (Test-Path $installWim) {\r\n                $wimSizeMB = [math]::Round((Get-Item $installWim).Length / 1MB)\r\n                if ($wimSizeMB -gt 3800) {\r\n                    Log \"install.wim is $wimSizeMB MB - splitting for FAT32 compatibility... This will take several minutes.\"\r\n                    $splitDest = Join-Path $usbDrive \"sources\\install.swm\"\r\n                    New-Item -ItemType Directory -Path (Split-Path $splitDest) -Force | Out-Null\r\n                    Split-WindowsImage -ImagePath $installWim -SplitImagePath $splitDest -FileSize 3800 -CheckIntegrity\r\n                    Log \"install.wim split complete.\"\r\n                    Log \"Copying remaining files to USB...\"\r\n                    & robocopy $contentsDir $usbDrive /E /XF install.wim /NFL /NDL /NJH /NJS\r\n                } else {\r\n                    & robocopy $contentsDir $usbDrive /E /NFL /NDL /NJH /NJS\r\n                }\r\n            } else {\r\n                & robocopy $contentsDir $usbDrive /E /NFL /NDL /NJH /NJS\r\n            }\r\n\r\n            SetProgress \"Finalising USB drive...\" 90\r\n            Log \"Files copied to USB.\"\r\n            SetProgress \"USB write complete\" 100\r\n            Log \"USB drive is ready for use.\"\r\n\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                [System.Windows.MessageBox]::Show(\r\n                    \"USB drive created successfully!`n`nYou can now boot from this drive to install Windows 11.\",\r\n                    \"USB Ready\", \"OK\", \"Info\")\r\n            })\r\n        } catch {\r\n            Log \"ERROR during USB write: $_\"\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                [System.Windows.MessageBox]::Show(\"USB write failed:`n`n$_\", \"USB Write Error\", \"OK\", \"Error\")\r\n            })\r\n        } finally {\r\n            Start-Sleep -Milliseconds 800\r\n            $sync[\"WPFWin11ISOStatusLog\"].Dispatcher.Invoke([action]{\r\n                $sync.progressBarTextBlock.Text    = \"\"\r\n                $sync.progressBarTextBlock.ToolTip = \"\"\r\n                $sync.ProgressBar.Value            = 0\r\n                $sync[\"WPFWin11ISOWriteUSBButton\"].IsEnabled = $true\r\n            })\r\n        }\r\n    }) | Out-Null\r\n\r\n    $script.BeginInvoke() | Out-Null\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilInstallPSProfile.ps1",
    "content": "function Invoke-WinUtilInstallPSProfile {\r\n\r\n    if (Test-Path $Profile) {\r\n        Rename-Item $Profile -NewName ($Profile + '.bak')\r\n    }\r\n\r\n    Start-Process pwsh -ArgumentList '-Command \"irm https://github.com/ChrisTitusTech/powershell-profile/raw/main/setup.ps1 | iex\"'\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilSSHServer.ps1",
    "content": "function Invoke-WinUtilSSHServer {\r\n    <#\r\n    .SYNOPSIS\r\n        Enables OpenSSH server to remote into your windows device\r\n    #>\r\n\r\n    # Get the latest version of OpenSSH Server\r\n    $FeatureName = Get-WindowsCapability -Online | Where-Object { $_.Name -like \"OpenSSH.Server*\" }\r\n\r\n    # Install the OpenSSH Server feature if not already installed\r\n    if ($FeatureName.State -ne \"Installed\") {\r\n        Write-Host \"Enabling OpenSSH Server\"\r\n        Add-WindowsCapability -Online -Name $FeatureName.Name\r\n    }\r\n\r\n    # Sets up the OpenSSH Server service\r\n    Write-Host \"Starting the services\"\r\n    Start-Service -Name sshd\r\n    Set-Service -Name sshd -StartupType Automatic\r\n\r\n    # Sets up the ssh-agent service\r\n    Start-Service 'ssh-agent'\r\n    Set-Service -Name 'ssh-agent' -StartupType 'Automatic'\r\n\r\n    # Confirm the required services are running\r\n    $SSHDaemonService = Get-Service -Name sshd\r\n    $SSHAgentService = Get-Service -Name 'ssh-agent'\r\n\r\n    if ($SSHDaemonService.Status -eq 'Running') {\r\n        Write-Host \"OpenSSH Server is running.\"\r\n    } else {\r\n        try {\r\n            Write-Host \"OpenSSH Server is not running. Attempting to restart...\"\r\n            Restart-Service -Name sshd -Force\r\n            Write-Host \"OpenSSH Server has been restarted successfully.\"\r\n        } catch {\r\n            Write-Host \"Failed to restart OpenSSH Server: $_\"\r\n        }\r\n    }\r\n    if ($SSHAgentService.Status -eq 'Running') {\r\n        Write-Host \"ssh-agent is running.\"\r\n    } else {\r\n        try {\r\n            Write-Host \"ssh-agent is not running. Attempting to restart...\"\r\n            Restart-Service -Name sshd -Force\r\n            Write-Host \"ssh-agent has been restarted successfully.\"\r\n        } catch {\r\n            Write-Host \"Failed to restart ssh-agent : $_\"\r\n        }\r\n    }\r\n\r\n    #Adding Firewall rule for port 22\r\n    Write-Host \"Setting up firewall rules\"\r\n    $firewallRule = (Get-NetFirewallRule -Name 'sshd').Enabled\r\n    if ($firewallRule) {\r\n        Write-Host \"Firewall rule for OpenSSH Server (sshd) already exists.\"\r\n    } else {\r\n        New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22\r\n        Write-Host \"Firewall rule for OpenSSH Server created and enabled.\"\r\n    }\r\n\r\n    # Check for the authorized_keys file\r\n    $sshFolderPath = \"$env:HOMEDRIVE\\$env:HOMEPATH\\.ssh\"\r\n    $authorizedKeysPath = \"$sshFolderPath\\authorized_keys\"\r\n\r\n    if (-not (Test-Path -Path $sshFolderPath)) {\r\n        Write-Host \"Creating ssh directory...\"\r\n        New-Item -Path $sshFolderPath -ItemType Directory -Force\r\n    }\r\n\r\n    if (-not (Test-Path -Path $authorizedKeysPath)) {\r\n        Write-Host \"Creating authorized_keys file...\"\r\n        New-Item -Path $authorizedKeysPath -ItemType File -Force\r\n        Write-Host \"authorized_keys file created at $authorizedKeysPath.\"\r\n    } else {\r\n        Write-Host \"authorized_keys file already exists at $authorizedKeysPath.\"\r\n    }\r\n    Write-Host \"OpenSSH server was successfully enabled.\"\r\n    Write-Host \"The config file can be located at C:\\ProgramData\\ssh\\sshd_config \"\r\n    Write-Host \"Add your public keys to this file -> $authorizedKeysPath\"\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilScript.ps1",
    "content": "function Invoke-WinUtilScript {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Invokes the provided scriptblock. Intended for things that can't be handled with the other functions.\r\n\r\n    .PARAMETER Name\r\n        The name of the scriptblock being invoked\r\n\r\n    .PARAMETER scriptblock\r\n        The scriptblock to be invoked\r\n\r\n    .EXAMPLE\r\n        $Scriptblock = [scriptblock]::Create({\"Write-output 'Hello World'\"})\r\n        Invoke-WinUtilScript -ScriptBlock $scriptblock -Name \"Hello World\"\r\n\r\n    #>\r\n    param (\r\n        $Name,\r\n        [scriptblock]$scriptblock\r\n    )\r\n\r\n    try {\r\n        Write-Host \"Running Script for $name\"\r\n        Invoke-Command $scriptblock -ErrorAction Stop\r\n    } catch [System.Management.Automation.CommandNotFoundException] {\r\n        Write-Warning \"The specified command was not found.\"\r\n        Write-Warning $PSItem.Exception.message\r\n    } catch [System.Management.Automation.RuntimeException] {\r\n        Write-Warning \"A runtime exception occurred.\"\r\n        Write-Warning $PSItem.Exception.message\r\n    } catch [System.Security.SecurityException] {\r\n        Write-Warning \"A security exception occurred.\"\r\n        Write-Warning $PSItem.Exception.message\r\n    } catch [System.UnauthorizedAccessException] {\r\n        Write-Warning \"Access denied. You do not have permission to perform this operation.\"\r\n        Write-Warning $PSItem.Exception.message\r\n    } catch {\r\n        # Generic catch block to handle any other type of exception\r\n        Write-Warning \"Unable to run script for $name due to unhandled exception\"\r\n        Write-Warning $psitem.Exception.StackTrace\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilSponsors.ps1",
    "content": "Function Invoke-WinUtilSponsors {\r\n    <#\r\n    .SYNOPSIS\r\n        Lists Sponsors from ChrisTitusTech\r\n    .DESCRIPTION\r\n        Lists Sponsors from ChrisTitusTech\r\n    .EXAMPLE\r\n        Invoke-WinUtilSponsors\r\n    .NOTES\r\n        This function is used to list sponsors from ChrisTitusTech\r\n    #>\r\n    try {\r\n        # Define the URL and headers\r\n        $url = \"https://github.com/sponsors/ChrisTitusTech\"\r\n        $headers = @{\r\n            \"User-Agent\" = \"Chrome/58.0.3029.110\"\r\n        }\r\n\r\n        # Fetch the webpage content\r\n        try {\r\n            $html = Invoke-RestMethod -Uri $url -Headers $headers\r\n        } catch {\r\n            Write-Output $_.Exception.Message\r\n            exit\r\n        }\r\n\r\n        # Use regex to extract the content between \"Current sponsors\" and \"Past sponsors\"\r\n        $currentSponsorsPattern = '(?s)(?<=Current sponsors).*?(?=Past sponsors)'\r\n        $currentSponsorsHtml = [regex]::Match($html, $currentSponsorsPattern).Value\r\n\r\n        # Use regex to extract the sponsor usernames from the alt attributes in the \"Current Sponsors\" section\r\n        $sponsorPattern = '(?<=alt=\"@)[^\"]+'\r\n        $sponsors = [regex]::Matches($currentSponsorsHtml, $sponsorPattern) | ForEach-Object { $_.Value }\r\n\r\n        # Exclude \"ChrisTitusTech\" from the sponsors\r\n        $sponsors = $sponsors | Where-Object { $_ -ne \"ChrisTitusTech\" }\r\n\r\n        # Return the sponsors\r\n        return $sponsors\r\n    } catch {\r\n        Write-Error \"An error occurred while fetching or processing the sponsors: $_\"\r\n        return $null\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilTweaks.ps1",
    "content": "function Invoke-WinUtilTweaks {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Invokes the function associated with each provided checkbox\r\n\r\n    .PARAMETER CheckBox\r\n        The checkbox to invoke\r\n\r\n    .PARAMETER undo\r\n        Indicates whether to undo the operation contained in the checkbox\r\n\r\n    .PARAMETER KeepServiceStartup\r\n        Indicates whether to override the startup of a service with the one given from WinUtil,\r\n        or to keep the startup of said service, if it was changed by the user, or another program, from its default value.\r\n    #>\r\n\r\n    param(\r\n        $CheckBox,\r\n        $undo = $false,\r\n        $KeepServiceStartup = $true\r\n    )\r\n\r\n    Write-Debug \"Tweaks: $($CheckBox)\"\r\n    if($undo) {\r\n        $Values = @{\r\n            Registry = \"OriginalValue\"\r\n            ScheduledTask = \"OriginalState\"\r\n            Service = \"OriginalType\"\r\n            ScriptType = \"UndoScript\"\r\n        }\r\n\r\n    } else {\r\n        $Values = @{\r\n            Registry = \"Value\"\r\n            ScheduledTask = \"State\"\r\n            Service = \"StartupType\"\r\n            OriginalService = \"OriginalType\"\r\n            ScriptType = \"InvokeScript\"\r\n        }\r\n    }\r\n    if($sync.configs.tweaks.$CheckBox.ScheduledTask) {\r\n        $sync.configs.tweaks.$CheckBox.ScheduledTask | ForEach-Object {\r\n            Write-Debug \"$($psitem.Name) and state is $($psitem.$($values.ScheduledTask))\"\r\n            Set-WinUtilScheduledTask -Name $psitem.Name -State $psitem.$($values.ScheduledTask)\r\n        }\r\n    }\r\n    if($sync.configs.tweaks.$CheckBox.service) {\r\n        Write-Debug \"KeepServiceStartup is $KeepServiceStartup\"\r\n        $sync.configs.tweaks.$CheckBox.service | ForEach-Object {\r\n            $changeservice = $true\r\n\r\n        # The check for !($undo) is required, without it the script will throw an error for accessing unavailable member, which's the 'OriginalService' Property\r\n            if($KeepServiceStartup -AND !($undo)) {\r\n                try {\r\n                    # Check if the service exists\r\n                    $service = Get-Service -Name $psitem.Name -ErrorAction Stop\r\n                    if(!($service.StartType.ToString() -eq $psitem.$($values.OriginalService))) {\r\n                        Write-Debug \"Service $($service.Name) was changed in the past to $($service.StartType.ToString()) from it's original type of $($psitem.$($values.OriginalService)), will not change it to $($psitem.$($values.service))\"\r\n                        $changeservice = $false\r\n                    }\r\n                } catch [System.ServiceProcess.ServiceNotFoundException] {\r\n                    Write-Warning \"Service $($psitem.Name) was not found\"\r\n                }\r\n            }\r\n\r\n            if($changeservice) {\r\n                Write-Debug \"$($psitem.Name) and state is $($psitem.$($values.service))\"\r\n                Set-WinUtilService -Name $psitem.Name -StartupType $psitem.$($values.Service)\r\n            }\r\n        }\r\n    }\r\n    if($sync.configs.tweaks.$CheckBox.registry) {\r\n        $sync.configs.tweaks.$CheckBox.registry | ForEach-Object {\r\n            Write-Debug \"$($psitem.Name) and state is $($psitem.$($values.registry))\"\r\n            if (($psitem.Path -imatch \"hku\") -and !(Get-PSDrive -Name HKU -ErrorAction SilentlyContinue)) {\r\n                $null = (New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS)\r\n                if (Get-PSDrive -Name HKU -ErrorAction SilentlyContinue) {\r\n                    Write-Debug \"HKU drive created successfully\"\r\n                } else {\r\n                    Write-Debug \"Failed to create HKU drive\"\r\n                }\r\n            }\r\n            Set-WinUtilRegistry -Name $psitem.Name -Path $psitem.Path -Type $psitem.Type -Value $psitem.$($values.registry)\r\n        }\r\n    }\r\n    if($sync.configs.tweaks.$CheckBox.$($values.ScriptType)) {\r\n        $sync.configs.tweaks.$CheckBox.$($values.ScriptType) | ForEach-Object {\r\n            Write-Debug \"$($psitem) and state is $($psitem.$($values.ScriptType))\"\r\n            $Scriptblock = [scriptblock]::Create($psitem)\r\n            Invoke-WinUtilScript -ScriptBlock $scriptblock -Name $CheckBox\r\n        }\r\n    }\r\n\r\n    if(!$undo) {\r\n        if($sync.configs.tweaks.$CheckBox.appx) {\r\n            $sync.configs.tweaks.$CheckBox.appx | ForEach-Object {\r\n                Write-Debug \"UNDO $($psitem.Name)\"\r\n                Remove-WinUtilAPPX -Name $psitem\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinUtilUninstallPSProfile.ps1",
    "content": "function Invoke-WinUtilUninstallPSProfile {\r\n    if (Test-Path ($Profile + '.bak')) {\r\n        Remove-Item $Profile\r\n        Rename-Item ($Profile + '.bak') -NewName $Profile\r\n    }\r\n    else {\r\n        Remove-Item $Profile\r\n    }\r\n\r\n    Write-Host \"Successfully uninstalled CTT Powershell Profile\" -ForegroundColor Green\r\n}\r\n"
  },
  {
    "path": "functions/private/Invoke-WinutilThemeChange.ps1",
    "content": "function Invoke-WinutilThemeChange {\r\n    <#\r\n    .SYNOPSIS\r\n        Toggles between light and dark themes for a Windows utility application.\r\n\r\n    .DESCRIPTION\r\n        This function toggles the theme of the user interface between 'Light' and 'Dark' modes,\r\n        modifying various UI elements such as colors, margins, corner radii, font families, etc.\r\n        If the '-init' switch is used, it initializes the theme based on the system's current dark mode setting.\r\n\r\n    .EXAMPLE\r\n        Invoke-WinutilThemeChange\r\n        # Toggles the theme between 'Light' and 'Dark'.\r\n\r\n\r\n    #>\r\n    param (\r\n        [string]$theme = \"Auto\"\r\n    )\r\n\r\n    function Set-WinutilTheme {\r\n        <#\r\n        .SYNOPSIS\r\n            Applies the specified theme to the application's user interface.\r\n\r\n        .DESCRIPTION\r\n            This internal function applies the given theme by setting the relevant properties\r\n            like colors, font families, corner radii, etc., in the UI. It uses the\r\n            'Set-ThemeResourceProperty' helper function to modify the application's resources.\r\n\r\n        .PARAMETER currentTheme\r\n            The name of the theme to be applied. Common values are \"Light\", \"Dark\", or \"shared\".\r\n        #>\r\n        param (\r\n            [string]$currentTheme\r\n        )\r\n\r\n        function Set-ThemeResourceProperty {\r\n            <#\r\n            .SYNOPSIS\r\n                Sets a specific UI property in the application's resources.\r\n\r\n            .DESCRIPTION\r\n                This helper function sets a property (e.g., color, margin, corner radius) in the\r\n                application's resources, based on the provided type and value. It includes\r\n                error handling to manage potential issues while setting a property.\r\n\r\n            .PARAMETER Name\r\n                The name of the resource property to modify (e.g., \"MainBackgroundColor\", \"ButtonBackgroundMouseoverColor\").\r\n\r\n            .PARAMETER Value\r\n                The value to assign to the resource property (e.g., \"#FFFFFF\" for a color).\r\n\r\n            .PARAMETER Type\r\n                The type of the resource, such as \"ColorBrush\", \"CornerRadius\", \"GridLength\", or \"FontFamily\".\r\n            #>\r\n            param($Name, $Value, $Type)\r\n            try {\r\n                # Set the resource property based on its type\r\n                $sync.Form.Resources[$Name] = switch ($Type) {\r\n                    \"ColorBrush\" { [Windows.Media.SolidColorBrush]::new($Value) }\r\n                    \"Color\" {\r\n                        # Convert hex string to RGB values\r\n                        $hexColor = $Value.TrimStart(\"#\")\r\n                        $r = [Convert]::ToInt32($hexColor.Substring(0,2), 16)\r\n                        $g = [Convert]::ToInt32($hexColor.Substring(2,2), 16)\r\n                        $b = [Convert]::ToInt32($hexColor.Substring(4,2), 16)\r\n                        [Windows.Media.Color]::FromRgb($r, $g, $b)\r\n                    }\r\n                    \"CornerRadius\" { [System.Windows.CornerRadius]::new($Value) }\r\n                    \"GridLength\" { [System.Windows.GridLength]::new($Value) }\r\n                    \"Thickness\" {\r\n                        # Parse the Thickness value (supports 1, 2, or 4 inputs)\r\n                        $values = $Value -split \",\"\r\n                        switch ($values.Count) {\r\n                            1 { [System.Windows.Thickness]::new([double]$values[0]) }\r\n                            2 { [System.Windows.Thickness]::new([double]$values[0], [double]$values[1]) }\r\n                            4 { [System.Windows.Thickness]::new([double]$values[0], [double]$values[1], [double]$values[2], [double]$values[3]) }\r\n                        }\r\n                    }\r\n                    \"FontFamily\" { [Windows.Media.FontFamily]::new($Value) }\r\n                    \"Double\" { [double]$Value }\r\n                    default { $Value }\r\n                }\r\n            }\r\n            catch {\r\n                # Log a warning if there's an issue setting the property\r\n                Write-Warning \"Failed to set property $($Name): $_\"\r\n            }\r\n        }\r\n\r\n        # Retrieve all theme properties from the theme configuration\r\n        $themeProperties = $sync.configs.themes.$currentTheme.PSObject.Properties\r\n        foreach ($_ in $themeProperties) {\r\n            # Apply properties that deal with colors\r\n            if ($_.Name -like \"*color*\") {\r\n                Set-ThemeResourceProperty -Name $_.Name -Value $_.Value -Type \"ColorBrush\"\r\n                # For certain color properties, also set complementary values (e.g., BorderColor -> CBorderColor) This is required because e.g DropShadowEffect requires a <Color> and not a <SolidColorBrush> object\r\n                if ($_.Name -in @(\"BorderColor\", \"ButtonBackgroundMouseoverColor\")) {\r\n                    Set-ThemeResourceProperty -Name \"C$($_.Name)\" -Value $_.Value -Type \"Color\"\r\n                }\r\n            }\r\n            # Apply corner radius properties\r\n            elseif ($_.Name -like \"*Radius*\") {\r\n                Set-ThemeResourceProperty -Name $_.Name -Value $_.Value -Type \"CornerRadius\"\r\n            }\r\n            # Apply row height properties\r\n            elseif ($_.Name -like \"*RowHeight*\") {\r\n                Set-ThemeResourceProperty -Name $_.Name -Value $_.Value -Type \"GridLength\"\r\n            }\r\n            # Apply thickness or margin properties\r\n            elseif (($_.Name -like \"*Thickness*\") -or ($_.Name -like \"*margin\")) {\r\n                Set-ThemeResourceProperty -Name $_.Name -Value $_.Value -Type \"Thickness\"\r\n            }\r\n            # Apply font family properties\r\n            elseif ($_.Name -like \"*FontFamily*\") {\r\n                Set-ThemeResourceProperty -Name $_.Name -Value $_.Value -Type \"FontFamily\"\r\n            }\r\n            # Apply any other properties as doubles (numerical values)\r\n            else {\r\n                Set-ThemeResourceProperty -Name $_.Name -Value $_.Value -Type \"Double\"\r\n            }\r\n        }\r\n    }\r\n\r\n    $sync.preferences.theme = $theme\r\n    Set-Preferences -save\r\n    Set-WinutilTheme -currentTheme \"shared\"\r\n\r\n    switch ($sync.preferences.theme) {\r\n        \"Auto\" {\r\n            $systemUsesDarkMode = Get-WinUtilToggleStatus WPFToggleDarkMode\r\n            if ($systemUsesDarkMode) {\r\n                $theme = \"Dark\"\r\n            }\r\n            else{\r\n                $theme = \"Light\"\r\n            }\r\n\r\n            Set-WinutilTheme -currentTheme $theme\r\n            $themeButtonIcon = [char]0xF08C\r\n        }\r\n        \"Dark\" {\r\n            Set-WinutilTheme -currentTheme $sync.preferences.theme\r\n            $themeButtonIcon = [char]0xE708\r\n           }\r\n        \"Light\" {\r\n            Set-WinutilTheme -currentTheme $sync.preferences.theme\r\n            $themeButtonIcon = [char]0xE706\r\n        }\r\n    }\r\n\r\n    # Set FOSS Highlight Color\r\n    $fossEnabled = $true\r\n    if ($sync.WPFToggleFOSSHighlight) {\r\n        $fossEnabled = $sync.WPFToggleFOSSHighlight.IsChecked\r\n    }\r\n\r\n    if ($fossEnabled) {\r\n         $sync.Form.Resources[\"FOSSColor\"] = [Windows.Media.SolidColorBrush]::new([Windows.Media.Color]::FromRgb(76, 175, 80)) # #4CAF50\r\n    } else {\r\n         $sync.Form.Resources[\"FOSSColor\"] = $sync.Form.Resources[\"MainForegroundColor\"]\r\n    }\r\n\r\n    # Update the theme selector button with the appropriate icon\r\n    $ThemeButton = $sync.Form.FindName(\"ThemeButton\")\r\n    $ThemeButton.Content = [string]$themeButtonIcon\r\n}\r\n"
  },
  {
    "path": "functions/private/Remove-WinUtilAPPX.ps1",
    "content": "function Remove-WinUtilAPPX {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Removes all APPX packages that match the given name\r\n\r\n    .PARAMETER Name\r\n        The name of the APPX package to remove\r\n\r\n    .EXAMPLE\r\n        Remove-WinUtilAPPX -Name \"Microsoft.Microsoft3DViewer\"\r\n\r\n    #>\r\n    param (\r\n        $Name\r\n    )\r\n\r\n    Write-Host \"Removing $Name\"\r\n    Get-AppxPackage $Name -AllUsers | Remove-AppxPackage -AllUsers\r\n    Get-AppxProvisionedPackage -Online | Where-Object DisplayName -like $Name | Remove-AppxProvisionedPackage -Online\r\n}\r\n"
  },
  {
    "path": "functions/private/Reset-WPFCheckBoxes.ps1",
    "content": "function Reset-WPFCheckBoxes {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Set winutil checkboxs to match $sync.selected values.\r\n        Should only need to be run if $sync.selected updated outside of UI (i.e. presets or import)\r\n\r\n    .PARAMETER doToggles\r\n        Whether or not to set UI toggles. WARNING: they will trigger if altered\r\n\r\n    .PARAMETER checkboxfilterpattern\r\n        The Pattern to use when filtering through CheckBoxes, defaults to \"**\"\r\n        Used to make reset blazingly fast.\r\n    #>\r\n\r\n    param (\r\n        [Parameter(position=0)]\r\n        [bool]$doToggles = $false,\r\n\r\n        [Parameter(position=1)]\r\n        [string]$checkboxfilterpattern = \"**\"\r\n    )\r\n\r\n    $CheckBoxesToCheck = $sync.selectedApps + $sync.selectedTweaks + $sync.selectedFeatures\r\n    $CheckBoxes = ($sync.GetEnumerator()).where{ $_.Value -is [System.Windows.Controls.CheckBox] -and $_.Name -notlike \"WPFToggle*\" -and $_.Name -like \"$checkboxfilterpattern\"}\r\n    Write-Debug \"Getting checkboxes to set, number of checkboxes: $($CheckBoxes.Count)\"\r\n\r\n    if ($CheckBoxesToCheck -ne \"\") {\r\n        $debugMsg = \"CheckBoxes to Check are: \"\r\n        $CheckBoxesToCheck | ForEach-Object { $debugMsg += \"$_, \" }\r\n        $debugMsg = $debugMsg -replace (',\\s*$', '')\r\n        Write-Debug \"$debugMsg\"\r\n    }\r\n\r\n    foreach ($CheckBox in $CheckBoxes) {\r\n        $checkboxName = $CheckBox.Key\r\n        if (-not $CheckBoxesToCheck) {\r\n            $sync.$checkBoxName.IsChecked = $false\r\n            continue\r\n        }\r\n\r\n        # Check if the checkbox name exists in the flattened JSON hashtable\r\n        if ($CheckBoxesToCheck -contains $checkboxName) {\r\n            # If it exists, set IsChecked to true\r\n            $sync.$checkboxName.IsChecked = $true\r\n            Write-Debug \"$checkboxName is checked\"\r\n        } else {\r\n            # If it doesn't exist, set IsChecked to false\r\n            $sync.$checkboxName.IsChecked = $false\r\n            Write-Debug \"$checkboxName is not checked\"\r\n        }\r\n    }\r\n\r\n    # Update Installs tab UI values\r\n    $count = $sync.SelectedApps.Count\r\n    $sync.WPFselectedAppsButton.Content = \"Selected Apps: $count\"\r\n    # On every change, remove all entries inside the Popup Menu. This is done, so we can keep the alphabetical order even if elements are selected in a random way\r\n    $sync.selectedAppsstackPanel.Children.Clear()\r\n    $sync.selectedApps | Foreach-Object { Add-SelectedAppsMenuItem -name $($sync.configs.applicationsHashtable.$_.Content) -key $_ }\r\n\r\n    if($doToggles) {\r\n        # Restore toggle switch states from imported config.\r\n        # Only act on toggles that are explicitly listed in the import — toggles absent\r\n        # from the export file were not part of the saved config and should keep whatever\r\n        # state the live system already has (set during UI initialisation via Get-WinUtilToggleStatus).\r\n        $importedToggles = $sync.selectedToggles\r\n        $allToggles = $sync.GetEnumerator() | Where-Object { $_.Key -like \"WPFToggle*\" -and $_.Value -is [System.Windows.Controls.CheckBox] }\r\n        foreach ($toggle in $allToggles) {\r\n            if ($importedToggles -contains $toggle.Key) {\r\n                $sync[$toggle.Key].IsChecked = $true\r\n                Write-Debug \"Restoring toggle: $($toggle.Key) = checked\"\r\n            }\r\n            # Toggles not present in the import are intentionally left untouched;\r\n            # their current UI state already reflects the real system state.\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Set-Preferences.ps1",
    "content": "function Set-Preferences{\r\n\r\n    param(\r\n        [switch]$save=$false\r\n    )\r\n\r\n    # TODO delete this function sometime later\r\n    function Clean-OldPrefs{\r\n        if (Test-Path -Path \"$winutildir\\LightTheme.ini\") {\r\n            $sync.preferences.theme = \"Light\"\r\n            Remove-Item -Path \"$winutildir\\LightTheme.ini\"\r\n        }\r\n\r\n        if (Test-Path -Path \"$winutildir\\DarkTheme.ini\") {\r\n            $sync.preferences.theme = \"Dark\"\r\n            Remove-Item -Path \"$winutildir\\DarkTheme.ini\"\r\n        }\r\n\r\n        # check old prefs, if its first line has no =, then absorb it as pm\r\n        if (Test-Path -Path $iniPath) {\r\n            $oldPM = Get-Content $iniPath\r\n            if ($oldPM -notlike \"*=*\") {\r\n                $sync.preferences.packagemanager = $oldPM\r\n            }\r\n        }\r\n\r\n        if (Test-Path -Path \"$winutildir\\preferChocolatey.ini\") {\r\n            $sync.preferences.packagemanager = \"Choco\"\r\n            Remove-Item -Path \"$winutildir\\preferChocolatey.ini\"\r\n        }\r\n    }\r\n\r\n    function Save-Preferences{\r\n        $ini = \"\"\r\n        foreach($key in $sync.preferences.Keys) {\r\n            $pref = \"$($key)=$($sync.preferences.$key)\"\r\n            Write-Debug \"Saving pref: $($pref)\"\r\n            $ini = $ini + $pref + \"`r`n\"\r\n        }\r\n        $ini | Out-File $iniPath\r\n    }\r\n\r\n    function Load-Preferences{\r\n        Clean-OldPrefs\r\n        if (Test-Path -Path $iniPath) {\r\n            $iniData = Get-Content \"$winutildir\\preferences.ini\"\r\n            foreach ($line in $iniData) {\r\n                if ($line -like \"*=*\") {\r\n                    $arr = $line -split \"=\",-2\r\n                    $key = $arr[0] -replace \"\\s\",\"\"\r\n                    $value = $arr[1] -replace \"\\s\",\"\"\r\n                    Write-Debug \"Preference: Key = '$($key)' Value ='$($value)'\"\r\n                    $sync.preferences.$key = $value\r\n                }\r\n            }\r\n        }\r\n\r\n        # write defaults in case preferences dont exist\r\n        if ($null -eq $sync.preferences.theme) {\r\n            $sync.preferences.theme = \"Auto\"\r\n        }\r\n        if ($null -eq $sync.preferences.packagemanager) {\r\n            $sync.preferences.packagemanager = \"Winget\"\r\n        }\r\n\r\n        # convert packagemanager to enum\r\n        if ($sync.preferences.packagemanager -eq \"Choco\") {\r\n            $sync.preferences.packagemanager = [PackageManagers]::Choco\r\n        }\r\n        elseif ($sync.preferences.packagemanager -eq \"Winget\") {\r\n            $sync.preferences.packagemanager = [PackageManagers]::Winget\r\n        }\r\n    }\r\n\r\n    $iniPath = \"$winutildir\\preferences.ini\"\r\n\r\n    if ($save) {\r\n        Save-Preferences\r\n    }\r\n    else {\r\n        Load-Preferences\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Set-WinUtilDNS.ps1",
    "content": "function Set-WinUtilDNS {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Sets the DNS of all interfaces that are in the \"Up\" state. It will lookup the values from the DNS.Json file\r\n\r\n    .PARAMETER DNSProvider\r\n        The DNS provider to set the DNS server to\r\n\r\n    .EXAMPLE\r\n        Set-WinUtilDNS -DNSProvider \"google\"\r\n\r\n    #>\r\n    param($DNSProvider)\r\n    if($DNSProvider -eq \"Default\") {return}\r\n    try {\r\n        $Adapters = Get-NetAdapter | Where-Object {$_.Status -eq \"Up\"}\r\n        Write-Host \"Ensuring DNS is set to $DNSProvider on the following interfaces\"\r\n        Write-Host $($Adapters | Out-String)\r\n\r\n        Foreach ($Adapter in $Adapters) {\r\n            if($DNSProvider -eq \"DHCP\") {\r\n                Set-DnsClientServerAddress -InterfaceIndex $Adapter.ifIndex -ResetServerAddresses\r\n            } else {\r\n                Set-DnsClientServerAddress -InterfaceIndex $Adapter.ifIndex -ServerAddresses (\"$($sync.configs.dns.$DNSProvider.Primary)\", \"$($sync.configs.dns.$DNSProvider.Secondary)\")\r\n                Set-DnsClientServerAddress -InterfaceIndex $Adapter.ifIndex -ServerAddresses (\"$($sync.configs.dns.$DNSProvider.Primary6)\", \"$($sync.configs.dns.$DNSProvider.Secondary6)\")\r\n            }\r\n        }\r\n    } catch {\r\n        Write-Warning \"Unable to set DNS Provider due to an unhandled exception\"\r\n        Write-Warning $psitem.Exception.StackTrace\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Set-WinUtilProgressbar.ps1",
    "content": "function Set-WinUtilProgressbar{\r\n    <#\r\n    .SYNOPSIS\r\n        This function is used to Update the Progress Bar displayed in the winutil GUI.\r\n        It will be automatically hidden if the user clicks something and no process is running\r\n    .PARAMETER Label\r\n        The Text to be overlaid onto the Progress Bar\r\n    .PARAMETER PERCENT\r\n        The percentage of the Progress Bar that should be filled (0-100)\r\n    #>\r\n    param(\r\n        [string]$Label,\r\n        [ValidateRange(0,100)]\r\n        [int]$Percent\r\n    )\r\n\r\n    if($PARAM_NOUI) {\r\n        return;\r\n    }\r\n\r\n    Invoke-WPFUIThread -ScriptBlock {$sync.progressBarTextBlock.Text = $label}\r\n    Invoke-WPFUIThread -ScriptBlock {$sync.progressBarTextBlock.ToolTip = $label}\r\n    if ($percent -lt 5 ) {\r\n        $percent = 5 # Ensure the progress bar is not empty, as it looks weird\r\n    }\r\n    Invoke-WPFUIThread -ScriptBlock { $sync.ProgressBar.Value = $percent}\r\n\r\n}\r\n"
  },
  {
    "path": "functions/private/Set-WinUtilRegistry.ps1",
    "content": "function Set-WinUtilRegistry {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Modifies the registry based on the given inputs\r\n\r\n    .PARAMETER Name\r\n        The name of the key to modify\r\n\r\n    .PARAMETER Path\r\n        The path to the key\r\n\r\n    .PARAMETER Type\r\n        The type of value to set the key to\r\n\r\n    .PARAMETER Value\r\n        The value to set the key to\r\n\r\n    .EXAMPLE\r\n        Set-WinUtilRegistry -Name \"PublishUserActivities\" -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\System\" -Type \"DWord\" -Value \"0\"\r\n\r\n    #>\r\n    param (\r\n        $Name,\r\n        $Path,\r\n        $Type,\r\n        $Value\r\n    )\r\n\r\n    try {\r\n        if(!(Test-Path 'HKU:\\')) {New-PSDrive -PSProvider Registry -Name HKU -Root HKEY_USERS}\r\n\r\n        If (!(Test-Path $Path)) {\r\n            Write-Host \"$Path was not found, Creating...\"\r\n            New-Item -Path $Path -Force -ErrorAction Stop | Out-Null\r\n        }\r\n\r\n        if ($Value -ne \"<RemoveEntry>\") {\r\n            Write-Host \"Set $Path\\$Name to $Value\"\r\n            Set-ItemProperty -Path $Path -Name $Name -Type $Type -Value $Value -Force -ErrorAction Stop | Out-Null\r\n        }\r\n        else{\r\n            Write-Host \"Remove $Path\\$Name\"\r\n            Remove-ItemProperty -Path $Path -Name $Name -Force -ErrorAction Stop | Out-Null\r\n        }\r\n    } catch [System.Security.SecurityException] {\r\n        Write-Warning \"Unable to set $Path\\$Name to $Value due to a Security Exception\"\r\n    } catch [System.Management.Automation.ItemNotFoundException] {\r\n        Write-Warning $psitem.Exception.ErrorRecord\r\n    } catch [System.UnauthorizedAccessException] {\r\n       Write-Warning $psitem.Exception.Message\r\n    } catch {\r\n        Write-Warning \"Unable to set $Name due to unhandled exception\"\r\n        Write-Warning $psitem.Exception.StackTrace\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Set-WinUtilScheduledTask.ps1",
    "content": "function Set-WinUtilScheduledTask {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Enables/Disables the provided Scheduled Task\r\n\r\n    .PARAMETER Name\r\n        The path to the Scheduled Task\r\n\r\n    .PARAMETER State\r\n        The State to set the Task to\r\n\r\n    .EXAMPLE\r\n        Set-WinUtilScheduledTask -Name \"Microsoft\\Windows\\Application Experience\\Microsoft Compatibility Appraiser\" -State \"Disabled\"\r\n\r\n    #>\r\n    param (\r\n        $Name,\r\n        $State\r\n    )\r\n\r\n    try {\r\n        if($State -eq \"Disabled\") {\r\n            Write-Host \"Disabling Scheduled Task $Name\"\r\n            Disable-ScheduledTask -TaskName $Name -ErrorAction Stop\r\n        }\r\n        if($State -eq \"Enabled\") {\r\n            Write-Host \"Enabling Scheduled Task $Name\"\r\n            Enable-ScheduledTask -TaskName $Name -ErrorAction Stop\r\n        }\r\n    } catch [System.Exception] {\r\n        if($psitem.Exception.Message -like \"*The system cannot find the file specified*\") {\r\n            Write-Warning \"Scheduled Task $name was not Found\"\r\n        } else {\r\n            Write-Warning \"Unable to set $Name due to unhandled exception\"\r\n            Write-Warning $psitem.Exception.Message\r\n        }\r\n    } catch {\r\n        Write-Warning \"Unable to run script for $name due to unhandled exception\"\r\n        Write-Warning $psitem.Exception.StackTrace\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Set-WinUtilService.ps1",
    "content": "Function Set-WinUtilService {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Changes the startup type of the given service\r\n\r\n    .PARAMETER Name\r\n        The name of the service to modify\r\n\r\n    .PARAMETER StartupType\r\n        The startup type to set the service to\r\n\r\n    .EXAMPLE\r\n        Set-WinUtilService -Name \"HomeGroupListener\" -StartupType \"Manual\"\r\n\r\n    #>\r\n    param (\r\n        $Name,\r\n        $StartupType\r\n    )\r\n    try {\r\n        Write-Host \"Setting Service $Name to $StartupType\"\r\n\r\n        # Check if the service exists\r\n        $service = Get-Service -Name $Name -ErrorAction Stop\r\n\r\n        # Service exists, proceed with changing properties -- while handling auto delayed start for PWSH 5\r\n        if (($PSVersionTable.PSVersion.Major -lt 7) -and ($StartupType -eq \"AutomaticDelayedStart\")) {\r\n            sc.exe config $Name start=delayed-auto\r\n        } else {\r\n            $service | Set-Service -StartupType $StartupType -ErrorAction Stop\r\n        }\r\n    } catch [System.ServiceProcess.ServiceNotFoundException] {\r\n        Write-Warning \"Service $Name was not found\"\r\n    } catch {\r\n        Write-Warning \"Unable to set $Name due to unhandled exception\"\r\n        Write-Warning $_.Exception.Message\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "functions/private/Set-WinUtilTaskbarItem.ps1",
    "content": "function Set-WinUtilTaskbaritem {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Modifies the Taskbaritem of the WPF Form\r\n\r\n    .PARAMETER value\r\n        Value can be between 0 and 1, 0 being no progress done yet and 1 being fully completed\r\n        Value does not affect item without setting the state to 'Normal', 'Error' or 'Paused'\r\n        Set-WinUtilTaskbaritem -value 0.5\r\n\r\n    .PARAMETER state\r\n        State can be 'None' > No progress, 'Indeterminate' > inf. loading gray, 'Normal' > Gray, 'Error' > Red, 'Paused' > Yellow\r\n        no value needed:\r\n        - Set-WinUtilTaskbaritem -state \"None\"\r\n        - Set-WinUtilTaskbaritem -state \"Indeterminate\"\r\n        value needed:\r\n        - Set-WinUtilTaskbaritem -state \"Error\"\r\n        - Set-WinUtilTaskbaritem -state \"Normal\"\r\n        - Set-WinUtilTaskbaritem -state \"Paused\"\r\n\r\n    .PARAMETER overlay\r\n        Overlay icon to display on the taskbar item, there are the presets 'None', 'logo' and 'checkmark' or you can specify a path/link to an image file.\r\n        CTT logo preset:\r\n        - Set-WinUtilTaskbaritem -overlay \"logo\"\r\n        Checkmark preset:\r\n        - Set-WinUtilTaskbaritem -overlay \"checkmark\"\r\n        Warning preset:\r\n        - Set-WinUtilTaskbaritem -overlay \"warning\"\r\n        No overlay:\r\n        - Set-WinUtilTaskbaritem -overlay \"None\"\r\n        Custom icon (needs to be supported by WPF):\r\n        - Set-WinUtilTaskbaritem -overlay \"C:\\path\\to\\icon.png\"\r\n\r\n    .PARAMETER description\r\n        Description to display on the taskbar item preview\r\n        Set-WinUtilTaskbaritem -description \"This is a description\"\r\n    #>\r\n    param (\r\n        [string]$state,\r\n        [double]$value,\r\n        [string]$overlay,\r\n        [string]$description\r\n    )\r\n\r\n    if ($value) {\r\n        $sync[\"Form\"].taskbarItemInfo.ProgressValue = $value\r\n    }\r\n\r\n    if ($state) {\r\n        switch ($state) {\r\n            'None' { $sync[\"Form\"].taskbarItemInfo.ProgressState = \"None\" }\r\n            'Indeterminate' { $sync[\"Form\"].taskbarItemInfo.ProgressState = \"Indeterminate\" }\r\n            'Normal' { $sync[\"Form\"].taskbarItemInfo.ProgressState = \"Normal\" }\r\n            'Error' { $sync[\"Form\"].taskbarItemInfo.ProgressState = \"Error\" }\r\n            'Paused' { $sync[\"Form\"].taskbarItemInfo.ProgressState = \"Paused\" }\r\n            default { throw \"[Set-WinUtilTaskbarItem] Invalid state\" }\r\n        }\r\n    }\r\n\r\n    if ($overlay) {\r\n        switch ($overlay) {\r\n            'logo' {\r\n                $sync[\"Form\"].taskbarItemInfo.Overlay = $sync[\"logorender\"]\r\n            }\r\n            'checkmark' {\r\n                $sync[\"Form\"].taskbarItemInfo.Overlay = $sync[\"checkmarkrender\"]\r\n            }\r\n            'warning' {\r\n                $sync[\"Form\"].taskbarItemInfo.Overlay = $sync[\"warningrender\"]\r\n            }\r\n            'None' {\r\n                $sync[\"Form\"].taskbarItemInfo.Overlay = $null\r\n            }\r\n            default {\r\n                if (Test-Path $overlay) {\r\n                    $sync[\"Form\"].taskbarItemInfo.Overlay = $overlay\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if ($description) {\r\n        $sync[\"Form\"].taskbarItemInfo.Description = $description\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Show-CustomDialog.ps1",
    "content": "function Show-CustomDialog {\r\n    <#\r\n    .SYNOPSIS\r\n    Displays a custom dialog box with an image, heading, message, and an OK button.\r\n\r\n    .DESCRIPTION\r\n    This function creates a custom dialog box with the specified message and additional elements such as an image, heading, and an OK button. The dialog box is designed with a green border, rounded corners, and a black background.\r\n\r\n    .PARAMETER Title\r\n    The Title to use for the dialog window's Title Bar, this will not be visible by the user, as window styling is set to None.\r\n\r\n    .PARAMETER Message\r\n    The message to be displayed in the dialog box.\r\n\r\n    .PARAMETER Width\r\n    The width of the custom dialog window.\r\n\r\n    .PARAMETER Height\r\n    The height of the custom dialog window.\r\n\r\n    .PARAMETER FontSize\r\n    The Font Size of message shown inside custom dialog window.\r\n\r\n    .PARAMETER HeaderFontSize\r\n    The Font Size for the Header of custom dialog window.\r\n\r\n    .PARAMETER LogoSize\r\n    The Size of the Logo used inside the custom dialog window.\r\n\r\n    .PARAMETER ForegroundColor\r\n    The Foreground Color of dialog window title & message.\r\n\r\n    .PARAMETER BackgroundColor\r\n    The Background Color of dialog window.\r\n\r\n    .PARAMETER BorderColor\r\n    The Color for dialog window border.\r\n\r\n    .PARAMETER ButtonBackgroundColor\r\n    The Background Color for Buttons in dialog window.\r\n\r\n    .PARAMETER ButtonForegroundColor\r\n    The Foreground Color for Buttons in dialog window.\r\n\r\n    .PARAMETER ShadowColor\r\n    The Color used when creating the Drop-down Shadow effect for dialog window.\r\n\r\n    .PARAMETER LogoColor\r\n    The Color of WinUtil Text found next to WinUtil's Logo inside dialog window.\r\n\r\n    .PARAMETER LinkForegroundColor\r\n    The Foreground Color for Links inside dialog window.\r\n\r\n    .PARAMETER LinkHoverForegroundColor\r\n    The Foreground Color for Links when the mouse pointer hovers over them inside dialog window.\r\n\r\n    .PARAMETER EnableScroll\r\n    A flag indicating whether to enable scrolling if the content exceeds the window size.\r\n\r\n    .EXAMPLE\r\n    Show-CustomDialog -Title \"My Custom Dialog\" -Message \"This is a custom dialog with a message and an image above.\" -Width 300 -Height 200\r\n\r\n    Makes a new Custom Dialog with the title 'My Custom Dialog' and a message 'This is a custom dialog with a message and an image above.', with dimensions of 300 by 200 pixels.\r\n    Other styling options are grabbed from '$sync.Form.Resources' global variable.\r\n\r\n    .EXAMPLE\r\n    $foregroundColor = New-Object System.Windows.Media.SolidColorBrush(\"#0088e5\")\r\n    $backgroundColor = New-Object System.Windows.Media.SolidColorBrush(\"#1e1e1e\")\r\n    $linkForegroundColor = New-Object System.Windows.Media.SolidColorBrush(\"#0088e5\")\r\n    $linkHoverForegroundColor = New-Object System.Windows.Media.SolidColorBrush(\"#005289\")\r\n    Show-CustomDialog -Title \"My Custom Dialog\" -Message \"This is a custom dialog with a message and an image above.\" -Width 300 -Height 200 -ForegroundColor $foregroundColor -BackgroundColor $backgroundColor -LinkForegroundColor $linkForegroundColor -LinkHoverForegroundColor $linkHoverForegroundColor\r\n\r\n    Makes a new Custom Dialog with the title 'My Custom Dialog' and a message 'This is a custom dialog with a message and an image above.', with dimensions of 300 by 200 pixels, with a link foreground (and general foreground) colors of '#0088e5', background color of '#1e1e1e', and Link Color on Hover of '005289', all of which are in Hexadecimal (the '#' Symbol is required by SolidColorBrush Constructor).\r\n    Other styling options are grabbed from '$sync.Form.Resources' global variable.\r\n\r\n    #>\r\n    param(\r\n        [string]$Title,\r\n        [string]$Message,\r\n        [int]$Width = $sync.Form.Resources.CustomDialogWidth,\r\n        [int]$Height = $sync.Form.Resources.CustomDialogHeight,\r\n\r\n        [System.Windows.Media.FontFamily]$FontFamily = $sync.Form.Resources.FontFamily,\r\n        [int]$FontSize = $sync.Form.Resources.CustomDialogFontSize,\r\n        [int]$HeaderFontSize = $sync.Form.Resources.CustomDialogFontSizeHeader,\r\n        [int]$LogoSize = $sync.Form.Resources.CustomDialogLogoSize,\r\n\r\n        [System.Windows.Media.Color]$ShadowColor = \"#AAAAAAAA\",\r\n        [System.Windows.Media.SolidColorBrush]$LogoColor = $sync.Form.Resources.LabelboxForegroundColor,\r\n        [System.Windows.Media.SolidColorBrush]$BorderColor = $sync.Form.Resources.BorderColor,\r\n        [System.Windows.Media.SolidColorBrush]$ForegroundColor = $sync.Form.Resources.MainForegroundColor,\r\n        [System.Windows.Media.SolidColorBrush]$BackgroundColor = $sync.Form.Resources.MainBackgroundColor,\r\n        [System.Windows.Media.SolidColorBrush]$ButtonForegroundColor = $sync.Form.Resources.ButtonInstallForegroundColor,\r\n        [System.Windows.Media.SolidColorBrush]$ButtonBackgroundColor = $sync.Form.Resources.ButtonInstallBackgroundColor,\r\n        [System.Windows.Media.SolidColorBrush]$LinkForegroundColor = $sync.Form.Resources.LinkForegroundColor,\r\n        [System.Windows.Media.SolidColorBrush]$LinkHoverForegroundColor = $sync.Form.Resources.LinkHoverForegroundColor,\r\n\r\n        [bool]$EnableScroll = $false\r\n    )\r\n\r\n    # Create a custom dialog window\r\n    $dialog = New-Object Windows.Window\r\n    $dialog.Title = $Title\r\n    $dialog.Height = $Height\r\n    $dialog.Width = $Width\r\n    $dialog.Margin = New-Object Windows.Thickness(10)  # Add margin to the entire dialog box\r\n    $dialog.WindowStyle = [Windows.WindowStyle]::None  # Remove title bar and window controls\r\n    $dialog.ResizeMode = [Windows.ResizeMode]::NoResize  # Disable resizing\r\n    $dialog.WindowStartupLocation = [Windows.WindowStartupLocation]::CenterScreen  # Center the window\r\n    $dialog.Foreground = $ForegroundColor\r\n    $dialog.Background = $BackgroundColor\r\n    $dialog.FontFamily = $FontFamily\r\n    $dialog.FontSize = $FontSize\r\n\r\n    # Create a Border for the green edge with rounded corners\r\n    $border = New-Object Windows.Controls.Border\r\n    $border.BorderBrush = $BorderColor\r\n    $border.BorderThickness = New-Object Windows.Thickness(1)  # Adjust border thickness as needed\r\n    $border.CornerRadius = New-Object Windows.CornerRadius(10)  # Adjust the radius for rounded corners\r\n\r\n    # Create a drop shadow effect\r\n    $dropShadow = New-Object Windows.Media.Effects.DropShadowEffect\r\n    $dropShadow.Color = $shadowColor\r\n    $dropShadow.Direction = 270\r\n    $dropShadow.ShadowDepth = 5\r\n    $dropShadow.BlurRadius = 10\r\n\r\n    # Apply drop shadow effect to the border\r\n    $dialog.Effect = $dropShadow\r\n\r\n    $dialog.Content = $border\r\n\r\n    # Create a grid for layout inside the Border\r\n    $grid = New-Object Windows.Controls.Grid\r\n    $border.Child = $grid\r\n\r\n    # Uncomment the following line to show gridlines\r\n    #$grid.ShowGridLines = $true\r\n\r\n    # Add the following line to set the background color of the grid\r\n    $grid.Background = [Windows.Media.Brushes]::Transparent\r\n    # Add the following line to make the Grid stretch\r\n    $grid.HorizontalAlignment = [Windows.HorizontalAlignment]::Stretch\r\n    $grid.VerticalAlignment = [Windows.VerticalAlignment]::Stretch\r\n\r\n    # Add the following line to make the Border stretch\r\n    $border.HorizontalAlignment = [Windows.HorizontalAlignment]::Stretch\r\n    $border.VerticalAlignment = [Windows.VerticalAlignment]::Stretch\r\n\r\n    # Set up Row Definitions\r\n    $row0 = New-Object Windows.Controls.RowDefinition\r\n    $row0.Height = [Windows.GridLength]::Auto\r\n\r\n    $row1 = New-Object Windows.Controls.RowDefinition\r\n    $row1.Height = [Windows.GridLength]::new(1, [Windows.GridUnitType]::Star)\r\n\r\n    $row2 = New-Object Windows.Controls.RowDefinition\r\n    $row2.Height = [Windows.GridLength]::Auto\r\n\r\n    # Add Row Definitions to Grid\r\n    $grid.RowDefinitions.Add($row0)\r\n    $grid.RowDefinitions.Add($row1)\r\n    $grid.RowDefinitions.Add($row2)\r\n\r\n    # Add StackPanel for horizontal layout with margins\r\n    $stackPanel = New-Object Windows.Controls.StackPanel\r\n    $stackPanel.Margin = New-Object Windows.Thickness(10)  # Add margins around the stack panel\r\n    $stackPanel.Orientation = [Windows.Controls.Orientation]::Horizontal\r\n    $stackPanel.HorizontalAlignment = [Windows.HorizontalAlignment]::Left  # Align to the left\r\n    $stackPanel.VerticalAlignment = [Windows.VerticalAlignment]::Top  # Align to the top\r\n\r\n    $grid.Children.Add($stackPanel)\r\n    [Windows.Controls.Grid]::SetRow($stackPanel, 0)  # Set the row to the second row (0-based index)\r\n\r\n    # Add SVG path to the stack panel\r\n    $stackPanel.Children.Add((Invoke-WinUtilAssets -Type \"logo\" -Size $LogoSize))\r\n\r\n    # Add \"Winutil\" text\r\n    $winutilTextBlock = New-Object Windows.Controls.TextBlock\r\n    $winutilTextBlock.Text = \"Winutil\"\r\n    $winutilTextBlock.FontSize = $HeaderFontSize\r\n    $winutilTextBlock.Foreground = $LogoColor\r\n    $winutilTextBlock.Margin = New-Object Windows.Thickness(10, 10, 10, 5)  # Add margins around the text block\r\n    $stackPanel.Children.Add($winutilTextBlock)\r\n    # Add TextBlock for information with text wrapping and margins\r\n    $messageTextBlock = New-Object Windows.Controls.TextBlock\r\n    $messageTextBlock.FontSize = $FontSize\r\n    $messageTextBlock.TextWrapping = [Windows.TextWrapping]::Wrap  # Enable text wrapping\r\n    $messageTextBlock.HorizontalAlignment = [Windows.HorizontalAlignment]::Left\r\n    $messageTextBlock.VerticalAlignment = [Windows.VerticalAlignment]::Top\r\n    $messageTextBlock.Margin = New-Object Windows.Thickness(10)  # Add margins around the text block\r\n\r\n    # Define the Regex to find hyperlinks formatted as HTML <a> tags\r\n    $regex = [regex]::new('<a href=\"([^\"]+)\">([^<]+)</a>')\r\n    $lastPos = 0\r\n\r\n    # Iterate through each match and add regular text and hyperlinks\r\n    foreach ($match in $regex.Matches($Message)) {\r\n        # Add the text before the hyperlink, if any\r\n        $textBefore = $Message.Substring($lastPos, $match.Index - $lastPos)\r\n        if ($textBefore.Length -gt 0) {\r\n            $messageTextBlock.Inlines.Add((New-Object Windows.Documents.Run($textBefore)))\r\n        }\r\n\r\n        # Create and add the hyperlink\r\n        $hyperlink = New-Object Windows.Documents.Hyperlink\r\n        $hyperlink.NavigateUri = New-Object System.Uri($match.Groups[1].Value)\r\n        $hyperlink.Inlines.Add($match.Groups[2].Value)\r\n        $hyperlink.TextDecorations = [Windows.TextDecorations]::None  # Remove underline\r\n        $hyperlink.Foreground = $LinkForegroundColor\r\n\r\n        $hyperlink.Add_Click({\r\n            param($sender, $args)\r\n            Start-Process $sender.NavigateUri.AbsoluteUri\r\n        })\r\n        $hyperlink.Add_MouseEnter({\r\n            param($sender, $args)\r\n            $sender.Foreground = $LinkHoverForegroundColor\r\n            $sender.FontSize = ($FontSize + ($FontSize / 4))\r\n            $sender.FontWeight = \"SemiBold\"\r\n        })\r\n        $hyperlink.Add_MouseLeave({\r\n            param($sender, $args)\r\n            $sender.Foreground = $LinkForegroundColor\r\n            $sender.FontSize = $FontSize\r\n            $sender.FontWeight = \"Normal\"\r\n        })\r\n\r\n        $messageTextBlock.Inlines.Add($hyperlink)\r\n\r\n        # Update the last position\r\n        $lastPos = $match.Index + $match.Length\r\n    }\r\n\r\n    # Add any remaining text after the last hyperlink\r\n    if ($lastPos -lt $Message.Length) {\r\n        $textAfter = $Message.Substring($lastPos)\r\n        $messageTextBlock.Inlines.Add((New-Object Windows.Documents.Run($textAfter)))\r\n    }\r\n\r\n    # If no matches, add the entire message as a run\r\n    if ($regex.Matches($Message).Count -eq 0) {\r\n        $messageTextBlock.Inlines.Add((New-Object Windows.Documents.Run($Message)))\r\n    }\r\n\r\n    # Create a ScrollViewer if EnableScroll is true\r\n    if ($EnableScroll) {\r\n        $scrollViewer = New-Object System.Windows.Controls.ScrollViewer\r\n        $scrollViewer.VerticalScrollBarVisibility = 'Auto'\r\n        $scrollViewer.HorizontalScrollBarVisibility = 'Disabled'\r\n        $scrollViewer.Content = $messageTextBlock\r\n        $grid.Children.Add($scrollViewer)\r\n        [Windows.Controls.Grid]::SetRow($scrollViewer, 1)  # Set the row to the second row (0-based index)\r\n    } else {\r\n        $grid.Children.Add($messageTextBlock)\r\n        [Windows.Controls.Grid]::SetRow($messageTextBlock, 1)  # Set the row to the second row (0-based index)\r\n    }\r\n\r\n    # Add OK button\r\n    $okButton = New-Object Windows.Controls.Button\r\n    $okButton.Content = \"OK\"\r\n    $okButton.FontSize = $FontSize\r\n    $okButton.Width = 80\r\n    $okButton.Height = 30\r\n    $okButton.HorizontalAlignment = [Windows.HorizontalAlignment]::Center\r\n    $okButton.VerticalAlignment = [Windows.VerticalAlignment]::Bottom\r\n    $okButton.Margin = New-Object Windows.Thickness(0, 0, 0, 10)\r\n    $okButton.Background = $buttonBackgroundColor\r\n    $okButton.Foreground = $buttonForegroundColor\r\n    $okButton.BorderBrush = $BorderColor\r\n    $okButton.Add_Click({\r\n        $dialog.Close()\r\n    })\r\n    $grid.Children.Add($okButton)\r\n    [Windows.Controls.Grid]::SetRow($okButton, 2)  # Set the row to the third row (0-based index)\r\n\r\n    # Handle Escape key press to close the dialog\r\n    $dialog.Add_KeyDown({\r\n        if ($_.Key -eq 'Escape') {\r\n            $dialog.Close()\r\n        }\r\n    })\r\n\r\n    # Set the OK button as the default button (activated on Enter)\r\n    $okButton.IsDefault = $true\r\n\r\n    # Show the custom dialog\r\n    $dialog.ShowDialog()\r\n}\r\n"
  },
  {
    "path": "functions/private/Show-WPFInstallAppBusy.ps1",
    "content": "function Show-WPFInstallAppBusy {\r\n    <#\r\n    .SYNOPSIS\r\n        Displays a busy overlay in the install app area of the WPF form.\r\n        This is used to indicate that an install or uninstall is in progress.\r\n        Dynamically updates the size of the overlay based on the app area on each invocation.\r\n    .PARAMETER text\r\n        The text to display in the busy overlay. Defaults to \"Installing apps...\".\r\n    #>\r\n    param (\r\n        $text = \"Installing apps...\"\r\n    )\r\n    Invoke-WPFUIThread -ScriptBlock {\r\n        $sync.InstallAppAreaOverlay.Visibility = [Windows.Visibility]::Visible\r\n        $sync.InstallAppAreaOverlay.Width = $($sync.InstallAppAreaScrollViewer.ActualWidth * 0.4)\r\n        $sync.InstallAppAreaOverlay.Height = $($sync.InstallAppAreaScrollViewer.ActualWidth * 0.4)\r\n        $sync.InstallAppAreaOverlayText.Text = $text\r\n        $sync.InstallAppAreaBorder.IsEnabled = $false\r\n        $sync.InstallAppAreaScrollViewer.Effect.Radius = 5\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/private/Test-WinUtilPackageManager.ps1",
    "content": "function Test-WinUtilPackageManager {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Checks if Winget and/or Choco are installed\r\n\r\n    .PARAMETER winget\r\n        Check if Winget is installed\r\n\r\n    .PARAMETER choco\r\n        Check if Chocolatey is installed\r\n\r\n    #>\r\n\r\n    Param(\r\n        [System.Management.Automation.SwitchParameter]$winget,\r\n        [System.Management.Automation.SwitchParameter]$choco\r\n    )\r\n\r\n    if ($winget) {\r\n        if (Get-Command winget -ErrorAction SilentlyContinue) {\r\n            Write-Host \"===========================================\" -ForegroundColor Green\r\n            Write-Host \"---        Winget is installed          ---\" -ForegroundColor Green\r\n            Write-Host \"===========================================\" -ForegroundColor Green\r\n            $status = \"installed\"\r\n        } else {\r\n            Write-Host \"===========================================\" -ForegroundColor Red\r\n            Write-Host \"---      Winget is not installed        ---\" -ForegroundColor Red\r\n            Write-Host \"===========================================\" -ForegroundColor Red\r\n            $status = \"not-installed\"\r\n        }\r\n    }\r\n\r\n    if ($choco) {\r\n        if (Get-Command choco -ErrorAction SilentlyContinue) {\r\n            Write-Host \"===========================================\" -ForegroundColor Green\r\n            Write-Host \"---      Chocolatey is installed        ---\" -ForegroundColor Green\r\n            Write-Host \"===========================================\" -ForegroundColor Green\r\n            $status = \"installed\"\r\n        } else {\r\n            Write-Host \"===========================================\" -ForegroundColor Red\r\n            Write-Host \"---    Chocolatey is not installed      ---\" -ForegroundColor Red\r\n            Write-Host \"===========================================\" -ForegroundColor Red\r\n            $status = \"not-installed\"\r\n        }\r\n    }\r\n\r\n    return $status\r\n}\r\n"
  },
  {
    "path": "functions/private/Update-WinUtilProgramWinget.ps1",
    "content": "Function Update-WinUtilProgramWinget {\r\n\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        This will update all programs using Winget\r\n\r\n    #>\r\n\r\n    [ScriptBlock]$wingetinstall = {\r\n\r\n        $host.ui.RawUI.WindowTitle = \"\"\"Winget Install\"\"\"\r\n\r\n        Start-Transcript \"$logdir\\winget-update_$dateTime.log\" -Append\r\n        winget upgrade --all --accept-source-agreements --accept-package-agreements --scope=machine --silent\r\n\r\n    }\r\n\r\n    $global:WinGetInstall = Start-Process -Verb runas powershell -ArgumentList \"-command invoke-command -scriptblock {$wingetinstall} -argumentlist '$($ProgramsToInstall -join \",\")'\" -PassThru\r\n\r\n}\r\n"
  },
  {
    "path": "functions/private/Update-WinUtilSelections.ps1",
    "content": "function Update-WinUtilSelections {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Updates the $sync.selected variables with a given preset.\r\n\r\n    .PARAMETER flatJson\r\n        The flattened json list of $sync values to select.\r\n    #>\r\n\r\n    param (\r\n        $flatJson\r\n    )\r\n\r\n    Write-Debug \"JSON to import: $($flatJson)\"\r\n\r\n    foreach ($item in $flatJson) {\r\n        # Ensure each item is treated as a string to handle PSCustomObject from JSON deserialization\r\n        $cbkey = [string]$item\r\n        $group = if ($cbkey.StartsWith(\"WPFInstall\")) { \"Install\" }\r\n                    elseif ($cbkey.StartsWith(\"WPFTweaks\")) { \"Tweaks\" }\r\n                    elseif ($cbkey.StartsWith(\"WPFToggle\")) { \"Toggle\" }\r\n                    elseif ($cbkey.StartsWith(\"WPFFeature\")) { \"Feature\" }\r\n                    else { \"na\" }\r\n\r\n        switch ($group) {\r\n            \"Install\" {\r\n                if (!$sync.selectedApps.Contains($cbkey)) {\r\n                    $sync.selectedApps.Add($cbkey)\r\n                    # The List type needs to be specified again, because otherwise Sort-Object will convert the list to a string if there is only a single entry\r\n                    [System.Collections.Generic.List[string]]$sync.selectedApps = $sync.SelectedApps | Sort-Object\r\n                }\r\n            }\r\n            \"Tweaks\" {\r\n                if (!$sync.selectedTweaks.Contains($cbkey)) {\r\n                    $sync.selectedTweaks.Add($cbkey)\r\n                }\r\n            }\r\n            \"Toggle\" {\r\n                if (!$sync.selectedToggles.Contains($cbkey)) {\r\n                    $sync.selectedToggles.Add($cbkey)\r\n                }\r\n            }\r\n            \"Feature\" {\r\n                if (!$sync.selectedFeatures.Contains($cbkey)) {\r\n                    $sync.selectedFeatures.Add($cbkey)\r\n                }\r\n            }\r\n            default {\r\n                Write-Host \"Unknown group for checkbox: $($cbkey)\"\r\n            }\r\n        }\r\n    }\r\n\r\n    Write-Debug \"-------------------------------------\"\r\n    Write-Debug \"Selected Apps: $($sync.selectedApps)\"\r\n    Write-Debug \"Selected Tweaks: $($sync.selectedTweaks)\"\r\n    Write-Debug \"Selected Toggles: $($sync.selectedToggles)\"\r\n    Write-Debug \"Selected Features: $($sync.selectedFeatures)\"\r\n    Write-Debug \"--------------------------------------\"\r\n}\r\n"
  },
  {
    "path": "functions/public/Initialize-WPFUI.ps1",
    "content": "function Initialize-WPFUI {\r\n    [OutputType([void])]\r\n    param(\r\n        [Parameter(Mandatory)]\r\n        [string]$TargetGridName\r\n    )\r\n\r\n    switch ($TargetGridName) {\r\n        \"appscategory\"{\r\n            # TODO\r\n            # Switch UI generation of the sidebar to this function\r\n            # $sync.ItemsControl = Initialize-InstallAppArea -TargetElement $TargetGridName\r\n            # ...\r\n\r\n            # Create and configure a popup for displaying selected apps\r\n            $selectedAppsPopup = New-Object Windows.Controls.Primitives.Popup\r\n            $selectedAppsPopup.IsOpen = $false\r\n            $selectedAppsPopup.PlacementTarget = $sync.WPFselectedAppsButton\r\n            $selectedAppsPopup.Placement = [System.Windows.Controls.Primitives.PlacementMode]::Bottom\r\n            $selectedAppsPopup.AllowsTransparency = $true\r\n\r\n            # Style the popup with a border and background\r\n            $selectedAppsBorder = New-Object Windows.Controls.Border\r\n            $selectedAppsBorder.SetResourceReference([Windows.Controls.Control]::BackgroundProperty, \"MainBackgroundColor\")\r\n            $selectedAppsBorder.SetResourceReference([Windows.Controls.Control]::BorderBrushProperty, \"MainForegroundColor\")\r\n            $selectedAppsBorder.SetResourceReference([Windows.Controls.Control]::BorderThicknessProperty, \"ButtonBorderThickness\")\r\n            $selectedAppsBorder.Width = 200\r\n            $selectedAppsBorder.Padding = 5\r\n            $selectedAppsPopup.Child = $selectedAppsBorder\r\n            $sync.selectedAppsPopup = $selectedAppsPopup\r\n\r\n            # Add a stack panel inside the popup's border to organize its child elements\r\n            $sync.selectedAppsstackPanel = New-Object Windows.Controls.StackPanel\r\n            $selectedAppsBorder.Child = $sync.selectedAppsstackPanel\r\n\r\n            # Close selectedAppsPopup when mouse leaves both button and selectedAppsPopup\r\n            $sync.WPFselectedAppsButton.Add_MouseLeave({\r\n                if (-not $sync.selectedAppsPopup.IsMouseOver) {\r\n                    $sync.selectedAppsPopup.IsOpen = $false\r\n                }\r\n            })\r\n            $selectedAppsPopup.Add_MouseLeave({\r\n                if (-not $sync.WPFselectedAppsButton.IsMouseOver) {\r\n                    $sync.selectedAppsPopup.IsOpen = $false\r\n                }\r\n            })\r\n\r\n            # Creates the popup that is displayed when the user right-clicks on an app entry\r\n            # This popup contains buttons for installing, uninstalling, and viewing app information\r\n\r\n            $appPopup = New-Object Windows.Controls.Primitives.Popup\r\n            $appPopup.StaysOpen = $false\r\n            $appPopup.Placement = [System.Windows.Controls.Primitives.PlacementMode]::Bottom\r\n            $appPopup.AllowsTransparency = $true\r\n            # Store the popup globally so the position can be set later\r\n            $sync.appPopup = $appPopup\r\n\r\n            $appPopupStackPanel = New-Object Windows.Controls.StackPanel\r\n            $appPopupStackPanel.Orientation = \"Horizontal\"\r\n            $appPopupStackPanel.Add_MouseLeave({\r\n                $sync.appPopup.IsOpen = $false\r\n            })\r\n            $appPopup.Child = $appPopupStackPanel\r\n\r\n            $appButtons = @(\r\n            [PSCustomObject]@{ Name = \"Install\";    Icon = [char]0xE118 },\r\n            [PSCustomObject]@{ Name = \"Uninstall\";  Icon = [char]0xE74D },\r\n            [PSCustomObject]@{ Name = \"Info\";       Icon = [char]0xE946 }\r\n            )\r\n            foreach ($button in $appButtons) {\r\n                $newButton = New-Object Windows.Controls.Button\r\n                $newButton.Style = $sync.Form.Resources.AppEntryButtonStyle\r\n                $newButton.Content = $button.Icon\r\n                $appPopupStackPanel.Children.Add($newButton) | Out-Null\r\n\r\n                # Dynamically load the selected app object so the buttons can be reused and do not need to be created for each app\r\n                switch ($button.Name) {\r\n                    \"Install\" {\r\n                        $newButton.Add_MouseEnter({\r\n                            $appObject = $sync.configs.applicationsHashtable.$($sync.appPopupSelectedApp)\r\n                            $this.ToolTip = \"Install or Upgrade $($appObject.content)\"\r\n                        })\r\n                        $newButton.Add_Click({\r\n                            $appObject = $sync.configs.applicationsHashtable.$($sync.appPopupSelectedApp)\r\n                            Invoke-WPFInstall -PackagesToInstall $appObject\r\n                        })\r\n                    }\r\n                    \"Uninstall\" {\r\n                        $newButton.Add_MouseEnter({\r\n                            $appObject = $sync.configs.applicationsHashtable.$($sync.appPopupSelectedApp)\r\n                            $this.ToolTip = \"Uninstall $($appObject.content)\"\r\n                        })\r\n                        $newButton.Add_Click({\r\n                            $appObject = $sync.configs.applicationsHashtable.$($sync.appPopupSelectedApp)\r\n                            Invoke-WPFUnInstall -PackagesToUninstall $appObject\r\n                        })\r\n                    }\r\n                    \"Info\" {\r\n                        $newButton.Add_MouseEnter({\r\n                            $appObject = $sync.configs.applicationsHashtable.$($sync.appPopupSelectedApp)\r\n                            $this.ToolTip = \"Open the application's website in your default browser`n$($appObject.link)\"\r\n                        })\r\n                        $newButton.Add_Click({\r\n                            $appObject = $sync.configs.applicationsHashtable.$($sync.appPopupSelectedApp)\r\n                            Start-Process $appObject.link\r\n                        })\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        \"appspanel\" {\r\n            $sync.ItemsControl = Initialize-InstallAppArea -TargetElement $TargetGridName\r\n            Initialize-InstallCategoryAppList -TargetElement $sync.ItemsControl -Apps $sync.configs.applicationsHashtable\r\n        }\r\n        default {\r\n            Write-Output \"$TargetGridName not yet implemented\"\r\n        }\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFButton.ps1",
    "content": "function Invoke-WPFButton {\r\n\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Invokes the function associated with the clicked button\r\n\r\n    .PARAMETER Button\r\n        The name of the button that was clicked\r\n\r\n    #>\r\n\r\n    Param ([string]$Button)\r\n\r\n    # Use this to get the name of the button\r\n    #[System.Windows.MessageBox]::Show(\"$Button\",\"Chris Titus Tech's Windows Utility\",\"OK\",\"Info\")\r\n    if (-not $sync.ProcessRunning) {\r\n        Set-WinUtilProgressBar  -label \"\" -percent 0\r\n    }\r\n\r\n    # Check if button is defined in feature config with function or InvokeScript\r\n    if ($sync.configs.feature.$Button) {\r\n        $buttonConfig = $sync.configs.feature.$Button\r\n\r\n        # If button has a function defined, call it\r\n        if ($buttonConfig.function) {\r\n            $functionName = $buttonConfig.function\r\n            if (Get-Command $functionName -ErrorAction SilentlyContinue) {\r\n                & $functionName\r\n                return\r\n            }\r\n        }\r\n\r\n        # If button has InvokeScript defined, execute the scripts\r\n        if ($buttonConfig.InvokeScript -and $buttonConfig.InvokeScript.Count -gt 0) {\r\n            foreach ($script in $buttonConfig.InvokeScript) {\r\n                if (-not [string]::IsNullOrWhiteSpace($script)) {\r\n                    Invoke-Expression $script\r\n                }\r\n            }\r\n            return\r\n        }\r\n    }\r\n\r\n    # Fallback to hard-coded switch for buttons not in feature.json\r\n    Switch -Wildcard ($Button) {\r\n        \"WPFTab?BT\" {Invoke-WPFTab $Button}\r\n        \"WPFInstall\" {Invoke-WPFInstall}\r\n        \"WPFUninstall\" {Invoke-WPFUnInstall}\r\n        \"WPFInstallUpgrade\" {Invoke-WPFInstallUpgrade}\r\n        \"WPFCollapseAllCategories\" {Invoke-WPFToggleAllCategories -Action \"Collapse\"}\r\n        \"WPFExpandAllCategories\" {Invoke-WPFToggleAllCategories -Action \"Expand\"}\r\n        \"WPFStandard\" {Invoke-WPFPresets \"Standard\" -checkboxfilterpattern \"WPFTweak*\"}\r\n        \"WPFMinimal\" {Invoke-WPFPresets \"Minimal\" -checkboxfilterpattern \"WPFTweak*\"}\r\n        \"WPFClearTweaksSelection\" {Invoke-WPFPresets -imported $true -checkboxfilterpattern \"WPFTweak*\"}\r\n        \"WPFClearInstallSelection\" {Invoke-WPFPresets -imported $true -checkboxfilterpattern \"WPFInstall*\"}\r\n        \"WPFtweaksbutton\" {Invoke-WPFtweaksbutton}\r\n        \"WPFOOSUbutton\" {Invoke-WPFOOSU}\r\n        \"WPFAddUltPerf\" {Invoke-WPFUltimatePerformance -State \"Enable\"}\r\n        \"WPFRemoveUltPerf\" {Invoke-WPFUltimatePerformance -State \"Disable\"}\r\n        \"WPFundoall\" {Invoke-WPFundoall}\r\n        \"WPFUpdatesdefault\" {Invoke-WPFUpdatesdefault}\r\n        \"WPFRunAdobeCCCleanerTool\" {Invoke-WPFRunAdobeCCCleanerTool}\r\n        \"WPFUpdatesdisable\" {Invoke-WPFUpdatesdisable}\r\n        \"WPFUpdatessecurity\" {Invoke-WPFUpdatessecurity}\r\n        \"WPFWinUtilShortcut\" {Invoke-WPFShortcut -ShortcutToAdd \"WinUtil\" -RunAsAdmin $true}\r\n        \"WPFGetInstalled\" {Invoke-WPFGetInstalled -CheckBox \"winget\"}\r\n        \"WPFGetInstalledTweaks\" {Invoke-WPFGetInstalled -CheckBox \"tweaks\"}\r\n        \"WPFCloseButton\" {$sync.Form.Close(); Write-Host \"Bye bye!\"}\r\n        \"WPFselectedAppsButton\" {$sync.selectedAppsPopup.IsOpen = -not $sync.selectedAppsPopup.IsOpen}\r\n        \"WPFToggleFOSSHighlight\" {\r\n            if ($sync.WPFToggleFOSSHighlight.IsChecked) {\r\n                 $sync.Form.Resources[\"FOSSColor\"] = [Windows.Media.SolidColorBrush]::new([Windows.Media.Color]::FromRgb(76, 175, 80)) # #4CAF50\r\n            } else {\r\n                 $sync.Form.Resources[\"FOSSColor\"] = $sync.Form.Resources[\"MainForegroundColor\"]\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFFeatureInstall.ps1",
    "content": "function Invoke-WPFFeatureInstall {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Installs selected Windows Features\r\n\r\n    #>\r\n\r\n    if($sync.ProcessRunning) {\r\n        $msg = \"[Invoke-WPFFeatureInstall] Install process is currently running.\"\r\n        [System.Windows.MessageBox]::Show($msg, \"Winutil\", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)\r\n        return\r\n    }\r\n\r\n    $handle = Invoke-WPFRunspace -ScriptBlock {\r\n        $Features = $sync.selectedFeatures\r\n        $sync.ProcessRunning = $true\r\n        if ($Features.count -eq 1) {\r\n            Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Indeterminate\" -value 0.01 -overlay \"logo\" }\r\n        } else {\r\n            Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Normal\" -value 0.01 -overlay \"logo\" }\r\n        }\r\n\r\n        $x = 0\r\n\r\n        $Features | ForEach-Object {\r\n            Invoke-WinUtilFeatureInstall $Feature\r\n            $X++\r\n            Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -value ($x/$CheckBox.Count) }\r\n        }\r\n\r\n        $sync.ProcessRunning = $false\r\n        Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\" }\r\n\r\n        Write-Host \"===================================\"\r\n        Write-Host \"---   Features are Installed    ---\"\r\n        Write-Host \"---  A Reboot may be required   ---\"\r\n        Write-Host \"===================================\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFFixesNetwork.ps1",
    "content": "function Invoke-WPFFixesNetwork {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Resets various network configurations\r\n\r\n    #>\r\n\r\n    Write-Host \"Resetting Network with netsh\"\r\n\r\n    Set-WinUtilTaskbaritem -state \"Normal\" -value 0.01 -overlay \"logo\"\r\n    # Reset WinSock catalog to a clean state\r\n    Start-Process -NoNewWindow -FilePath \"netsh\" -ArgumentList \"winsock\", \"reset\"\r\n\r\n    Set-WinUtilTaskbaritem -state \"Normal\" -value 0.35 -overlay \"logo\"\r\n    # Resets WinHTTP proxy setting to DIRECT\r\n    Start-Process -NoNewWindow -FilePath \"netsh\" -ArgumentList \"winhttp\", \"reset\", \"proxy\"\r\n\r\n    Set-WinUtilTaskbaritem -state \"Normal\" -value 0.7 -overlay \"logo\"\r\n    # Removes all user configured IP settings\r\n    Start-Process -NoNewWindow -FilePath \"netsh\" -ArgumentList \"int\", \"ip\", \"reset\"\r\n\r\n    Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\"\r\n\r\n    Write-Host \"Process complete. Please reboot your computer.\"\r\n\r\n    $ButtonType = [System.Windows.MessageBoxButton]::OK\r\n    $MessageboxTitle = \"Network Reset \"\r\n    $Messageboxbody = (\"Stock settings loaded.`n Please reboot your computer\")\r\n    $MessageIcon = [System.Windows.MessageBoxImage]::Information\r\n\r\n    [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)\r\n    Write-Host \"==========================================\"\r\n    Write-Host \"-- Network Configuration has been Reset --\"\r\n    Write-Host \"==========================================\"\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFFixesUpdate.ps1",
    "content": "function Invoke-WPFFixesUpdate {\r\n\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Performs various tasks in an attempt to repair Windows Update\r\n\r\n    .DESCRIPTION\r\n        1. (Aggressive Only) Scans the system for corruption using the Invoke-WPFSystemRepair function\r\n        2. Stops Windows Update Services\r\n        3. Remove the QMGR Data file, which stores BITS jobs\r\n        4. (Aggressive Only) Renames the DataStore and CatRoot2 folders\r\n            DataStore - Contains the Windows Update History and Log Files\r\n            CatRoot2 - Contains the Signatures for Windows Update Packages\r\n        5. Renames the Windows Update Download Folder\r\n        6. Deletes the Windows Update Log\r\n        7. (Aggressive Only) Resets the Security Descriptors on the Windows Update Services\r\n        8. Reregisters the BITS and Windows Update DLLs\r\n        9. Removes the WSUS client settings\r\n        10. Resets WinSock\r\n        11. Gets and deletes all BITS jobs\r\n        12. Sets the startup type of the Windows Update Services then starts them\r\n        13. Forces Windows Update to check for updates\r\n\r\n    .PARAMETER Aggressive\r\n        If specified, the script will take additional steps to repair Windows Update that are more dangerous, take a significant amount of time, or are generally unnecessary\r\n\r\n    #>\r\n\r\n    param($Aggressive = $false)\r\n\r\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -PercentComplete 0\r\n    Set-WinUtilTaskbaritem -state \"Indeterminate\" -overlay \"logo\"\r\n    Write-Host \"Starting Windows Update Repair...\"\r\n    # Wait for the first progress bar to show, otherwise the second one won't show\r\n    Start-Sleep -Milliseconds 200\r\n\r\n    if ($Aggressive) {\r\n        Invoke-WPFSystemRepair\r\n    }\r\n\r\n\r\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Stopping Windows Update Services...\" -PercentComplete 10\r\n    # Stop the Windows Update Services\r\n    Write-Progress -Id 2 -ParentId 0 -Activity \"Stopping Services\" -Status \"Stopping BITS...\" -PercentComplete 0\r\n    Stop-Service -Name BITS -Force\r\n    Write-Progress -Id 2 -ParentId 0 -Activity \"Stopping Services\" -Status \"Stopping wuauserv...\" -PercentComplete 20\r\n    Stop-Service -Name wuauserv -Force\r\n    Write-Progress -Id 2 -ParentId 0 -Activity \"Stopping Services\" -Status \"Stopping appidsvc...\" -PercentComplete 40\r\n    Stop-Service -Name appidsvc -Force\r\n    Write-Progress -Id 2 -ParentId 0 -Activity \"Stopping Services\" -Status \"Stopping cryptsvc...\" -PercentComplete 60\r\n    Stop-Service -Name cryptsvc -Force\r\n    Write-Progress -Id 2 -ParentId 0 -Activity \"Stopping Services\" -Status \"Completed\" -PercentComplete 100\r\n\r\n\r\n    # Remove the QMGR Data file\r\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Renaming/Removing Files...\" -PercentComplete 20\r\n    Write-Progress -Id 3 -ParentId 0 -Activity \"Renaming/Removing Files\" -Status \"Removing QMGR Data files...\" -PercentComplete 0\r\n    Remove-Item \"$env:allusersprofile\\Application Data\\Microsoft\\Network\\Downloader\\qmgr*.dat\" -ErrorAction SilentlyContinue\r\n\r\n\r\n    if ($Aggressive) {\r\n        # Rename the Windows Update Log and Signature Folders\r\n        Write-Progress -Id 3 -ParentId 0 -Activity \"Renaming/Removing Files\" -Status \"Renaming the Windows Update Log, Download, and Signature Folder...\" -PercentComplete 20\r\n        Rename-Item $env:systemroot\\SoftwareDistribution\\DataStore DataStore.bak -ErrorAction SilentlyContinue\r\n        Rename-Item $env:systemroot\\System32\\Catroot2 catroot2.bak -ErrorAction SilentlyContinue\r\n    }\r\n\r\n    # Rename the Windows Update Download Folder\r\n    Write-Progress -Id 3 -ParentId 0 -Activity \"Renaming/Removing Files\" -Status \"Renaming the Windows Update Download Folder...\" -PercentComplete 20\r\n    Rename-Item $env:systemroot\\SoftwareDistribution\\Download Download.bak -ErrorAction SilentlyContinue\r\n\r\n    # Delete the legacy Windows Update Log\r\n    Write-Progress -Id 3 -ParentId 0 -Activity \"Renaming/Removing Files\" -Status \"Removing the old Windows Update log...\" -PercentComplete 80\r\n    Remove-Item $env:systemroot\\WindowsUpdate.log -ErrorAction SilentlyContinue\r\n    Write-Progress -Id 3 -ParentId 0 -Activity \"Renaming/Removing Files\" -Status \"Completed\" -PercentComplete 100\r\n\r\n\r\n    if ($Aggressive) {\r\n        # Reset the Security Descriptors on the Windows Update Services\r\n        Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Resetting the WU Service Security Descriptors...\" -PercentComplete 25\r\n        Write-Progress -Id 4 -ParentId 0 -Activity \"Resetting the WU Service Security Descriptors\" -Status \"Resetting the BITS Security Descriptor...\" -PercentComplete 0\r\n        Start-Process -NoNewWindow -FilePath \"sc.exe\" -ArgumentList \"sdset\", \"bits\", \"D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)\" -Wait\r\n        Write-Progress -Id 4 -ParentId 0 -Activity \"Resetting the WU Service Security Descriptors\" -Status \"Resetting the wuauserv Security Descriptor...\" -PercentComplete 50\r\n        Start-Process -NoNewWindow -FilePath \"sc.exe\" -ArgumentList \"sdset\", \"wuauserv\", \"D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU)\" -Wait\r\n        Write-Progress -Id 4 -ParentId 0 -Activity \"Resetting the WU Service Security Descriptors\" -Status \"Completed\" -PercentComplete 100\r\n    }\r\n\r\n\r\n    # Reregister the BITS and Windows Update DLLs\r\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Reregistering DLLs...\" -PercentComplete 40\r\n    $oldLocation = Get-Location\r\n    Set-Location $env:systemroot\\system32\r\n    $i = 0\r\n    $DLLs = @(\r\n        \"atl.dll\", \"urlmon.dll\", \"mshtml.dll\", \"shdocvw.dll\", \"browseui.dll\",\r\n        \"jscript.dll\", \"vbscript.dll\", \"scrrun.dll\", \"msxml.dll\", \"msxml3.dll\",\r\n        \"msxml6.dll\", \"actxprxy.dll\", \"softpub.dll\", \"wintrust.dll\", \"dssenh.dll\",\r\n        \"rsaenh.dll\", \"gpkcsp.dll\", \"sccbase.dll\", \"slbcsp.dll\", \"cryptdlg.dll\",\r\n        \"oleaut32.dll\", \"ole32.dll\", \"shell32.dll\", \"initpki.dll\", \"wuapi.dll\",\r\n        \"wuaueng.dll\", \"wuaueng1.dll\", \"wucltui.dll\", \"wups.dll\", \"wups2.dll\",\r\n        \"wuweb.dll\", \"qmgr.dll\", \"qmgrprxy.dll\", \"wucltux.dll\", \"muweb.dll\", \"wuwebv.dll\"\r\n    )\r\n    foreach ($dll in $DLLs) {\r\n        Write-Progress -Id 5 -ParentId 0 -Activity \"Reregistering DLLs\" -Status \"Registering $dll...\" -PercentComplete ($i / $DLLs.Count * 100)\r\n        $i++\r\n        Start-Process -NoNewWindow -FilePath \"regsvr32.exe\" -ArgumentList \"/s\", $dll\r\n    }\r\n    Set-Location $oldLocation\r\n    Write-Progress -Id 5 -ParentId 0 -Activity \"Reregistering DLLs\" -Status \"Completed\" -PercentComplete 100\r\n\r\n\r\n    # Remove the WSUS client settings\r\n    if (Test-Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\") {\r\n        Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Removing WSUS client settings...\" -PercentComplete 60\r\n        Write-Progress -Id 6 -ParentId 0 -Activity \"Removing WSUS client settings\" -PercentComplete 0\r\n        Start-Process -NoNewWindow -FilePath \"REG\" -ArgumentList \"DELETE\", \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\", \"/v\", \"AccountDomainSid\", \"/f\" -RedirectStandardError \"NUL\"\r\n        Start-Process -NoNewWindow -FilePath \"REG\" -ArgumentList \"DELETE\", \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\", \"/v\", \"PingID\", \"/f\" -RedirectStandardError \"NUL\"\r\n        Start-Process -NoNewWindow -FilePath \"REG\" -ArgumentList \"DELETE\", \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\", \"/v\", \"SusClientId\", \"/f\" -RedirectStandardError \"NUL\"\r\n        Write-Progress -Id 6 -ParentId 0 -Activity \"Removing WSUS client settings\" -Status \"Completed\" -PercentComplete 100\r\n    }\r\n\r\n    # Remove Group Policy Windows Update settings\r\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Removing Group Policy Windows Update settings...\" -PercentComplete 60\r\n    Write-Progress -Id 7 -ParentId 0 -Activity \"Removing Group Policy Windows Update settings\" -PercentComplete 0\r\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\" -Name \"ExcludeWUDriversInQualityUpdate\" -ErrorAction SilentlyContinue\r\n    Write-Host \"Defaulting driver offering through Windows Update...\"\r\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Device Metadata\" -Name \"PreventDeviceMetadataFromNetwork\" -ErrorAction SilentlyContinue\r\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DriverSearching\" -Name \"DontPromptForWindowsUpdate\" -ErrorAction SilentlyContinue\r\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DriverSearching\" -Name \"DontSearchWindowsUpdate\" -ErrorAction SilentlyContinue\r\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DriverSearching\" -Name \"DriverUpdateWizardWuSearchEnabled\" -ErrorAction SilentlyContinue\r\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\" -Name \"ExcludeWUDriversInQualityUpdate\" -ErrorAction SilentlyContinue\r\n    Write-Host \"Defaulting Windows Update automatic restart...\"\r\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" -Name \"NoAutoRebootWithLoggedOnUsers\" -ErrorAction SilentlyContinue\r\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" -Name \"AUPowerManagement\" -ErrorAction SilentlyContinue\r\n    Write-Host \"Clearing ANY Windows Update Policy settings...\"\r\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings\" -Name \"BranchReadinessLevel\" -ErrorAction SilentlyContinue\r\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings\" -Name \"DeferFeatureUpdatesPeriodInDays\" -ErrorAction SilentlyContinue\r\n    Remove-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings\" -Name \"DeferQualityUpdatesPeriodInDays\" -ErrorAction SilentlyContinue\r\n    Remove-Item -Path \"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item -Path \"HKCU:\\Software\\Microsoft\\WindowsSelfHost\" -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item -Path \"HKCU:\\Software\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item -Path \"HKLM:\\Software\\Microsoft\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item -Path \"HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item -Path \"HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\WindowsStore\\WindowsUpdate\" -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item -Path \"HKLM:\\Software\\Microsoft\\WindowsSelfHost\" -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item -Path \"HKLM:\\Software\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item -Path \"HKLM:\\Software\\WOW6432Node\\Microsoft\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item -Path \"HKLM:\\Software\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Policies\" -Recurse -Force -ErrorAction SilentlyContinue\r\n    Remove-Item -Path \"HKLM:\\Software\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\WindowsStore\\WindowsUpdate\" -Recurse -Force -ErrorAction SilentlyContinue\r\n    Start-Process -NoNewWindow -FilePath \"secedit\" -ArgumentList \"/configure\", \"/cfg\", \"$env:windir\\inf\\defltbase.inf\", \"/db\", \"defltbase.sdb\", \"/verbose\" -Wait\r\n    Start-Process -NoNewWindow -FilePath \"cmd.exe\" -ArgumentList \"/c RD /S /Q $env:WinDir\\System32\\GroupPolicyUsers\" -Wait\r\n    Start-Process -NoNewWindow -FilePath \"cmd.exe\" -ArgumentList \"/c RD /S /Q $env:WinDir\\System32\\GroupPolicy\" -Wait\r\n    Start-Process -NoNewWindow -FilePath \"gpupdate\" -ArgumentList \"/force\" -Wait\r\n    Write-Progress -Id 7 -ParentId 0 -Activity \"Removing Group Policy Windows Update settings\" -Status \"Completed\" -PercentComplete 100\r\n\r\n\r\n    # Reset WinSock\r\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Resetting WinSock...\" -PercentComplete 65\r\n    Write-Progress -Id 7 -ParentId 0 -Activity \"Resetting WinSock\" -Status \"Resetting WinSock...\" -PercentComplete 0\r\n    Start-Process -NoNewWindow -FilePath \"netsh\" -ArgumentList \"winsock\", \"reset\"\r\n    Start-Process -NoNewWindow -FilePath \"netsh\" -ArgumentList \"winhttp\", \"reset\", \"proxy\"\r\n    Start-Process -NoNewWindow -FilePath \"netsh\" -ArgumentList \"int\", \"ip\", \"reset\"\r\n    Write-Progress -Id 7 -ParentId 0 -Activity \"Resetting WinSock\" -Status \"Completed\" -PercentComplete 100\r\n\r\n\r\n    # Get and delete all BITS jobs\r\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Deleting BITS jobs...\" -PercentComplete 75\r\n    Write-Progress -Id 8 -ParentId 0 -Activity \"Deleting BITS jobs\" -Status \"Deleting BITS jobs...\" -PercentComplete 0\r\n    Get-BitsTransfer | Remove-BitsTransfer\r\n    Write-Progress -Id 8 -ParentId 0 -Activity \"Deleting BITS jobs\" -Status \"Completed\" -PercentComplete 100\r\n\r\n\r\n    # Change the startup type of the Windows Update Services and start them\r\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Starting Windows Update Services...\" -PercentComplete 90\r\n    Write-Progress -Id 9 -ParentId 0 -Activity \"Starting Windows Update Services\" -Status \"Starting BITS...\" -PercentComplete 0\r\n    Get-Service BITS | Set-Service -StartupType Manual -PassThru | Start-Service\r\n    Write-Progress -Id 9 -ParentId 0 -Activity \"Starting Windows Update Services\" -Status \"Starting wuauserv...\" -PercentComplete 25\r\n    Get-Service wuauserv | Set-Service -StartupType Manual -PassThru | Start-Service\r\n    Write-Progress -Id 9 -ParentId 0 -Activity \"Starting Windows Update Services\" -Status \"Starting AppIDSvc...\" -PercentComplete 50\r\n    # The AppIDSvc service is protected, so the startup type has to be changed in the registry\r\n    Set-ItemProperty -Path \"HKLM:\\SYSTEM\\CurrentControlSet\\Services\\AppIDSvc\" -Name \"Start\" -Value \"3\" # Manual\r\n    Start-Service AppIDSvc\r\n    Write-Progress -Id 9 -ParentId 0 -Activity \"Starting Windows Update Services\" -Status \"Starting CryptSvc...\" -PercentComplete 75\r\n    Get-Service CryptSvc | Set-Service -StartupType Manual -PassThru | Start-Service\r\n    Write-Progress -Id 9 -ParentId 0 -Activity \"Starting Windows Update Services\" -Status \"Completed\" -PercentComplete 100\r\n\r\n\r\n    # Force Windows Update to check for updates\r\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Forcing discovery...\" -PercentComplete 95\r\n    Write-Progress -Id 10 -ParentId 0 -Activity \"Forcing discovery\" -Status \"Forcing discovery...\" -PercentComplete 0\r\n    try {\r\n        (New-Object -ComObject Microsoft.Update.AutoUpdate).DetectNow()\r\n    } catch {\r\n        Set-WinUtilTaskbaritem -state \"Error\" -overlay \"warning\"\r\n        Write-Warning \"Failed to create Windows Update COM object: $_\"\r\n    }\r\n    Start-Process -NoNewWindow -FilePath \"wuauclt\" -ArgumentList \"/resetauthorization\", \"/detectnow\"\r\n    Write-Progress -Id 10 -ParentId 0 -Activity \"Forcing discovery\" -Status \"Completed\" -PercentComplete 100\r\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Status \"Completed\" -PercentComplete 100\r\n\r\n    Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\"\r\n\r\n    $ButtonType = [System.Windows.MessageBoxButton]::OK\r\n    $MessageboxTitle = \"Reset Windows Update \"\r\n    $Messageboxbody = (\"Stock settings loaded.`n Please reboot your computer\")\r\n    $MessageIcon = [System.Windows.MessageBoxImage]::Information\r\n\r\n    [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)\r\n    Write-Host \"===============================================\"\r\n    Write-Host \"-- Reset All Windows Update Settings to Stock -\"\r\n    Write-Host \"===============================================\"\r\n\r\n    # Remove the progress bars\r\n    Write-Progress -Id 0 -Activity \"Repairing Windows Update\" -Completed\r\n    Write-Progress -Id 1 -Activity \"Scanning for corruption\" -Completed\r\n    Write-Progress -Id 2 -Activity \"Stopping Services\" -Completed\r\n    Write-Progress -Id 3 -Activity \"Renaming/Removing Files\" -Completed\r\n    Write-Progress -Id 4 -Activity \"Resetting the WU Service Security Descriptors\" -Completed\r\n    Write-Progress -Id 5 -Activity \"Reregistering DLLs\" -Completed\r\n    Write-Progress -Id 6 -Activity \"Removing Group Policy Windows Update settings\" -Completed\r\n    Write-Progress -Id 7 -Activity \"Resetting WinSock\" -Completed\r\n    Write-Progress -Id 8 -Activity \"Deleting BITS jobs\" -Completed\r\n    Write-Progress -Id 9 -Activity \"Starting Windows Update Services\" -Completed\r\n    Write-Progress -Id 10 -Activity \"Forcing discovery\" -Completed\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFFixesWinget.ps1",
    "content": "function Invoke-WPFFixesWinget {\r\n\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Fixes Winget by running choco install winget\r\n    .DESCRIPTION\r\n        BravoNorris for the fantastic idea of a button to reinstall winget\r\n    #>\r\n    # Install Choco if not already present\r\n    try {\r\n        Set-WinUtilTaskbaritem -state \"Indeterminate\" -overlay \"logo\"\r\n        Write-Host \"==> Starting Winget Repair\"\r\n        Install-WinUtilWinget\r\n    } catch {\r\n        Write-Error \"Failed to install winget: $_\"\r\n        Set-WinUtilTaskbaritem -state \"Error\" -overlay \"warning\"\r\n    } finally {\r\n        Write-Host \"==> Finished Winget Repair\"\r\n        Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\"\r\n    }\r\n\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFGetInstalled.ps1",
    "content": "function Invoke-WPFGetInstalled {\r\n    <#\r\n    TODO: Add the Option to use Chocolatey as Engine\r\n    .SYNOPSIS\r\n        Invokes the function that gets the checkboxes to check in a new runspace\r\n\r\n    .PARAMETER checkbox\r\n        Indicates whether to check for installed 'winget' programs or applied 'tweaks'\r\n\r\n    #>\r\n    param($checkbox)\r\n    if ($sync.ProcessRunning) {\r\n        $msg = \"[Invoke-WPFGetInstalled] Install process is currently running.\"\r\n        [System.Windows.MessageBox]::Show($msg, \"Winutil\", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)\r\n        return\r\n    }\r\n\r\n    if (($sync.ChocoRadioButton.IsChecked -eq $false) -and ((Test-WinUtilPackageManager -winget) -eq \"not-installed\") -and $checkbox -eq \"winget\") {\r\n        return\r\n    }\r\n    $managerPreference = $sync.preferences.packagemanager\r\n\r\n    Invoke-WPFRunspace -ParameterList @((\"managerPreference\", $managerPreference),(\"checkbox\", $checkbox)) -ScriptBlock {\r\n        param (\r\n            [string]$checkbox,\r\n            [PackageManagers]$managerPreference\r\n        )\r\n        $sync.ProcessRunning = $true\r\n        Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Indeterminate\" }\r\n\r\n        if ($checkbox -eq \"winget\") {\r\n            Write-Host \"Getting Installed Programs...\"\r\n            switch ($managerPreference) {\r\n                \"Choco\"{$Checkboxes = Invoke-WinUtilCurrentSystem -CheckBox \"choco\"; break}\r\n                \"Winget\"{$Checkboxes = Invoke-WinUtilCurrentSystem -CheckBox $checkbox; break}\r\n            }\r\n        }\r\n        elseif ($checkbox -eq \"tweaks\") {\r\n            Write-Host \"Getting Installed Tweaks...\"\r\n            $Checkboxes = Invoke-WinUtilCurrentSystem -CheckBox $checkbox\r\n        }\r\n\r\n        $sync.form.Dispatcher.invoke({\r\n            foreach ($checkbox in $Checkboxes) {\r\n                $sync.$checkbox.ischecked = $True\r\n            }\r\n        })\r\n\r\n        Write-Host \"Done...\"\r\n        $sync.ProcessRunning = $false\r\n        Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"None\" }\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFImpex.ps1",
    "content": "function Invoke-WPFImpex {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Handles importing and exporting of the checkboxes checked for the tweaks section\r\n\r\n    .PARAMETER type\r\n        Indicates whether to 'import' or 'export'\r\n\r\n    .PARAMETER checkbox\r\n        The checkbox to export to a file or apply the imported file to\r\n\r\n    .EXAMPLE\r\n        Invoke-WPFImpex -type \"export\"\r\n\r\n    #>\r\n    param(\r\n        $type,\r\n        $Config = $null\r\n    )\r\n\r\n    function ConfigDialog {\r\n        if (!$Config) {\r\n            switch ($type) {\r\n                \"export\" { $FileBrowser = New-Object System.Windows.Forms.SaveFileDialog }\r\n                \"import\" { $FileBrowser = New-Object System.Windows.Forms.OpenFileDialog }\r\n            }\r\n            $FileBrowser.InitialDirectory = [Environment]::GetFolderPath('Desktop')\r\n            $FileBrowser.Filter = \"JSON Files (*.json)|*.json\"\r\n            $FileBrowser.ShowDialog() | Out-Null\r\n\r\n            if ($FileBrowser.FileName -eq \"\") {\r\n                return $null\r\n            } else {\r\n                return $FileBrowser.FileName\r\n            }\r\n        } else {\r\n            return $Config\r\n        }\r\n    }\r\n\r\n    switch ($type) {\r\n        \"export\" {\r\n            try {\r\n                $Config = ConfigDialog\r\n                if ($Config) {\r\n                    $allConfs = ($sync.selectedApps + $sync.selectedTweaks + $sync.selectedToggles + $sync.selectedFeatures) | ForEach-Object { [string]$_ }\r\n                    if (-not $allConfs) {\r\n                        [System.Windows.MessageBox]::Show(\r\n                            \"No settings are selected to export. Please select at least one app, tweak, toggle, or feature before exporting.\",\r\n                            \"Nothing to Export\", \"OK\", \"Warning\")\r\n                        return\r\n                    }\r\n                    $jsonFile = $allConfs | ConvertTo-Json\r\n                    $jsonFile | Out-File $Config -Force\r\n                    \"iex \"\"& { `$(irm https://christitus.com/win) } -Config '$Config'\"\"\" | Set-Clipboard\r\n                }\r\n            } catch {\r\n                Write-Error \"An error occurred while exporting: $_\"\r\n            }\r\n        }\r\n        \"import\" {\r\n            try {\r\n                $Config = ConfigDialog\r\n                if ($Config) {\r\n                    try {\r\n                        if ($Config -match '^https?://') {\r\n                            $jsonFile = (Invoke-WebRequest \"$Config\").Content | ConvertFrom-Json\r\n                        } else {\r\n                            $jsonFile = Get-Content $Config | ConvertFrom-Json\r\n                        }\r\n                    } catch {\r\n                        Write-Error \"Failed to load the JSON file from the specified path or URL: $_\"\r\n                        return\r\n                    }\r\n                    # TODO how to handle old style? detected json type then flatten it in a func?\r\n                    # $flattenedJson = $jsonFile.PSObject.Properties.Where({ $_.Name -ne \"Install\" }).ForEach({ $_.Value })\r\n                    $flattenedJson = $jsonFile\r\n\r\n                    if (-not $flattenedJson) {\r\n                        [System.Windows.MessageBox]::Show(\r\n                            \"The selected file contains no settings to import. No changes have been made.\",\r\n                            \"Empty Configuration\", \"OK\", \"Warning\")\r\n                        return\r\n                    }\r\n\r\n                    # Clear all existing selections before importing so the import replaces\r\n                    # the current state rather than merging with it\r\n                    $sync.selectedApps = [System.Collections.Generic.List[string]]::new()\r\n                    $sync.selectedTweaks = [System.Collections.Generic.List[string]]::new()\r\n                    $sync.selectedToggles = [System.Collections.Generic.List[string]]::new()\r\n                    $sync.selectedFeatures = [System.Collections.Generic.List[string]]::new()\r\n\r\n                    Update-WinUtilSelections -flatJson $flattenedJson\r\n\r\n                    if (!$PARAM_NOUI) {\r\n                        # Set flag so toggle Checked/Unchecked events don't trigger registry writes\r\n                        # while we're programmatically restoring UI state from the imported config\r\n                        $sync.ImportInProgress = $true\r\n                        try {\r\n                            Reset-WPFCheckBoxes -doToggles $true\r\n                        } finally {\r\n                            $sync.ImportInProgress = $false\r\n                        }\r\n                    }\r\n                }\r\n            } catch {\r\n                Write-Error \"An error occurred while importing: $_\"\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFInstall.ps1",
    "content": "function Invoke-WPFInstall {\r\n    <#\r\n    .SYNOPSIS\r\n        Installs the selected programs using winget, if one or more of the selected programs are already installed on the system, winget will try and perform an upgrade if there's a newer version to install.\r\n    #>\r\n\r\n    $PackagesToInstall = $sync.selectedApps | Foreach-Object { $sync.configs.applicationsHashtable.$_ }\r\n\r\n\r\n    if($sync.ProcessRunning) {\r\n        $msg = \"[Invoke-WPFInstall] An Install process is currently running.\"\r\n        [System.Windows.MessageBox]::Show($msg, \"Winutil\", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)\r\n        return\r\n    }\r\n\r\n    if ($PackagesToInstall.Count -eq 0) {\r\n        $WarningMsg = \"Please select the program(s) to install or upgrade\"\r\n        [System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)\r\n        return\r\n    }\r\n\r\n    $ManagerPreference = $sync.preferences.packagemanager\r\n\r\n    $handle = Invoke-WPFRunspace -ParameterList @((\"PackagesToInstall\", $PackagesToInstall),(\"ManagerPreference\", $ManagerPreference)) -ScriptBlock {\r\n        param($PackagesToInstall, $ManagerPreference)\r\n\r\n        $packagesSorted = Get-WinUtilSelectedPackages -PackageList $PackagesToInstall -Preference $ManagerPreference\r\n\r\n        $packagesWinget = $packagesSorted[[PackageManagers]::Winget]\r\n        $packagesChoco = $packagesSorted[[PackageManagers]::Choco]\r\n\r\n        try {\r\n            $sync.ProcessRunning = $true\r\n            if($packagesWinget.Count -gt 0 -and $packagesWinget -ne \"0\") {\r\n                Show-WPFInstallAppBusy -text \"Installing apps...\"\r\n                Install-WinUtilWinget\r\n                Install-WinUtilProgramWinget -Action Install -Programs $packagesWinget\r\n            }\r\n            if($packagesChoco.Count -gt 0) {\r\n                Install-WinUtilChoco\r\n                Install-WinUtilProgramChoco -Action Install -Programs $packagesChoco\r\n            }\r\n            Hide-WPFInstallAppBusy\r\n            Write-Host \"===========================================\"\r\n            Write-Host \"--      Installs have finished          ---\"\r\n            Write-Host \"===========================================\"\r\n            Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\" }\r\n        } catch {\r\n            Write-Host \"===========================================\"\r\n            Write-Host \"Error: $_\"\r\n            Write-Host \"===========================================\"\r\n            Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Error\" -overlay \"warning\" }\r\n        }\r\n        $sync.ProcessRunning = $False\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFInstallUpgrade.ps1",
    "content": "function Invoke-WPFInstallUpgrade {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Invokes the function that upgrades all installed programs\r\n\r\n    #>\r\n    if ($sync.ChocoRadioButton.IsChecked) {\r\n        Install-WinUtilChoco\r\n        $chocoUpgradeStatus = (Start-Process \"choco\" -ArgumentList \"upgrade all -y\" -Wait -PassThru -NoNewWindow).ExitCode\r\n        if ($chocoUpgradeStatus -eq 0) {\r\n            Write-Host \"Upgrade Successful\"\r\n        }\r\n        else{\r\n            Write-Host \"Error Occurred. Return Code: $chocoUpgradeStatus\"\r\n        }\r\n    }\r\n    else{\r\n        if((Test-WinUtilPackageManager -winget) -eq \"not-installed\") {\r\n            return\r\n        }\r\n\r\n        if(Get-WinUtilInstallerProcess -Process $global:WinGetInstall) {\r\n            $msg = \"[Invoke-WPFInstallUpgrade] Install process is currently running. Please check for a powershell window labeled 'Winget Install'\"\r\n            [System.Windows.MessageBox]::Show($msg, \"Winutil\", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)\r\n            return\r\n        }\r\n\r\n        Update-WinUtilProgramWinget\r\n\r\n        Write-Host \"===========================================\"\r\n        Write-Host \"--           Updates started            ---\"\r\n        Write-Host \"-- You can close this window if desired ---\"\r\n        Write-Host \"===========================================\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFOOSU.ps1",
    "content": "function Invoke-WPFOOSU {\r\n    <#\r\n    .SYNOPSIS\r\n        Downloads and runs OO Shutup 10\r\n    #>\r\n    try {\r\n        $OOSU_filepath = \"$ENV:temp\\OOSU10.exe\"\r\n        $Initial_ProgressPreference = $ProgressPreference\r\n        $ProgressPreference = \"SilentlyContinue\" # Disables the Progress Bar to drasticly speed up Invoke-WebRequest\r\n        Invoke-WebRequest -Uri \"https://dl5.oo-software.com/files/ooshutup10/OOSU10.exe\" -OutFile $OOSU_filepath\r\n        Write-Host \"Starting OO Shutup 10 ...\"\r\n        Start-Process $OOSU_filepath\r\n    } catch {\r\n        Write-Host \"Error Downloading and Running OO Shutup 10\" -ForegroundColor Red\r\n    }\r\n    finally {\r\n        $ProgressPreference = $Initial_ProgressPreference\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFPanelAutologin.ps1",
    "content": "function Invoke-WPFPanelAutologin {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Enables autologin using Sysinternals Autologon.exe\r\n\r\n    #>\r\n\r\n    # Official Microsoft recommendation: https://learn.microsoft.com/en-us/sysinternals/downloads/autologon\r\n    Invoke-WebRequest -Uri \"https://live.sysinternals.com/Autologon.exe\" -OutFile \"$env:temp\\autologin.exe\"\r\n    cmd /c \"$env:temp\\autologin.exe\" /accepteula\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFPopup.ps1",
    "content": "function Invoke-WPFPopup {\r\n    param (\r\n        [ValidateSet(\"Show\", \"Hide\", \"Toggle\")]\r\n        [string]$Action = \"\",\r\n\r\n        [string[]]$Popups = @(),\r\n\r\n        [ValidateScript({\r\n            $invalid = $_.GetEnumerator() | Where-Object { $_.Value -notin @(\"Show\", \"Hide\", \"Toggle\") }\r\n            if ($invalid) {\r\n                throw \"Found invalid Popup-Action pair(s): \" + ($invalid | ForEach-Object { \"$($_.Key) = $($_.Value)\" } -join \"; \")\r\n            }\r\n            $true\r\n        })]\r\n        [hashtable]$PopupActionTable = @{}\r\n    )\r\n\r\n    if (-not $PopupActionTable.Count -and (-not $Action -or -not $Popups.Count)) {\r\n        throw \"Provide either 'PopupActionTable' or both 'Action' and 'Popups'.\"\r\n    }\r\n\r\n    if ($PopupActionTable.Count -and ($Action -or $Popups.Count)) {\r\n        throw \"Use 'PopupActionTable' on its own, or 'Action' with 'Popups'.\"\r\n    }\r\n\r\n    # Collect popups and actions\r\n    $PopupsToProcess = if ($PopupActionTable.Count) {\r\n        $PopupActionTable.GetEnumerator() | ForEach-Object { [PSCustomObject]@{ Name = \"$($_.Key)Popup\"; Action = $_.Value } }\r\n    } else {\r\n        $Popups | ForEach-Object { [PSCustomObject]@{ Name = \"$_`Popup\"; Action = $Action } }\r\n    }\r\n\r\n    $PopupsNotFound = @()\r\n\r\n    # Apply actions\r\n    foreach ($popupEntry in $PopupsToProcess) {\r\n        $popupName = $popupEntry.Name\r\n\r\n        if (-not $sync.$popupName) {\r\n            $PopupsNotFound += $popupName\r\n            continue\r\n        }\r\n\r\n        $sync.$popupName.IsOpen = switch ($popupEntry.Action) {\r\n            \"Show\" { $true }\r\n            \"Hide\" { $false }\r\n            \"Toggle\" { -not $sync.$popupName.IsOpen }\r\n        }\r\n    }\r\n\r\n    if ($PopupsNotFound.Count -gt 0) {\r\n        throw \"Could not find the following popups: $($PopupsNotFound -join ', ')\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFPresets.ps1",
    "content": "function Invoke-WPFPresets {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Sets the checkboxes in winutil to the given preset\r\n\r\n    .PARAMETER preset\r\n        The preset to set the checkboxes to\r\n\r\n    .PARAMETER imported\r\n        If the preset is imported from a file, defaults to false\r\n\r\n    .PARAMETER checkboxfilterpattern\r\n        The Pattern to use when filtering through CheckBoxes, defaults to \"**\"\r\n\r\n    #>\r\n\r\n    param (\r\n        [Parameter(position=0)]\r\n        [Array]$preset = $null,\r\n\r\n        [Parameter(position=1)]\r\n        [bool]$imported = $false,\r\n\r\n        [Parameter(position=2)]\r\n        [string]$checkboxfilterpattern = \"**\"\r\n    )\r\n\r\n    if ($imported -eq $true) {\r\n        $CheckBoxesToCheck = $preset\r\n    } else {\r\n        $CheckBoxesToCheck = $sync.configs.preset.$preset\r\n    }\r\n\r\n    # clear out the filtered pattern so applying a preset replaces the current\r\n    # state rather than merging with it\r\n    switch ($checkboxfilterpattern) {\r\n        \"WPFTweak*\" { $sync.selectedTweaks = [System.Collections.Generic.List[string]]::new() }\r\n        \"WPFInstall*\" { $sync.selectedApps = [System.Collections.Generic.List[string]]::new() }\r\n        \"WPFeatures\" { $sync.selectedFeatures = [System.Collections.Generic.List[string]]::new() }\r\n        \"WPFToggle\" { $sync.selectedToggles = [System.Collections.Generic.List[string]]::new() }\r\n        default {}\r\n    }\r\n\r\n    if ($preset) {\r\n        Update-WinUtilSelections -flatJson $CheckBoxesToCheck\r\n    }\r\n\r\n    Reset-WPFCheckBoxes -doToggles $false -checkboxfilterpattern $checkboxfilterpattern\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFRunspace.ps1",
    "content": "function Invoke-WPFRunspace {\r\n\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Creates and invokes a runspace using the given scriptblock and argumentlist\r\n\r\n    .PARAMETER ScriptBlock\r\n        The scriptblock to invoke in the runspace\r\n\r\n    .PARAMETER ArgumentList\r\n        A list of arguments to pass to the runspace\r\n\r\n    .PARAMETER ParameterList\r\n        A list of named parameters that should be provided.\r\n    .EXAMPLE\r\n        Invoke-WPFRunspace `\r\n            -ScriptBlock $sync.ScriptsInstallPrograms `\r\n            -ArgumentList \"Installadvancedip,Installbitwarden\" `\r\n\r\n        Invoke-WPFRunspace`\r\n            -ScriptBlock $sync.ScriptsInstallPrograms `\r\n            -ParameterList @((\"PackagesToInstall\", @(\"Installadvancedip,Installbitwarden\")),(\"ChocoPreference\", $true))\r\n    #>\r\n\r\n    [CmdletBinding()]\r\n    Param (\r\n        $ScriptBlock,\r\n        $ArgumentList,\r\n        $ParameterList\r\n    )\r\n\r\n    # Create a PowerShell instance\r\n    $script:powershell = [powershell]::Create()\r\n\r\n    # Add Scriptblock and Arguments to runspace\r\n    $script:powershell.AddScript($ScriptBlock)\r\n    $script:powershell.AddArgument($ArgumentList)\r\n\r\n    foreach ($parameter in $ParameterList) {\r\n        $script:powershell.AddParameter($parameter[0], $parameter[1])\r\n    }\r\n\r\n    $script:powershell.RunspacePool = $sync.runspace\r\n\r\n    # Execute the RunspacePool\r\n    $script:handle = $script:powershell.BeginInvoke()\r\n\r\n    # Clean up the RunspacePool threads when they are complete, and invoke the garbage collector to clean up the memory\r\n    if ($script:handle.IsCompleted) {\r\n        $script:powershell.EndInvoke($script:handle)\r\n        $script:powershell.Dispose()\r\n        $sync.runspace.Dispose()\r\n        $sync.runspace.Close()\r\n        [System.GC]::Collect()\r\n    }\r\n    # Return the handle\r\n    return $handle\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFSSHServer.ps1",
    "content": "function Invoke-WPFSSHServer {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Invokes the OpenSSH Server install in a runspace\r\n\r\n  #>\r\n\r\n    Invoke-WPFRunspace -ScriptBlock {\r\n\r\n        Invoke-WinUtilSSHServer\r\n\r\n        Write-Host \"=======================================\"\r\n        Write-Host \"--     OpenSSH Server installed!    ---\"\r\n        Write-Host \"=======================================\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFSelectedCheckboxesUpdate.ps1",
    "content": "function Invoke-WPFSelectedCheckboxesUpdate{\r\n    <#\r\n        .SYNOPSIS\r\n            This is a helper function that is called by the Checked and Unchecked events of the Checkboxes.\r\n            It also Updates the \"Selected Apps\" selectedAppLabel on the Install Tab to represent the current collection\r\n        .PARAMETER type\r\n            Either: Add | Remove\r\n        .PARAMETER checkboxName\r\n            should contain the name of the current instance of the checkbox that triggered the Event.\r\n            Most of the time will be the automatic variable $this.Parent.Tag\r\n        .EXAMPLE\r\n            $checkbox.Add_Unchecked({Invoke-WPFSelectedCheckboxesUpdate -type \"Remove\" -checkboxName $this.Parent.Tag})\r\n            OR\r\n            Invoke-WPFSelectedCheckboxesUpdate -type \"Add\" -checkboxName $specificCheckbox.Parent.Tag\r\n    #>\r\n    param (\r\n        $type,\r\n        $checkboxName\r\n    )\r\n\r\n    if (($type -ne \"Add\") -and ($type -ne \"Remove\"))\r\n    {\r\n        Write-Error \"Type: $type not implemented\"\r\n        return\r\n    }\r\n\r\n    # Get the actual Name from the selectedAppLabel inside the Checkbox\r\n    $appKey = $checkboxName\r\n    $group = if ($appKey.StartsWith(\"WPFInstall\")) { \"Install\" }\r\n                elseif ($appKey.StartsWith(\"WPFTweaks\")) { \"Tweaks\" }\r\n                elseif ($appKey.StartsWith(\"WPFToggle\")) { \"Toggle\" }\r\n                elseif ($appKey.StartsWith(\"WPFFeature\")) { \"Feature\" }\r\n                else { \"na\" }\r\n\r\n    switch ($group) {\r\n        \"Install\" {\r\n            if ($type -eq \"Add\") {\r\n               if (!$sync.selectedApps.Contains($appKey)) {\r\n                    $sync.selectedApps.Add($appKey)\r\n                    # The List type needs to be specified again, because otherwise Sort-Object will convert the list to a string if there is only a single entry\r\n                    [System.Collections.Generic.List[string]]$sync.selectedApps = $sync.SelectedApps | Sort-Object\r\n                }\r\n            }\r\n            else{\r\n                $sync.selectedApps.Remove($appKey)\r\n            }\r\n\r\n            $count = $sync.SelectedApps.Count\r\n            $sync.WPFselectedAppsButton.Content = \"Selected Apps: $count\"\r\n            # On every change, remove all entries inside the Popup Menu. This is done, so we can keep the alphabetical order even if elements are selected in a random way\r\n            $sync.selectedAppsstackPanel.Children.Clear()\r\n            $sync.selectedApps | Foreach-Object { Add-SelectedAppsMenuItem -name $($sync.configs.applicationsHashtable.$_.Content) -key $_ }\r\n        }\r\n        \"Tweaks\" {\r\n            if ($type -eq \"Add\") {\r\n                if (!$sync.selectedTweaks.Contains($appKey)) {\r\n                    $sync.selectedTweaks.Add($appKey)\r\n                }\r\n            }\r\n            else{\r\n                $sync.selectedTweaks.Remove($appKey)\r\n            }\r\n        }\r\n        \"Toggle\" {\r\n            if ($type -eq \"Add\") {\r\n                if (!$sync.selectedToggles.Contains($appKey)) {\r\n                    $sync.selectedToggles.Add($appKey)\r\n                }\r\n            }\r\n            else{\r\n                $sync.selectedToggles.Remove($appKey)\r\n            }\r\n        }\r\n        \"Feature\" {\r\n            if ($type -eq \"Add\") {\r\n                if (!$sync.selectedFeatures.Contains($appKey)) {\r\n                    $sync.selectedFeatures.Add($appKey)\r\n                }\r\n            }\r\n            else{\r\n                $sync.selectedFeatures.Remove($appKey)\r\n            }\r\n        }\r\n        default {\r\n            Write-Host \"Unknown group for checkbox: $($appKey)\"\r\n        }\r\n    }\r\n\r\n    Write-Debug \"-------------------------------------\"\r\n    Write-Debug \"Selected Apps: $($sync.selectedApps)\"\r\n    Write-Debug \"Selected Tweaks: $($sync.selectedTweaks)\"\r\n    Write-Debug \"Selected Toggles: $($sync.selectedToggles)\"\r\n    Write-Debug \"Selected Features: $($sync.selectedFeatures)\"\r\n    Write-Debug \"--------------------------------------\"\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFSystemRepair.ps1",
    "content": "function Invoke-WPFSystemRepair {\r\n    <#\r\n    .SYNOPSIS\r\n        Checks for system corruption using SFC, and DISM\r\n        Checks for disk failure using Chkdsk\r\n\r\n    .DESCRIPTION\r\n        1. Chkdsk - Checks for disk errors, which can cause system file corruption and notifies of early disk failure\r\n        2. SFC - scans protected system files for corruption and fixes them\r\n        3. DISM - Repair a corrupted Windows operating system image\r\n    #>\r\n\r\n    Start-Process cmd.exe -ArgumentList \"/c chkdsk /scan /perf\" -NoNewWindow -Wait\r\n    Start-Process cmd.exe -ArgumentList \"/c sfc /scannow\" -NoNewWindow -Wait\r\n    Start-Process cmd.exe -ArgumentList \"/c dism /online /cleanup-image /restorehealth\" -NoNewWindow -Wait\r\n\r\n    Write-Host \"==> Finished System Repair\"\r\n    Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\"\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFTab.ps1",
    "content": "function Invoke-WPFTab {\r\n\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Sets the selected tab to the tab that was clicked\r\n\r\n    .PARAMETER ClickedTab\r\n        The name of the tab that was clicked\r\n\r\n    #>\r\n\r\n    Param (\r\n        [Parameter(Mandatory,position=0)]\r\n        [string]$ClickedTab\r\n    )\r\n\r\n    $tabNav = Get-WinUtilVariables | Where-Object {$psitem -like \"WPFTabNav\"}\r\n    $tabNumber = [int]($ClickedTab -replace \"WPFTab\",\"\" -replace \"BT\",\"\") - 1\r\n\r\n    $filter = Get-WinUtilVariables -Type ToggleButton | Where-Object {$psitem -like \"WPFTab?BT\"}\r\n    ($sync.GetEnumerator()).where{$psitem.Key -in $filter} | ForEach-Object {\r\n        if ($ClickedTab -ne $PSItem.name) {\r\n            $sync[$PSItem.Name].IsChecked = $false\r\n        } else {\r\n            $sync[\"$ClickedTab\"].IsChecked = $true\r\n            $tabNumber = [int]($ClickedTab-replace \"WPFTab\",\"\" -replace \"BT\",\"\") - 1\r\n            $sync.$tabNav.Items[$tabNumber].IsSelected = $true\r\n        }\r\n    }\r\n    $sync.currentTab = $sync.$tabNav.Items[$tabNumber].Header\r\n\r\n    # Always reset the filter for the current tab\r\n    if ($sync.currentTab -eq \"Install\") {\r\n        # Reset Install tab filter\r\n        Find-AppsByNameOrDescription -SearchString \"\"\r\n    } elseif ($sync.currentTab -eq \"Tweaks\") {\r\n        # Reset Tweaks tab filter\r\n        Find-TweaksByNameOrDescription -SearchString \"\"\r\n    }\r\n\r\n    # Show search bar in Install and Tweaks tabs\r\n    if ($tabNumber -eq 0 -or $tabNumber -eq 1) {\r\n        $sync.SearchBar.Visibility = \"Visible\"\r\n        $searchIcon = ($sync.Form.FindName(\"SearchBar\").Parent.Children | Where-Object { $_ -is [System.Windows.Controls.TextBlock] -and $_.Text -eq [char]0xE721 })[0]\r\n        if ($searchIcon) {\r\n            $searchIcon.Visibility = \"Visible\"\r\n        }\r\n    } else {\r\n        $sync.SearchBar.Visibility = \"Collapsed\"\r\n        $searchIcon = ($sync.Form.FindName(\"SearchBar\").Parent.Children | Where-Object { $_ -is [System.Windows.Controls.TextBlock] -and $_.Text -eq [char]0xE721 })[0]\r\n        if ($searchIcon) {\r\n            $searchIcon.Visibility = \"Collapsed\"\r\n        }\r\n        # Hide the clear button if it's visible\r\n        $sync.SearchBarClearButton.Visibility = \"Collapsed\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFToggleAllCategories.ps1",
    "content": "function Invoke-WPFToggleAllCategories {\r\n    <#\r\n        .SYNOPSIS\r\n            Expands or collapses all categories in the Install tab\r\n\r\n        .PARAMETER Action\r\n            The action to perform: \"Expand\" or \"Collapse\"\r\n\r\n        .DESCRIPTION\r\n            This function iterates through all category containers in the Install tab\r\n            and expands or collapses their WrapPanels while updating the toggle button labels\r\n    #>\r\n\r\n    param(\r\n        [Parameter(Mandatory=$true)]\r\n        [ValidateSet(\"Expand\", \"Collapse\")]\r\n        [string]$Action\r\n    )\r\n\r\n    try {\r\n        if ($null -eq $sync.ItemsControl) {\r\n            Write-Warning \"ItemsControl not initialized\"\r\n            return\r\n        }\r\n\r\n        $targetVisibility = if ($Action -eq \"Expand\") { [Windows.Visibility]::Visible } else { [Windows.Visibility]::Collapsed }\r\n        $targetPrefix = if ($Action -eq \"Expand\") { \"-\" } else { \"+\" }\r\n        $sourcePrefix = if ($Action -eq \"Expand\") { \"+\" } else { \"-\" }\r\n\r\n        # Iterate through all items in the ItemsControl\r\n        $sync.ItemsControl.Items | ForEach-Object {\r\n            $categoryContainer = $_\r\n\r\n            # Check if this is a category container (StackPanel with children)\r\n            if ($categoryContainer -is [System.Windows.Controls.StackPanel] -and $categoryContainer.Children.Count -ge 2) {\r\n                # Get the WrapPanel (second child)\r\n                $wrapPanel = $categoryContainer.Children[1]\r\n                $wrapPanel.Visibility = $targetVisibility\r\n\r\n                # Update the label to show the correct state\r\n                $categoryLabel = $categoryContainer.Children[0]\r\n                if ($categoryLabel.Content -like \"$sourcePrefix*\") {\r\n                    $escapedSourcePrefix = [regex]::Escape($sourcePrefix)\r\n                    $categoryLabel.Content = $categoryLabel.Content -replace \"^$escapedSourcePrefix \", \"$targetPrefix \"\r\n                }\r\n            }\r\n        }\r\n    }\r\n    catch {\r\n        Write-Error \"Error toggling categories: $_\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFUIElements.ps1",
    "content": "function Invoke-WPFUIElements {\r\n    <#\r\n    .SYNOPSIS\r\n        Adds UI elements to a specified Grid in the WinUtil GUI based on a JSON configuration.\r\n    .PARAMETER configVariable\r\n        The variable/link containing the JSON configuration.\r\n    .PARAMETER targetGridName\r\n        The name of the grid to which the UI elements should be added.\r\n    .PARAMETER columncount\r\n        The number of columns to be used in the Grid. If not provided, a default value is used based on the panel.\r\n    .EXAMPLE\r\n        Invoke-WPFUIElements -configVariable $sync.configs.applications -targetGridName \"install\" -columncount 5\r\n    .NOTES\r\n        Future me/contributor: If possible, please wrap this into a runspace to make it load all panels at the same time.\r\n    #>\r\n\r\n    param(\r\n        [Parameter(Mandatory, Position = 0)]\r\n        [PSCustomObject]$configVariable,\r\n\r\n        [Parameter(Mandatory, Position = 1)]\r\n        [string]$targetGridName,\r\n\r\n        [Parameter(Mandatory, Position = 2)]\r\n        [int]$columncount\r\n    )\r\n\r\n    $window = $sync.form\r\n\r\n    $borderstyle = $window.FindResource(\"BorderStyle\")\r\n    $HoverTextBlockStyle = $window.FindResource(\"HoverTextBlockStyle\")\r\n    $ColorfulToggleSwitchStyle = $window.FindResource(\"ColorfulToggleSwitchStyle\")\r\n    $ToggleButtonStyle = $window.FindResource(\"ToggleButtonStyle\")\r\n\r\n    if (!$borderstyle -or !$HoverTextBlockStyle -or !$ColorfulToggleSwitchStyle) {\r\n        throw \"Failed to retrieve Styles using 'FindResource' from main window element.\"\r\n    }\r\n\r\n    $targetGrid = $window.FindName($targetGridName)\r\n\r\n    if (!$targetGrid) {\r\n        throw \"Failed to retrieve Target Grid by name, provided name: $targetGrid\"\r\n    }\r\n\r\n    # Clear existing ColumnDefinitions and Children\r\n    $targetGrid.ColumnDefinitions.Clear() | Out-Null\r\n    $targetGrid.Children.Clear() | Out-Null\r\n\r\n    # Add ColumnDefinitions to the target Grid\r\n    for ($i = 0; $i -lt $columncount; $i++) {\r\n        $colDef = New-Object Windows.Controls.ColumnDefinition\r\n        $colDef.Width = New-Object Windows.GridLength(1, [Windows.GridUnitType]::Star)\r\n        $targetGrid.ColumnDefinitions.Add($colDef) | Out-Null\r\n    }\r\n\r\n    # Convert PSCustomObject to Hashtable\r\n    $configHashtable = @{}\r\n    $configVariable.PSObject.Properties.Name | ForEach-Object {\r\n        $configHashtable[$_] = $configVariable.$_\r\n    }\r\n\r\n    $radioButtonGroups = @{}\r\n\r\n    $organizedData = @{}\r\n    # Iterate through JSON data and organize by panel and category\r\n    foreach ($entry in $configHashtable.Keys) {\r\n        $entryInfo = $configHashtable[$entry]\r\n\r\n        # Create an object for the application\r\n        $entryObject = [PSCustomObject]@{\r\n            Name        = $entry\r\n            Category    = $entryInfo.Category\r\n            Content     = $entryInfo.Content\r\n            Panel       = if ($entryInfo.Panel) { $entryInfo.Panel } else { \"0\" }\r\n            Link        = $entryInfo.link\r\n            Description = $entryInfo.description\r\n            Type        = $entryInfo.type\r\n            ComboItems  = $entryInfo.ComboItems\r\n            Checked     = $entryInfo.Checked\r\n            ButtonWidth = $entryInfo.ButtonWidth\r\n            GroupName   = $entryInfo.GroupName  # Added for RadioButton groupings\r\n        }\r\n\r\n        if (-not $organizedData.ContainsKey($entryObject.Panel)) {\r\n            $organizedData[$entryObject.Panel] = @{}\r\n        }\r\n\r\n        if (-not $organizedData[$entryObject.Panel].ContainsKey($entryObject.Category)) {\r\n            $organizedData[$entryObject.Panel][$entryObject.Category] = @()\r\n        }\r\n\r\n        # Store application data in an array under the category\r\n        $organizedData[$entryObject.Panel][$entryObject.Category] += $entryObject\r\n\r\n    }\r\n\r\n    # Initialize panel count\r\n    $panelcount = 0\r\n\r\n    # Iterate through 'organizedData' by panel, category, and application\r\n    $count = 0\r\n    foreach ($panelKey in ($organizedData.Keys | Sort-Object)) {\r\n        # Create a Border for each column\r\n        $border = New-Object Windows.Controls.Border\r\n        $border.VerticalAlignment = \"Stretch\"\r\n        [System.Windows.Controls.Grid]::SetColumn($border, $panelcount)\r\n        $border.style = $borderstyle\r\n        $targetGrid.Children.Add($border) | Out-Null\r\n\r\n        # Use a DockPanel to contain the content\r\n        $dockPanelContainer = New-Object Windows.Controls.DockPanel\r\n        $border.Child = $dockPanelContainer\r\n\r\n        # Create an ItemsControl for application content\r\n        $itemsControl = New-Object Windows.Controls.ItemsControl\r\n        $itemsControl.HorizontalAlignment = 'Stretch'\r\n        $itemsControl.VerticalAlignment = 'Stretch'\r\n\r\n        # Set the ItemsPanel to a VirtualizingStackPanel\r\n        $itemsPanelTemplate = New-Object Windows.Controls.ItemsPanelTemplate\r\n        $factory = New-Object Windows.FrameworkElementFactory ([Windows.Controls.VirtualizingStackPanel])\r\n        $itemsPanelTemplate.VisualTree = $factory\r\n        $itemsControl.ItemsPanel = $itemsPanelTemplate\r\n\r\n        # Set virtualization properties\r\n        $itemsControl.SetValue([Windows.Controls.VirtualizingStackPanel]::IsVirtualizingProperty, $true)\r\n        $itemsControl.SetValue([Windows.Controls.VirtualizingStackPanel]::VirtualizationModeProperty, [Windows.Controls.VirtualizationMode]::Recycling)\r\n\r\n        # Add the ItemsControl directly to the DockPanel\r\n        [Windows.Controls.DockPanel]::SetDock($itemsControl, [Windows.Controls.Dock]::Bottom)\r\n        $dockPanelContainer.Children.Add($itemsControl) | Out-Null\r\n        $panelcount++\r\n\r\n        # Now proceed with adding category labels and entries to $itemsControl\r\n        foreach ($category in ($organizedData[$panelKey].Keys | Sort-Object)) {\r\n            $count++\r\n\r\n            $label = New-Object Windows.Controls.Label\r\n            $label.Content = $category -replace \".*__\", \"\"\r\n            $label.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, \"HeaderFontSize\")\r\n            $label.SetResourceReference([Windows.Controls.Control]::FontFamilyProperty, \"HeaderFontFamily\")\r\n            $label.UseLayoutRounding = $true\r\n            $itemsControl.Items.Add($label) | Out-Null\r\n            $sync[$category] = $label\r\n\r\n            # Sort entries by type (checkboxes first, then buttons, then comboboxes) and then alphabetically by Content\r\n            $entries = $organizedData[$panelKey][$category] | Sort-Object @{Expression = {\r\n                switch ($_.Type) {\r\n                    'Button' { 1 }\r\n                    'Combobox' { 2 }\r\n                    default { 0 }\r\n                }\r\n            }}, Content\r\n            foreach ($entryInfo in $entries) {\r\n                $count++\r\n                # Create the UI elements based on the entry type\r\n                switch ($entryInfo.Type) {\r\n                    \"Toggle\" {\r\n                        $dockPanel = New-Object Windows.Controls.DockPanel\r\n                        $checkBox = New-Object Windows.Controls.CheckBox\r\n                        $checkBox.Name = $entryInfo.Name\r\n                        $checkBox.HorizontalAlignment = \"Right\"\r\n                        $checkBox.UseLayoutRounding = $true\r\n                        [System.Windows.Automation.AutomationProperties]::SetName($checkBox, $entryInfo.Content)\r\n                        $dockPanel.Children.Add($checkBox) | Out-Null\r\n                        $checkBox.Style = $ColorfulToggleSwitchStyle\r\n\r\n                        $label = New-Object Windows.Controls.Label\r\n                        $label.Content = $entryInfo.Content\r\n                        $label.ToolTip = $entryInfo.Description\r\n                        $label.HorizontalAlignment = \"Left\"\r\n                        $label.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, \"FontSize\")\r\n                        $label.SetResourceReference([Windows.Controls.Control]::ForegroundProperty, \"MainForegroundColor\")\r\n                        $label.UseLayoutRounding = $true\r\n                        $dockPanel.Children.Add($label) | Out-Null\r\n                        $itemsControl.Items.Add($dockPanel) | Out-Null\r\n\r\n                        $sync[$entryInfo.Name] = $checkBox\r\n                        if ($entryInfo.Name -eq \"WPFToggleFOSSHighlight\") {\r\n                             if ($entryInfo.Checked -eq $true) {\r\n                                 $sync[$entryInfo.Name].IsChecked = $true\r\n                             }\r\n\r\n                             $sync[$entryInfo.Name].Add_Checked({\r\n                                 Invoke-WPFButton -Button \"WPFToggleFOSSHighlight\"\r\n                             })\r\n                             $sync[$entryInfo.Name].Add_Unchecked({\r\n                                 Invoke-WPFButton -Button \"WPFToggleFOSSHighlight\"\r\n                             })\r\n                        } else {\r\n                            $sync[$entryInfo.Name].IsChecked = (Get-WinUtilToggleStatus $entryInfo.Name)\r\n\r\n                            $sync[$entryInfo.Name].Add_Checked({\r\n                                [System.Object]$Sender = $args[0]\r\n                                Invoke-WPFSelectedCheckboxesUpdate -type \"Add\" -checkboxName $Sender.name\r\n                                # Skip applying tweaks while an import is restoring toggle states\r\n                                if (-not $sync.ImportInProgress) {\r\n                                    Invoke-WinUtilTweaks $Sender.name\r\n                                }\r\n                            })\r\n\r\n                            $sync[$entryInfo.Name].Add_Unchecked({\r\n                                [System.Object]$Sender = $args[0]\r\n                                Invoke-WPFSelectedCheckboxesUpdate -type \"Remove\" -checkboxName $Sender.name\r\n                                # Skip undoing tweaks while an import is restoring toggle states\r\n                                if (-not $sync.ImportInProgress) {\r\n                                    Invoke-WinUtiltweaks $Sender.name -undo $true\r\n                                }\r\n                            })\r\n                        }\r\n                    }\r\n\r\n                    \"ToggleButton\" {\r\n                        $toggleButton = New-Object Windows.Controls.Primitives.ToggleButton\r\n                        $toggleButton.Name = $entryInfo.Name\r\n                        $toggleButton.Content = $entryInfo.Content[1]\r\n                        $toggleButton.ToolTip = $entryInfo.Description\r\n                        $toggleButton.HorizontalAlignment = \"Left\"\r\n                        $toggleButton.Style = $ToggleButtonStyle\r\n                        [System.Windows.Automation.AutomationProperties]::SetName($toggleButton, $entryInfo.Content[0])\r\n\r\n                        $toggleButton.Tag = @{\r\n                            contentOn = if ($entryInfo.Content.Count -ge 1) { $entryInfo.Content[0] } else { \"\" }\r\n                            contentOff = if ($entryInfo.Content.Count -ge 2) { $entryInfo.Content[1] } else { $contentOn }\r\n                        }\r\n\r\n                        $itemsControl.Items.Add($toggleButton) | Out-Null\r\n\r\n                        $sync[$entryInfo.Name] = $toggleButton\r\n\r\n                        $sync[$entryInfo.Name].Add_Checked({\r\n                            $this.Content = $this.Tag.contentOn\r\n                        })\r\n\r\n                        $sync[$entryInfo.Name].Add_Unchecked({\r\n                            $this.Content = $this.Tag.contentOff\r\n                        })\r\n                    }\r\n\r\n                    \"Combobox\" {\r\n                        $horizontalStackPanel = New-Object Windows.Controls.StackPanel\r\n                        $horizontalStackPanel.Orientation = \"Horizontal\"\r\n                        $horizontalStackPanel.Margin = \"0,5,0,0\"\r\n\r\n                        $label = New-Object Windows.Controls.Label\r\n                        $label.Content = $entryInfo.Content\r\n                        $label.HorizontalAlignment = \"Left\"\r\n                        $label.VerticalAlignment = \"Center\"\r\n                        $label.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, \"ButtonFontSize\")\r\n                        $label.UseLayoutRounding = $true\r\n                        $horizontalStackPanel.Children.Add($label) | Out-Null\r\n\r\n                        $comboBox = New-Object Windows.Controls.ComboBox\r\n                        $comboBox.Name = $entryInfo.Name\r\n                        $comboBox.SetResourceReference([Windows.Controls.Control]::HeightProperty, \"ButtonHeight\")\r\n                        $comboBox.SetResourceReference([Windows.Controls.Control]::WidthProperty, \"ButtonWidth\")\r\n                        $comboBox.HorizontalAlignment = \"Left\"\r\n                        $comboBox.VerticalAlignment = \"Center\"\r\n                        $comboBox.SetResourceReference([Windows.Controls.Control]::MarginProperty, \"ButtonMargin\")\r\n                        $comboBox.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, \"ButtonFontSize\")\r\n                        $comboBox.UseLayoutRounding = $true\r\n                        [System.Windows.Automation.AutomationProperties]::SetName($comboBox, $entryInfo.Content)\r\n\r\n                        foreach ($comboitem in ($entryInfo.ComboItems -split \" \")) {\r\n                            $comboBoxItem = New-Object Windows.Controls.ComboBoxItem\r\n                            $comboBoxItem.Content = $comboitem\r\n                            $comboBoxItem.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, \"ButtonFontSize\")\r\n                            $comboBoxItem.UseLayoutRounding = $true\r\n                            $comboBox.Items.Add($comboBoxItem) | Out-Null\r\n                        }\r\n\r\n                        $horizontalStackPanel.Children.Add($comboBox) | Out-Null\r\n                        $itemsControl.Items.Add($horizontalStackPanel) | Out-Null\r\n\r\n                        $comboBox.SelectedIndex = 0\r\n\r\n                        # Set initial text\r\n                        if ($comboBox.Items.Count -gt 0) {\r\n                            $comboBox.Text = $comboBox.Items[0].Content\r\n                        }\r\n\r\n                        # Add SelectionChanged event handler to update the text property\r\n                        $comboBox.Add_SelectionChanged({\r\n                            $selectedItem = $this.SelectedItem\r\n                            if ($selectedItem) {\r\n                                $this.Text = $selectedItem.Content\r\n                            }\r\n                        })\r\n\r\n                        $sync[$entryInfo.Name] = $comboBox\r\n                    }\r\n\r\n                    \"Button\" {\r\n                        $button = New-Object Windows.Controls.Button\r\n                        $button.Name = $entryInfo.Name\r\n                        $button.Content = $entryInfo.Content\r\n                        $button.HorizontalAlignment = \"Left\"\r\n                        $button.SetResourceReference([Windows.Controls.Control]::MarginProperty, \"ButtonMargin\")\r\n                        $button.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, \"ButtonFontSize\")\r\n                        if ($entryInfo.ButtonWidth) {\r\n                            $baseWidth = [int]$entryInfo.ButtonWidth\r\n                            $button.Width = [math]::Max($baseWidth, 350)\r\n                        }\r\n                        [System.Windows.Automation.AutomationProperties]::SetName($button, $entryInfo.Content)\r\n                        $itemsControl.Items.Add($button) | Out-Null\r\n\r\n                        $sync[$entryInfo.Name] = $button\r\n                    }\r\n\r\n                    \"RadioButton\" {\r\n                        # Check if a container for this GroupName already exists\r\n                        if (-not $radioButtonGroups.ContainsKey($entryInfo.GroupName)) {\r\n                            # Create a StackPanel for this group\r\n                            $groupStackPanel = New-Object Windows.Controls.StackPanel\r\n                            $groupStackPanel.Orientation = \"Vertical\"\r\n\r\n                            # Add the group container to the ItemsControl\r\n                            $itemsControl.Items.Add($groupStackPanel) | Out-Null\r\n                        }\r\n                        else {\r\n                            # Retrieve the existing group container\r\n                            $groupStackPanel = $radioButtonGroups[$entryInfo.GroupName]\r\n                        }\r\n\r\n                        # Create the RadioButton\r\n                        $radioButton = New-Object Windows.Controls.RadioButton\r\n                        $radioButton.Name = $entryInfo.Name\r\n                        $radioButton.GroupName = $entryInfo.GroupName\r\n                        $radioButton.Content = $entryInfo.Content\r\n                        $radioButton.HorizontalAlignment = \"Left\"\r\n                        $radioButton.SetResourceReference([Windows.Controls.Control]::MarginProperty, \"CheckBoxMargin\")\r\n                        $radioButton.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, \"ButtonFontSize\")\r\n                        $radioButton.ToolTip = $entryInfo.Description\r\n                        $radioButton.UseLayoutRounding = $true\r\n                        [System.Windows.Automation.AutomationProperties]::SetName($radioButton, $entryInfo.Content)\r\n\r\n                        if ($entryInfo.Checked -eq $true) {\r\n                            $radioButton.IsChecked = $true\r\n                        }\r\n\r\n                        # Add the RadioButton to the group container\r\n                        $groupStackPanel.Children.Add($radioButton) | Out-Null\r\n                        $sync[$entryInfo.Name] = $radioButton\r\n                    }\r\n\r\n                    default {\r\n                        $horizontalStackPanel = New-Object Windows.Controls.StackPanel\r\n                        $horizontalStackPanel.Orientation = \"Horizontal\"\r\n\r\n                        $checkBox = New-Object Windows.Controls.CheckBox\r\n                        $checkBox.Name = $entryInfo.Name\r\n                        $checkBox.Content = $entryInfo.Content\r\n                        $checkBox.SetResourceReference([Windows.Controls.Control]::FontSizeProperty, \"FontSize\")\r\n                        $checkBox.ToolTip = $entryInfo.Description\r\n                        $checkBox.SetResourceReference([Windows.Controls.Control]::MarginProperty, \"CheckBoxMargin\")\r\n                        $checkBox.UseLayoutRounding = $true\r\n                        [System.Windows.Automation.AutomationProperties]::SetName($checkBox, $entryInfo.Content)\r\n                        if ($entryInfo.Checked -eq $true) {\r\n                            $checkBox.IsChecked = $entryInfo.Checked\r\n                        }\r\n                        $horizontalStackPanel.Children.Add($checkBox) | Out-Null\r\n\r\n                        if ($entryInfo.Link) {\r\n                            $textBlock = New-Object Windows.Controls.TextBlock\r\n                            $textBlock.Name = $checkBox.Name + \"Link\"\r\n                            $textBlock.Text = \"(?)\"\r\n                            $textBlock.ToolTip = $entryInfo.Link\r\n                            $textBlock.Style = $HoverTextBlockStyle\r\n                            $textBlock.UseLayoutRounding = $true\r\n\r\n                            $horizontalStackPanel.Children.Add($textBlock) | Out-Null\r\n\r\n                            $sync[$textBlock.Name] = $textBlock\r\n                        }\r\n\r\n                        $itemsControl.Items.Add($horizontalStackPanel) | Out-Null\r\n                        $sync[$entryInfo.Name] = $checkBox\r\n\r\n                        $sync[$entryInfo.Name].Add_Checked({\r\n                            [System.Object]$Sender = $args[0]\r\n                            Invoke-WPFSelectedCheckboxesUpdate -type \"Add\" -checkboxName $Sender.name\r\n                        })\r\n\r\n                        $sync[$entryInfo.Name].Add_Unchecked({\r\n                            [System.Object]$Sender = $args[0]\r\n                            Invoke-WPFSelectedCheckboxesUpdate -type \"Remove\" -checkbox $Sender.name\r\n                        })\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFUIThread.ps1",
    "content": "function Invoke-WPFUIThread {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Creates and runs a task on Winutil's WPF Forms thread.\r\n\r\n    .PARAMETER ScriptBlock\r\n        The scriptblock to invoke in the thread\r\n    #>\r\n\r\n    [CmdletBinding()]\r\n    Param (\r\n        $ScriptBlock\r\n    )\r\n\r\n    if ($PARAM_NOUI) {\r\n        return;\r\n    }\r\n\r\n    $sync.form.Dispatcher.Invoke([action]$ScriptBlock)\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFUltimatePerformance.ps1",
    "content": "Function Invoke-WPFUltimatePerformance {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Enables or disables the Ultimate Performance power scheme based on its GUID.\r\n\r\n    .PARAMETER State\r\n        Specifies whether to \"Enable\" or \"Disable\" the Ultimate Performance power scheme.\r\n\r\n    #>\r\n    param(\r\n        [Parameter(Mandatory = $true)]\r\n        [ValidateSet(\"Enable\", \"Disable\")]\r\n        [string]$State\r\n    )\r\n\r\n    try {\r\n        # GUID of the Ultimate Performance power plan\r\n        $ultimateGUID = \"e9a42b02-d5df-448d-aa00-03f14749eb61\"\r\n\r\n        switch ($State) {\r\n            \"Enable\" {\r\n                # Duplicate the Ultimate Performance power plan using its GUID\r\n                $duplicateOutput = powercfg /duplicatescheme $ultimateGUID\r\n\r\n                $guid = $null\r\n                $nameFromFile = \"ChrisTitus - Ultimate Power Plan\"\r\n                $description = \"Ultimate Power Plan, added via WinUtils\"\r\n\r\n                # Extract the new GUID from the duplicateOutput\r\n                foreach ($line in $duplicateOutput) {\r\n                    if ($line -match \"\\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\\b\") {\r\n                        $guid = $matches[0]  # $matches[0] will contain the first match, which is the GUID\r\n                        Write-Output \"GUID: $guid has been extracted and stored in the variable.\"\r\n                        break\r\n                    }\r\n                }\r\n\r\n                if (-not $guid) {\r\n                    Write-Output \"No GUID found in the duplicateOutput. Check the output format.\"\r\n                    exit 1\r\n                }\r\n\r\n                # Change the name of the power plan and set its description\r\n                $changeNameOutput = powercfg /changename $guid \"$nameFromFile\" \"$description\"\r\n                Write-Output \"The power plan name and description have been changed. Output:\"\r\n                Write-Output $changeNameOutput\r\n\r\n                # Set the duplicated Ultimate Performance plan as active\r\n                $setActiveOutput = powercfg /setactive $guid\r\n                Write-Output \"The power plan has been set as active. Output:\"\r\n                Write-Output $setActiveOutput\r\n\r\n                Write-Host \"> Ultimate Performance plan installed and set as active.\"\r\n            }\r\n            \"Disable\" {\r\n                # Check if the Ultimate Performance plan is installed by GUID\r\n                $installedPlan = powercfg -list | Select-String -Pattern \"ChrisTitus - Ultimate Power Plan\"\r\n\r\n                if ($installedPlan) {\r\n                    # Extract the GUID of the installed Ultimate Performance plan\r\n                    $ultimatePlanGUID = $installedPlan.Line.Split()[3]\r\n\r\n                    # Set a different power plan as active before deleting the Ultimate Performance plan\r\n                    $balancedPlanGUID = \"381b4222-f694-41f0-9685-ff5bb260df2e\"\r\n                    powercfg -setactive $balancedPlanGUID\r\n\r\n                    # Delete the Ultimate Performance plan by GUID\r\n                    powercfg -delete $ultimatePlanGUID\r\n\r\n                    Write-Host \"Ultimate Performance plan has been uninstalled.\"\r\n                    Write-Host \"> Balanced plan is now active.\"\r\n                } else {\r\n                    Write-Host \"Ultimate Performance plan is not installed.\"\r\n                }\r\n            }\r\n            default {\r\n                Write-Host \"Invalid state. Please use 'Enable' or 'Disable'.\"\r\n            }\r\n        }\r\n    } catch {\r\n        Write-Error \"Error occurred: $_\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFUnInstall.ps1",
    "content": "function Invoke-WPFUnInstall {\r\n    param(\r\n        [Parameter(Mandatory=$false)]\r\n        [PSObject[]]$PackagesToUninstall = $($sync.selectedApps | Foreach-Object { $sync.configs.applicationsHashtable.$_ })\r\n    )\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Uninstalls the selected programs\r\n    #>\r\n\r\n    if($sync.ProcessRunning) {\r\n        $msg = \"[Invoke-WPFUnInstall] Install process is currently running\"\r\n        [System.Windows.MessageBox]::Show($msg, \"Winutil\", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)\r\n        return\r\n    }\r\n\r\n    if ($PackagesToUninstall.Count -eq 0) {\r\n        $WarningMsg = \"Please select the program(s) to uninstall\"\r\n        [System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)\r\n        return\r\n    }\r\n\r\n    $ButtonType = [System.Windows.MessageBoxButton]::YesNo\r\n    $MessageboxTitle = \"Are you sure?\"\r\n    $Messageboxbody = (\"This will uninstall the following applications: `n $($PackagesToUninstall | Select-Object Name, Description| Out-String)\")\r\n    $MessageIcon = [System.Windows.MessageBoxImage]::Information\r\n\r\n    $confirm = [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)\r\n\r\n    if($confirm -eq \"No\") {return}\r\n\r\n    $ManagerPreference = $sync.preferences.packagemanager\r\n\r\n    Invoke-WPFRunspace -ParameterList @((\"PackagesToUninstall\", $PackagesToUninstall),(\"ManagerPreference\", $ManagerPreference)) -ScriptBlock {\r\n        param($PackagesToUninstall, $ManagerPreference)\r\n\r\n        $packagesSorted = Get-WinUtilSelectedPackages -PackageList $PackagesToUninstall -Preference $ManagerPreference\r\n        $packagesWinget = $packagesSorted[[PackageManagers]::Winget]\r\n        $packagesChoco = $packagesSorted[[PackageManagers]::Choco]\r\n\r\n        try {\r\n            $sync.ProcessRunning = $true\r\n            Show-WPFInstallAppBusy -text \"Uninstalling apps...\"\r\n\r\n            # Uninstall all selected programs in new window\r\n            if($packagesWinget.Count -gt 0) {\r\n                Install-WinUtilProgramWinget -Action Uninstall -Programs $packagesWinget\r\n            }\r\n            if($packagesChoco.Count -gt 0) {\r\n                Install-WinUtilProgramChoco -Action Uninstall -Programs $packagesChoco\r\n            }\r\n            Hide-WPFInstallAppBusy\r\n            Write-Host \"===========================================\"\r\n            Write-Host \"--       Uninstalls have finished       ---\"\r\n            Write-Host \"===========================================\"\r\n            Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\" }\r\n        } catch {\r\n            Write-Host \"===========================================\"\r\n            Write-Host \"Error: $_\"\r\n            Write-Host \"===========================================\"\r\n           Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Error\" -overlay \"warning\" }\r\n        }\r\n        $sync.ProcessRunning = $False\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFUpdatesdefault.ps1",
    "content": "function Invoke-WPFUpdatesdefault {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Resets Windows Update settings to default\r\n\r\n    #>\r\n    $ErrorActionPreference = 'SilentlyContinue'\r\n\r\n    Write-Host \"Removing Windows Update policy settings...\" -ForegroundColor Green\r\n\r\n    Remove-Item -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" -Recurse -Force\r\n    Remove-Item -Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\DeliveryOptimization\" -Recurse -Force\r\n    Remove-Item -Path \"HKLM:\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings\" -Recurse -Force\r\n    Remove-Item -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Device Metadata\" -Recurse -Force\r\n    Remove-Item -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DriverSearching\" -Recurse -Force\r\n    Remove-Item -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\" -Recurse -Force\r\n\r\n    Write-Host \"Reenabling Windows Update Services...\" -ForegroundColor Green\r\n\r\n    Write-Host \"Restored BITS to Manual\"\r\n    Set-Service -Name BITS -StartupType Manual\r\n\r\n    Write-Host \"Restored wuauserv to Manual\"\r\n    Set-Service -Name wuauserv -StartupType Manual\r\n\r\n    Write-Host \"Restored UsoSvc to Automatic\"\r\n    Set-Service -Name UsoSvc -StartupType Automatic\r\n\r\n    Write-Host \"Restored WaaSMedicSvc to Manual\"\r\n    Set-Service -Name WaaSMedicSvc -StartupType Manual\r\n\r\n    Write-Host \"Enabling update related scheduled tasks...\" -ForegroundColor Green\r\n\r\n    $Tasks =\r\n        '\\Microsoft\\Windows\\InstallService\\*',\r\n        '\\Microsoft\\Windows\\UpdateOrchestrator\\*',\r\n        '\\Microsoft\\Windows\\UpdateAssistant\\*',\r\n        '\\Microsoft\\Windows\\WaaSMedic\\*',\r\n        '\\Microsoft\\Windows\\WindowsUpdate\\*',\r\n        '\\Microsoft\\WindowsUpdate\\*'\r\n\r\n    foreach ($Task in $Tasks) {\r\n        Get-ScheduledTask -TaskPath $Task | Enable-ScheduledTask -ErrorAction SilentlyContinue\r\n    }\r\n\r\n    Write-Host \"Windows Local Policies Reset to Default\"\r\n    secedit /configure /cfg \"$Env:SystemRoot\\inf\\defltbase.inf\" /db defltbase.sdb\r\n\r\n    Write-Host \"===================================================\" -ForegroundColor Green\r\n    Write-Host \"---  Windows Update Settings Reset to Default   ---\" -ForegroundColor Green\r\n    Write-Host \"===================================================\" -ForegroundColor Green\r\n\r\n    Write-Host \"Note: You must restart your system in order for all changes to take effect.\" -ForegroundColor Yellow\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFUpdatesdisable.ps1",
    "content": "function Invoke-WPFUpdatesdisable {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Disables Windows Update\r\n\r\n    .NOTES\r\n        Disabling Windows Update is not recommended. This is only for advanced users who know what they are doing.\r\n\r\n    #>\r\n    $ErrorActionPreference = 'SilentlyContinue'\r\n\r\n    Write-Host \"Configuring registry settings...\" -ForegroundColor Yellow\r\n    New-Item -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" -Force\r\n\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" -Name \"NoAutoUpdate\" -Type DWord -Value 1\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" -Name \"AUOptions\" -Type DWord -Value 1\r\n\r\n    New-Item -Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\DeliveryOptimization\\Config\" -Force\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\DeliveryOptimization\\Config\" -Name \"DODownloadMode\" -Type DWord -Value 0\r\n\r\n    Write-Host \"Disabled BITS Service\"\r\n    Set-Service -Name BITS -StartupType Disabled\r\n\r\n    Write-Host \"Disabled wuauserv Service\"\r\n    Set-Service -Name wuauserv -StartupType Disabled\r\n\r\n    Write-Host \"Disabled UsoSvc Service\"\r\n    Set-Service -Name UsoSvc -StartupType Disabled\r\n\r\n    Write-Host \"Disabled WaaSMedicSvc Service\"\r\n    Set-Service -Name WaaSMedicSvc -StartupType Disabled\r\n\r\n    Remove-Item \"C:\\Windows\\SoftwareDistribution\\*\" -Recurse -Force\r\n    Write-Host \"Cleared SoftwareDistribution folder\"\r\n\r\n    Write-Host \"Disabling update related scheduled tasks...\" -ForegroundColor Yellow\r\n\r\n    $Tasks =\r\n        '\\Microsoft\\Windows\\InstallService\\*',\r\n        '\\Microsoft\\Windows\\UpdateOrchestrator\\*',\r\n        '\\Microsoft\\Windows\\UpdateAssistant\\*',\r\n        '\\Microsoft\\Windows\\WaaSMedic\\*',\r\n        '\\Microsoft\\Windows\\WindowsUpdate\\*',\r\n        '\\Microsoft\\WindowsUpdate\\*'\r\n\r\n    foreach ($Task in $Tasks) {\r\n        Get-ScheduledTask -TaskPath $Task | Disable-ScheduledTask -ErrorAction SilentlyContinue\r\n    }\r\n\r\n    Write-Host \"=================================\" -ForegroundColor Green\r\n    Write-Host \"---   Updates Are Disabled    ---\" -ForegroundColor Green\r\n    Write-Host \"=================================\" -ForegroundColor Green\r\n\r\n    Write-Host \"Note: You must restart your system in order for all changes to take effect.\" -ForegroundColor Yellow\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFUpdatessecurity.ps1",
    "content": "function Invoke-WPFUpdatessecurity {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Sets Windows Update to recommended settings\r\n\r\n    .DESCRIPTION\r\n        1. Disables driver offering through Windows Update\r\n        2. Disables Windows Update automatic restart\r\n        3. Sets Windows Update to Semi-Annual Channel (Targeted)\r\n        4. Defers feature updates for 365 days\r\n        5. Defers quality updates for 4 days\r\n\r\n    #>\r\n\r\n    Write-Host \"Disabling driver offering through Windows Update...\"\r\n\r\n    New-Item -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Device Metadata\" -Force\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\Device Metadata\" -Name \"PreventDeviceMetadataFromNetwork\" -Type DWord -Value 1\r\n\r\n    New-Item -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DriverSearching\" -Force\r\n\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DriverSearching\" -Name \"DontPromptForWindowsUpdate\" -Type DWord -Value 1\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DriverSearching\" -Name \"DontSearchWindowsUpdate\" -Type DWord -Value 1\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DriverSearching\" -Name \"DriverUpdateWizardWuSearchEnabled\" -Type DWord -Value 0\r\n\r\n    New-Item -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\" -Force\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\" -Name \"ExcludeWUDriversInQualityUpdate\" -Type DWord -Value 1\r\n\r\n    Write-Host \"Setting cumulative updates back by 1 year and security updates by 4 days\"\r\n\r\n    New-Item -Path \"HKLM:\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings\" -Force\r\n\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings\" -Name \"BranchReadinessLevel\" -Type DWord -Value 20\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings\" -Name \"DeferFeatureUpdatesPeriodInDays\" -Type DWord -Value 365\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings\" -Name \"DeferQualityUpdatesPeriodInDays\" -Type DWord -Value 4\r\n\r\n    Write-Host \"Disabling Windows Update automatic restart...\"\r\n\r\n    New-Item -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" -Force\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" -Name \"NoAutoRebootWithLoggedOnUsers\" -Type DWord -Value 1\r\n    Set-ItemProperty -Path \"HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" -Name \"AUPowerManagement\" -Type DWord -Value 0\r\n\r\n    Write-Host \"=================================\"\r\n    Write-Host \"-- Updates Set to Recommended ---\"\r\n    Write-Host \"=================================\"\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFtweaksbutton.ps1",
    "content": "function Invoke-WPFtweaksbutton {\r\n  <#\r\n\r\n    .SYNOPSIS\r\n        Invokes the functions associated with each group of checkboxes\r\n\r\n  #>\r\n\r\n  if($sync.ProcessRunning) {\r\n    $msg = \"[Invoke-WPFtweaksbutton] Install process is currently running.\"\r\n    [System.Windows.MessageBox]::Show($msg, \"Winutil\", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)\r\n    return\r\n  }\r\n\r\n  $Tweaks = $sync.selectedTweaks\r\n  $dnsProvider = $sync[\"WPFchangedns\"].text\r\n  $restorePointTweak = \"WPFTweaksRestorePoint\"\r\n  $restorePointSelected = $Tweaks -contains $restorePointTweak\r\n  $tweaksToRun = @($Tweaks | Where-Object { $_ -ne $restorePointTweak })\r\n  $totalSteps = [Math]::Max($Tweaks.Count, 1)\r\n  $completedSteps = 0\r\n\r\n  if ($tweaks.count -eq 0 -and $dnsProvider -eq \"Default\") {\r\n    $msg = \"Please check the tweaks you wish to perform.\"\r\n    [System.Windows.MessageBox]::Show($msg, \"Winutil\", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)\r\n    return\r\n  }\r\n\r\n  Write-Debug \"Number of tweaks to process: $($Tweaks.Count)\"\r\n\r\n  if ($restorePointSelected) {\r\n    $sync.ProcessRunning = $true\r\n\r\n    if ($Tweaks.Count -eq 1) {\r\n        Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Indeterminate\" -value 0.01 -overlay \"logo\" }\r\n    } else {\r\n        Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Normal\" -value 0.01 -overlay \"logo\" }\r\n    }\r\n\r\n    Set-WinUtilProgressBar -Label \"Creating restore point\" -Percent 0\r\n    Invoke-WinUtilTweaks $restorePointTweak\r\n    $completedSteps = 1\r\n\r\n    if ($tweaksToRun.Count -eq 0 -and $dnsProvider -eq \"Default\") {\r\n      Set-WinUtilProgressBar -Label \"Tweaks finished\" -Percent 100\r\n      $sync.ProcessRunning = $false\r\n      Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\" }\r\n      Write-Host \"=================================\"\r\n      Write-Host \"--     Tweaks are Finished    ---\"\r\n      Write-Host \"=================================\"\r\n      return\r\n    }\r\n  }\r\n\r\n  # The leading \",\" in the ParameterList is necessary because we only provide one argument and powershell cannot be convinced that we want a nested loop with only one argument otherwise\r\n  $handle = Invoke-WPFRunspace -ParameterList @((\"tweaks\", $tweaksToRun), (\"dnsProvider\", $dnsProvider), (\"completedSteps\", $completedSteps), (\"totalSteps\", $totalSteps)) -ScriptBlock {\r\n    param($tweaks, $dnsProvider, $completedSteps, $totalSteps)\r\n    Write-Debug \"Inside Number of tweaks to process: $($Tweaks.Count)\"\r\n\r\n    $sync.ProcessRunning = $true\r\n\r\n    if ($completedSteps -eq 0) {\r\n      if ($Tweaks.count -eq 1) {\r\n        Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Indeterminate\" -value 0.01 -overlay \"logo\" }\r\n      } else {\r\n        Invoke-WPFUIThread -ScriptBlock{ Set-WinUtilTaskbaritem -state \"Normal\" -value 0.01 -overlay \"logo\" }\r\n      }\r\n    }\r\n\r\n    Set-WinUtilDNS -DNSProvider $dnsProvider\r\n\r\n    for ($i = 0; $i -lt $tweaks.Count; $i++) {\r\n      Set-WinUtilProgressBar -Label \"Applying $($tweaks[$i])\" -Percent ($completedSteps / $totalSteps * 100)\r\n      Invoke-WinUtilTweaks $tweaks[$i]\r\n      $completedSteps++\r\n      $progress = $completedSteps / $totalSteps\r\n      Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -value $progress }\r\n    }\r\n    Set-WinUtilProgressBar -Label \"Tweaks finished\" -Percent 100\r\n    $sync.ProcessRunning = $false\r\n    Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\" }\r\n    Write-Host \"=================================\"\r\n    Write-Host \"--     Tweaks are Finished    ---\"\r\n    Write-Host \"=================================\"\r\n  }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WPFundoall.ps1",
    "content": "function Invoke-WPFundoall {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Undoes every selected tweak\r\n\r\n    #>\r\n\r\n    if($sync.ProcessRunning) {\r\n        $msg = \"[Invoke-WPFundoall] Install process is currently running.\"\r\n        [System.Windows.MessageBox]::Show($msg, \"Winutil\", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)\r\n        return\r\n    }\r\n\r\n    $tweaks = $sync.selectedTweaks\r\n\r\n    if ($tweaks.count -eq 0) {\r\n        $msg = \"Please check the tweaks you wish to undo.\"\r\n        [System.Windows.MessageBox]::Show($msg, \"Winutil\", [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)\r\n        return\r\n    }\r\n\r\n    Invoke-WPFRunspace -ArgumentList $tweaks -ScriptBlock {\r\n        param($tweaks)\r\n\r\n        $sync.ProcessRunning = $true\r\n        if ($tweaks.count -eq 1) {\r\n            Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Indeterminate\" -value 0.01 -overlay \"logo\" }\r\n        } else {\r\n            Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"Normal\" -value 0.01 -overlay \"logo\" }\r\n        }\r\n\r\n\r\n        for ($i = 0; $i -lt $tweaks.Count; $i++) {\r\n            Set-WinUtilProgressBar -Label \"Undoing $($tweaks[$i])\" -Percent ($i / $tweaks.Count * 100)\r\n            Invoke-WinUtiltweaks $tweaks[$i] -undo $true\r\n            Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -value ($i/$tweaks.Count) }\r\n        }\r\n\r\n        Set-WinUtilProgressBar -Label \"Undo Tweaks Finished\" -Percent 100\r\n        $sync.ProcessRunning = $false\r\n        Invoke-WPFUIThread -ScriptBlock { Set-WinUtilTaskbaritem -state \"None\" -overlay \"checkmark\" }\r\n        Write-Host \"==================================\"\r\n        Write-Host \"---  Undo Tweaks are Finished  ---\"\r\n        Write-Host \"==================================\"\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WinUtilAutoRun.ps1",
    "content": "function Invoke-WinUtilAutoRun {\r\n    <#\r\n\r\n    .SYNOPSIS\r\n        Runs Install, Tweaks, and Features with optional UI invocation.\r\n    #>\r\n\r\n    function BusyWait {\r\n        Start-Sleep -Seconds 5\r\n        while ($sync.ProcessRunning) {\r\n                Start-Sleep -Seconds 5\r\n            }\r\n    }\r\n\r\n    BusyWait\r\n\r\n    Write-Host \"Applying tweaks...\"\r\n    Invoke-WPFtweaksbutton\r\n    BusyWait\r\n\r\n    Write-Host \"Applying toggles...\"\r\n    $handle = Invoke-WPFRunspace -ScriptBlock {\r\n        $Toggles = $sync.selectedToggles\r\n        Write-Debug \"Inside Number of toggles to process: $($Toggles.Count)\"\r\n\r\n        $sync.ProcessRunning = $true\r\n\r\n        for ($i = 0; $i -lt $Tweaks.Count; $i++) {\r\n            Invoke-WinUtilTweaks $Toggles[$i]\r\n        }\r\n\r\n        $sync.ProcessRunning = $false\r\n        Write-Host \"=================================\"\r\n        Write-Host \"--     Toggles are Finished    ---\"\r\n        Write-Host \"=================================\"\r\n    }\r\n    BusyWait\r\n\r\n    Write-Host \"Applying features...\"\r\n    Invoke-WPFFeatureInstall\r\n    BusyWait\r\n\r\n    Write-Host \"Installing applications...\"\r\n    Invoke-WPFInstall\r\n    BusyWait\r\n\r\n    Write-Host \"Done.\"\r\n}\r\n"
  },
  {
    "path": "functions/public/Invoke-WinUtilRemoveEdge.ps1",
    "content": "function Invoke-WinUtilRemoveEdge {\r\n  Write-Host \"Unlocking The Offical Edge Uninstaller And Removing Microsoft Edge...\"\r\n\r\n  $Path = (Get-ChildItem \"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\*\\Installer\\setup.exe\")[0].FullName\r\n  New-Item \"C:\\Windows\\SystemApps\\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\\MicrosoftEdge.exe\" -Force\r\n  Start-Process $Path -ArgumentList '--uninstall --system-level --force-uninstall --delete-profile'\r\n}\r\n"
  },
  {
    "path": "functions/public/Show-CTTLogo.ps1",
    "content": "Function Show-CTTLogo {\r\n    <#\r\n        .SYNOPSIS\r\n            Displays the CTT logo in ASCII art.\r\n        .DESCRIPTION\r\n            This function displays the CTT logo in ASCII art format.\r\n        .PARAMETER None\r\n            No parameters are required for this function.\r\n        .EXAMPLE\r\n            Show-CTTLogo\r\n            Prints the CTT logo in ASCII art format to the console.\r\n    #>\r\n\r\n    $asciiArt = @\"\r\n    CCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\r\n CCC::::::::::::CT:::::::::::::::::::::TT:::::::::::::::::::::T\r\nCC:::::::::::::::CT:::::::::::::::::::::TT:::::::::::::::::::::T\r\nC:::::CCCCCCCC::::CT:::::TT:::::::TT:::::TT:::::TT:::::::TT:::::T\r\nC:::::C       CCCCCCTTTTTT  T:::::T  TTTTTTTTTTTT  T:::::T  TTTTTT\r\nC:::::C                     T:::::T                T:::::T\r\nC:::::C                     T:::::T                T:::::T\r\nC:::::C                     T:::::T                T:::::T\r\nC:::::C                     T:::::T                T:::::T\r\nC:::::C                     T:::::T                T:::::T\r\nC:::::C                     T:::::T                T:::::T\r\nC:::::C       CCCCCC        T:::::T                T:::::T\r\nC:::::CCCCCCCC::::C      TT:::::::TT            TT:::::::TT\r\nCC:::::::::::::::C       T:::::::::T            T:::::::::T\r\nCCC::::::::::::C         T:::::::::T            T:::::::::T\r\n  CCCCCCCCCCCCC          TTTTTTTTTTT            TTTTTTTTTTT\r\n\r\n====Chris Titus Tech=====\r\n=====Windows Toolbox=====\r\n\"@\r\n\r\n    Write-Host $asciiArt\r\n}\r\n\r\n"
  },
  {
    "path": "lint/PSScriptAnalyser.ps1",
    "content": "@{\r\n    # Only diagnostic records of the specified severity will be generated.\r\n    # Uncomment the following line if you only want Errors and Warnings but\r\n    # not Information diagnostic records.\r\n    # Severity = @('Error','Warning')\r\n\r\n    # Analyze **only** the following rules. Use IncludeRules when you want\r\n    # to invoke only a small subset of the default rules.\r\n<#\r\n    IncludeRules = @('PSAvoidDefaultValueSwitchParameter',\r\n                     'PSMisleadingBacktick',\r\n                     'PSMissingModuleManifestField',\r\n                     'PSReservedCmdletChar',\r\n                     'PSReservedParams',\r\n                     'PSShouldProcess',\r\n                     'PSUseApprovedVerbs',\r\n                     'PSUseDeclaredVarsMoreThanAssignments')\r\n#>\r\n    # Do not analyze the following rules. Use ExcludeRules when you have\r\n    # commented out the IncludeRules settings above and want to include all\r\n    # the default rules except for those you exclude below.\r\n    # Note: if a rule is in both IncludeRules and ExcludeRules, the rule\r\n    # will be excluded.\r\n    ExcludeRules = @('PSAvoidUsingWriteHost')\r\n}\r\n"
  },
  {
    "path": "overrides/main.html",
    "content": "{% extends \"base.html\" %}\n\n{% block header %}\n    {{ super() }}\n    <div style=\"color: red; text-align: center; padding: 10px; font-size: 20px;\">\n        <strong>Announcement:</strong> We are currently reworking the docs to use Hugo rather then mkdocs.\n    </div>\n{% endblock %}\n\n{% block footer %}\n    {# Empty block to override the footer #}\n{% endblock %}\n"
  },
  {
    "path": "pester/configs.Tests.ps1",
    "content": "# Import Config Files\r\n$global:importedconfigs = @{}\r\nGet-ChildItem .\\config | Where-Object {$_.Extension -eq \".json\"} | ForEach-Object {\r\n    $global:importedconfigs[$psitem.BaseName] = Get-Content $psitem.FullName | ConvertFrom-Json\r\n}\r\n\r\n\r\n#===========================================================================\r\n# Tests - Application Installs\r\n#===========================================================================\r\n\r\nDescribe \"Config Files\" -ForEach @(\r\n    @{\r\n        name = \"applications\"\r\n        config = $('{\r\n            \"winget\": \"value\",\r\n            \"choco\": \"value\",\r\n            \"category\": \"value\",\r\n            \"content\": \"value\",\r\n            \"description\": \"value\",\r\n            \"link\": \"value\"\r\n          }' | ConvertFrom-Json)\r\n    },\r\n    @{\r\n        name = \"tweaks\"\r\n        undo = $true\r\n    }\r\n) {\r\n    Context \"$name config file\" {\r\n        It \"Imports with no errors\" {\r\n            $global:importedconfigs.$name | should -Not -BeNullOrEmpty\r\n        }\r\n        if ($config) {\r\n            It \"Imports should be the correct structure\" {\r\n                $applications = $global:importedconfigs.$name | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty name\r\n                $template = $config | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty name\r\n                $result = New-Object System.Collections.Generic.List[System.Object]\r\n                Foreach ($application in $applications) {\r\n                    $compare = $global:importedconfigs.$name.$application | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty name\r\n                    if (-not $compare) {\r\n                        throw \"Comparison object for application '$application' is null.\"\r\n                    }\r\n                    if (-not $template) {\r\n                        throw \"Template object for application '$application' is null.\"\r\n                    }\r\n                    if ($(Compare-Object $compare $template) -ne $null) {\r\n                        $result.Add($application)\r\n                    }\r\n                }\r\n\r\n                $result | Select-String \"WPF*\" | should -BeNullOrEmpty\r\n            }\r\n        }\r\n        if($undo) {\r\n            It \"Tweaks should contain original Value\" {\r\n                $tweaks = $global:importedconfigs.$name | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty name\r\n                $result = New-Object System.Collections.Generic.List[System.Object]\r\n\r\n                foreach ($tweak in $tweaks) {\r\n                    $Originals = @(\r\n                        @{\r\n                            name = \"registry\"\r\n                            value = \"OriginalValue\"\r\n                        },\r\n                        @{\r\n                            name = \"service\"\r\n                            value = \"OriginalType\"\r\n                        },\r\n                        @{\r\n                            name = \"ScheduledTask\"\r\n                            value = \"OriginalState\"\r\n                        }\r\n                    )\r\n                    Foreach ($original in $Originals) {\r\n                        $TotalCount = ($global:importedconfigs.$name.$tweak.$($original.name)).count\r\n                        $OriginalCount = ($global:importedconfigs.$name.$tweak.$($original.name).$($original.value) | Where-Object {$_}).count\r\n                        if($TotalCount -ne $OriginalCount) {\r\n                            $result.Add(\"$Tweak,$($original.name)\")\r\n                        }\r\n                    }\r\n                }\r\n                $result | Select-String \"WPF*\" | should -BeNullOrEmpty\r\n            }\r\n        }\r\n\r\n    }\r\n}\r\n"
  },
  {
    "path": "pester/functions.Tests.ps1",
    "content": "#===========================================================================\r\n# Tests - Functions\r\n#===========================================================================\r\nDescribe \"Comprehensive Checks for PS1 Files in Functions Folder\" {\r\n    BeforeAll {\r\n        # Get all .ps1 files in the functions folder\r\n        $ps1Files = Get-ChildItem -Path ./functions -Filter *.ps1 -Recurse\r\n    }\r\n\r\n    foreach ($file in $ps1Files) {\r\n        Context \"Checking $($file.Name)\" {\r\n            It \"Should import without errors\" {\r\n                { . $file.FullName } | Should -Not -Throw\r\n            }\r\n\r\n            It \"Should have no syntax errors\" {\r\n                $syntaxErrors = $null\r\n                $null = [System.Management.Automation.PSParser]::Tokenize((Get-Content -Path $file.FullName -Raw), [ref]$syntaxErrors)\r\n                $syntaxErrors.Count | Should -Be 0\r\n            }\r\n\r\n            It \"Should not use deprecated cmdlets or aliases\" {\r\n                $content = Get-Content -Path $file.FullName -Raw\r\n                # Example check for a known deprecated cmdlet or alias\r\n                $content | Should -Not -Match 'DeprecatedCmdlet'\r\n                # Add more checks as needed\r\n            }\r\n\r\n            It \"Should follow naming conventions for functions\" {\r\n                $functions = (Get-Command -Path $file.FullName).Name\r\n                foreach ($function in $functions) {\r\n                    $function | Should -Match '^[a-z]+(-[a-z]+)*$' # Enforce lower-kebab-case\r\n                }\r\n            }\r\n\r\n            It \"Should define mandatory parameters for all functions\" {\r\n                . $file.FullName\r\n                $functions = (Get-Command -Path $file.FullName).Name\r\n                foreach ($function in $functions) {\r\n                    $parameters = (Get-Command -Name $function).Parameters.Values\r\n                    $mandatoryParams = $parameters | Where-Object { $_.Attributes.Mandatory -eq $true }\r\n                    $mandatoryParams.Count | Should -BeGreaterThan 0\r\n                }\r\n            }\r\n\r\n            It \"Should have all functions available after import\" {\r\n                . $file.FullName\r\n                $functions = (Get-Command -Path $file.FullName).Name\r\n                foreach ($function in $functions) {\r\n                    { Get-Command -Name $function -CommandType Function } | Should -Not -BeNullOrEmpty\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "scripts/main.ps1",
    "content": "# Create enums\r\nAdd-Type @\"\r\npublic enum PackageManagers\r\n{\r\n    Winget,\r\n    Choco\r\n}\r\n\"@\r\n\r\n# SPDX-License-Identifier: MIT\r\n# Set the maximum number of threads for the RunspacePool to the number of threads on the machine\r\n$maxthreads = [int]$env:NUMBER_OF_PROCESSORS\r\n\r\n# Create a new session state for parsing variables into our runspace\r\n$hashVars = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'sync',$sync,$Null\r\n$debugVar = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'DebugPreference',$DebugPreference,$Null\r\n$uiVar = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'PARAM_NOUI',$PARAM_NOUI,$Null\r\n$offlineVar = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'PARAM_OFFLINE',$PARAM_OFFLINE,$Null\r\n$InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault()\r\n\r\n# Add the variable to the session state\r\n$InitialSessionState.Variables.Add($hashVars)\r\n$InitialSessionState.Variables.Add($debugVar)\r\n$InitialSessionState.Variables.Add($uiVar)\r\n$InitialSessionState.Variables.Add($offlineVar)\r\n\r\n# Get every private function and add them to the session state\r\n$functions = Get-ChildItem function:\\ | Where-Object { $_.Name -imatch 'winutil|WPF' }\r\nforeach ($function in $functions) {\r\n    $functionDefinition = Get-Content function:\\$($function.name)\r\n    $functionEntry = New-Object System.Management.Automation.Runspaces.SessionStateFunctionEntry -ArgumentList $($function.name), $functionDefinition\r\n\r\n    $initialSessionState.Commands.Add($functionEntry)\r\n}\r\n\r\n# Create the runspace pool\r\n$sync.runspace = [runspacefactory]::CreateRunspacePool(\r\n    1,                      # Minimum thread count\r\n    $maxthreads,            # Maximum thread count\r\n    $InitialSessionState,   # Initial session state\r\n    $Host                   # Machine to create runspaces on\r\n)\r\n\r\n# Open the RunspacePool instance\r\n$sync.runspace.Open()\r\n\r\n# Create classes for different exceptions\r\n\r\nclass WingetFailedInstall : Exception {\r\n    [string]$additionalData\r\n    WingetFailedInstall($Message) : base($Message) {}\r\n}\r\n\r\nclass ChocoFailedInstall : Exception {\r\n    [string]$additionalData\r\n    ChocoFailedInstall($Message) : base($Message) {}\r\n}\r\n\r\nclass GenericException : Exception {\r\n    [string]$additionalData\r\n    GenericException($Message) : base($Message) {}\r\n}\r\n\r\n# Load the configuration files\r\n\r\n$sync.configs.applicationsHashtable = @{}\r\n$sync.configs.applications.PSObject.Properties | ForEach-Object {\r\n    $sync.configs.applicationsHashtable[$_.Name] = $_.Value\r\n}\r\n\r\nSet-Preferences\r\n\r\nif ($PARAM_NOUI) {\r\n    Show-CTTLogo\r\n    if ($PARAM_CONFIG -and -not [string]::IsNullOrWhiteSpace($PARAM_CONFIG)) {\r\n        Write-Host \"Running config file tasks...\"\r\n        Invoke-WPFImpex -type \"import\" -Config $PARAM_CONFIG\r\n        if ($PARAM_RUN) {\r\n            Invoke-WinUtilAutoRun\r\n        }\r\n        else {\r\n            Write-Host \"Did you forget to add '--Run'?\";\r\n        }\r\n        $sync.runspace.Dispose()\r\n        $sync.runspace.Close()\r\n        [System.GC]::Collect()\r\n        Stop-Transcript\r\n        exit 1\r\n    }\r\n    else {\r\n        Write-Host \"Cannot automatically run without a config file provided.\"\r\n        $sync.runspace.Dispose()\r\n        $sync.runspace.Close()\r\n        [System.GC]::Collect()\r\n        Stop-Transcript\r\n        exit 1\r\n    }\r\n}\r\n\r\n$inputXML = $inputXML -replace 'mc:Ignorable=\"d\"', '' -replace \"x:N\", 'N' -replace '^<Win.*', '<Window'\r\n\r\n[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')\r\n[xml]$XAML = $inputXML\r\n\r\n# Read the XAML file\r\n$readerOperationSuccessful = $false # There's more cases of failure then success.\r\n$reader = (New-Object System.Xml.XmlNodeReader $xaml)\r\ntry {\r\n    $sync[\"Form\"] = [Windows.Markup.XamlReader]::Load( $reader )\r\n    $readerOperationSuccessful = $true\r\n} catch [System.Management.Automation.MethodInvocationException] {\r\n    Write-Host \"We ran into a problem with the XAML code.  Check the syntax for this control...\" -ForegroundColor Red\r\n    Write-Host $error[0].Exception.Message -ForegroundColor Red\r\n\r\n    If ($error[0].Exception.Message -like \"*button*\") {\r\n        write-Host \"Ensure your &lt;button in the `$inputXML does NOT have a Click=ButtonClick property.  PS can't handle this`n`n`n`n\" -ForegroundColor Red\r\n    }\r\n} catch {\r\n    Write-Host \"Unable to load Windows.Markup.XamlReader. Double-check syntax and ensure .net is installed.\" -ForegroundColor Red\r\n}\r\n\r\nif (-NOT ($readerOperationSuccessful)) {\r\n    Write-Host \"Failed to parse xaml content using Windows.Markup.XamlReader's Load Method.\" -ForegroundColor Red\r\n    Write-Host \"Quitting winutil...\" -ForegroundColor Red\r\n    $sync.runspace.Dispose()\r\n    $sync.runspace.Close()\r\n    [System.GC]::Collect()\r\n    exit 1\r\n}\r\n\r\n# Setup the Window to follow listen for windows Theme Change events and update the winutil theme\r\n# throttle logic needed, because windows seems to send more than one theme change event per change\r\n$lastThemeChangeTime = [datetime]::MinValue\r\n$debounceInterval = [timespan]::FromSeconds(2)\r\n$sync.Form.Add_Loaded({\r\n    $interopHelper = New-Object System.Windows.Interop.WindowInteropHelper $sync.Form\r\n    $hwndSource = [System.Windows.Interop.HwndSource]::FromHwnd($interopHelper.Handle)\r\n    $hwndSource.AddHook({\r\n        param (\r\n            [System.IntPtr]$hwnd,\r\n            [int]$msg,\r\n            [System.IntPtr]$wParam,\r\n            [System.IntPtr]$lParam,\r\n            [ref]$handled\r\n        )\r\n        # Check for the Event WM_SETTINGCHANGE (0x1001A) and validate that Button shows the icon for \"Auto\" => [char]0xF08C\r\n        if (($msg -eq 0x001A) -and $sync.ThemeButton.Content -eq [char]0xF08C) {\r\n            $currentTime = [datetime]::Now\r\n            if ($currentTime - $lastThemeChangeTime -gt $debounceInterval) {\r\n                Invoke-WinutilThemeChange -theme \"Auto\"\r\n                $script:lastThemeChangeTime = $currentTime\r\n                $handled = $true\r\n            }\r\n        }\r\n        return 0\r\n    })\r\n})\r\n\r\nInvoke-WinutilThemeChange -theme $sync.preferences.theme\r\n\r\n\r\n# Now call the function with the final merged config\r\nInvoke-WPFUIElements -configVariable $sync.configs.appnavigation -targetGridName \"appscategory\" -columncount 1\r\nInitialize-WPFUI -targetGridName \"appscategory\"\r\n\r\nInitialize-WPFUI -targetGridName \"appspanel\"\r\n\r\nInvoke-WPFUIElements -configVariable $sync.configs.tweaks -targetGridName \"tweakspanel\" -columncount 2\r\n\r\nInvoke-WPFUIElements -configVariable $sync.configs.feature -targetGridName \"featurespanel\" -columncount 2\r\n\r\n# Future implementation: Add Windows Version to updates panel\r\n#Invoke-WPFUIElements -configVariable $sync.configs.updates -targetGridName \"updatespanel\" -columncount 1\r\n\r\n#===========================================================================\r\n# Store Form Objects In PowerShell\r\n#===========================================================================\r\n\r\n$xaml.SelectNodes(\"//*[@Name]\") | ForEach-Object {$sync[\"$(\"$($psitem.Name)\")\"] = $sync[\"Form\"].FindName($psitem.Name)}\r\n\r\n#Persist Package Manager preference across winutil restarts\r\n$sync.ChocoRadioButton.Add_Checked({\r\n    $sync.preferences.packagemanager = [PackageManagers]::Choco\r\n    Set-Preferences -save\r\n})\r\n$sync.WingetRadioButton.Add_Checked({\r\n    $sync.preferences.packagemanager = [PackageManagers]::Winget\r\n    Set-Preferences -save\r\n})\r\n\r\nswitch ($sync.preferences.packagemanager) {\r\n    \"Choco\" {$sync.ChocoRadioButton.IsChecked = $true; break}\r\n    \"Winget\" {$sync.WingetRadioButton.IsChecked = $true; break}\r\n}\r\n\r\n$sync.keys | ForEach-Object {\r\n    if($sync.$psitem) {\r\n        if($($sync[\"$psitem\"].GetType() | Select-Object -ExpandProperty Name) -eq \"ToggleButton\") {\r\n            $sync[\"$psitem\"].Add_Click({\r\n                [System.Object]$Sender = $args[0]\r\n                Invoke-WPFButton $Sender.name\r\n            })\r\n        }\r\n\r\n        if($($sync[\"$psitem\"].GetType() | Select-Object -ExpandProperty Name) -eq \"Button\") {\r\n            $sync[\"$psitem\"].Add_Click({\r\n                [System.Object]$Sender = $args[0]\r\n                Invoke-WPFButton $Sender.name\r\n            })\r\n        }\r\n\r\n        if ($($sync[\"$psitem\"].GetType() | Select-Object -ExpandProperty Name) -eq \"TextBlock\") {\r\n            if ($sync[\"$psitem\"].Name.EndsWith(\"Link\")) {\r\n                $sync[\"$psitem\"].Add_MouseUp({\r\n                    [System.Object]$Sender = $args[0]\r\n                    Start-Process $Sender.ToolTip -ErrorAction Stop\r\n                    Write-Debug \"Opening: $($Sender.ToolTip)\"\r\n                })\r\n            }\r\n\r\n        }\r\n    }\r\n}\r\n\r\n#===========================================================================\r\n# Setup background config\r\n#===========================================================================\r\n\r\n# Load computer information in the background\r\nInvoke-WPFRunspace -ScriptBlock {\r\n    try {\r\n        $ProgressPreference = \"SilentlyContinue\"\r\n        $sync.ConfigLoaded = $False\r\n        $sync.ComputerInfo = Get-ComputerInfo\r\n        $sync.ConfigLoaded = $True\r\n    }\r\n    finally{\r\n        $ProgressPreference = $oldProgressPreference\r\n    }\r\n\r\n} | Out-Null\r\n\r\n#===========================================================================\r\n# Setup and Show the Form\r\n#===========================================================================\r\n\r\n# Print the logo\r\nShow-CTTLogo\r\n\r\n# Progress bar in taskbaritem > Set-WinUtilProgressbar\r\n$sync[\"Form\"].TaskbarItemInfo = New-Object System.Windows.Shell.TaskbarItemInfo\r\nSet-WinUtilTaskbaritem -state \"None\"\r\n\r\n# Set the titlebar\r\n$sync[\"Form\"].title = $sync[\"Form\"].title + \" \" + $sync.version\r\n# Set the commands that will run when the form is closed\r\n$sync[\"Form\"].Add_Closing({\r\n    $sync.runspace.Dispose()\r\n    $sync.runspace.Close()\r\n    [System.GC]::Collect()\r\n})\r\n\r\n# Attach the event handler to the Click event\r\n$sync.SearchBarClearButton.Add_Click({\r\n    $sync.SearchBar.Text = \"\"\r\n    $sync.SearchBarClearButton.Visibility = \"Collapsed\"\r\n\r\n    # Focus the search bar after clearing the text\r\n    $sync.SearchBar.Focus()\r\n    $sync.SearchBar.SelectAll()\r\n})\r\n\r\n# add some shortcuts for people that don't like clicking\r\n$commonKeyEvents = {\r\n    # Prevent shortcuts from executing if a process is already running\r\n    if ($sync.ProcessRunning -eq $true) {\r\n        return\r\n    }\r\n\r\n    # Handle key presses of single keys\r\n    switch ($_.Key) {\r\n        \"Escape\" { $sync.SearchBar.Text = \"\" }\r\n    }\r\n    # Handle Alt key combinations for navigation\r\n    if ($_.KeyboardDevice.Modifiers -eq \"Alt\") {\r\n        $keyEventArgs = $_\r\n        switch ($_.SystemKey) {\r\n            \"I\" { Invoke-WPFButton \"WPFTab1BT\"; $keyEventArgs.Handled = $true } # Navigate to Install tab and suppress Windows Warning Sound\r\n            \"T\" { Invoke-WPFButton \"WPFTab2BT\"; $keyEventArgs.Handled = $true } # Navigate to Tweaks tab\r\n            \"C\" { Invoke-WPFButton \"WPFTab3BT\"; $keyEventArgs.Handled = $true } # Navigate to Config tab\r\n            \"U\" { Invoke-WPFButton \"WPFTab4BT\"; $keyEventArgs.Handled = $true } # Navigate to Updates tab\r\n            \"W\" { Invoke-WPFButton \"WPFTab5BT\"; $keyEventArgs.Handled = $true } # Navigate to Win11ISO tab\r\n        }\r\n    }\r\n    # Handle Ctrl key combinations for specific actions\r\n    if ($_.KeyboardDevice.Modifiers -eq \"Ctrl\") {\r\n        switch ($_.Key) {\r\n            \"F\" { $sync.SearchBar.Focus() } # Focus on the search bar\r\n            \"Q\" { $this.Close() } # Close the application\r\n        }\r\n    }\r\n}\r\n$sync[\"Form\"].Add_PreViewKeyDown($commonKeyEvents)\r\n\r\n$sync[\"Form\"].Add_MouseLeftButtonDown({\r\n    Invoke-WPFPopup -Action \"Hide\" -Popups @(\"Settings\", \"Theme\", \"FontScaling\")\r\n    $sync[\"Form\"].DragMove()\r\n})\r\n\r\n$sync[\"Form\"].Add_MouseDoubleClick({\r\n    if ($_.OriginalSource.Name -eq \"NavDockPanel\" -or\r\n        $_.OriginalSource.Name -eq \"GridBesideNavDockPanel\") {\r\n            if ($sync[\"Form\"].WindowState -eq [Windows.WindowState]::Normal) {\r\n                $sync[\"Form\"].WindowState = [Windows.WindowState]::Maximized\r\n            }\r\n            else{\r\n                $sync[\"Form\"].WindowState = [Windows.WindowState]::Normal\r\n            }\r\n    }\r\n})\r\n\r\n$sync[\"Form\"].Add_Deactivated({\r\n    Write-Debug \"WinUtil lost focus\"\r\n    Invoke-WPFPopup -Action \"Hide\" -Popups @(\"Settings\", \"Theme\", \"FontScaling\")\r\n})\r\n\r\n$sync[\"Form\"].Add_ContentRendered({\r\n    # Load the Windows Forms assembly\r\n    Add-Type -AssemblyName System.Windows.Forms\r\n    $primaryScreen = [System.Windows.Forms.Screen]::PrimaryScreen\r\n    # Check if the primary screen is found\r\n    if ($primaryScreen) {\r\n        # Extract screen width and height for the primary monitor\r\n        $screenWidth = $primaryScreen.Bounds.Width\r\n        $screenHeight = $primaryScreen.Bounds.Height\r\n\r\n        # Print the screen size\r\n        Write-Debug \"Primary Monitor Width: $screenWidth pixels\"\r\n        Write-Debug \"Primary Monitor Height: $screenHeight pixels\"\r\n\r\n        # Compare with the primary monitor size\r\n        if ($sync.Form.ActualWidth -gt $screenWidth -or $sync.Form.ActualHeight -gt $screenHeight) {\r\n            Write-Debug \"The specified width and/or height is greater than the primary monitor size.\"\r\n            $sync.Form.Left = 0\r\n            $sync.Form.Top = 0\r\n            $sync.Form.Width = $screenWidth\r\n            $sync.Form.Height = $screenHeight\r\n        } else {\r\n            Write-Debug \"The specified width and height are within the primary monitor size limits.\"\r\n        }\r\n    } else {\r\n        Write-Debug \"Unable to retrieve information about the primary monitor.\"\r\n    }\r\n\r\n    if ($PARAM_OFFLINE) {\r\n        # Show offline banner\r\n        $sync.WPFOfflineBanner.Visibility = [System.Windows.Visibility]::Visible\r\n\r\n        # Disable the install tab\r\n        $sync.WPFTab1BT.IsEnabled = $false\r\n        $sync.WPFTab1BT.Opacity = 0.5\r\n        $sync.WPFTab1BT.ToolTip = \"Internet connection required for installing applications\"\r\n\r\n        # Disable install-related buttons\r\n        $sync.WPFInstall.IsEnabled = $false\r\n        $sync.WPFUninstall.IsEnabled = $false\r\n        $sync.WPFInstallUpgrade.IsEnabled = $false\r\n        $sync.WPFGetInstalled.IsEnabled = $false\r\n\r\n        # Show offline indicator\r\n        Write-Host \"Offline mode detected - Install tab disabled\" -ForegroundColor Yellow\r\n\r\n        # Optionally switch to a different tab if install tab was going to be default\r\n        Invoke-WPFTab \"WPFTab2BT\"  # Switch to Tweaks tab instead\r\n    }\r\n    else {\r\n        # Online - ensure install tab is enabled\r\n        $sync.WPFTab1BT.IsEnabled = $true\r\n        $sync.WPFTab1BT.Opacity = 1.0\r\n        $sync.WPFTab1BT.ToolTip = $null\r\n        Invoke-WPFTab \"WPFTab1BT\"  # Default to install tab\r\n    }\r\n\r\n    $sync[\"Form\"].Focus()\r\n\r\n   if ($PARAM_CONFIG -and -not [string]::IsNullOrWhiteSpace($PARAM_CONFIG)) {\r\n        Write-Host \"Running config file tasks...\"\r\n        Invoke-WPFImpex -type \"import\" -Config $PARAM_CONFIG\r\n        if ($PARAM_RUN) {\r\n            Invoke-WinUtilAutoRun\r\n        }\r\n    }\r\n\r\n})\r\n\r\n# The SearchBarTimer is used to delay the search operation until the user has stopped typing for a short period\r\n# This prevents the ui from stuttering when the user types quickly as it dosnt need to update the ui for every keystroke\r\n\r\n$searchBarTimer = New-Object System.Windows.Threading.DispatcherTimer\r\n$searchBarTimer.Interval = [TimeSpan]::FromMilliseconds(300)\r\n$searchBarTimer.IsEnabled = $false\r\n\r\n$searchBarTimer.add_Tick({\r\n    $searchBarTimer.Stop()\r\n    switch ($sync.currentTab) {\r\n        \"Install\" {\r\n            Find-AppsByNameOrDescription -SearchString $sync.SearchBar.Text\r\n        }\r\n        \"Tweaks\" {\r\n            Find-TweaksByNameOrDescription -SearchString $sync.SearchBar.Text\r\n        }\r\n    }\r\n})\r\n$sync[\"SearchBar\"].Add_TextChanged({\r\n    if ($sync.SearchBar.Text -ne \"\") {\r\n        $sync.SearchBarClearButton.Visibility = \"Visible\"\r\n    } else {\r\n        $sync.SearchBarClearButton.Visibility = \"Collapsed\"\r\n    }\r\n    if ($searchBarTimer.IsEnabled) {\r\n        $searchBarTimer.Stop()\r\n    }\r\n    $searchBarTimer.Start()\r\n})\r\n\r\n$sync[\"Form\"].Add_Loaded({\r\n    param($e)\r\n    $sync.Form.MinWidth = \"1000\"\r\n    $sync[\"Form\"].MaxWidth = [Double]::PositiveInfinity\r\n    $sync[\"Form\"].MaxHeight = [Double]::PositiveInfinity\r\n})\r\n\r\n$NavLogoPanel = $sync[\"Form\"].FindName(\"NavLogoPanel\")\r\n$NavLogoPanel.Children.Add((Invoke-WinUtilAssets -Type \"logo\" -Size 25)) | Out-Null\r\n\r\n\r\nif (Test-Path \"$winutildir\\logo.ico\") {\r\n    $sync[\"logorender\"] = \"$winutildir\\logo.ico\"\r\n} else {\r\n    $sync[\"logorender\"] = (Invoke-WinUtilAssets -Type \"Logo\" -Size 90 -Render)\r\n}\r\n$sync[\"checkmarkrender\"] = (Invoke-WinUtilAssets -Type \"checkmark\" -Size 512 -Render)\r\n$sync[\"warningrender\"] = (Invoke-WinUtilAssets -Type \"warning\" -Size 512 -Render)\r\n\r\nSet-WinUtilTaskbaritem -overlay \"logo\"\r\n\r\n$sync[\"Form\"].Add_Activated({\r\n    Set-WinUtilTaskbaritem -overlay \"logo\"\r\n})\r\n\r\n$sync[\"ThemeButton\"].Add_Click({\r\n    Write-Debug \"ThemeButton clicked\"\r\n    Invoke-WPFPopup -PopupActionTable @{ \"Settings\" = \"Hide\"; \"Theme\" = \"Toggle\"; \"FontScaling\" = \"Hide\" }\r\n})\r\n$sync[\"AutoThemeMenuItem\"].Add_Click({\r\n    Write-Debug \"About clicked\"\r\n    Invoke-WPFPopup -Action \"Hide\" -Popups @(\"Theme\")\r\n    Invoke-WinutilThemeChange -theme \"Auto\"\r\n})\r\n$sync[\"DarkThemeMenuItem\"].Add_Click({\r\n    Write-Debug \"Dark Theme clicked\"\r\n    Invoke-WPFPopup -Action \"Hide\" -Popups @(\"Theme\")\r\n    Invoke-WinutilThemeChange -theme \"Dark\"\r\n})\r\n$sync[\"LightThemeMenuItem\"].Add_Click({\r\n    Write-Debug \"Light Theme clicked\"\r\n    Invoke-WPFPopup -Action \"Hide\" -Popups @(\"Theme\")\r\n    Invoke-WinutilThemeChange -theme \"Light\"\r\n})\r\n\r\n$sync[\"SettingsButton\"].Add_Click({\r\n    Write-Debug \"SettingsButton clicked\"\r\n    Invoke-WPFPopup -PopupActionTable @{ \"Settings\" = \"Toggle\"; \"Theme\" = \"Hide\"; \"FontScaling\" = \"Hide\" }\r\n})\r\n$sync[\"ImportMenuItem\"].Add_Click({\r\n    Write-Debug \"Import clicked\"\r\n    Invoke-WPFPopup -Action \"Hide\" -Popups @(\"Settings\")\r\n    Invoke-WPFImpex -type \"import\"\r\n})\r\n$sync[\"ExportMenuItem\"].Add_Click({\r\n    Write-Debug \"Export clicked\"\r\n    Invoke-WPFPopup -Action \"Hide\" -Popups @(\"Settings\")\r\n    Invoke-WPFImpex -type \"export\"\r\n})\r\n$sync[\"AboutMenuItem\"].Add_Click({\r\n    Write-Debug \"About clicked\"\r\n    Invoke-WPFPopup -Action \"Hide\" -Popups @(\"Settings\")\r\n\r\n    $authorInfo = @\"\r\nAuthor   : <a href=\"https://github.com/ChrisTitusTech\">@ChrisTitusTech</a>\r\nUI       : <a href=\"https://github.com/MyDrift-user\">@MyDrift-user</a>, <a href=\"https://github.com/Marterich\">@Marterich</a>\r\nRunspace : <a href=\"https://github.com/DeveloperDurp\">@DeveloperDurp</a>, <a href=\"https://github.com/Marterich\">@Marterich</a>\r\nGitHub   : <a href=\"https://github.com/ChrisTitusTech/winutil\">ChrisTitusTech/winutil</a>\r\nVersion  : <a href=\"https://github.com/ChrisTitusTech/winutil/releases/tag/$($sync.version)\">$($sync.version)</a>\r\n\"@\r\n    Show-CustomDialog -Title \"About\" -Message $authorInfo\r\n})\r\n$sync[\"DocumentationMenuItem\"].Add_Click({\r\n    Write-Debug \"Documentation clicked\"\r\n    Invoke-WPFPopup -Action \"Hide\" -Popups @(\"Settings\")\r\n    Start-Process \"https://winutil.christitus.com/\"\r\n})\r\n$sync[\"SponsorMenuItem\"].Add_Click({\r\n    Write-Debug \"Sponsors clicked\"\r\n    Invoke-WPFPopup -Action \"Hide\" -Popups @(\"Settings\")\r\n\r\n    $authorInfo = @\"\r\n<a href=\"https://github.com/sponsors/ChrisTitusTech\">Current sponsors for ChrisTitusTech:</a>\r\n\"@\r\n    $authorInfo += \"`n\"\r\n    try {\r\n        $sponsors = Invoke-WinUtilSponsors\r\n        foreach ($sponsor in $sponsors) {\r\n            $authorInfo += \"<a href=`\"https://github.com/sponsors/ChrisTitusTech`\">$sponsor</a>`n\"\r\n        }\r\n    } catch {\r\n        $authorInfo += \"An error occurred while fetching or processing the sponsors: $_`n\"\r\n    }\r\n    Show-CustomDialog -Title \"Sponsors\" -Message $authorInfo -EnableScroll $true\r\n})\r\n\r\n# Font Scaling Event Handlers\r\n$sync[\"FontScalingButton\"].Add_Click({\r\n    Write-Debug \"FontScalingButton clicked\"\r\n    Invoke-WPFPopup -PopupActionTable @{ \"Settings\" = \"Hide\"; \"Theme\" = \"Hide\"; \"FontScaling\" = \"Toggle\" }\r\n})\r\n\r\n$sync[\"FontScalingSlider\"].Add_ValueChanged({\r\n    param($slider)\r\n    $percentage = [math]::Round($slider.Value * 100)\r\n    $sync.FontScalingValue.Text = \"$percentage%\"\r\n})\r\n\r\n$sync[\"FontScalingResetButton\"].Add_Click({\r\n    Write-Debug \"FontScalingResetButton clicked\"\r\n    $sync.FontScalingSlider.Value = 1.0\r\n    $sync.FontScalingValue.Text = \"100%\"\r\n})\r\n\r\n$sync[\"FontScalingApplyButton\"].Add_Click({\r\n    Write-Debug \"FontScalingApplyButton clicked\"\r\n    $scaleFactor = $sync.FontScalingSlider.Value\r\n    Invoke-WinUtilFontScaling -ScaleFactor $scaleFactor\r\n    Invoke-WPFPopup -Action \"Hide\" -Popups @(\"FontScaling\")\r\n})\r\n\r\n# ── Win11ISO Tab button handlers ──────────────────────────────────────────────\r\n\r\n$sync[\"WPFTab5BT\"].Add_Click({\r\n    $sync[\"Form\"].Dispatcher.BeginInvoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{ Invoke-WinUtilISOCheckExistingWork }) | Out-Null\r\n})\r\n\r\n$sync[\"WPFWin11ISOBrowseButton\"].Add_Click({\r\n    Write-Debug \"WPFWin11ISOBrowseButton clicked\"\r\n    Invoke-WinUtilISOBrowse\r\n})\r\n\r\n$sync[\"WPFWin11ISODownloadLink\"].Add_Click({\r\n    Write-Debug \"WPFWin11ISODownloadLink clicked\"\r\n    Start-Process \"https://www.microsoft.com/software-download/windows11\"\r\n})\r\n\r\n$sync[\"WPFWin11ISOMountButton\"].Add_Click({\r\n    Write-Debug \"WPFWin11ISOMountButton clicked\"\r\n    Invoke-WinUtilISOMountAndVerify\r\n})\r\n\r\n$sync[\"WPFWin11ISOModifyButton\"].Add_Click({\r\n    Write-Debug \"WPFWin11ISOModifyButton clicked\"\r\n    Invoke-WinUtilISOModify\r\n})\r\n\r\n$sync[\"WPFWin11ISOChooseISOButton\"].Add_Click({\r\n    Write-Debug \"WPFWin11ISOChooseISOButton clicked\"\r\n    $sync[\"WPFWin11ISOOptionUSB\"].Visibility = \"Collapsed\"\r\n    Invoke-WinUtilISOExport\r\n})\r\n\r\n$sync[\"WPFWin11ISOChooseUSBButton\"].Add_Click({\r\n    Write-Debug \"WPFWin11ISOChooseUSBButton clicked\"\r\n    $sync[\"WPFWin11ISOOptionUSB\"].Visibility = \"Visible\"\r\n    Invoke-WinUtilISORefreshUSBDrives\r\n})\r\n\r\n$sync[\"WPFWin11ISORefreshUSBButton\"].Add_Click({\r\n    Write-Debug \"WPFWin11ISORefreshUSBButton clicked\"\r\n    Invoke-WinUtilISORefreshUSBDrives\r\n})\r\n\r\n$sync[\"WPFWin11ISOWriteUSBButton\"].Add_Click({\r\n    Write-Debug \"WPFWin11ISOWriteUSBButton clicked\"\r\n    Invoke-WinUtilISOWriteUSB\r\n})\r\n\r\n$sync[\"WPFWin11ISOCleanResetButton\"].Add_Click({\r\n    Write-Debug \"WPFWin11ISOCleanResetButton clicked\"\r\n    Invoke-WinUtilISOCleanAndReset\r\n})\r\n\r\n# ──────────────────────────────────────────────────────────────────────────────\r\n\r\n$sync[\"Form\"].ShowDialog() | out-null\r\nStop-Transcript\r\n"
  },
  {
    "path": "scripts/start.ps1",
    "content": "<#\r\n.NOTES\r\n    Author         : Chris Titus @christitustech\r\n    Runspace Author: @DeveloperDurp\r\n    GitHub         : https://github.com/ChrisTitusTech\r\n    Version        : #{replaceme}\r\n#>\r\n\r\nparam (\r\n    [string]$Config,\r\n    [switch]$Run,\r\n    [switch]$Noui,\r\n    [switch]$Offline\r\n)\r\n\r\nif ($Config) {\r\n    $PARAM_CONFIG = $Config\r\n}\r\n\r\n$PARAM_RUN = $false\r\n# Handle the -Run switch\r\nif ($Run) {\r\n    $PARAM_RUN = $true\r\n}\r\n\r\n$PARAM_NOUI = $false\r\nif ($Noui) {\r\n    $PARAM_NOUI = $true\r\n}\r\n\r\n$PARAM_OFFLINE = $false\r\nif ($Offline) {\r\n    $PARAM_OFFLINE = $true\r\n}\r\n\r\n\r\nif (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {\r\n    Write-Output \"Winutil needs to be run as Administrator. Attempting to relaunch.\"\r\n    $argList = @()\r\n\r\n    $PSBoundParameters.GetEnumerator() | ForEach-Object {\r\n        $argList += if ($_.Value -is [switch] -and $_.Value) {\r\n            \"-$($_.Key)\"\r\n        } elseif ($_.Value -is [array]) {\r\n            \"-$($_.Key) $($_.Value -join ',')\"\r\n        } elseif ($_.Value) {\r\n            \"-$($_.Key) '$($_.Value)'\"\r\n        }\r\n    }\r\n\r\n    $script = if ($PSCommandPath) {\r\n        \"& { & `'$($PSCommandPath)`' $($argList -join ' ') }\"\r\n    } else {\r\n        \"&([ScriptBlock]::Create((irm https://github.com/ChrisTitusTech/winutil/releases/latest/download/winutil.ps1))) $($argList -join ' ')\"\r\n    }\r\n\r\n    $powershellCmd = if (Get-Command pwsh -ErrorAction SilentlyContinue) { \"pwsh\" } else { \"powershell\" }\r\n    $processCmd = if (Get-Command wt.exe -ErrorAction SilentlyContinue) { \"wt.exe\" } else { \"$powershellCmd\" }\r\n\r\n    if ($processCmd -eq \"wt.exe\") {\r\n        Start-Process $processCmd -ArgumentList \"$powershellCmd -ExecutionPolicy Bypass -NoProfile -Command `\"$script`\"\" -Verb RunAs\r\n    } else {\r\n        Start-Process $processCmd -ArgumentList \"-ExecutionPolicy Bypass -NoProfile -Command `\"$script`\"\" -Verb RunAs\r\n    }\r\n\r\n    break\r\n}\r\n\r\n# Load DLLs\r\nAdd-Type -AssemblyName PresentationFramework\r\nAdd-Type -AssemblyName System.Windows.Forms\r\n\r\n# Variable to sync between runspaces\r\n$sync = [Hashtable]::Synchronized(@{})\r\n$sync.PSScriptRoot = $PSScriptRoot\r\n$sync.version = \"#{replaceme}\"\r\n$sync.configs = @{}\r\n$sync.Buttons = [System.Collections.Generic.List[PSObject]]::new()\r\n$sync.preferences = @{}\r\n$sync.ProcessRunning = $false\r\n$sync.selectedApps = [System.Collections.Generic.List[string]]::new()\r\n$sync.selectedTweaks = [System.Collections.Generic.List[string]]::new()\r\n$sync.selectedToggles = [System.Collections.Generic.List[string]]::new()\r\n$sync.selectedFeatures = [System.Collections.Generic.List[string]]::new()\r\n$sync.currentTab = \"Install\"\r\n$sync.selectedAppsStackPanel\r\n$sync.selectedAppsPopup\r\n\r\n$dateTime = Get-Date -Format \"yyyy-MM-dd_HH-mm-ss\"\r\n\r\n# Set the path for the winutil directory\r\n$winutildir = \"$env:LocalAppData\\winutil\"\r\nNew-Item $winutildir -ItemType Directory -Force | Out-Null\r\n\r\n$logdir = \"$winutildir\\logs\"\r\nNew-Item $logdir -ItemType Directory -Force | Out-Null\r\nStart-Transcript -Path \"$logdir\\winutil_$dateTime.log\" -Append -NoClobber | Out-Null\r\n\r\n# Set PowerShell window title\r\n$Host.UI.RawUI.WindowTitle = \"WinUtil (Admin)\"\r\nclear-host\r\n"
  },
  {
    "path": "sign.bat",
    "content": "signtool.exe sign /td sha256 /tr http://timestamp.digicert.com /fd sha256 /n \"CT Tech Group LLC\" .\\winutil.ps1\n"
  },
  {
    "path": "tools/Invoke-Preprocessing.ps1",
    "content": "function Invoke-Preprocessing {\r\n    <#\r\n        .SYNOPSIS\r\n        A function that does Code Formatting using RegEx, useful when trying to force specific coding standard(s) to a project.\r\n\r\n        .PARAMETER ExcludedFiles\r\n        A list of file paths which're *relative to* 'WorkingDir' Folder, every item in the list can be pointing to File (doesn't end with '\\') or Directory (ends with '\\') or None-Existing File/Directory.\r\n        By default, it checks if everyitem exists, and throws an exception if one or more are not found (None-Existing).\r\n\r\n        .PARAMETER WorkingDir\r\n        The folder to search inside recursively for files which're going to be Preprocessed (Code Formatted), unless they're found in 'ExcludedFiles' List.\r\n        Note: The path should be absolute, NOT relative.\r\n\r\n        .PARAMETER ProgressStatusMessage\r\n        The status message used when displaying the progress bar, which's done through PowerShell 'Write-Progress' Cmdlet.\r\n        This's a Required Parameter, as the information displayed to terminal is useful when running this function,\r\n        which might take less than 1 sec to minutes depending on project's scale & hardware performance.\r\n\r\n        .PARAMETER ProgressActivity\r\n        The activity message used when displaying the progress bar, which's done through PowerShell 'Write-Progress' Cmdlet,\r\n        This's an Optional Parameter, default value is 'Preprocessing', used in combination with 'ProgressStatusMessage' Parameter Value.\r\n\r\n        .EXAMPLE\r\n        Invoke-Preprocessing -WorkingDir \"DRIVE:\\Path\\To\\Folder\\\" -ExcludedFiles @('file.txt', '.\\.git\\', '*.png') -ProgressStatusMessage \"Doing Preprocessing\"\r\n\r\n        Calls 'Invoke-Preprocessing' function using Named Parameters, with 'WorkingDir' (Mandatory Parameter) which's used as the base folder when searching for files recursively (using 'Get-ChildItem'), other two parameters are, in order from right to left, the Optional 'ExcludeFiles', which can be a path to a file, folder, or pattern-matched (like '*.png'), and the 'ProgressStatusMessage', which's used in Progress Bar.\r\n\r\n        .EXAMPLE\r\n        Invoke-Preprocessing -WorkingDir \"DRIVE:\\Path\\To\\Folder\\\" -ExcludedFiles @('file.txt', '.\\.git\\', '*.png') -ProgressStatusMessage \"Doing Preprocessing\" -ProgressActivity \"Re-Formatting Code\"\r\n\r\n        Same as Example No. 1, but uses 'ProgressActivity' which's used in Progress Bar.\r\n\r\n        .EXAMPLE\r\n        Invoke-Preprocessing -Skip -WorkingDir \"DRIVE:\\Path\\To\\Folder\\\" -ExcludedFiles @('file.txt', '.\\.git\\', '*.png') -ProgressStatusMessage \"Doing Preprocessing\"\r\n\r\n    #>\r\n\r\n    param (\r\n        [Parameter(Mandatory, position=1)]\r\n        [ValidateScript({[System.IO.Path]::IsPathRooted($_)})]\r\n        [string]$WorkingDir,\r\n\r\n        [Parameter(position=2)]\r\n        [string[]]$ExcludedFiles,\r\n\r\n        [Parameter(Mandatory, position=3)]\r\n        [string]$ProgressStatusMessage,\r\n\r\n        [Parameter(position=4)]\r\n        [string]$ProgressActivity = \"Preprocessing\"\r\n    )\r\n\r\n    if (-NOT (Test-Path -PathType Container -Path \"$WorkingDir\")) {\r\n        throw \"[Invoke-Preprocessing] Invalid Parameter Value for 'WorkingDir', passed value: '$WorkingDir'. Either the path is a File or Non-Existing/Invlid, please double check your code.\"\r\n    }\r\n\r\n    $InternalExcludedFiles = [System.Collections.Generic.List[string]]::new($ExcludedFiles.Count)\r\n    ForEach ($excludedFile in $ExcludedFiles) {\r\n        $InternalExcludedFiles.Add($excludedFile) | Out-Null\r\n    }\r\n\r\n    # Validate the ExcludedItems List before continuing on\r\n    if ($ExcludedFiles.Count -gt 0) {\r\n        ForEach ($excludedFile in $ExcludedFiles) {\r\n            $filePath = \"$(($WorkingDir -replace ('\\\\$', '')) + '\\' + ($excludedFile -replace ('\\.\\\\', '')))\"\r\n            # Only attempt to create the directory if the excludedFile ends with '\\'\r\n            if ($excludedFile -match '\\\\$' -and -not (Test-Path \"$filePath\")) {\r\n                New-Item -Path \"$filePath\" -ItemType Directory -Force | Out-Null\r\n            }\r\n            $files = Get-ChildItem -Recurse -Path \"$filePath\" -File -Force\r\n            if ($files.Count -gt 0) {\r\n                ForEach ($file in $files) {\r\n                    $InternalExcludedFiles.Add(\"$($file.FullName)\") | Out-Null\r\n                }\r\n            } else { $failedFilesList += \"'$filePath', \" }\r\n        }\r\n        $failedFilesList = $failedFilesList -replace (',\\s*$', '')\r\n    }\r\n\r\n    # Get Files List\r\n    [System.Collections.ArrayList]$files = Get-ChildItem -LiteralPath $WorkingDir -Recurse -Exclude $InternalExcludedFiles -File -Force\r\n\r\n    # Only keep the 'FullName' Property for every entry in the list\r\n    for ($i = 0; $i -lt $files.Count; $i++) {\r\n        $file = $files[$i]\r\n        $files[$i] = $file.FullName\r\n    }\r\n\r\n    # If a file(s) are found in Exclude List,\r\n    # Remove the file from files list.\r\n    ForEach ($excludedFile in $InternalExcludedFiles) {\r\n        $index = $files.IndexOf(\"$excludedFile\")\r\n        if ($index -ge 0) { $files.RemoveAt($index) }\r\n    }\r\n\r\n    # Define a path to store the file hashes\r\n    $hashFilePath = Join-Path -Path $WorkingDir -ChildPath \".preprocessor_hashes.json\"\r\n\r\n    # Load existing hashes if the file exists\r\n    $existingHashes = @{}\r\n    if (Test-Path -Path $hashFilePath) {\r\n        # intentionally dosn't use ConvertFrom-Json -AsHashtable as it isn't supported on old powershell versions\r\n        $file_content = Get-Content -Path $hashFilePath | ConvertFrom-Json \r\n        foreach ($property in $file_content.PSObject.Properties) {\r\n            $existingHashes[$property.Name] = $property.Value\r\n        }\r\n    }\r\n\r\n    $newHashes = @{}\r\n    $changedFiles = @()\r\n    $hashingAlgorithm = \"MD5\"\r\n    foreach ($file in $files){\r\n        # Calculate the hash of the file\r\n        $hash = Get-FileHash -Path $file -Algorithm $hashingAlgorithm | Select-Object -ExpandProperty Hash\r\n        $newHashes[$file] = $hash\r\n\r\n        # Check if the hash already exists in the existing hashes\r\n        if (($existingHashes.ContainsKey($file) -and $existingHashes[$file] -eq $hash)) {\r\n            # Skip processing this file as it hasn't changed\r\n            continue;\r\n        }\r\n        else {\r\n            # If the hash doesn't exist or has changed, add it to the changed files list\r\n            $changedFiles += $file\r\n        }\r\n    }\r\n\r\n    $files = $changedFiles\r\n    $numOfFiles = $files.Count\r\n    Write-Debug \"[Invoke-Preprocessing] Files Changed: $numOfFiles\"\r\n\r\n    if ($numOfFiles -eq 0){\r\n        Write-Debug \"[Invoke-Preprocessing] Found 0 Files to Preprocess inside 'WorkingDir' Directory : '$WorkingDir'.\"\r\n        return\r\n    }\r\n\r\n    for ($i = 0; $i -lt $numOfFiles; $i++) {\r\n        $fullFileName = $files[$i]\r\n\r\n        # TODO:\r\n        #   make more formatting rules, and document them in WinUtil Official Documentation\r\n        (Get-Content \"$fullFileName\").TrimEnd() `\r\n            -replace ('\\t', '    ') `\r\n            -replace ('\\)\\s*\\{', ') {') `\r\n            -replace ('(?<keyword>if|for|foreach)\\s*(?<condition>\\([.*?]\\))\\s*\\{', '${keyword} ${condition} {') `\r\n            -replace ('\\}\\s*elseif\\s*(?<condition>\\([.*?]\\))\\s*\\{', '} elseif ${condition} {') `\r\n            -replace ('\\}\\s*else\\s*\\{', '} else {') `\r\n            -replace ('Try\\s*\\{', 'try {') `\r\n            -replace ('Catch\\s*\\{', 'catch {') `\r\n            -replace ('\\}\\s*Catch', '} catch') `\r\n            -replace ('\\}\\s*Catch\\s*(?<exceptions>(\\[.*?\\]\\s*(\\,)?\\s*)+)\\s*\\{', '} catch ${exceptions} {') `\r\n            -replace ('\\}\\s*Catch\\s*(?<exceptions>\\[.*?\\])\\s*\\{', '} catch ${exceptions} {') `\r\n            -replace ('(?<parameter_type>\\[[^$0-9]+\\])\\s*(?<str_after_type>\\$.*?)', '${parameter_type}${str_after_type}') `\r\n        | Set-Content \"$fullFileName\"\r\n        $newHashes[$fullFileName] = Get-FileHash -Path $fullFileName -Algorithm $hashingAlgorithm | Select-Object -ExpandProperty Hash\r\n\r\n        Write-Progress -Activity $ProgressActivity -Status \"$ProgressStatusMessage - Finished $i out of $numOfFiles\" -PercentComplete (($i/$numOfFiles)*100)\r\n    }\r\n\r\n    Write-Progress -Activity $ProgressActivity -Status \"$ProgressStatusMessage - Finished Task Successfully\" -Completed\r\n\r\n    # Save the new hashes to the file  \r\n    $newHashes | ConvertTo-Json -Depth 10 | Set-Content -Path $hashFilePath\r\n}\r\n"
  },
  {
    "path": "tools/autounattend.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<unattend xmlns=\"urn:schemas-microsoft-com:unattend\" xmlns:wcm=\"http://schemas.microsoft.com/WMIConfig/2002/State\">\n    <!--https://schneegans.de/windows/unattend-generator/?LanguageMode=Interactive&ProcessorArchitecture=amd64&BypassRequirementsCheck=true&ComputerNameMode=Random&CompactOsMode=Default&TimeZoneMode=Implicit&PartitionMode=Interactive&DiskAssertionMode=Skip&WindowsEditionMode=Interactive&InstallFromMode=Automatic&PEMode=Default&UserAccountMode=InteractiveLocal&PasswordExpirationMode=Unlimited&LockoutMode=Default&HideFiles=Hidden&ClassicContextMenu=true&LaunchToThisPC=true&ShowEndTask=true&TaskbarSearch=Hide&TaskbarIconsMode=Empty&DisableWidgets=true&LeftTaskbar=true&HideTaskViewButton=true&StartTilesMode=Default&StartPinsMode=Empty&EnableLongPaths=true&HideEdgeFre=true&DisableEdgeStartupBoost=true&DeleteWindowsOld=true&EffectsMode=Default&DeleteEdgeDesktopIcon=true&DesktopIconsMode=Default&StartFoldersMode=Default&WifiMode=Skip&ExpressSettings=DisableAll&LockKeysMode=Configure&CapsLockInitial=Off&CapsLockBehavior=Toggle&NumLockInitial=On&NumLockBehavior=Toggle&ScrollLockInitial=Off&ScrollLockBehavior=Toggle&StickyKeysMode=Disabled&ColorMode=Custom&SystemColorTheme=Dark&AppsColorTheme=Dark&AccentColor=%230078d4&WallpaperMode=Default&LockScreenMode=Default&WdacMode=Skip&AppLockerMode=Skip-->\n    <settings pass=\"offlineServicing\"></settings>\n    <settings pass=\"windowsPE\">\n        <component name=\"Microsoft-Windows-Setup\" processorArchitecture=\"amd64\" publicKeyToken=\"31bf3856ad364e35\" language=\"neutral\" versionScope=\"nonSxS\">\n            <UserData>\n                <AcceptEula>true</AcceptEula>\n            </UserData>\n            <UseConfigurationSet>false</UseConfigurationSet>\n            <RunSynchronous>\n                <RunSynchronousCommand wcm:action=\"add\">\n                    <Order>1</Order>\n                    <Path>reg.exe add \"HKLM\\SYSTEM\\Setup\\LabConfig\" /v BypassTPMCheck /t REG_DWORD /d 1 /f</Path>\n                </RunSynchronousCommand>\n                <RunSynchronousCommand wcm:action=\"add\">\n                    <Order>2</Order>\n                    <Path>reg.exe add \"HKLM\\SYSTEM\\Setup\\LabConfig\" /v BypassSecureBootCheck /t REG_DWORD /d 1 /f</Path>\n                </RunSynchronousCommand>\n                <RunSynchronousCommand wcm:action=\"add\">\n                    <Order>3</Order>\n                    <Path>reg.exe add \"HKLM\\SYSTEM\\Setup\\LabConfig\" /v BypassRAMCheck /t REG_DWORD /d 1 /f</Path>\n                </RunSynchronousCommand>\n            </RunSynchronous>\n        </component>\n    </settings>\n    <settings pass=\"generalize\"></settings>\n    <settings pass=\"specialize\">\n        <component name=\"Microsoft-Windows-Deployment\" processorArchitecture=\"amd64\" publicKeyToken=\"31bf3856ad364e35\" language=\"neutral\" versionScope=\"nonSxS\">\n            <RunSynchronous>\n                <RunSynchronousCommand wcm:action=\"add\">\n                    <Order>1</Order>\n                    <Path>powershell.exe -WindowStyle \"Normal\" -NoProfile -Command \"$xml = [xml]::new(); $xml.Load('C:\\Windows\\Panther\\unattend.xml'); $sb = [scriptblock]::Create( $xml.unattend.Extensions.ExtractScript ); Invoke-Command -ScriptBlock $sb -ArgumentList $xml;\"</Path>\n                </RunSynchronousCommand>\n                <RunSynchronousCommand wcm:action=\"add\">\n                    <Order>2</Order>\n                    <Path>powershell.exe -WindowStyle \"Normal\" -ExecutionPolicy \"Unrestricted\" -NoProfile -File \"C:\\Windows\\Setup\\Scripts\\Specialize.ps1\"</Path>\n                </RunSynchronousCommand>\n                <RunSynchronousCommand wcm:action=\"add\">\n                    <Order>3</Order>\n                    <Path>reg.exe load \"HKU\\DefaultUser\" \"C:\\Users\\Default\\NTUSER.DAT\"</Path>\n                </RunSynchronousCommand>\n                <RunSynchronousCommand wcm:action=\"add\">\n                    <Order>4</Order>\n                    <Path>powershell.exe -WindowStyle \"Normal\" -ExecutionPolicy \"Unrestricted\" -NoProfile -File \"C:\\Windows\\Setup\\Scripts\\DefaultUser.ps1\"</Path>\n                </RunSynchronousCommand>\n                <RunSynchronousCommand wcm:action=\"add\">\n                    <Order>5</Order>\n                    <Path>reg.exe unload \"HKU\\DefaultUser\"</Path>\n                </RunSynchronousCommand>\n            </RunSynchronous>\n        </component>\n    </settings>\n    <settings pass=\"auditSystem\"></settings>\n    <settings pass=\"auditUser\"></settings>\n    <settings pass=\"oobeSystem\">\n        <component name=\"Microsoft-Windows-Shell-Setup\" processorArchitecture=\"amd64\" publicKeyToken=\"31bf3856ad364e35\" language=\"neutral\" versionScope=\"nonSxS\">\n            <OOBE>\n                <ProtectYourPC>3</ProtectYourPC>\n                <HideEULAPage>true</HideEULAPage>\n                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>\n                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>\n            </OOBE>\n            <FirstLogonCommands>\n                <SynchronousCommand wcm:action=\"add\">\n                    <Order>1</Order>\n                    <CommandLine>powershell.exe -WindowStyle \"Normal\" -ExecutionPolicy \"Unrestricted\" -NoProfile -File \"C:\\Windows\\Setup\\Scripts\\FirstLogon.ps1\"</CommandLine>\n                </SynchronousCommand>\n            </FirstLogonCommands>\n        </component>\n    </settings>\n    <Extensions xmlns=\"https://schneegans.de/windows/unattend-generator/\">\n        <ExtractScript>\nparam(\n    [xml]$Document\n);\n\nforeach( $file in $Document.unattend.Extensions.File ) {\n    $path = [System.Environment]::ExpandEnvironmentVariables( $file.GetAttribute( 'path' ) );\n    mkdir -Path( $path | Split-Path -Parent ) -ErrorAction 'SilentlyContinue';\n    $encoding = switch( [System.IO.Path]::GetExtension( $path ) ) {\n        { $_ -in '.ps1', '.xml' } { [System.Text.Encoding]::UTF8; }\n        { $_ -in '.reg', '.vbs', '.js' } { [System.Text.UnicodeEncoding]::new( $false, $true ); }\n        default { [System.Text.Encoding]::Default; }\n    };\n    $bytes = $encoding.GetPreamble() + $encoding.GetBytes( $file.InnerText.Trim() );\n    [System.IO.File]::WriteAllBytes( $path, $bytes );\n}\n        </ExtractScript>\n        <File path=\"C:\\Windows\\Setup\\Scripts\\TaskbarLayoutModification.xml\">\n&lt;LayoutModificationTemplate xmlns=\"http://schemas.microsoft.com/Start/2014/LayoutModification\" xmlns:defaultlayout=\"http://schemas.microsoft.com/Start/2014/FullDefaultLayout\" xmlns:start=\"http://schemas.microsoft.com/Start/2014/StartLayout\" xmlns:taskbar=\"http://schemas.microsoft.com/Start/2014/TaskbarLayout\" Version=\"1\"&gt;\n    &lt;CustomTaskbarLayoutCollection PinListPlacement=\"Replace\"&gt;\n        &lt;defaultlayout:TaskbarLayout&gt;\n            &lt;taskbar:TaskbarPinList&gt;\n                &lt;taskbar:DesktopApp DesktopApplicationLinkPath=\"#leaveempty\" /&gt;\n            &lt;/taskbar:TaskbarPinList&gt;\n        &lt;/defaultlayout:TaskbarLayout&gt;\n    &lt;/CustomTaskbarLayoutCollection&gt;\n&lt;/LayoutModificationTemplate&gt;\n        </File>\n        <File path=\"C:\\Windows\\Setup\\Scripts\\UnlockStartLayout.vbs\">\nHKU = &amp;H80000003\nSet reg = GetObject(\"winmgmts://./root/default:StdRegProv\")\nSet fso = CreateObject(\"Scripting.FileSystemObject\")\n\nIf reg.EnumKey(HKU, \"\", sids) = 0 Then\n    If Not IsNull(sids) Then\n        For Each sid In sids\n            key = sid + \"\\Software\\Policies\\Microsoft\\Windows\\Explorer\"\n            name = \"LockedStartLayout\"\n            If reg.GetDWORDValue(HKU, key, name, existing) = 0 Then\n                reg.SetDWORDValue HKU, key, name, 0\n            End If\n        Next\n    End If\nEnd If\n        </File>\n        <File path=\"C:\\Windows\\Setup\\Scripts\\UnlockStartLayout.xml\">\n&lt;Task version=\"1.2\" xmlns=\"http://schemas.microsoft.com/windows/2004/02/mit/task\"&gt;\n    &lt;Triggers&gt;\n        &lt;EventTrigger&gt;\n            &lt;Enabled&gt;true&lt;/Enabled&gt;\n            &lt;Subscription&gt;&amp;lt;QueryList&amp;gt;&amp;lt;Query Id=\"0\" Path=\"Application\"&amp;gt;&amp;lt;Select Path=\"Application\"&amp;gt;*[System[Provider[@Name='UnattendGenerator'] and EventID=1]]&amp;lt;/Select&amp;gt;&amp;lt;/Query&amp;gt;&amp;lt;/QueryList&amp;gt;&lt;/Subscription&gt;\n        &lt;/EventTrigger&gt;\n    &lt;/Triggers&gt;\n    &lt;Principals&gt;\n        &lt;Principal id=\"Author\"&gt;\n            &lt;UserId&gt;S-1-5-18&lt;/UserId&gt;\n            &lt;RunLevel&gt;LeastPrivilege&lt;/RunLevel&gt;\n        &lt;/Principal&gt;\n    &lt;/Principals&gt;\n    &lt;Settings&gt;\n        &lt;MultipleInstancesPolicy&gt;IgnoreNew&lt;/MultipleInstancesPolicy&gt;\n        &lt;DisallowStartIfOnBatteries&gt;false&lt;/DisallowStartIfOnBatteries&gt;\n        &lt;StopIfGoingOnBatteries&gt;false&lt;/StopIfGoingOnBatteries&gt;\n        &lt;AllowHardTerminate&gt;true&lt;/AllowHardTerminate&gt;\n        &lt;StartWhenAvailable&gt;false&lt;/StartWhenAvailable&gt;\n        &lt;RunOnlyIfNetworkAvailable&gt;false&lt;/RunOnlyIfNetworkAvailable&gt;\n        &lt;IdleSettings&gt;\n            &lt;StopOnIdleEnd&gt;true&lt;/StopOnIdleEnd&gt;\n            &lt;RestartOnIdle&gt;false&lt;/RestartOnIdle&gt;\n        &lt;/IdleSettings&gt;\n        &lt;AllowStartOnDemand&gt;true&lt;/AllowStartOnDemand&gt;\n        &lt;Enabled&gt;true&lt;/Enabled&gt;\n        &lt;Hidden&gt;false&lt;/Hidden&gt;\n        &lt;RunOnlyIfIdle&gt;false&lt;/RunOnlyIfIdle&gt;\n        &lt;WakeToRun&gt;false&lt;/WakeToRun&gt;\n        &lt;ExecutionTimeLimit&gt;PT72H&lt;/ExecutionTimeLimit&gt;\n        &lt;Priority&gt;7&lt;/Priority&gt;\n    &lt;/Settings&gt;\n    &lt;Actions Context=\"Author\"&gt;\n        &lt;Exec&gt;\n            &lt;Command&gt;C:\\Windows\\System32\\wscript.exe&lt;/Command&gt;\n            &lt;Arguments&gt;C:\\Windows\\Setup\\Scripts\\UnlockStartLayout.vbs&lt;/Arguments&gt;\n        &lt;/Exec&gt;\n    &lt;/Actions&gt;\n&lt;/Task&gt;\n        </File>\n        <File path=\"C:\\Windows\\Setup\\Scripts\\SetStartPins.ps1\">\n$json = '{\"pinnedList\":[]}';\nif( [System.Environment]::OSVersion.Version.Build -lt 20000 ) {\n    return;\n}\n$key = 'Registry::HKLM\\SOFTWARE\\Microsoft\\PolicyManager\\current\\device\\Start';\nNew-Item -Path $key -ItemType 'Directory' -ErrorAction 'SilentlyContinue';\nSet-ItemProperty -LiteralPath $key -Name 'ConfigureStartPins' -Value $json -Type 'String';\n        </File>\n        <File path=\"C:\\Windows\\Setup\\Scripts\\SetColorTheme.ps1\">\n$lightThemeSystem = 0;\n$lightThemeApps = 0;\n$accentColorOnStart = 0;\n$enableTransparency = 0;\n$htmlAccentColor = '#0078D4';\n&amp; {\n    $params = @{\n        LiteralPath = 'Registry::HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize';\n        Force = $true;\n        Type = 'DWord';\n    };\n    Set-ItemProperty @params -Name 'SystemUsesLightTheme' -Value $lightThemeSystem;\n    Set-ItemProperty @params -Name 'AppsUseLightTheme' -Value $lightThemeApps;\n    Set-ItemProperty @params -Name 'ColorPrevalence' -Value $accentColorOnStart;\n    Set-ItemProperty @params -Name 'EnableTransparency' -Value $enableTransparency;\n};\n&amp; {\n    Add-Type -AssemblyName 'System.Drawing';\n    $accentColor = [System.Drawing.ColorTranslator]::FromHtml( $htmlAccentColor );\n\n    function ConvertTo-DWord {\n        param(\n            [System.Drawing.Color]\n            $Color\n        );\n\n        [byte[]]$bytes = @(\n            $Color.R;\n            $Color.G;\n            $Color.B;\n            $Color.A;\n        );\n        return [System.BitConverter]::ToUInt32( $bytes, 0);\n    }\n\n    $startColor = [System.Drawing.Color]::FromArgb( 0xD2, $accentColor );\n    Set-ItemProperty -LiteralPath 'Registry::HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Accent' -Name 'StartColorMenu' -Value( ConvertTo-DWord -Color $accentColor ) -Type 'DWord' -Force;\n    Set-ItemProperty -LiteralPath 'Registry::HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Accent' -Name 'AccentColorMenu' -Value( ConvertTo-DWord -Color $accentColor ) -Type 'DWord' -Force;\n    Set-ItemProperty -LiteralPath 'Registry::HKCU\\Software\\Microsoft\\Windows\\DWM' -Name 'AccentColor' -Value( ConvertTo-DWord -Color $accentColor ) -Type 'DWord' -Force;\n    $params = @{\n        LiteralPath = 'Registry::HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Accent';\n        Name = 'AccentPalette';\n    };\n    $palette = Get-ItemPropertyValue @params;\n    $index = 20;\n    $palette[ $index++ ] = $accentColor.R;\n    $palette[ $index++ ] = $accentColor.G;\n    $palette[ $index++ ] = $accentColor.B;\n    $palette[ $index++ ] = $accentColor.A;\n    Set-ItemProperty @params -Value $palette -Type 'Binary' -Force;\n};\n        </File>\n        <File path=\"C:\\Windows\\Setup\\Scripts\\Specialize.ps1\">\n$scripts = @(\n    {\n        reg.exe add \"HKLM\\SYSTEM\\Setup\\MoSetup\" /v AllowUpgradesWithUnsupportedTPMOrCPU /t REG_DWORD /d 1 /f;\n    };\n    {\n        net.exe accounts /maxpwage:UNLIMITED;\n    };\n    {\n        reg.exe add \"HKLM\\Software\\Policies\\Microsoft\\Windows\\CloudContent\" /v \"DisableCloudOptimizedContent\" /t REG_DWORD /d 1 /f;\n        [System.Diagnostics.EventLog]::CreateEventSource( 'UnattendGenerator', 'Application' );\n    };\n    {\n        Register-ScheduledTask -TaskName 'UnlockStartLayout' -Xml $( Get-Content -LiteralPath 'C:\\Windows\\Setup\\Scripts\\UnlockStartLayout.xml' -Raw );\n    };\n    {\n        reg.exe add \"HKLM\\SYSTEM\\CurrentControlSet\\Control\\FileSystem\" /v LongPathsEnabled /t REG_DWORD /d 1 /f\n    };\n    {\n        Remove-Item -LiteralPath 'C:\\Users\\Public\\Desktop\\Microsoft Edge.lnk' -ErrorAction 'SilentlyContinue' -Verbose;\n    };\n    {\n        reg.exe add \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Dsh\" /v AllowNewsAndInterests /t REG_DWORD /d 0 /f;\n    };\n    {\n        reg.exe add \"HKLM\\Software\\Policies\\Microsoft\\Edge\" /v HideFirstRunExperience /t REG_DWORD /d 1 /f;\n    };\n    {\n        reg.exe add \"HKLM\\Software\\Policies\\Microsoft\\Edge\\Recommended\" /v BackgroundModeEnabled /t REG_DWORD /d 0 /f;\n        reg.exe add \"HKLM\\Software\\Policies\\Microsoft\\Edge\\Recommended\" /v StartupBoostEnabled /t REG_DWORD /d 0 /f;\n    };\n    {\n        &amp; 'C:\\Windows\\Setup\\Scripts\\SetStartPins.ps1';\n    };\n    {\n        reg.exe add \"HKU\\.DEFAULT\\Control Panel\\Accessibility\\StickyKeys\" /v Flags /t REG_SZ /d 10 /f;\n    };\n    {\n        reg.exe add \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" /v NoAutoUpdate /t REG_DWORD /d 1 /f;\n        reg.exe add \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\" /v DisableWindowsUpdateAccess /t REG_DWORD /d 1 /f;\n    };\n);\n\n&amp; {\n  [float]$complete = 0;\n  [float]$increment = 100 / $scripts.Count;\n  foreach( $script in $scripts ) {\n    Write-Progress -Id 0 -Activity 'Running scripts to customize your Windows installation. Do not close this window.' -PercentComplete $complete;\n    '*** Will now execute command &#xAB;{0}&#xBB;.' -f $(\n      $str = $script.ToString().Trim() -replace '\\s+', ' ';\n      $max = 100;\n      if( $str.Length -le $max ) {\n        $str;\n      } else {\n        $str.Substring( 0, $max - 1 ) + '&#x2026;';\n      }\n    );\n    $start = [datetime]::Now;\n    &amp; $script;\n    '*** Finished executing command after {0:0} ms.' -f [datetime]::Now.Subtract( $start ).TotalMilliseconds;\n    \"`r`n\" * 3;\n    $complete += $increment;\n  }\n} *&gt;&amp;1 | Out-String -Width 1KB -Stream &gt;&gt; \"C:\\Windows\\Setup\\Scripts\\Specialize.log\";\n        </File>\n        <File path=\"C:\\Windows\\Setup\\Scripts\\UserOnce.ps1\">\n$scripts = @(\n    {\n        [System.Diagnostics.EventLog]::WriteEntry( 'UnattendGenerator', \"User '$env:USERNAME' has requested to unlock the Start menu layout.\", [System.Diagnostics.EventLogEntryType]::Information, 1 );\n    };\n    {\n        Remove-Item -Path \"${env:USERPROFILE}\\Desktop\\*.lnk\" -Force -ErrorAction 'SilentlyContinue';\n        Remove-Item -Path \"$env:HOMEDRIVE\\Users\\Default\\Desktop\\*.lnk\" -Force -ErrorAction 'SilentlyContinue';\n    };\n    {\n        $taskbarPath = \"$env:AppData\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\";\n        if( Test-Path $taskbarPath ) {\n            Get-ChildItem -Path $taskbarPath -File | Remove-Item -Force;\n        }\n        Remove-ItemProperty -Path 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Taskband' -Name 'FavoritesRemovedChanges' -Force -ErrorAction 'SilentlyContinue';\n        Remove-ItemProperty -Path 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Taskband' -Name 'FavoritesChanges' -Force -ErrorAction 'SilentlyContinue';\n        Remove-ItemProperty -Path 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Taskband' -Name 'Favorites' -Force -ErrorAction 'SilentlyContinue';\n    };\n    {\n        reg.exe add \"HKCU\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\InprocServer32\" /ve /f;\n    };\n    {\n        Set-ItemProperty -LiteralPath 'Registry::HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced' -Name 'LaunchTo' -Type 'DWord' -Value 1;\n    };\n    {\n        Set-ItemProperty -LiteralPath 'Registry::HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Search' -Name 'SearchboxTaskbarMode' -Type 'DWord' -Value 0;\n    };\n    {\n        &amp; 'C:\\Windows\\Setup\\Scripts\\SetColorTheme.ps1';\n    };\n    {\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Notifications\\Settings\\Windows.SystemToast.Suggested\" /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Notifications\\Settings\\Windows.SystemToast.Suggested\" /v Enabled /t REG_DWORD /d 0 /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Notifications\\Settings\\Windows.SystemToast.StartupApp\" /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Notifications\\Settings\\Windows.SystemToast.StartupApp\" /v Enabled /t REG_DWORD /d 0 /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Notifications\\Settings\\Microsoft.SkyDrive.Desktop\" /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Notifications\\Settings\\Microsoft.SkyDrive.Desktop\" /v Enabled /t REG_DWORD /d 0 /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Notifications\\Settings\\Windows.SystemToast.AccountHealth\" /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Notifications\\Settings\\Windows.SystemToast.AccountHealth\" /v Enabled /t REG_DWORD /d 0 /f;\n    };\n    {\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Start\" /v AllAppsViewMode /t REG_DWORD /d 2 /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" /v Start_IrisRecommendations /t REG_DWORD /d 0 /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" /v Start_AccountNotifications /t REG_DWORD /d 0 /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Start\" /v ShowAllPinsList /t REG_DWORD /d 0 /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Start\" /v ShowFrequentList /t REG_DWORD /d 0 /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Start\" /v ShowRecentList /t REG_DWORD /d 0 /f;\n        reg.exe add \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" /v Start_TrackDocs /t REG_DWORD /d 0 /f;\n    };\n    {\n        Restart-Computer -Force;\n    };\n);\n\n&amp; {\n  [float]$complete = 0;\n  [float]$increment = 100 / $scripts.Count;\n  foreach( $script in $scripts ) {\n    Write-Progress -Id 0 -Activity 'Running scripts to configure this user account. Do not close this window.' -PercentComplete $complete;\n    '*** Will now execute command &#xAB;{0}&#xBB;.' -f $(\n      $str = $script.ToString().Trim() -replace '\\s+', ' ';\n      $max = 100;\n      if( $str.Length -le $max ) {\n        $str;\n      } else {\n        $str.Substring( 0, $max - 1 ) + '&#x2026;';\n      }\n    );\n    $start = [datetime]::Now;\n    &amp; $script;\n    '*** Finished executing command after {0:0} ms.' -f [datetime]::Now.Subtract( $start ).TotalMilliseconds;\n    \"`r`n\" * 3;\n    $complete += $increment;\n  }\n} *&gt;&amp;1 | Out-String -Width 1KB -Stream &gt;&gt; \"$env:TEMP\\UserOnce.log\";\n        </File>\n        <File path=\"C:\\Windows\\Setup\\Scripts\\DefaultUser.ps1\">\n$scripts = @(\n    {\n        reg.exe add \"HKU\\DefaultUser\\Software\\Policies\\Microsoft\\Windows\\Explorer\" /v \"StartLayoutFile\" /t REG_SZ /d \"C:\\Windows\\Setup\\Scripts\\TaskbarLayoutModification.xml\" /f;\n        reg.exe add \"HKU\\DefaultUser\\Software\\Policies\\Microsoft\\Windows\\Explorer\" /v \"LockedStartLayout\" /t REG_DWORD /d 1 /f;\n    };\n    {\n        reg.exe add \"HKU\\DefaultUser\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" /v ShowTaskViewButton /t REG_DWORD /d 0 /f;\n    };\n    {\n        reg.exe add \"HKU\\DefaultUser\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\" /v TaskbarAl /t REG_DWORD /d 0 /f;\n    };\n    {\n        foreach( $root in 'Registry::HKU\\.DEFAULT', 'Registry::HKU\\DefaultUser' ) {\n          Set-ItemProperty -LiteralPath \"$root\\Control Panel\\Keyboard\" -Name 'InitialKeyboardIndicators' -Type 'String' -Value 2 -Force;\n        }\n    };\n    {\n        reg.exe add \"HKU\\DefaultUser\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\TaskbarDeveloperSettings\" /v TaskbarEndTask /t REG_DWORD /d 1 /f;\n    };\n    {\n        reg.exe add \"HKU\\DefaultUser\\Control Panel\\Accessibility\\StickyKeys\" /v Flags /t REG_SZ /d 10 /f;\n    };\n    {\n        reg.exe add \"HKU\\DefaultUser\\Software\\Microsoft\\Windows\\DWM\" /v ColorPrevalence /t REG_DWORD /d 0 /f;\n    };\n    {\n        reg.exe add \"HKU\\DefaultUser\\Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce\" /v \"UnattendedSetup\" /t REG_SZ /d \"powershell.exe -WindowStyle \\\"\"Normal\\\"\" -ExecutionPolicy \\\"\"Unrestricted\\\"\" -NoProfile -File \\\"\"C:\\Windows\\Setup\\Scripts\\UserOnce.ps1\\\"\"\" /f;\n    };\n);\n\n&amp; {\n  [float]$complete = 0;\n  [float]$increment = 100 / $scripts.Count;\n  foreach( $script in $scripts ) {\n    Write-Progress -Id 0 -Activity 'Running scripts to modify the default user&#x2019;&#x2019;s registry hive. Do not close this window.' -PercentComplete $complete;\n    '*** Will now execute command &#xAB;{0}&#xBB;.' -f $(\n      $str = $script.ToString().Trim() -replace '\\s+', ' ';\n      $max = 100;\n      if( $str.Length -le $max ) {\n        $str;\n      } else {\n        $str.Substring( 0, $max - 1 ) + '&#x2026;';\n      }\n    );\n    $start = [datetime]::Now;\n    &amp; $script;\n    '*** Finished executing command after {0:0} ms.' -f [datetime]::Now.Subtract( $start ).TotalMilliseconds;\n    \"`r`n\" * 3;\n    $complete += $increment;\n  }\n} *&gt;&amp;1 | Out-String -Width 1KB -Stream &gt;&gt; \"C:\\Windows\\Setup\\Scripts\\DefaultUser.log\";\n        </File>\n        <File path=\"C:\\Windows\\Setup\\Scripts\\FirstLogon.ps1\">\n$scripts = @(\n    {\n        Remove-Item -LiteralPath @(\n          'C:\\Windows\\Panther\\unattend.xml';\n          'C:\\Windows\\Panther\\unattend-original.xml';\n          'C:\\Windows\\Setup\\Scripts\\Wifi.xml';\n          'C:\\Windows.old';\n        ) -Recurse -Force -ErrorAction 'SilentlyContinue';\n    };\n    {\n        reg.exe delete \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" /v NoAutoUpdate              /f;\n        reg.exe delete \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" /v AUOptions                 /f;\n        reg.exe delete \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU\" /v UseWUServer               /f;\n        reg.exe delete \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\"    /v DisableWindowsUpdateAccess /f;\n        reg.exe delete \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\"    /v WUServer                  /f;\n        reg.exe delete \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\"    /v WUStatusServer            /f;\n        reg.exe delete \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\DeliveryOptimization\\Config\" /v DODownloadMode /f;\n        reg.exe add \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\BITS\"         /v Start /t REG_DWORD /d 3 /f;\n        reg.exe add \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\wuauserv\"     /v Start /t REG_DWORD /d 3 /f;\n        reg.exe add \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\UsoSvc\"       /v Start /t REG_DWORD /d 2 /f;\n        reg.exe add \"HKLM\\SYSTEM\\CurrentControlSet\\Services\\WaaSMedicSvc\" /v Start /t REG_DWORD /d 3 /f;\n    };\n    {\n        reg.exe add \"HKLM\\SOFTWARE\\Microsoft\\PolicyManager\\current\\device\\Education\" /f;\n        reg.exe add \"HKLM\\SOFTWARE\\Microsoft\\PolicyManager\\current\\device\\Start\" /f;\n        reg.exe add \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer\" /f;\n        reg.exe add \"HKLM\\SOFTWARE\\Microsoft\\PolicyManager\\current\\device\\Education\" /v IsEducationEnvironment /t REG_DWORD /d 1 /f;\n        reg.exe add \"HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer\" /v HideRecommendedSection /t REG_DWORD /d 1 /f;\n        reg.exe add \"HKLM\\SOFTWARE\\Microsoft\\PolicyManager\\current\\device\\Start\" /v HideRecommendedSection /t REG_DWORD /d 1 /f;\n    };\n    {\n        $recallFeature = Get-WindowsOptionalFeature -Online -ErrorAction SilentlyContinue | Where-Object { $_.State -eq 'Enabled' -and $_.FeatureName -like 'Recall' };\n        if( $recallFeature ) {\n            Disable-WindowsOptionalFeature -Online -FeatureName 'Recall' -Remove -ErrorAction SilentlyContinue;\n        }\n    };\n    {\n        $viveDir = Join-Path $env:TEMP 'ViVeTool';\n        $viveZip = Join-Path $env:TEMP 'ViVeTool.zip';\n        Invoke-WebRequest 'https://github.com/thebookisclosed/ViVe/releases/download/v0.3.4/ViVeTool-v0.3.4-IntelAmd.zip' -OutFile $viveZip;\n        Expand-Archive -Path $viveZip -DestinationPath $viveDir -Force;\n        Remove-Item -Path $viveZip -Force;\n        Start-Process -FilePath (Join-Path $viveDir 'ViVeTool.exe') -ArgumentList '/disable /id:47205210' -Wait -NoNewWindow;\n        Remove-Item -Path $viveDir -Recurse -Force;\n    };\n    {\n        if( (Get-BitLockerVolume -MountPoint $Env:SystemDrive).ProtectionStatus -eq 'On' ) {\n            Disable-BitLocker -MountPoint $Env:SystemDrive;\n        }\n    };\n    {\n        if( (bcdedit | Select-String 'path').Count -eq 2 ) {\n            bcdedit /set `{bootmgr`} timeout 0;\n        }\n    };\n);\n\n&amp; {\n  [float]$complete = 0;\n  [float]$increment = 100 / $scripts.Count;\n  foreach( $script in $scripts ) {\n    Write-Progress -Id 0 -Activity 'Running scripts to finalize your Windows installation. Do not close this window.' -PercentComplete $complete;\n    '*** Will now execute command &#xAB;{0}&#xBB;.' -f $(\n      $str = $script.ToString().Trim() -replace '\\s+', ' ';\n      $max = 100;\n      if( $str.Length -le $max ) {\n        $str;\n      } else {\n        $str.Substring( 0, $max - 1 ) + '&#x2026;';\n      }\n    );\n    $start = [datetime]::Now;\n    &amp; $script;\n    '*** Finished executing command after {0:0} ms.' -f [datetime]::Now.Subtract( $start ).TotalMilliseconds;\n    \"`r`n\" * 3;\n    $complete += $increment;\n  }\n} *&gt;&amp;1 | Out-String -Width 1KB -Stream &gt;&gt; \"C:\\Windows\\Setup\\Scripts\\FirstLogon.log\";\n        </File>\n    </Extensions>\n</unattend>\n"
  },
  {
    "path": "tools/devdocs-generator.md",
    "content": "---\ntitle: \"Dev Docs Generator\"\ndescription: \"How the devdocs-generator.ps1 script works\"\n---\n\n# Dev Docs Generator\n\nThe `devdocs-generator.ps1` script automatically generates Hugo-compatible markdown files for the development documentation. It pulls content directly from the JSON config files and PowerShell function files so the docs never go out of sync.\n\n## When Does it Run?\n\n- Automatically triggered by the `docs.yaml` GitHub Actions workflow, which generates the `.md` files, commits them back to the repo, and then triggers Hugo to build the site\n- Automatically runs during the pre-release workflow, committing the updated `\"link\"` properties back to the JSON config files\n- Watches `docs/**`, `config/tweaks.json`, `config/feature.json`, and `functions/**` for changes\n- Supports manual runs via `workflow_dispatch`\n\n## What Does It Do?\n\n### 1. Loads the Data\n\n- Reads `config/tweaks.json` and `config/feature.json`\n- Reads all `.ps1` function files from `functions/public/` and `functions/private/`\n- Parses `Invoke-WPFButton.ps1` to build a mapping of button names to their function names\n\n### 2. Updates Links in JSON\n\n- Adds or updates a `\"link\"` property on every entry in both JSON config files\n- Each link points to that entry's documentation page on the Hugo site\n- The updated links are automatically committed back to the JSON config files as part of the pre-release workflow\n\n### 3. Cleans Up Old Docs\n\n- Deletes all `.md` files (except `_index.md`) from `docs/content/dev/tweaks/` and `docs/content/dev/features/`\n- This prevents duplicate or orphaned files from previous runs\n\n### 4. Generates Tweak Documentation\n\nFor each entry in `tweaks.json` that belongs to a documented category:\n\n- **Button type** entries get the mapped PowerShell function file embedded\n- **All other types** get the raw JSON snippet embedded with correct line numbers from the source file\n- Entries with **registry changes** get a Registry Changes section added\n- Entries with **services** get the `Set-WinUtilService.ps1` function appended\n\n### 5. Generates Feature Documentation\n\nFor each entry in `feature.json` that belongs to a documented category:\n\n- **Fixes and Legacy Windows Panels** get the mapped PowerShell function file embedded\n- **Features** get the raw JSON snippet embedded with correct line numbers\n\n### 6. Output Format\n\n- Every `.md` file gets Hugo frontmatter with `title` and `description`\n- Code blocks use Hugo syntax with filename labels and line numbers\n- Files are organized into category subdirectories matching the JSON `category` field\n\n## Documented Categories\n\nThe script generates docs for entries in these categories:\n\n- Essential Tweaks\n- z--Advanced-Tweaks---CAUTION\n- Customize Preferences\n- Performance Plans\n- Features\n- Fixes\n- Legacy Windows Panels\n\n## File Structure\n\n```\ndocs/content/dev/\n  tweaks/\n    Essential-Tweaks/\n    z--Advanced-Tweaks---CAUTION/\n    Customize-Preferences/\n    Performance-Plans/\n  features/\n    Features/\n    Fixes/\n    Legacy-Windows-Panels/\n```\n\n## How File Names Are Derived\n\nThe script strips common prefixes from the JSON key names using the pattern `WPF(WinUtil|Toggle|Features?|Tweaks?|Panel|Fix(es)?)?`. For example:\n\n| JSON Key            | Generated File |\n| ------------------- | -------------- |\n| `WPFTweaksHiber`    | `Hiber.md`     |\n| `WPFTweaksDeBloat`  | `DeBloat.md`   |\n| `WPFFeatureshyperv` | `hyperv.md`    |\n| `WPFPanelDISM`      | `DISM.md`      |\n\n## Key Points\n\n- The JSON config files are the single source of truth\n- Manual edits to generated `.md` files will be overwritten on the next run\n- The script does not modify `_index.md` or `architecture.md`\n  — do not delete `_index.md` or `architecture.md`, as they will need to be recreated manually.\n- Category directories are created automatically if they don't exist\n- The `\"link\"` property added to JSON entries is excluded from the displayed code blocks\n- The `docs` workflow generates the `.md` files and commits them back to the repo before Hugo builds the site\n- The `pre-release` workflow generates the `\"link\"` properties and commits them back to the repo\n"
  },
  {
    "path": "tools/devdocs-generator.ps1",
    "content": "<#\r\n    .DESCRIPTION\r\n    Generates Hugo markdown docs from config/tweaks.json and config/feature.json.\r\n    Run by the GitHub Actions docs workflow before Hugo build.\r\n#>\r\n\r\nfunction Update-Progress {\r\n    param (\r\n        [Parameter(Mandatory, position=0)]\r\n        [string]$StatusMessage,\r\n        [Parameter(Mandatory, position=1)]\r\n        [ValidateRange(0,100)]\r\n        [int]$Percent\r\n    )\r\n    Write-Progress -Activity \"Generating Dev Docs\" -Status $StatusMessage -PercentComplete $Percent\r\n}\r\n\r\nfunction Get-RawJsonBlock {\r\n    # Returns the raw JSON text and 1-based start line for an item, excluding the \"link\" property.\r\n    param (\r\n        [Parameter(Mandatory)]\r\n        [string]$ItemName,\r\n        [Parameter(Mandatory)]\r\n        [AllowEmptyString()]\r\n        [string[]]$JsonLines\r\n    )\r\n\r\n    $escapedName = [regex]::Escape($ItemName)\r\n    $startIndex  = -1\r\n    $startIndent = \"\"\r\n\r\n    for ($i = 0; $i -lt $JsonLines.Count; $i++) {\r\n        if ($JsonLines[$i] -match \"^(\\s*)`\"$escapedName`\"\\s*:\\s*\\{\") {\r\n            $startIndex  = $i\r\n            $startIndent = $matches[1]\r\n            break\r\n        }\r\n    }\r\n\r\n    if ($startIndex -eq -1) {\r\n        Write-Warning \"Could not find '$ItemName' in JSON\"\r\n        return $null\r\n    }\r\n\r\n    $escapedIndent = [regex]::Escape($startIndent)\r\n    $endIndex      = -1\r\n    for ($i = ($startIndex + 1); $i -lt $JsonLines.Count; $i++) {\r\n        if ($JsonLines[$i] -match \"^$escapedIndent\\}\") {\r\n            $endIndex = $i\r\n            break\r\n        }\r\n    }\r\n\r\n    if ($endIndex -eq -1) {\r\n        Write-Warning \"Could not find closing brace for '$ItemName'\"\r\n        return $null\r\n    }\r\n\r\n    # Strip trailing \"link\" property and blank lines before returning\r\n    $lastContentIndex = $endIndex - 1\r\n    while ($lastContentIndex -gt $startIndex) {\r\n        $trimmed = $JsonLines[$lastContentIndex].Trim()\r\n        if ($trimmed -eq \"\" -or $trimmed -match '^\"link\"') {\r\n            $lastContentIndex--\r\n        } else {\r\n            break\r\n        }\r\n    }\r\n\r\n    return @{\r\n        LineNumber = $startIndex + 1\r\n        RawText    = ($JsonLines[$startIndex..$lastContentIndex] -join \"`r`n\")\r\n    }\r\n}\r\n\r\nfunction Get-ButtonFunctionMapping {\r\n    # Parses Invoke-WPFButton.ps1 and returns a hashtable of button name -> function name.\r\n    param (\r\n        [Parameter(Mandatory)]\r\n        [string]$ButtonFilePath\r\n    )\r\n\r\n    $mapping = @{}\r\n    foreach ($line in (Get-Content -Path $ButtonFilePath)) {\r\n        if ($line -match '^\\s*\"(\\w+)\"\\s*\\{(Invoke-\\w+)') {\r\n            $mapping[$matches[1]] = $matches[2]\r\n        }\r\n    }\r\n    return $mapping\r\n}\r\n\r\nfunction Add-LinkAttributeToJson {\r\n    # Updates only the \"link\" property for each entry in a JSON config file.\r\n    # Reads via ConvertFrom-Json for metadata, then edits lines directly to avoid reformatting.\r\n    param (\r\n        [Parameter(Mandatory)]\r\n        [string]$JsonFilePath,\r\n        [Parameter(Mandatory)]\r\n        [string]$UrlPrefix,\r\n        [Parameter(Mandatory)]\r\n        [string]$ItemNameToCut\r\n    )\r\n\r\n    $jsonData = Get-Content -Path $JsonFilePath -Raw | ConvertFrom-Json\r\n    $lines    = [System.Collections.Generic.List[string]](Get-Content -Path $JsonFilePath)\r\n\r\n    foreach ($item in $jsonData.PSObject.Properties) {\r\n        $itemName    = $item.Name\r\n        $category    = $item.Value.category -replace '[^a-zA-Z0-9]', '-'\r\n        $displayName = $itemName -replace $ItemNameToCut, ''\r\n        $newLink     = \"$UrlPrefix/$($category.ToLower())/$($displayName.ToLower())\"\r\n        $escapedName = [regex]::Escape($itemName)\r\n\r\n        # Find item start line\r\n        $startIdx = -1\r\n        for ($i = 0; $i -lt $lines.Count; $i++) {\r\n            if ($lines[$i] -match \"^\\s*`\"$escapedName`\"\\s*:\\s*\\{\") {\r\n                $startIdx = $i\r\n                break\r\n            }\r\n        }\r\n        if ($startIdx -eq -1) { continue }\r\n\r\n        # Derive indentation: propIndent is one level deeper than the item start.\r\n        # Used to target only top-level properties and skip nested object braces.\r\n        $null          = $lines[$startIdx] -match '^(\\s*)'\r\n        $propIndent    = $matches[1] + '  '\r\n        $propIndentLen = $propIndent.Length\r\n        $escapedPropIndent = [regex]::Escape($propIndent)\r\n\r\n        # Scan forward: update existing \"link\" or find the closing brace to insert one.\r\n        # Closing brace is matched by indent <= propIndentLen to handle inconsistent formatting.\r\n        $linkUpdated   = $false\r\n        $closeBraceIdx = -1\r\n        for ($j = $startIdx + 1; $j -lt $lines.Count; $j++) {\r\n            if ($lines[$j] -match \"^$escapedPropIndent`\"link`\"\\s*:\") {\r\n                $lines[$j] = $lines[$j] -replace '\"link\"\\s*:\\s*\"[^\"]*\"', \"`\"link`\": `\"$newLink`\"\"\r\n                $linkUpdated = $true\r\n                break\r\n            }\r\n            if ($lines[$j] -match '^\\s*\\}') {\r\n                $null = $lines[$j] -match '^(\\s*)'\r\n                if ($matches[1].Length -le $propIndentLen) {\r\n                    $closeBraceIdx = $j\r\n                    break\r\n                }\r\n            }\r\n        }\r\n\r\n        if (-not $linkUpdated -and $closeBraceIdx -ne -1) {\r\n            # Insert \"link\" before the closing brace\r\n            $prevPropIdx = $closeBraceIdx - 1\r\n            while ($prevPropIdx -gt $startIdx -and $lines[$prevPropIdx].Trim() -eq '') { $prevPropIdx-- }\r\n\r\n            if ($lines[$prevPropIdx] -notmatch ',\\s*$') {\r\n                $lines[$prevPropIdx] = $lines[$prevPropIdx].TrimEnd() + ','\r\n            }\r\n            $lines.Insert($closeBraceIdx, \"$propIndent`\"link`\": `\"$newLink`\"\")\r\n        }\r\n    }\r\n\r\n    Set-Content -Path $JsonFilePath -Value $lines -Encoding utf8\r\n}\r\n\r\n# ==============================================================================\r\n# Main\r\n# ==============================================================================\r\n\r\n$scriptDir = if ($PSScriptRoot) { $PSScriptRoot } else { (Get-Location).Path }\r\n$repoRoot  = Resolve-Path \"$scriptDir/..\"\r\n\r\n$tweaksJsonPath      = \"$repoRoot/config/tweaks.json\"\r\n$featuresJsonPath    = \"$repoRoot/config/feature.json\"\r\n$tweaksOutputDir     = \"$repoRoot/docs/content/dev/tweaks\"\r\n$featuresOutputDir   = \"$repoRoot/docs/content/dev/features\"\r\n$publicFunctionsDir  = \"$repoRoot/functions/public\"\r\n$privateFunctionsDir = \"$repoRoot/functions/private\"\r\n\r\n$itemnametocut = 'WPF(WinUtil|Toggle|Features?|Tweaks?|Panel|Fix(es)?)?'\r\n$baseUrl       = \"https://winutil.christitus.com\"\r\n\r\n# Categories with generated docs\r\n$documentedCategories = @(\r\n    \"Essential Tweaks\",\r\n    \"z__Advanced Tweaks - CAUTION\",\r\n    \"Customize Preferences\",\r\n    \"Performance Plans\",\r\n    \"Features\",\r\n    \"Fixes\",\r\n    \"Legacy Windows Panels\",\r\n    \"Powershell Profile Powershell 7+ Only\",\r\n    \"Remote Access\"\r\n)\r\n\r\n# Categories where Button entries embed a PS function instead of raw JSON\r\n$functionEmbedCategories = @(\r\n    \"Fixes\",\r\n    \"Powershell Profile Powershell 7+ Only\",\r\n    \"Remote Access\"\r\n)\r\n\r\nUpdate-Progress \"Loading JSON files\" 10\r\n$tweaks   = Get-Content -Path $tweaksJsonPath   -Raw | ConvertFrom-Json\r\n$features = Get-Content -Path $featuresJsonPath -Raw | ConvertFrom-Json\r\n\r\nUpdate-Progress \"Loading function files\" 20\r\n$functionFiles = @{}\r\nGet-ChildItem -Path $publicFunctionsDir  -Filter *.ps1 | ForEach-Object {\r\n    $functionFiles[$_.BaseName] = @{ Content = (Get-Content -Path $_.FullName -Raw).TrimEnd(); RelativePath = \"functions/public/$($_.Name)\" }\r\n}\r\nGet-ChildItem -Path $privateFunctionsDir -Filter *.ps1 | ForEach-Object {\r\n    $functionFiles[$_.BaseName] = @{ Content = (Get-Content -Path $_.FullName -Raw).TrimEnd(); RelativePath = \"functions/private/$($_.Name)\" }\r\n}\r\n\r\nUpdate-Progress \"Building button-to-function mapping\" 30\r\n$buttonFunctionMap = Get-ButtonFunctionMapping -ButtonFilePath \"$publicFunctionsDir/Invoke-WPFButton.ps1\"\r\n\r\nUpdate-Progress \"Updating documentation links in JSON\" 40\r\nAdd-LinkAttributeToJson -JsonFilePath $tweaksJsonPath   -UrlPrefix \"$baseUrl/dev/tweaks\"   -ItemNameToCut $itemnametocut\r\nAdd-LinkAttributeToJson -JsonFilePath $featuresJsonPath -UrlPrefix \"$baseUrl/dev/features\" -ItemNameToCut $itemnametocut\r\n\r\n# Reload lines after link update so line numbers in docs are accurate\r\n$tweaksLines   = Get-Content -Path $tweaksJsonPath\r\n$featuresLines = Get-Content -Path $featuresJsonPath\r\n\r\n# ==============================================================================\r\n# Clean up old generated .md files (preserve _index.md)\r\n# ==============================================================================\r\n\r\nUpdate-Progress \"Cleaning up old generated docs\" 45\r\nforeach ($dir in @($tweaksOutputDir, $featuresOutputDir)) {\r\n    Get-ChildItem -Path $dir -Recurse -Filter *.md | Where-Object {\r\n        $_.Name -ne \"_index.md\"\r\n    } | Remove-Item -Force\r\n}\r\n\r\n# ==============================================================================\r\n# Generate Tweak Documentation\r\n# ==============================================================================\r\n\r\nUpdate-Progress \"Generating tweak documentation\" 50\r\n\r\n$tweakNames  = $tweaks.PSObject.Properties.Name\r\n$totalTweaks = $tweakNames.Count\r\n$tweakCount  = 0\r\n\r\nforeach ($itemName in $tweakNames) {\r\n    $item = $tweaks.$itemName\r\n    $tweakCount++\r\n\r\n    if ($item.category -notin $documentedCategories) { continue }\r\n\r\n    $category    = $item.category -replace '[^a-zA-Z0-9]', '-'\r\n    $displayName = $itemName -replace $itemnametocut, ''\r\n    $categoryDir = \"$tweaksOutputDir/$category\"\r\n    $filename    = \"$categoryDir/$displayName.md\"\r\n\r\n    if (-Not (Test-Path -Path $categoryDir)) { New-Item -ItemType Directory -Path $categoryDir | Out-Null }\r\n\r\n    $title   = $item.Content -replace '\"', '\\\"'\r\n    $content = \"---`r`ntitle: `\"$title`\"`r`ndescription: `\"`\"`r`n---`r`n`r`n\"\r\n\r\n    if ($item.Type -eq \"Button\") {\r\n        $funcName = $buttonFunctionMap[$itemName]\r\n        if ($funcName -and $functionFiles.ContainsKey($funcName)) {\r\n            $func     = $functionFiles[$funcName]\r\n            $content += \"``````powershell {filename=`\"$($func.RelativePath)`\",linenos=inline,linenostart=1}`r`n\"\r\n            $content += $func.Content + \"`r`n\"\r\n            $content += \"```````r`n\"\r\n        }\r\n    } else {\r\n        $jsonBlock = Get-RawJsonBlock -ItemName $itemName -JsonLines $tweaksLines\r\n        if ($jsonBlock) {\r\n            $content += \"``````json {filename=`\"config/tweaks.json`\",linenos=inline,linenostart=$($jsonBlock.LineNumber)}`r`n\"\r\n            $content += $jsonBlock.RawText + \"`r`n\"\r\n            $content += \"```````r`n\"\r\n        }\r\n\r\n        if ($item.registry) {\r\n            $content += \"`r`n## Registry Changes`r`n`r`n\"\r\n            $content += \"Applications and System Components store and retrieve configuration data to modify windows settings, so we can use the registry to change many settings in one place.`r`n`r`n\"\r\n            $content += \"You can find information about the registry on [Wikipedia](https://www.wikiwand.com/en/Windows_Registry) and [Microsoft's Website](https://learn.microsoft.com/en-us/windows/win32/sysinfo/registry).`r`n\"\r\n        }\r\n    }\r\n\r\n    Set-Content -Path $filename -Value $content -Encoding utf8 -NoNewline\r\n\r\n    $percent = [Math]::Min(70, 50 + [int](($tweakCount / $totalTweaks) * 20))\r\n    Update-Progress \"Generating tweak documentation ($tweakCount/$totalTweaks)\" $percent\r\n}\r\n\r\n# ==============================================================================\r\n# Generate Feature Documentation\r\n# ==============================================================================\r\n\r\nUpdate-Progress \"Generating feature documentation\" 70\r\n\r\n$featureNames  = $features.PSObject.Properties.Name\r\n$totalFeatures = $featureNames.Count\r\n$featureCount  = 0\r\n\r\nforeach ($itemName in $featureNames) {\r\n    $item = $features.$itemName\r\n    $featureCount++\r\n\r\n    if ($item.category -notin $documentedCategories) { continue }\r\n    if ($itemName -eq \"WPFFeatureInstall\") { continue }\r\n\r\n    $category    = $item.category -replace '[^a-zA-Z0-9]', '-'\r\n    $displayName = $itemName -replace $itemnametocut, ''\r\n    $categoryDir = \"$featuresOutputDir/$category\"\r\n    $filename    = \"$categoryDir/$displayName.md\"\r\n\r\n    if (-Not (Test-Path -Path $categoryDir)) { New-Item -ItemType Directory -Path $categoryDir | Out-Null }\r\n\r\n    $title   = $item.Content -replace '\"', '\\\"'\r\n    $content = \"---`r`ntitle: `\"$title`\"`r`ndescription: `\"`\"`r`n---`r`n`r`n\"\r\n\r\n    if ($item.category -in $functionEmbedCategories) {\r\n        $funcName = if ($item.function) { $item.function } else { $buttonFunctionMap[$itemName] }\r\n        if ($funcName -and $functionFiles.ContainsKey($funcName)) {\r\n            $func     = $functionFiles[$funcName]\r\n            $content += \"``````powershell {filename=`\"$($func.RelativePath)`\",linenos=inline,linenostart=1}`r`n\"\r\n            $content += $func.Content + \"`r`n\"\r\n            $content += \"```````r`n\"\r\n        }\r\n    } else {\r\n        $jsonBlock = Get-RawJsonBlock -ItemName $itemName -JsonLines $featuresLines\r\n        if ($jsonBlock) {\r\n            $content += \"``````json {filename=`\"config/feature.json`\",linenos=inline,linenostart=$($jsonBlock.LineNumber)}`r`n\"\r\n            $content += $jsonBlock.RawText + \"`r`n\"\r\n            $content += \"```````r`n\"\r\n        }\r\n    }\r\n\r\n    Set-Content -Path $filename -Value $content -Encoding utf8 -NoNewline\r\n\r\n    $percent = [Math]::Min(90, 70 + [int](($featureCount / $totalFeatures) * 20))\r\n    Update-Progress \"Generating feature documentation ($featureCount/$totalFeatures)\" $percent\r\n}\r\n\r\nUpdate-Progress \"Process Completed\" 100\r\nWrite-Host \"Documentation generation complete.\"\r\n"
  },
  {
    "path": "windev.ps1",
    "content": "<#\r\n.SYNOPSIS\r\n    This Script is used as a target for the https://christitus.com/windev alias.\r\n.DESCRIPTION\r\n    This Script provides a simple way to start the bleeding edge release of winutil.\r\n.EXAMPLE\r\n    irm https://christitus.com/windev | iex\r\n    OR\r\n    Run in Admin Powershell >  ./windev.ps1\r\n#>\r\n\r\n$latestTag = (Invoke-RestMethod \"https://api.github.com/repos/ChrisTitusTech/winutil/tags\")[0].name\r\nInvoke-RestMethod \"https://github.com/ChrisTitusTech/winutil/releases/download/$latestTag/winutil.ps1\" | Invoke-Expression\r\n"
  },
  {
    "path": "xaml/inputXML.xaml",
    "content": "<Window x:Class=\"WinUtility.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:WinUtility\"\n        mc:Ignorable=\"d\"\n        WindowStartupLocation=\"CenterScreen\"\n        UseLayoutRounding=\"True\"\n        WindowStyle=\"None\"\n        Width=\"Auto\"\n        Height=\"Auto\"\n        MinWidth=\"800\"\n        MinHeight=\"600\"\n        Title=\"WinUtil\">\n    <WindowChrome.WindowChrome>\n        <WindowChrome CaptionHeight=\"0\" CornerRadius=\"10\"/>\n    </WindowChrome.WindowChrome>\n    <Window.Resources>\n    <Style TargetType=\"ToolTip\">\n        <Setter Property=\"Background\" Value=\"{DynamicResource ToolTipBackgroundColor}\"/>\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource MainForegroundColor}\"/>\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource BorderColor}\"/>\n        <Setter Property=\"MaxWidth\" Value=\"{DynamicResource ToolTipWidth}\"/>\n        <Setter Property=\"BorderThickness\" Value=\"1\"/>\n        <Setter Property=\"Padding\" Value=\"2\"/>\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\"/>\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n        <!-- This ContentTemplate ensures that the content of the ToolTip wraps text properly for better readability -->\n        <Setter Property=\"ContentTemplate\">\n            <Setter.Value>\n                <DataTemplate>\n                    <ContentPresenter Content=\"{TemplateBinding Content}\">\n                        <ContentPresenter.Resources>\n                            <Style TargetType=\"TextBlock\">\n                                <Setter Property=\"TextWrapping\" Value=\"Wrap\"/>\n                            </Style>\n                        </ContentPresenter.Resources>\n                    </ContentPresenter>\n                </DataTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"{x:Type MenuItem}\">\n        <Setter Property=\"Background\" Value=\"{DynamicResource MainBackgroundColor}\"/>\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource MainForegroundColor}\"/>\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\"/>\n        <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n        <Setter Property=\"Padding\" Value=\"5,2,5,2\"/>\n        <Setter Property=\"BorderThickness\" Value=\"0\"/>\n    </Style>\n\n    <!--Scrollbar Thumbs-->\n    <Style x:Key=\"ScrollThumbs\" TargetType=\"{x:Type Thumb}\">\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type Thumb}\">\n                    <Grid x:Name=\"Grid\">\n                        <Rectangle HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\" Width=\"Auto\" Height=\"Auto\" Fill=\"Transparent\" />\n                        <Border x:Name=\"Rectangle1\" CornerRadius=\"5\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\" Width=\"Auto\" Height=\"Auto\"  Background=\"{TemplateBinding Background}\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"Tag\" Value=\"Horizontal\">\n                            <Setter TargetName=\"Rectangle1\" Property=\"Width\" Value=\"Auto\" />\n                            <Setter TargetName=\"Rectangle1\" Property=\"Height\" Value=\"7\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"TextBlock\" x:Key=\"HoverTextBlockStyle\">\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource LinkForegroundColor}\" />\n        <Setter Property=\"TextDecorations\" Value=\"Underline\" />\n        <Style.Triggers>\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource LinkHoverForegroundColor}\" />\n                <Setter Property=\"TextDecorations\" Value=\"Underline\" />\n                <Setter Property=\"Cursor\" Value=\"Hand\" />\n            </Trigger>\n        </Style.Triggers>\n    </Style>\n    <Style x:Key=\"AppEntryBorderStyle\" TargetType=\"Border\">\n        <Setter Property=\"BorderBrush\" Value=\"Gray\"/>\n        <Setter Property=\"BorderThickness\" Value=\"{DynamicResource AppEntryBorderThickness}\"/>\n        <Setter Property=\"CornerRadius\" Value=\"2\"/>\n        <Setter Property=\"Padding\" Value=\"{DynamicResource AppEntryMargin}\"/>\n        <Setter Property=\"Width\" Value=\"{DynamicResource AppEntryWidth}\"/>\n        <Setter Property=\"VerticalAlignment\" Value=\"Top\"/>\n        <Setter Property=\"Margin\" Value=\"{DynamicResource AppEntryMargin}\"/>\n        <Setter Property=\"Cursor\" Value=\"Hand\"/>\n        <Setter Property=\"Background\" Value=\"{DynamicResource AppInstallUnselectedColor}\"/>\n    </Style>\n    <Style x:Key=\"AppEntryCheckboxStyle\" TargetType=\"CheckBox\">\n        <Setter Property=\"Background\" Value=\"Transparent\"/>\n        <Setter Property=\"HorizontalAlignment\" Value=\"Left\"/>\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n        <Setter Property=\"Margin\" Value=\"{DynamicResource AppEntryMargin}\"/>\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"CheckBox\">\n                    <StackPanel Orientation=\"Horizontal\">\n                        <Grid Width=\"16\" Height=\"16\" Margin=\"0,0,8,0\">\n                            <Border x:Name=\"CheckBoxBorder\"\n                                    BorderBrush=\"{DynamicResource MainForegroundColor}\"\n                                    Background=\"{DynamicResource ButtonBackgroundColor}\"\n                                    BorderThickness=\"1\"\n                                    Width=\"12\"\n                                    Height=\"12\"\n                                    CornerRadius=\"2\"/>\n                            <Path x:Name=\"CheckMark\"\n                                  Stroke=\"{DynamicResource ToggleButtonOnColor}\"\n                                  StrokeThickness=\"2\"\n                                  Data=\"M 2 8 L 6 12 L 14 4\"\n                                  Visibility=\"Collapsed\"/>\n                        </Grid>\n                        <ContentPresenter Content=\"{TemplateBinding Content}\"\n                                        VerticalAlignment=\"Center\"\n                                        HorizontalAlignment=\"Left\"/>\n                    </StackPanel>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\n                            <Setter TargetName=\"CheckMark\" Property=\"Visibility\" Value=\"Visible\"/>\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n    <Style x:Key=\"AppEntryNameStyle\" TargetType=\"TextBlock\">\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource AppEntryFontSize}\"/>\n        <Setter Property=\"FontWeight\" Value=\"Bold\"/>\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource MainForegroundColor}\"/>\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n        <Setter Property=\"Margin\" Value=\"{DynamicResource AppEntryMargin}\"/>\n        <Setter Property=\"Background\" Value=\"Transparent\"/>\n    </Style>\n    <Style x:Key=\"AppEntryButtonStyle\" TargetType=\"Button\">\n        <Setter Property=\"Width\" Value=\"{DynamicResource IconButtonSize}\"/>\n        <Setter Property=\"Height\" Value=\"{DynamicResource IconButtonSize}\"/>\n        <Setter Property=\"Margin\" Value=\"{DynamicResource AppEntryMargin}\"/>\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonForegroundColor}\"/>\n        <Setter Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundColor}\"/>\n        <Setter Property=\"HorizontalAlignment\" Value=\"Center\"/>\n        <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n        <Setter Property=\"ContentTemplate\">\n            <Setter.Value>\n                <DataTemplate>\n                    <TextBlock  Text=\"{Binding}\"\n                                FontFamily=\"Segoe MDL2 Assets\"\n                                FontSize=\"{DynamicResource IconFontSize}\"\n                                Background=\"Transparent\"/>\n                </DataTemplate>\n            </Setter.Value>\n        </Setter>\n        <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"Button\">\n                        <Grid>\n                            <Border x:Name=\"BackgroundBorder\"\n                                    Background=\"{TemplateBinding Background}\"\n                                    BorderBrush=\"{TemplateBinding BorderBrush}\"\n                                    BorderThickness=\"{DynamicResource ButtonBorderThickness}\"\n                                    CornerRadius=\"{DynamicResource ButtonCornerRadius}\">\n                                <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\n                            </Border>\n                        </Grid>\n                        <ControlTemplate.Triggers>\n                            <Trigger Property=\"IsPressed\" Value=\"True\">\n                                <Setter TargetName=\"BackgroundBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundPressedColor}\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                <Setter Property=\"Cursor\" Value=\"Hand\"/>\n                                <Setter TargetName=\"BackgroundBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundMouseoverColor}\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsEnabled\" Value=\"False\">\n                                <Setter TargetName=\"BackgroundBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundSelectedColor}\"/>\n                                <Setter Property=\"Foreground\" Value=\"DimGray\"/>\n                            </Trigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n\n\n    </Style>\n    <Style TargetType=\"Button\" x:Key=\"HoverButtonStyle\">\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource MainForegroundColor}\" />\n        <Setter Property=\"FontWeight\" Value=\"Normal\" />\n        <Setter Property=\"FontSize\" Value=\"{DynamicResource ButtonFontSize}\" />\n        <Setter Property=\"TextElement.FontFamily\" Value=\"{DynamicResource ButtonFontFamily}\"/>\n        <Setter Property=\"Background\" Value=\"{DynamicResource MainBackgroundColor}\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"Button\">\n                    <Border Background=\"{TemplateBinding Background}\">\n                        <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\n                    </Border>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                            <Setter Property=\"FontWeight\" Value=\"Bold\" />\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource MainForegroundColor}\" />\n                            <Setter Property=\"Cursor\" Value=\"Hand\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <!--ScrollBars-->\n    <Style x:Key=\"{x:Type ScrollBar}\" TargetType=\"{x:Type ScrollBar}\">\n        <Setter Property=\"Stylus.IsFlicksEnabled\" Value=\"false\" />\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource ScrollBarBackgroundColor}\" />\n        <Setter Property=\"Background\" Value=\"{DynamicResource MainBackgroundColor}\" />\n        <Setter Property=\"Width\" Value=\"6\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ScrollBar}\">\n                    <Grid x:Name=\"GridRoot\" Width=\"7\" Background=\"{TemplateBinding Background}\" >\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"0.00001*\" />\n                        </Grid.RowDefinitions>\n\n                        <Track x:Name=\"PART_Track\" Grid.Row=\"0\" IsDirectionReversed=\"true\" Focusable=\"false\">\n                            <Track.Thumb>\n                                <Thumb x:Name=\"Thumb\" Background=\"{TemplateBinding Foreground}\" Style=\"{DynamicResource ScrollThumbs}\" />\n                            </Track.Thumb>\n                            <Track.IncreaseRepeatButton>\n                                <RepeatButton x:Name=\"PageUp\" Command=\"ScrollBar.PageDownCommand\" Opacity=\"0\" Focusable=\"false\" />\n                            </Track.IncreaseRepeatButton>\n                            <Track.DecreaseRepeatButton>\n                                <RepeatButton x:Name=\"PageDown\" Command=\"ScrollBar.PageUpCommand\" Opacity=\"0\" Focusable=\"false\" />\n                            </Track.DecreaseRepeatButton>\n                        </Track>\n                    </Grid>\n\n                    <ControlTemplate.Triggers>\n                        <Trigger SourceName=\"Thumb\" Property=\"IsMouseOver\" Value=\"true\">\n                            <Setter Value=\"{DynamicResource ScrollBarHoverColor}\" TargetName=\"Thumb\" Property=\"Background\" />\n                        </Trigger>\n                        <Trigger SourceName=\"Thumb\" Property=\"IsDragging\" Value=\"true\">\n                            <Setter Value=\"{DynamicResource ScrollBarDraggingColor}\" TargetName=\"Thumb\" Property=\"Background\" />\n                        </Trigger>\n\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter TargetName=\"Thumb\" Property=\"Visibility\" Value=\"Collapsed\" />\n                        </Trigger>\n                        <Trigger Property=\"Orientation\" Value=\"Horizontal\">\n                            <Setter TargetName=\"GridRoot\" Property=\"LayoutTransform\">\n                                <Setter.Value>\n                                    <RotateTransform Angle=\"-90\" />\n                                </Setter.Value>\n                            </Setter>\n                            <Setter TargetName=\"PART_Track\" Property=\"LayoutTransform\">\n                                <Setter.Value>\n                                    <RotateTransform Angle=\"-90\" />\n                                </Setter.Value>\n                            </Setter>\n                            <Setter Property=\"Width\" Value=\"Auto\" />\n                            <Setter Property=\"Height\" Value=\"8\" />\n                            <Setter TargetName=\"Thumb\" Property=\"Tag\" Value=\"Horizontal\" />\n                            <Setter TargetName=\"PageDown\" Property=\"Command\" Value=\"ScrollBar.PageLeftCommand\" />\n                            <Setter TargetName=\"PageUp\" Property=\"Command\" Value=\"ScrollBar.PageRightCommand\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n        </Style>\n        <Style TargetType=\"ComboBox\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource ComboBoxForegroundColor}\" />\n            <Setter Property=\"Background\" Value=\"{DynamicResource ComboBoxBackgroundColor}\" />\n            <Setter Property=\"MinWidth\"   Value=\"{DynamicResource ButtonWidth}\" />\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"ComboBox\">\n                        <Grid>\n                            <Border x:Name=\"OuterBorder\"\n                                    BorderBrush=\"{DynamicResource BorderColor}\"\n                                    BorderThickness=\"1\"\n                                    CornerRadius=\"{DynamicResource ButtonCornerRadius}\"\n                                    Background=\"{TemplateBinding Background}\">\n                                <ToggleButton x:Name=\"ToggleButton\"\n                                              Background=\"Transparent\"\n                                              BorderThickness=\"0\"\n                                              IsChecked=\"{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}\"\n                                              ClickMode=\"Press\">\n                                    <Grid>\n                                        <Grid.ColumnDefinitions>\n                                            <ColumnDefinition Width=\"*\"/>\n                                            <ColumnDefinition Width=\"Auto\"/>\n                                        </Grid.ColumnDefinitions>\n                                        <TextBlock Grid.Column=\"0\"\n                                                   Text=\"{TemplateBinding SelectionBoxItem}\"\n                                                   Foreground=\"{TemplateBinding Foreground}\"\n                                                   Background=\"Transparent\"\n                                                   HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\"\n                                                   Margin=\"6,3,2,3\"/>\n                                        <Path Grid.Column=\"1\"\n                                              Data=\"M 0,0 L 8,0 L 4,5 Z\"\n                                              Fill=\"{TemplateBinding Foreground}\"\n                                              Width=\"8\" Height=\"5\"\n                                              VerticalAlignment=\"Center\"\n                                              HorizontalAlignment=\"Center\"\n                                              Stretch=\"Uniform\"\n                                              Margin=\"4,0,6,0\"/>\n                                    </Grid>\n                                </ToggleButton>\n                            </Border>\n                            <Popup x:Name=\"Popup\"\n                                   IsOpen=\"{TemplateBinding IsDropDownOpen}\"\n                                   Placement=\"Bottom\"\n                                   Focusable=\"False\"\n                                   AllowsTransparency=\"True\"\n                                   PopupAnimation=\"Slide\">\n                                <Border x:Name=\"DropDownBorder\"\n                                        Background=\"{TemplateBinding Background}\"\n                                        BorderBrush=\"{DynamicResource BorderColor}\"\n                                        BorderThickness=\"1\"\n                                        CornerRadius=\"4\">\n                                    <ScrollViewer>\n                                        <ItemsPresenter HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Margin=\"4,2\"/>\n                                    </ScrollViewer>\n                                </Border>\n                            </Popup>\n                        </Grid>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n        <Style TargetType=\"Label\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource LabelboxForegroundColor}\"/>\n            <Setter Property=\"Background\" Value=\"{DynamicResource LabelBackgroundColor}\"/>\n            <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n        </Style>\n\n        <!-- TextBlock template -->\n        <Style TargetType=\"TextBlock\">\n            <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource LabelboxForegroundColor}\"/>\n            <Setter Property=\"Background\" Value=\"{DynamicResource LabelBackgroundColor}\"/>\n        </Style>\n        <!-- Toggle button template x:Key=\"TabToggleButton\" -->\n        <Style TargetType=\"{x:Type ToggleButton}\">\n            <Setter Property=\"Margin\" Value=\"{DynamicResource ButtonMargin}\"/>\n            <Setter Property=\"Content\" Value=\"\"/>\n            <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"ToggleButton\">\n                        <Grid>\n                            <Border x:Name=\"ButtonGlow\"\n                                        Background=\"{TemplateBinding Background}\"\n                                        BorderBrush=\"{DynamicResource ButtonForegroundColor}\"\n                                        BorderThickness=\"{DynamicResource ButtonBorderThickness}\"\n                                        CornerRadius=\"{DynamicResource ButtonCornerRadius}\">\n                                <Grid>\n                                    <Border x:Name=\"BackgroundBorder\"\n                                        Background=\"{TemplateBinding Background}\"\n                                        BorderBrush=\"{DynamicResource ButtonBackgroundColor}\"\n                                        BorderThickness=\"{DynamicResource ButtonBorderThickness}\"\n                                        CornerRadius=\"{DynamicResource ButtonCornerRadius}\">\n                                        <ContentPresenter\n                                            HorizontalAlignment=\"Center\"\n                                            VerticalAlignment=\"Center\"\n                                            Margin=\"10,2,10,2\"/>\n                                    </Border>\n                                </Grid>\n                            </Border>\n                        </Grid>\n                        <ControlTemplate.Triggers>\n                            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                <Setter TargetName=\"BackgroundBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundMouseoverColor}\"/>\n                                <Setter Property=\"Effect\">\n                                    <Setter.Value>\n                                        <DropShadowEffect Opacity=\"1\" ShadowDepth=\"5\" Color=\"{DynamicResource CButtonBackgroundMouseoverColor}\" Direction=\"-100\" BlurRadius=\"15\"/>\n                                    </Setter.Value>\n                                </Setter>\n                                <Setter Property=\"Panel.ZIndex\" Value=\"2000\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsChecked\" Value=\"True\">\n                                <Setter Property=\"BorderBrush\" Value=\"Pink\"/>\n                                <Setter Property=\"BorderThickness\" Value=\"2\"/>\n                                <Setter TargetName=\"BackgroundBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundSelectedColor}\"/>\n                                <Setter Property=\"Effect\">\n                                    <Setter.Value>\n                                        <DropShadowEffect Opacity=\"1\" ShadowDepth=\"2\" Color=\"{DynamicResource CButtonBackgroundMouseoverColor}\" Direction=\"-111\" BlurRadius=\"10\"/>\n                                    </Setter.Value>\n                                </Setter>\n                            </Trigger>\n                            <Trigger Property=\"IsChecked\" Value=\"False\">\n                                <Setter Property=\"BorderBrush\" Value=\"Transparent\"/>\n                                <Setter Property=\"BorderThickness\" Value=\"{DynamicResource ButtonBorderThickness}\"/>\n                            </Trigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n        <!-- Button Template -->\n        <Style TargetType=\"Button\">\n            <Setter Property=\"Margin\" Value=\"{DynamicResource ButtonMargin}\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonForegroundColor}\"/>\n            <Setter Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundColor}\"/>\n            <Setter Property=\"Height\" Value=\"{DynamicResource ButtonHeight}\"/>\n            <Setter Property=\"Width\" Value=\"{DynamicResource ButtonWidth}\"/>\n            <Setter Property=\"FontSize\" Value=\"{DynamicResource ButtonFontSize}\"/>\n            <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"Button\">\n                        <Grid>\n                            <Border x:Name=\"BackgroundBorder\"\n                                    Background=\"{TemplateBinding Background}\"\n                                    BorderBrush=\"{TemplateBinding BorderBrush}\"\n                                    BorderThickness=\"{DynamicResource ButtonBorderThickness}\"\n                                    CornerRadius=\"{DynamicResource ButtonCornerRadius}\">\n                                <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Margin=\"10,2,10,2\"/>\n                            </Border>\n                        </Grid>\n                        <ControlTemplate.Triggers>\n                            <Trigger Property=\"IsPressed\" Value=\"True\">\n                                <Setter TargetName=\"BackgroundBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundPressedColor}\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                <Setter TargetName=\"BackgroundBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundMouseoverColor}\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsEnabled\" Value=\"False\">\n                                <Setter TargetName=\"BackgroundBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundSelectedColor}\"/>\n                                <Setter Property=\"Foreground\" Value=\"DimGray\"/>\n                            </Trigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n\n        <Style x:Key=\"ToggleButtonStyle\" TargetType=\"ToggleButton\">\n            <Setter Property=\"Margin\" Value=\"{DynamicResource ButtonMargin}\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonForegroundColor}\"/>\n            <Setter Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundColor}\"/>\n            <Setter Property=\"Height\" Value=\"{DynamicResource ButtonHeight}\"/>\n            <Setter Property=\"Width\" Value=\"{DynamicResource ButtonWidth}\"/>\n            <Setter Property=\"FontSize\" Value=\"{DynamicResource ButtonFontSize}\"/>\n            <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"ToggleButton\">\n                        <Grid>\n                            <Border x:Name=\"BackgroundBorder\"\n                                    Background=\"{TemplateBinding Background}\"\n                                    BorderBrush=\"{TemplateBinding BorderBrush}\"\n                                    BorderThickness=\"{DynamicResource ButtonBorderThickness}\"\n                                    CornerRadius=\"{DynamicResource ButtonCornerRadius}\">\n                                <Grid>\n                                    <!-- Toggle Dot Background -->\n                                    <Ellipse Width=\"8\" Height=\"16\"\n                                            Fill=\"{DynamicResource ToggleButtonOnColor}\"\n                                            HorizontalAlignment=\"Right\"\n                                            VerticalAlignment=\"Top\"\n                                            Margin=\"0,3,5,0\" />\n\n                                    <!-- Toggle Dot with hover grow effect -->\n                                    <Ellipse x:Name=\"ToggleDot\"\n                                            Width=\"8\" Height=\"8\"\n                                            Fill=\"{DynamicResource ButtonForegroundColor}\"\n                                            HorizontalAlignment=\"Right\"\n                                            VerticalAlignment=\"Top\"\n                                            Margin=\"0,3,5,0\"\n                                            RenderTransformOrigin=\"0.5,0.5\">\n                                        <Ellipse.RenderTransform>\n                                            <ScaleTransform ScaleX=\"1\" ScaleY=\"1\"/>\n                                        </Ellipse.RenderTransform>\n                                    </Ellipse>\n\n                                    <!-- Content Presenter -->\n                                    <ContentPresenter HorizontalAlignment=\"Center\"\n                                                    VerticalAlignment=\"Center\"\n                                                    Margin=\"10,2,10,2\"/>\n                                </Grid>\n                            </Border>\n                        </Grid>\n\n                        <!-- Triggers for ToggleButton states -->\n                        <ControlTemplate.Triggers>\n                            <!-- Hover effect -->\n                            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                <Setter TargetName=\"BackgroundBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundMouseoverColor}\"/>\n                                <Trigger.EnterActions>\n                                    <BeginStoryboard>\n                                        <Storyboard>\n                                            <!-- Animation to grow the dot when hovered -->\n                                            <DoubleAnimation Storyboard.TargetName=\"ToggleDot\"\n                                                            Storyboard.TargetProperty=\"(UIElement.RenderTransform).(ScaleTransform.ScaleX)\"\n                                                            To=\"1.2\" Duration=\"0:0:0.1\"/>\n                                            <DoubleAnimation Storyboard.TargetName=\"ToggleDot\"\n                                                            Storyboard.TargetProperty=\"(UIElement.RenderTransform).(ScaleTransform.ScaleY)\"\n                                                            To=\"1.2\" Duration=\"0:0:0.1\"/>\n                                        </Storyboard>\n                                    </BeginStoryboard>\n                                </Trigger.EnterActions>\n                                <Trigger.ExitActions>\n                                    <BeginStoryboard>\n                                        <Storyboard>\n                                            <!-- Animation to shrink the dot back to original size when not hovered -->\n                                            <DoubleAnimation Storyboard.TargetName=\"ToggleDot\"\n                                                            Storyboard.TargetProperty=\"(UIElement.RenderTransform).(ScaleTransform.ScaleX)\"\n                                                            To=\"1.0\" Duration=\"0:0:0.1\"/>\n                                            <DoubleAnimation Storyboard.TargetName=\"ToggleDot\"\n                                                            Storyboard.TargetProperty=\"(UIElement.RenderTransform).(ScaleTransform.ScaleY)\"\n                                                            To=\"1.0\" Duration=\"0:0:0.1\"/>\n                                        </Storyboard>\n                                    </BeginStoryboard>\n                                </Trigger.ExitActions>\n                            </Trigger>\n\n                            <!-- IsChecked state -->\n                            <Trigger Property=\"IsChecked\" Value=\"True\">\n                                <Setter TargetName=\"ToggleDot\" Property=\"VerticalAlignment\" Value=\"Bottom\"/>\n                                <Setter TargetName=\"ToggleDot\" Property=\"Margin\" Value=\"0,0,5,3\"/>\n                            </Trigger>\n\n                            <!-- IsEnabled state -->\n                            <Trigger Property=\"IsEnabled\" Value=\"False\">\n                                <Setter TargetName=\"BackgroundBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundSelectedColor}\"/>\n                                <Setter Property=\"Foreground\" Value=\"DimGray\"/>\n                            </Trigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n\n        <Style x:Key=\"SearchBarClearButtonStyle\" TargetType=\"Button\">\n            <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n            <Setter Property=\"FontSize\" Value=\"{DynamicResource SearchBarClearButtonFontSize}\"/>\n            <Setter Property=\"Content\" Value=\"X\"/>\n            <Setter Property=\"Height\" Value=\"{DynamicResource SearchBarClearButtonFontSize}\"/>\n            <Setter Property=\"Width\" Value=\"{DynamicResource SearchBarClearButtonFontSize}\"/>\n            <Setter Property=\"Background\" Value=\"Transparent\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource MainForegroundColor}\"/>\n            <Setter Property=\"Padding\" Value=\"0\"/>\n            <Setter Property=\"BorderBrush\" Value=\"Transparent\"/>\n            <Setter Property=\"BorderThickness\" Value=\"0\"/>\n            <Style.Triggers>\n                <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                    <Setter Property=\"Foreground\" Value=\"Red\"/>\n                    <Setter Property=\"Background\" Value=\"Transparent\"/>\n                    <Setter Property=\"BorderThickness\" Value=\"10\"/>\n                    <Setter Property=\"Cursor\" Value=\"Hand\"/>\n                </Trigger>\n            </Style.Triggers>\n        </Style>\n        <!-- Checkbox template -->\n        <Style TargetType=\"CheckBox\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource MainForegroundColor}\"/>\n            <Setter Property=\"Background\" Value=\"{DynamicResource MainBackgroundColor}\"/>\n            <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\n            <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n            <Setter Property=\"TextElement.FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"CheckBox\">\n                        <Grid Background=\"{TemplateBinding Background}\" Margin=\"{DynamicResource CheckBoxMargin}\">\n                            <BulletDecorator Background=\"Transparent\">\n                                <BulletDecorator.Bullet>\n                                    <Grid Width=\"{DynamicResource CheckBoxBulletDecoratorSize}\" Height=\"{DynamicResource CheckBoxBulletDecoratorSize}\">\n                                        <Border x:Name=\"Border\"\n                                                BorderBrush=\"{TemplateBinding BorderBrush}\"\n                                                Background=\"{DynamicResource ButtonBackgroundColor}\"\n                                                BorderThickness=\"1\"\n                                                Width=\"{DynamicResource CheckBoxBulletDecoratorSize *0.85}\"\n                                                Height=\"{DynamicResource CheckBoxBulletDecoratorSize *0.85}\"\n                                                Margin=\"1\"\n                                                SnapsToDevicePixels=\"True\"/>\n                                        <Viewbox x:Name=\"CheckMarkContainer\"\n                                                Width=\"{DynamicResource CheckBoxBulletDecoratorSize}\"\n                                                Height=\"{DynamicResource CheckBoxBulletDecoratorSize}\"\n                                                HorizontalAlignment=\"Center\"\n                                                VerticalAlignment=\"Center\"\n                                                Visibility=\"Collapsed\">\n                                            <Path x:Name=\"CheckMark\"\n                                                  Stroke=\"{DynamicResource ToggleButtonOnColor}\"\n                                                  StrokeThickness=\"1.5\"\n                                                  Data=\"M 0 5 L 5 10 L 12 0\"\n                                                  Stretch=\"Uniform\"/>\n                                        </Viewbox>\n                                    </Grid>\n                                </BulletDecorator.Bullet>\n                                <ContentPresenter Margin=\"4,0,0,0\"\n                                                  HorizontalAlignment=\"Left\"\n                                                  VerticalAlignment=\"Center\"\n                                                  RecognizesAccessKey=\"True\"/>\n                            </BulletDecorator>\n                        </Grid>\n                        <ControlTemplate.Triggers>\n                            <Trigger Property=\"IsChecked\" Value=\"True\">\n                                <Setter TargetName=\"CheckMarkContainer\" Property=\"Visibility\" Value=\"Visible\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                <!--Setter TargetName=\"Border\" Property=\"Background\" Value=\"{DynamicResource ButtonBackgroundPressedColor}\"/-->\n                                <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonBackgroundPressedColor}\"/>\n                            </Trigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                 </Setter.Value>\n            </Setter>\n        </Style>\n        <Style TargetType=\"RadioButton\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource MainForegroundColor}\"/>\n            <Setter Property=\"Background\" Value=\"{DynamicResource MainBackgroundColor}\"/>\n            <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\" />\n            <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"RadioButton\">\n                        <StackPanel Orientation=\"Horizontal\" Margin=\"{DynamicResource CheckBoxMargin}\">\n                            <Viewbox Width=\"{DynamicResource CheckBoxBulletDecoratorSize}\" Height=\"{DynamicResource CheckBoxBulletDecoratorSize}\">\n                                <Grid Width=\"14\" Height=\"14\">\n                                    <Ellipse x:Name=\"OuterCircle\"\n                                            Stroke=\"{DynamicResource ToggleButtonOffColor}\"\n                                            Fill=\"{DynamicResource ButtonBackgroundColor}\"\n                                            StrokeThickness=\"1\"\n                                            Width=\"14\"\n                                            Height=\"14\"\n                                            SnapsToDevicePixels=\"True\"/>\n                                    <Ellipse x:Name=\"InnerCircle\"\n                                            Fill=\"{DynamicResource ToggleButtonOnColor}\"\n                                            Width=\"8\"\n                                            Height=\"8\"\n                                            Visibility=\"Collapsed\"\n                                            HorizontalAlignment=\"Center\"\n                                            VerticalAlignment=\"Center\"/>\n                                </Grid>\n                            </Viewbox>\n                            <ContentPresenter Margin=\"4,0,0,0\"\n                                            VerticalAlignment=\"Center\"\n                                            RecognizesAccessKey=\"True\"/>\n                        </StackPanel>\n                        <ControlTemplate.Triggers>\n                            <Trigger Property=\"IsChecked\" Value=\"True\">\n                                <Setter TargetName=\"InnerCircle\" Property=\"Visibility\" Value=\"Visible\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                <Setter TargetName=\"OuterCircle\" Property=\"Stroke\" Value=\"{DynamicResource ToggleButtonOnColor}\"/>\n                            </Trigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n        <Style x:Key=\"ToggleSwitchStyle\" TargetType=\"CheckBox\">\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"CheckBox\">\n                        <StackPanel>\n                            <Grid>\n                                <Border Width=\"45\"\n                                        Height=\"20\"\n                                        Background=\"#555555\"\n                                        CornerRadius=\"10\"\n                                        Margin=\"5,0\"\n                                />\n                                <Border Name=\"WPFToggleSwitchButton\"\n                                        Width=\"25\"\n                                        Height=\"25\"\n                                        Background=\"Black\"\n                                        CornerRadius=\"12.5\"\n                                        HorizontalAlignment=\"Left\"\n                                />\n                                <ContentPresenter Name=\"WPFToggleSwitchContent\"\n                                                  Margin=\"10,0,0,0\"\n                                                  Content=\"{TemplateBinding Content}\"\n                                                  VerticalAlignment=\"Center\"\n                                />\n                            </Grid>\n                        </StackPanel>\n                        <ControlTemplate.Triggers>\n                            <Trigger Property=\"IsChecked\" Value=\"false\">\n                                <Trigger.ExitActions>\n                                    <RemoveStoryboard BeginStoryboardName=\"WPFToggleSwitchLeft\" />\n                                    <BeginStoryboard x:Name=\"WPFToggleSwitchRight\">\n                                        <Storyboard>\n                                            <ThicknessAnimation Storyboard.TargetProperty=\"Margin\"\n                                                    Storyboard.TargetName=\"WPFToggleSwitchButton\"\n                                                    Duration=\"0:0:0:0\"\n                                                    From=\"0,0,0,0\"\n                                                    To=\"28,0,0,0\">\n                                            </ThicknessAnimation>\n                                        </Storyboard>\n                                    </BeginStoryboard>\n                                </Trigger.ExitActions>\n                                <Setter TargetName=\"WPFToggleSwitchButton\"\n                                        Property=\"Background\"\n                                        Value=\"#fff9f4f4\"\n                                />\n                            </Trigger>\n                            <Trigger Property=\"IsChecked\" Value=\"true\">\n                                <Trigger.ExitActions>\n                                    <RemoveStoryboard BeginStoryboardName=\"WPFToggleSwitchRight\" />\n                                    <BeginStoryboard x:Name=\"WPFToggleSwitchLeft\">\n                                        <Storyboard>\n                                            <ThicknessAnimation Storyboard.TargetProperty=\"Margin\"\n                                                    Storyboard.TargetName=\"WPFToggleSwitchButton\"\n                                                    Duration=\"0:0:0:0\"\n                                                    From=\"28,0,0,0\"\n                                                    To=\"0,0,0,0\">\n                                            </ThicknessAnimation>\n                                        </Storyboard>\n                                    </BeginStoryboard>\n                                </Trigger.ExitActions>\n                                <Setter TargetName=\"WPFToggleSwitchButton\"\n                                        Property=\"Background\"\n                                        Value=\"#ff060600\"\n                                />\n                            </Trigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n\n        <Style x:Key=\"ColorfulToggleSwitchStyle\" TargetType=\"{x:Type CheckBox}\">\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\n                        <Grid x:Name=\"toggleSwitch\">\n\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"Auto\"/>\n                            <ColumnDefinition Width=\"Auto\"/>\n                        </Grid.ColumnDefinitions>\n\n                        <Border Grid.Column=\"1\" x:Name=\"Border\" CornerRadius=\"8\"\n                                BorderThickness=\"1\"\n                                Width=\"34\" Height=\"17\">\n                            <Ellipse x:Name=\"Ellipse\" Fill=\"{DynamicResource MainForegroundColor}\" Stretch=\"Uniform\"\n                                    Margin=\"2,2,2,1\"\n                                    HorizontalAlignment=\"Left\" Width=\"10.8\"\n                                    RenderTransformOrigin=\"0.5, 0.5\">\n                                <Ellipse.RenderTransform>\n                                    <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\n                                </Ellipse.RenderTransform>\n                            </Ellipse>\n                        </Border>\n                        </Grid>\n\n                        <ControlTemplate.Triggers>\n                            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                <Setter TargetName=\"Border\" Property=\"BorderBrush\" Value=\"{DynamicResource MainForegroundColor}\" />\n                                <Setter TargetName=\"Border\" Property=\"Background\" Value=\"{DynamicResource LinkHoverForegroundColor}\"/>\n                                <Setter Property=\"Cursor\" Value=\"Hand\" />\n                                <Setter Property=\"Panel.ZIndex\" Value=\"1000\"/>\n                                <Trigger.EnterActions>\n                                    <BeginStoryboard>\n                                        <Storyboard>\n                                            <DoubleAnimation Storyboard.TargetName=\"Ellipse\"\n                                                            Storyboard.TargetProperty=\"(UIElement.RenderTransform).(ScaleTransform.ScaleX)\"\n                                                            To=\"1.1\" Duration=\"0:0:0.1\" />\n                                            <DoubleAnimation Storyboard.TargetName=\"Ellipse\"\n                                                            Storyboard.TargetProperty=\"(UIElement.RenderTransform).(ScaleTransform.ScaleY)\"\n                                                            To=\"1.1\" Duration=\"0:0:0.1\" />\n                                        </Storyboard>\n                                    </BeginStoryboard>\n                                </Trigger.EnterActions>\n                                <Trigger.ExitActions>\n                                    <BeginStoryboard>\n                                        <Storyboard>\n                                            <DoubleAnimation Storyboard.TargetName=\"Ellipse\"\n                                                            Storyboard.TargetProperty=\"(UIElement.RenderTransform).(ScaleTransform.ScaleX)\"\n                                                            To=\"1.0\" Duration=\"0:0:0.1\" />\n                                            <DoubleAnimation Storyboard.TargetName=\"Ellipse\"\n                                                            Storyboard.TargetProperty=\"(UIElement.RenderTransform).(ScaleTransform.ScaleY)\"\n                                                            To=\"1.0\" Duration=\"0:0:0.1\" />\n                                        </Storyboard>\n                                    </BeginStoryboard>\n                                </Trigger.ExitActions>\n                            </Trigger>\n                            <Trigger Property=\"ToggleButton.IsChecked\" Value=\"False\">\n                                <Setter TargetName=\"Border\" Property=\"Background\" Value=\"{DynamicResource MainBackgroundColor}\" />\n                                <Setter TargetName=\"Border\" Property=\"BorderBrush\" Value=\"{DynamicResource ToggleButtonOffColor}\" />\n                                <Setter TargetName=\"Ellipse\" Property=\"Fill\" Value=\"{DynamicResource ToggleButtonOffColor}\" />\n                            </Trigger>\n\n                            <Trigger Property=\"ToggleButton.IsChecked\" Value=\"True\">\n                                <Setter TargetName=\"Border\" Property=\"Background\" Value=\"{DynamicResource ToggleButtonOnColor}\" />\n                                <Setter TargetName=\"Border\" Property=\"BorderBrush\" Value=\"{DynamicResource ToggleButtonOnColor}\" />\n                                <Setter TargetName=\"Ellipse\" Property=\"Fill\" Value=\"White\" />\n\n                                <Trigger.EnterActions>\n                                    <BeginStoryboard>\n                                        <Storyboard>\n                                            <ThicknessAnimation Storyboard.TargetName=\"Ellipse\"\n                                                    Storyboard.TargetProperty=\"Margin\"\n                                                    To=\"18,2,2,2\" Duration=\"0:0:0.1\" />\n                                        </Storyboard>\n                                    </BeginStoryboard>\n                                </Trigger.EnterActions>\n                                <Trigger.ExitActions>\n                                    <BeginStoryboard>\n                                        <Storyboard>\n                                            <ThicknessAnimation Storyboard.TargetName=\"Ellipse\"\n                                                    Storyboard.TargetProperty=\"Margin\"\n                                                    To=\"2,2,2,1\" Duration=\"0:0:0.1\" />\n                                        </Storyboard>\n                                    </BeginStoryboard>\n                                </Trigger.ExitActions>\n                            </Trigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n            <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n        </Style>\n\n        <Style x:Key=\"labelfortweaks\" TargetType=\"{x:Type Label}\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource MainForegroundColor}\" />\n            <Setter Property=\"Background\" Value=\"{DynamicResource MainBackgroundColor}\" />\n            <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n            <Style.Triggers>\n                <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                    <Setter Property=\"Foreground\" Value=\"White\" />\n                </Trigger>\n            </Style.Triggers>\n        </Style>\n\n        <Style x:Key=\"BorderStyle\" TargetType=\"Border\">\n            <Setter Property=\"Background\" Value=\"{DynamicResource MainBackgroundColor}\"/>\n            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource BorderColor}\"/>\n            <Setter Property=\"BorderThickness\" Value=\"1\"/>\n            <Setter Property=\"CornerRadius\" Value=\"5\"/>\n            <Setter Property=\"Padding\" Value=\"5\"/>\n            <Setter Property=\"Margin\" Value=\"5\"/>\n            <Setter Property=\"Effect\">\n                <Setter.Value>\n                    <DropShadowEffect ShadowDepth=\"5\" BlurRadius=\"5\" Opacity=\"{DynamicResource BorderOpacity}\" Color=\"{DynamicResource CBorderColor}\"/>\n                </Setter.Value>\n            </Setter>\n        </Style>\n\n        <Style TargetType=\"TextBox\">\n            <Setter Property=\"Background\" Value=\"{DynamicResource MainBackgroundColor}\"/>\n            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource MainForegroundColor}\"/>\n            <Setter Property=\"BorderThickness\" Value=\"1\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource MainForegroundColor}\"/>\n            <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\"/>\n            <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n            <Setter Property=\"Padding\" Value=\"5\"/>\n            <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\"/>\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n            <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\"/>\n            <Setter Property=\"CaretBrush\" Value=\"{DynamicResource MainForegroundColor}\"/>\n            <Setter Property=\"ContextMenu\">\n                <Setter.Value>\n                    <ContextMenu>\n                        <ContextMenu.Style>\n                            <Style TargetType=\"ContextMenu\">\n                                <Setter Property=\"Template\">\n                                    <Setter.Value>\n                                        <ControlTemplate TargetType=\"ContextMenu\">\n                                            <Border Background=\"{DynamicResource MainBackgroundColor}\" BorderBrush=\"{DynamicResource BorderColor}\" BorderThickness=\"1\" CornerRadius=\"5\" Padding=\"5\">\n                                                <StackPanel>\n                                                    <MenuItem Command=\"Cut\" Header=\"Cut\"/>\n                                                    <MenuItem Command=\"Copy\" Header=\"Copy\"/>\n                                                    <MenuItem Command=\"Paste\" Header=\"Paste\"/>\n                                                </StackPanel>\n                                            </Border>\n                                        </ControlTemplate>\n                                    </Setter.Value>\n                                </Setter>\n                            </Style>\n                        </ContextMenu.Style>\n                    </ContextMenu>\n                </Setter.Value>\n            </Setter>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"TextBox\">\n                        <Border Background=\"{TemplateBinding Background}\"\n                                BorderBrush=\"{TemplateBinding BorderBrush}\"\n                                BorderThickness=\"{TemplateBinding BorderThickness}\"\n                                CornerRadius=\"5\">\n                            <Grid>\n                                <ScrollViewer x:Name=\"PART_ContentHost\" />\n                            </Grid>\n                        </Border>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n            <Setter Property=\"Effect\">\n                <Setter.Value>\n                    <DropShadowEffect ShadowDepth=\"5\" BlurRadius=\"5\" Opacity=\"{DynamicResource BorderOpacity}\" Color=\"{DynamicResource CBorderColor}\"/>\n                </Setter.Value>\n            </Setter>\n        </Style>\n        <Style TargetType=\"PasswordBox\">\n            <Setter Property=\"Background\" Value=\"{DynamicResource MainBackgroundColor}\"/>\n            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource MainForegroundColor}\"/>\n            <Setter Property=\"BorderThickness\" Value=\"1\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource MainForegroundColor}\"/>\n            <Setter Property=\"FontSize\" Value=\"{DynamicResource FontSize}\"/>\n            <Setter Property=\"FontFamily\" Value=\"{DynamicResource FontFamily}\"/>\n            <Setter Property=\"Padding\" Value=\"5\"/>\n            <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\"/>\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n            <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\"/>\n            <Setter Property=\"CaretBrush\" Value=\"{DynamicResource MainForegroundColor}\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"PasswordBox\">\n                        <Border Background=\"{TemplateBinding Background}\"\n                                BorderBrush=\"{TemplateBinding BorderBrush}\"\n                                BorderThickness=\"{TemplateBinding BorderThickness}\"\n                                CornerRadius=\"5\">\n                            <Grid>\n                                <ScrollViewer x:Name=\"PART_ContentHost\" />\n                            </Grid>\n                        </Border>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n            <Setter Property=\"Effect\">\n                <Setter.Value>\n                    <DropShadowEffect ShadowDepth=\"5\" BlurRadius=\"5\" Opacity=\"{DynamicResource BorderOpacity}\" Color=\"{DynamicResource CBorderColor}\"/>\n                </Setter.Value>\n            </Setter>\n        </Style>\n        <Style x:Key=\"ScrollVisibilityRectangle\" TargetType=\"Rectangle\">\n            <Setter Property=\"Visibility\" Value=\"Collapsed\"/>\n            <Style.Triggers>\n                <MultiDataTrigger>\n                    <MultiDataTrigger.Conditions>\n                        <Condition Binding=\"{Binding Path=ComputedHorizontalScrollBarVisibility, ElementName=scrollViewer}\" Value=\"Visible\"/>\n                        <Condition Binding=\"{Binding Path=ComputedVerticalScrollBarVisibility, ElementName=scrollViewer}\" Value=\"Visible\"/>\n                    </MultiDataTrigger.Conditions>\n                    <Setter Property=\"Visibility\" Value=\"Visible\"/>\n                </MultiDataTrigger>\n            </Style.Triggers>\n        </Style>\n    </Window.Resources>\n    <Grid Background=\"{DynamicResource MainBackgroundColor}\" ShowGridLines=\"False\" Name=\"WPFMainGrid\" Width=\"Auto\" Height=\"Auto\" HorizontalAlignment=\"Stretch\">\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\"/>\n            <RowDefinition Height=\"Auto\"/>\n            <RowDefinition Height=\"*\"/>\n        </Grid.RowDefinitions>\n        <Grid.ColumnDefinitions>\n            <ColumnDefinition Width=\"*\"/>\n        </Grid.ColumnDefinitions>\n        <!-- Offline banner -->\n        <Border Name=\"WPFOfflineBanner\" Grid.Row=\"0\" Background=\"#8B0000\" Visibility=\"Collapsed\" Padding=\"6,4\">\n            <TextBlock Text=\"&#x26A0; Offline Mode - No Internet Connection\" Foreground=\"White\" FontWeight=\"Bold\"\n                HorizontalAlignment=\"Center\" FontSize=\"13\" Background=\"Transparent\"/>\n        </Border>\n        <Grid Grid.Row=\"1\" Background=\"{DynamicResource MainBackgroundColor}\">\n            <Grid.ColumnDefinitions>\n                <ColumnDefinition Width=\"Auto\"/> <!-- Navigation buttons -->\n                <ColumnDefinition Width=\"*\"/> <!-- Search bar and buttons -->\n            </Grid.ColumnDefinitions>\n\n            <!-- Navigation Buttons Panel -->\n            <StackPanel Name=\"NavDockPanel\" Orientation=\"Horizontal\" Grid.Column=\"0\" Margin=\"5,5,10,5\">\n                <StackPanel Name=\"NavLogoPanel\" Orientation=\"Horizontal\" HorizontalAlignment=\"Left\" Background=\"{DynamicResource MainBackgroundColor}\" SnapsToDevicePixels=\"True\" Margin=\"10,0,20,0\">\n                </StackPanel>\n                <ToggleButton Margin=\"0,0,5,0\" Height=\"{DynamicResource TabButtonHeight}\" Width=\"{DynamicResource TabButtonWidth}\"\n                    Background=\"{DynamicResource ButtonInstallBackgroundColor}\" Foreground=\"white\" FontWeight=\"Bold\" Name=\"WPFTab1BT\">\n                    <ToggleButton.Content>\n                        <TextBlock FontSize=\"{DynamicResource TabButtonFontSize}\" Background=\"Transparent\" Foreground=\"{DynamicResource ButtonInstallForegroundColor}\" >\n                            <Underline>I</Underline>nstall\n                        </TextBlock>\n                    </ToggleButton.Content>\n                </ToggleButton>\n                <ToggleButton Margin=\"0,0,5,0\" Height=\"{DynamicResource TabButtonHeight}\" Width=\"{DynamicResource TabButtonWidth}\"\n                    Background=\"{DynamicResource ButtonTweaksBackgroundColor}\" Foreground=\"{DynamicResource ButtonTweaksForegroundColor}\" FontWeight=\"Bold\" Name=\"WPFTab2BT\">\n                    <ToggleButton.Content>\n                        <TextBlock FontSize=\"{DynamicResource TabButtonFontSize}\" Background=\"Transparent\" Foreground=\"{DynamicResource ButtonTweaksForegroundColor}\">\n                            <Underline>T</Underline>weaks\n                        </TextBlock>\n                    </ToggleButton.Content>\n                </ToggleButton>\n                <ToggleButton Margin=\"0,0,5,0\" Height=\"{DynamicResource TabButtonHeight}\" Width=\"{DynamicResource TabButtonWidth}\"\n                    Background=\"{DynamicResource ButtonConfigBackgroundColor}\" Foreground=\"{DynamicResource ButtonConfigForegroundColor}\" FontWeight=\"Bold\" Name=\"WPFTab3BT\">\n                    <ToggleButton.Content>\n                        <TextBlock FontSize=\"{DynamicResource TabButtonFontSize}\" Background=\"Transparent\" Foreground=\"{DynamicResource ButtonConfigForegroundColor}\">\n                            <Underline>C</Underline>onfig\n                        </TextBlock>\n                    </ToggleButton.Content>\n                </ToggleButton>\n                <ToggleButton Margin=\"0,0,5,0\" Height=\"{DynamicResource TabButtonHeight}\" Width=\"{DynamicResource TabButtonWidth}\"\n                    Background=\"{DynamicResource ButtonUpdatesBackgroundColor}\" Foreground=\"{DynamicResource ButtonUpdatesForegroundColor}\" FontWeight=\"Bold\" Name=\"WPFTab4BT\">\n                    <ToggleButton.Content>\n                        <TextBlock FontSize=\"{DynamicResource TabButtonFontSize}\" Background=\"Transparent\" Foreground=\"{DynamicResource ButtonUpdatesForegroundColor}\">\n                            <Underline>U</Underline>pdates\n                        </TextBlock>\n                    </ToggleButton.Content>\n                </ToggleButton>\n                <ToggleButton Margin=\"0,0,5,0\" Height=\"{DynamicResource TabButtonHeight}\" Width=\"Auto\" MinWidth=\"{DynamicResource TabButtonWidth}\"\n                    Background=\"{DynamicResource ButtonWin11ISOBackgroundColor}\" Foreground=\"{DynamicResource ButtonWin11ISOForegroundColor}\" FontWeight=\"Bold\" Name=\"WPFTab5BT\">\n                    <ToggleButton.Content>\n                        <TextBlock FontSize=\"{DynamicResource TabButtonFontSize}\" Background=\"Transparent\" Foreground=\"{DynamicResource ButtonWin11ISOForegroundColor}\">\n                            <Underline>W</Underline>in11 Creator\n                        </TextBlock>\n                    </ToggleButton.Content>\n                </ToggleButton>\n            </StackPanel>\n\n            <!-- Search Bar and Action Buttons -->\n            <Grid Name=\"GridBesideNavDockPanel\" Grid.Column=\"1\" Background=\"{DynamicResource MainBackgroundColor}\" ShowGridLines=\"False\" Height=\"Auto\">\n                <Grid.ColumnDefinitions>\n                    <ColumnDefinition Width=\"2*\"/> <!-- Search bar area - priority space -->\n                    <ColumnDefinition Width=\"Auto\"/><!-- Buttons area -->\n                </Grid.ColumnDefinitions>\n\n                <Border Grid.Column=\"0\" Margin=\"5,0,0,0\" Width=\"{DynamicResource SearchBarWidth}\" Height=\"{DynamicResource SearchBarHeight}\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\">\n                    <Grid>\n                        <TextBox\n                            Width=\"{DynamicResource SearchBarWidth}\"\n                            Height=\"{DynamicResource SearchBarHeight}\"\n                            FontSize=\"{DynamicResource SearchBarTextBoxFontSize}\"\n                            VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"\n                            BorderThickness=\"1\"\n                            Name=\"SearchBar\"\n                            Foreground=\"{DynamicResource MainForegroundColor}\" Background=\"{DynamicResource MainBackgroundColor}\"\n                            Padding=\"3,3,30,0\"\n                            ToolTip=\"Press Ctrl-F and type app name to filter application list below. Press Esc to reset the filter\">\n                        </TextBox>\n                        <TextBlock\n                            VerticalAlignment=\"Center\" HorizontalAlignment=\"Right\"\n                            FontFamily=\"Segoe MDL2 Assets\"\n                            Foreground=\"{DynamicResource ButtonBackgroundSelectedColor}\"\n                            FontSize=\"{DynamicResource IconFontSize}\"\n                            Margin=\"0,0,8,0\" Width=\"Auto\" Height=\"Auto\">&#xE721;\n                        </TextBlock>\n                    </Grid>\n                </Border>\n                <Button Grid.Column=\"0\"\n                    VerticalAlignment=\"Center\" HorizontalAlignment=\"Left\"\n                    Name=\"SearchBarClearButton\"\n                    Style=\"{StaticResource SearchBarClearButtonStyle}\"\n                    Margin=\"213,0,0,0\" Visibility=\"Collapsed\">\n                </Button>\n\n                <!-- Buttons Container -->\n                <StackPanel Grid.Column=\"1\" Orientation=\"Horizontal\" HorizontalAlignment=\"Right\" VerticalAlignment=\"Top\" Margin=\"5,5,5,5\">\n                    <Button Name=\"ThemeButton\"\n                        Style=\"{StaticResource HoverButtonStyle}\"\n                        BorderBrush=\"Transparent\"\n                    Background=\"{DynamicResource MainBackgroundColor}\"\n                    Foreground=\"{DynamicResource MainForegroundColor}\"\n                    FontSize=\"{DynamicResource SettingsIconFontSize}\"\n                    Width=\"{DynamicResource IconButtonSize}\" Height=\"{DynamicResource IconButtonSize}\"\n                    HorizontalAlignment=\"Right\" VerticalAlignment=\"Top\"\n                    Margin=\"0,0,2,0\"\n                    FontFamily=\"Segoe MDL2 Assets\"\n                    Content=\"N/A\"\n                    ToolTip=\"Change the Winutil UI Theme\"\n                />\n                    <Popup Name=\"ThemePopup\"\n                    IsOpen=\"False\"\n                    PlacementTarget=\"{Binding ElementName=ThemeButton}\" Placement=\"Bottom\"\n                    HorizontalAlignment=\"Right\" VerticalAlignment=\"Top\">\n                    <Border Background=\"{DynamicResource MainBackgroundColor}\" BorderBrush=\"{DynamicResource MainForegroundColor}\" BorderThickness=\"1\" CornerRadius=\"0\" Margin=\"0\">\n                        <StackPanel Background=\"{DynamicResource MainBackgroundColor}\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\">\n                            <MenuItem FontSize=\"{DynamicResource ButtonFontSize}\" Header=\"Auto\" Name=\"AutoThemeMenuItem\" Foreground=\"{DynamicResource MainForegroundColor}\">\n                                <MenuItem.ToolTip>\n                                    <ToolTip Content=\"Follow the Windows Theme\"/>\n                                </MenuItem.ToolTip>\n                            </MenuItem>\n                            <MenuItem FontSize=\"{DynamicResource ButtonFontSize}\" Header=\"Dark\" Name=\"DarkThemeMenuItem\" Foreground=\"{DynamicResource MainForegroundColor}\">\n                                <MenuItem.ToolTip>\n                                    <ToolTip Content=\"Use Dark Theme\"/>\n                                </MenuItem.ToolTip>\n                            </MenuItem>\n                            <MenuItem FontSize=\"{DynamicResource ButtonFontSize}\" Header=\"Light\" Name=\"LightThemeMenuItem\" Foreground=\"{DynamicResource MainForegroundColor}\">\n                                <MenuItem.ToolTip>\n                                    <ToolTip Content=\"Use Light Theme\"/>\n                                </MenuItem.ToolTip>\n                            </MenuItem>\n                        </StackPanel>\n                    </Border>\n                </Popup>\n\n                    <Button Name=\"FontScalingButton\"\n                        Style=\"{StaticResource HoverButtonStyle}\"\n                        BorderBrush=\"Transparent\"\n                    Background=\"{DynamicResource MainBackgroundColor}\"\n                    Foreground=\"{DynamicResource MainForegroundColor}\"\n                    FontSize=\"{DynamicResource SettingsIconFontSize}\"\n                    Width=\"{DynamicResource IconButtonSize}\" Height=\"{DynamicResource IconButtonSize}\"\n                    HorizontalAlignment=\"Right\" VerticalAlignment=\"Top\"\n                    Margin=\"0,0,2,0\"\n                    FontFamily=\"Segoe MDL2 Assets\"\n                    Content=\"&#xE8D3;\"\n                    ToolTip=\"Adjust Font Scaling for Accessibility\"\n                />\n                    <Popup Name=\"FontScalingPopup\"\n                    IsOpen=\"False\"\n                    PlacementTarget=\"{Binding ElementName=FontScalingButton}\" Placement=\"Bottom\"\n                    HorizontalAlignment=\"Right\" VerticalAlignment=\"Top\">\n                    <Border Background=\"{DynamicResource MainBackgroundColor}\" BorderBrush=\"{DynamicResource MainForegroundColor}\" BorderThickness=\"1\" CornerRadius=\"0\" Margin=\"0\">\n                        <StackPanel Background=\"{DynamicResource MainBackgroundColor}\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\" MinWidth=\"200\">\n                            <TextBlock Text=\"Font Scaling\"\n                                       FontSize=\"{DynamicResource ButtonFontSize}\"\n                                       Foreground=\"{DynamicResource MainForegroundColor}\"\n                                       HorizontalAlignment=\"Center\"\n                                       Margin=\"10,5,10,5\"\n                                       FontWeight=\"Bold\"/>\n                            <Separator Margin=\"5,0,5,5\"/>\n                            <StackPanel Orientation=\"Horizontal\" Margin=\"10,5,10,10\">\n                                <TextBlock Text=\"Small\"\n                                           FontSize=\"{DynamicResource ButtonFontSize}\"\n                                           Foreground=\"{DynamicResource MainForegroundColor}\"\n                                           VerticalAlignment=\"Center\"\n                                           Margin=\"0,0,10,0\"/>\n                                <Slider Name=\"FontScalingSlider\"\n                                        Minimum=\"0.75\" Maximum=\"2.0\"\n                                        Value=\"1.0\"\n                                        TickFrequency=\"0.25\"\n                                        TickPlacement=\"BottomRight\"\n                                        IsSnapToTickEnabled=\"True\"\n                                        Width=\"120\"\n                                        VerticalAlignment=\"Center\"/>\n                                <TextBlock Text=\"Large\"\n                                           FontSize=\"{DynamicResource ButtonFontSize}\"\n                                           Foreground=\"{DynamicResource MainForegroundColor}\"\n                                           VerticalAlignment=\"Center\"\n                                           Margin=\"10,0,0,0\"/>\n                            </StackPanel>\n                            <TextBlock Name=\"FontScalingValue\"\n                                       Text=\"100%\"\n                                       FontSize=\"{DynamicResource ButtonFontSize}\"\n                                       Foreground=\"{DynamicResource MainForegroundColor}\"\n                                       HorizontalAlignment=\"Center\"\n                                       Margin=\"10,0,10,5\"/>\n                            <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Center\" Margin=\"10,0,10,10\">\n                                <Button Name=\"FontScalingResetButton\"\n                                        Content=\"Reset\"\n                                        Style=\"{StaticResource HoverButtonStyle}\"\n                                        Width=\"60\" Height=\"25\"\n                                        Margin=\"5,0,5,0\"/>\n                                <Button Name=\"FontScalingApplyButton\"\n                                        Content=\"Apply\"\n                                        Style=\"{StaticResource HoverButtonStyle}\"\n                                        Width=\"60\" Height=\"25\"\n                                        Margin=\"5,0,5,0\"/>\n                            </StackPanel>\n                        </StackPanel>\n                    </Border>\n                </Popup>\n\n                    <Button Name=\"SettingsButton\"\n                        Style=\"{StaticResource HoverButtonStyle}\"\n                        BorderBrush=\"Transparent\"\n                    Background=\"{DynamicResource MainBackgroundColor}\"\n                    Foreground=\"{DynamicResource MainForegroundColor}\"\n                    FontSize=\"{DynamicResource SettingsIconFontSize}\"\n                    Width=\"{DynamicResource IconButtonSize}\" Height=\"{DynamicResource IconButtonSize}\"\n                    HorizontalAlignment=\"Right\" VerticalAlignment=\"Top\"\n                    Margin=\"0,0,2,0\"\n                    FontFamily=\"Segoe MDL2 Assets\"\n                    Content=\"&#xE713;\"/>\n                    <Popup Name=\"SettingsPopup\"\n                    IsOpen=\"False\"\n                    PlacementTarget=\"{Binding ElementName=SettingsButton}\" Placement=\"Bottom\"\n                    HorizontalAlignment=\"Right\" VerticalAlignment=\"Top\">\n                    <Border Background=\"{DynamicResource MainBackgroundColor}\" BorderBrush=\"{DynamicResource MainForegroundColor}\" BorderThickness=\"1\" CornerRadius=\"0\" Margin=\"0\">\n                        <StackPanel Background=\"{DynamicResource MainBackgroundColor}\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\">\n                            <MenuItem FontSize=\"{DynamicResource ButtonFontSize}\" Header=\"Import\" Name=\"ImportMenuItem\" Foreground=\"{DynamicResource MainForegroundColor}\">\n                                <MenuItem.ToolTip>\n                                    <ToolTip Content=\"Import Configuration from exported file.\"/>\n                                </MenuItem.ToolTip>\n                            </MenuItem>\n                            <MenuItem FontSize=\"{DynamicResource ButtonFontSize}\" Header=\"Export\" Name=\"ExportMenuItem\" Foreground=\"{DynamicResource MainForegroundColor}\">\n                                <MenuItem.ToolTip>\n                                    <ToolTip Content=\"Export Selected Elements and copy execution command to clipboard.\"/>\n                                </MenuItem.ToolTip>\n                            </MenuItem>\n                            <Separator/>\n                            <MenuItem FontSize=\"{DynamicResource ButtonFontSize}\" Header=\"About\" Name=\"AboutMenuItem\" Foreground=\"{DynamicResource MainForegroundColor}\"/>\n                            <MenuItem FontSize=\"{DynamicResource ButtonFontSize}\" Header=\"Documentation\" Name=\"DocumentationMenuItem\" Foreground=\"{DynamicResource MainForegroundColor}\"/>\n                            <MenuItem FontSize=\"{DynamicResource ButtonFontSize}\" Header=\"Sponsors\" Name=\"SponsorMenuItem\" Foreground=\"{DynamicResource MainForegroundColor}\"/>\n                        </StackPanel>\n                    </Border>\n                </Popup>\n\n                    <Button\n                    Content=\"&#xD7;\" BorderThickness=\"0\"\n                BorderBrush=\"Transparent\"\n                Background=\"{DynamicResource MainBackgroundColor}\"\n                Width=\"{DynamicResource IconButtonSize}\" Height=\"{DynamicResource IconButtonSize}\"\n                HorizontalAlignment=\"Right\" VerticalAlignment=\"Top\"\n                Margin=\"0,0,0,0\"\n                FontFamily=\"{DynamicResource FontFamily}\"\n                Foreground=\"{DynamicResource MainForegroundColor}\" FontSize=\"{DynamicResource CloseIconFontSize}\" Name=\"WPFCloseButton\" />\n                </StackPanel>\n            </Grid>\n        </Grid>\n\n        <TabControl Name=\"WPFTabNav\" Background=\"Transparent\" Width=\"Auto\" Height=\"Auto\" BorderBrush=\"Transparent\" BorderThickness=\"0\" Grid.Row=\"2\" Grid.Column=\"0\" Padding=\"-1\">\n            <TabItem Header=\"Install\" Visibility=\"Collapsed\" Name=\"WPFTab1\">\n                <Grid Background=\"Transparent\" >\n\n                    <Grid Grid.Row=\"0\" Grid.Column=\"0\" Margin=\"{DynamicResource TabContentMargin}\">\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"Auto\" />\n                            <ColumnDefinition Width=\"*\" />\n                        </Grid.ColumnDefinitions>\n\n                        <Grid Name=\"appscategory\" Grid.Column=\"0\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\">\n                        </Grid>\n\n                        <Grid Name=\"appspanel\" Grid.Column=\"1\" HorizontalAlignment=\"Stretch\" VerticalAlignment=\"Stretch\">\n                        </Grid>\n                    </Grid>\n                </Grid>\n            </TabItem>\n            <TabItem Header=\"Tweaks\" Visibility=\"Collapsed\" Name=\"WPFTab2\">\n                <Grid>\n                    <!-- Main content area with a ScrollViewer -->\n                    <Grid.RowDefinitions>\n                        <RowDefinition Height=\"*\" />\n                        <RowDefinition Height=\"Auto\" />\n                    </Grid.RowDefinitions>\n\n                    <ScrollViewer VerticalScrollBarVisibility=\"Auto\" HorizontalScrollBarVisibility=\"Disabled\" Grid.Row=\"0\" Margin=\"{DynamicResource TabContentMargin}\">\n                        <Grid Background=\"Transparent\">\n                            <Grid.RowDefinitions>\n                                <RowDefinition Height=\"Auto\"/>\n                                <RowDefinition Height=\"*\"/>\n                                <RowDefinition Height=\"Auto\"/>\n                            </Grid.RowDefinitions>\n\n                            <StackPanel Background=\"{DynamicResource MainBackgroundColor}\" Orientation=\"Vertical\" Grid.Row=\"0\" Grid.Column=\"0\" Grid.ColumnSpan=\"2\" Margin=\"5\">\n                                <Label Content=\"Recommended Selections:\" FontSize=\"{DynamicResource FontSize}\" VerticalAlignment=\"Center\" Margin=\"2\"/>\n                                <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Left\" Margin=\"0,2,0,0\">\n                                    <Button Name=\"WPFstandard\" Content=\" Standard \" Margin=\"2\" Width=\"{DynamicResource ButtonWidth}\" Height=\"{DynamicResource ButtonHeight}\"/>\n                                    <Button Name=\"WPFminimal\" Content=\" Minimal \" Margin=\"2\" Width=\"{DynamicResource ButtonWidth}\" Height=\"{DynamicResource ButtonHeight}\"/>\n                                    <Button Name=\"WPFClearTweaksSelection\" Content=\" Clear \" Margin=\"2\" Width=\"{DynamicResource ButtonWidth}\" Height=\"{DynamicResource ButtonHeight}\"/>\n                                    <Button Name=\"WPFGetInstalledTweaks\" Content=\" Get Installed Tweaks \" Margin=\"2\" Width=\"{DynamicResource ButtonWidth}\" Height=\"{DynamicResource ButtonHeight}\"/>\n                                </StackPanel>\n                            </StackPanel>\n\n                            <Grid Name=\"tweakspanel\" Grid.Row=\"1\">\n                                <!-- Your tweakspanel content goes here -->\n                            </Grid>\n\n                            <Border Grid.ColumnSpan=\"2\" Grid.Row=\"2\" Grid.Column=\"0\" Style=\"{StaticResource BorderStyle}\">\n                                <StackPanel Background=\"{DynamicResource MainBackgroundColor}\" Orientation=\"Horizontal\" HorizontalAlignment=\"Left\">\n                                    <TextBlock Padding=\"10\">\n                                        Note: Hover over items to get a better description. Please be careful as many of these tweaks will heavily modify your system.\n                                        <LineBreak/>Recommended selections are for normal users and if you are unsure do NOT check anything else!\n                                    </TextBlock>\n                                </StackPanel>\n                            </Border>\n                        </Grid>\n                    </ScrollViewer>\n                    <Border Grid.Row=\"1\" Background=\"{DynamicResource MainBackgroundColor}\" BorderBrush=\"{DynamicResource BorderColor}\" BorderThickness=\"1\" CornerRadius=\"5\" HorizontalAlignment=\"Stretch\" Padding=\"10\">\n                        <WrapPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Grid.Column=\"0\">\n                            <Button Name=\"WPFTweaksbutton\" Content=\"Run Tweaks\" Margin=\"5\" Width=\"{DynamicResource ButtonWidth}\" Height=\"{DynamicResource ButtonHeight}\"/>\n                            <Button Name=\"WPFUndoall\" Content=\"Undo Selected Tweaks\" Margin=\"5\" Width=\"{DynamicResource ButtonWidth}\" Height=\"{DynamicResource ButtonHeight}\"/>\n                        </WrapPanel>\n                    </Border>\n                </Grid>\n            </TabItem>\n            <TabItem Header=\"Config\" Visibility=\"Collapsed\" Name=\"WPFTab3\">\n                <ScrollViewer VerticalScrollBarVisibility=\"Auto\" HorizontalScrollBarVisibility=\"Auto\" Margin=\"{DynamicResource TabContentMargin}\">\n                    <Grid Name=\"featurespanel\" Grid.Row=\"1\" Background=\"Transparent\">\n                    </Grid>\n                </ScrollViewer>\n            </TabItem>\n            <TabItem Header=\"Updates\" Visibility=\"Collapsed\" Name=\"WPFTab4\">\n                <ScrollViewer VerticalScrollBarVisibility=\"Auto\" HorizontalScrollBarVisibility=\"Disabled\" Margin=\"{DynamicResource TabContentMargin}\">\n                    <Grid Background=\"Transparent\" MaxWidth=\"{Binding ActualWidth, RelativeSource={RelativeSource AncestorType=ScrollViewer}}\">\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"Auto\"/>  <!-- Row for the 3 columns -->\n                            <RowDefinition Height=\"Auto\"/>  <!-- Row for Windows Version -->\n                        </Grid.RowDefinitions>\n\n                        <!-- Three columns container -->\n                        <Grid Grid.Row=\"0\">\n                            <Grid.ColumnDefinitions>\n                                <ColumnDefinition Width=\"*\"/>\n                                <ColumnDefinition Width=\"*\"/>\n                                <ColumnDefinition Width=\"*\"/>\n                            </Grid.ColumnDefinitions>\n\n                            <!-- Default Settings -->\n                            <Border Grid.Column=\"0\" Style=\"{StaticResource BorderStyle}\">\n                                <StackPanel>\n                                    <Button Name=\"WPFUpdatesdefault\"\n                                            FontSize=\"{DynamicResource ConfigTabButtonFontSize}\"\n                                            Content=\"Default Settings\"\n                                            Margin=\"10,5\"\n                                            Padding=\"10\"/>\n                                    <TextBlock Margin=\"10\"\n                                             TextWrapping=\"Wrap\"\n                                             Foreground=\"{DynamicResource MainForegroundColor}\">\n                                        <Run FontWeight=\"Bold\">Default Windows Update Configuration</Run>\n                                        <LineBreak/>\n                                         - No modifications to Windows defaults\n                                        <LineBreak/>\n                                         - Removes any custom update settings\n                                        <LineBreak/><LineBreak/>\n                                        <Run FontStyle=\"Italic\" FontSize=\"11\">Note: This resets your Windows Update settings to default out of the box settings. It removes ANY policy or customization that has been done to Windows Update.</Run>\n                                    </TextBlock>\n                                </StackPanel>\n                            </Border>\n\n                            <!-- Security Settings -->\n                            <Border Grid.Column=\"1\" Style=\"{StaticResource BorderStyle}\">\n                                <StackPanel>\n                                    <Button Name=\"WPFUpdatessecurity\"\n                                            FontSize=\"{DynamicResource ConfigTabButtonFontSize}\"\n                                            Content=\"Security Settings\"\n                                            Margin=\"10,5\"\n                                            Padding=\"10\"/>\n                                    <TextBlock Margin=\"10\"\n                                             TextWrapping=\"Wrap\"\n                                             Foreground=\"{DynamicResource MainForegroundColor}\">\n                                        <Run FontWeight=\"Bold\">Balanced Security Configuration</Run>\n                                        <LineBreak/>\n                                         - Feature updates delayed by 365 days\n                                        <LineBreak/>\n                                         - Security updates installed after 4 days\n                                        <LineBreak/><LineBreak/>\n                                        <Run FontWeight=\"SemiBold\">Feature Updates:</Run> New features and potential bugs\n                                        <LineBreak/>\n                                        <Run FontWeight=\"SemiBold\">Security Updates:</Run> Critical security patches\n                                    <LineBreak/><LineBreak/>\n                                    <Run FontStyle=\"Italic\" FontSize=\"11\">Note: This only applies to Pro systems that can use group policy.</Run>\n                                    </TextBlock>\n                                </StackPanel>\n                            </Border>\n\n                            <!-- Disable Updates -->\n                            <Border Grid.Column=\"2\" Style=\"{StaticResource BorderStyle}\">\n                                <StackPanel>\n                                    <Button Name=\"WPFUpdatesdisable\"\n                                            FontSize=\"{DynamicResource ConfigTabButtonFontSize}\"\n                                            Content=\"Disable All Updates\"\n                                            Foreground=\"Red\"\n                                            Margin=\"10,5\"\n                                            Padding=\"10\"/>\n                                    <TextBlock Margin=\"10\"\n                                             TextWrapping=\"Wrap\"\n                                             Foreground=\"{DynamicResource MainForegroundColor}\">\n                                        <Run FontWeight=\"Bold\" Foreground=\"Red\">!! Not Recommended !!</Run>\n                                        <LineBreak/>\n                                         - Disables ALL Windows Updates\n                                        <LineBreak/>\n                                         - Increases security risks\n                                        <LineBreak/>\n                                         - Only use for isolated systems\n                                        <LineBreak/><LineBreak/>\n                                        <Run FontStyle=\"Italic\" FontSize=\"11\">Warning: Your system will be vulnerable without security updates.</Run>\n                                    </TextBlock>\n                                </StackPanel>\n                            </Border>\n                        </Grid>\n\n                        <!-- Future Implementation: Add Windows Version to updates panel -->\n                        <Grid Name=\"updatespanel\" Grid.Row=\"1\" Background=\"Transparent\">\n                        </Grid>\n                    </Grid>\n                </ScrollViewer>\n            </TabItem>\n            <TabItem Header=\"Win11ISO\" Visibility=\"Collapsed\" Name=\"WPFTab5\">\n                <Grid Name=\"Win11ISOPanel\" Margin=\"{DynamicResource TabContentMargin}\" Background=\"Transparent\">\n                    <Grid.RowDefinitions>\n                        <RowDefinition Height=\"Auto\"/>  <!-- Steps 1-4 -->\n                        <RowDefinition Height=\"*\"/>     <!-- Log / Status -->\n                    </Grid.RowDefinitions>\n\n                    <!-- Steps 1-4 -->\n                    <StackPanel Grid.Row=\"0\">\n\n                            <!-- ─── STEP 1 : Select Windows 11 ISO ─────────────── -->\n                            <Grid Name=\"WPFWin11ISOSelectSection\" Margin=\"5\" HorizontalAlignment=\"Left\" MinWidth=\"{DynamicResource ButtonWidth}\">\n                                <Grid.ColumnDefinitions>\n                                    <ColumnDefinition Width=\"*\"/>\n                                    <ColumnDefinition Width=\"*\"/>\n                                </Grid.ColumnDefinitions>\n\n                                <!-- Left: File Selector -->\n                                <StackPanel Grid.Column=\"0\" Margin=\"5,5,15,5\">\n                                    <TextBlock FontSize=\"{DynamicResource FontSize}\" FontWeight=\"Bold\"\n                                               Foreground=\"{DynamicResource MainForegroundColor}\" Margin=\"0,0,0,8\">\n                                        Step 1 - Select Windows 11 ISO\n                                    </TextBlock>\n                                    <TextBlock FontSize=\"{DynamicResource FontSize}\" Foreground=\"{DynamicResource MainForegroundColor}\"\n                                               TextWrapping=\"Wrap\" Margin=\"0,0,0,6\">\n                                        Browse to your locally saved Windows 11 ISO file. Only official ISOs\n                                        downloaded from Microsoft are supported.\n                                    </TextBlock>\n                                    <TextBlock FontSize=\"{DynamicResource FontSize}\" Foreground=\"{DynamicResource MainForegroundColor}\"\n                                               TextWrapping=\"Wrap\" Margin=\"0,0,0,12\" FontStyle=\"Italic\">\n                                        <Run FontWeight=\"Bold\">NOTE:</Run> This is only meant for Fresh and New Windows installs.\n                                    </TextBlock>\n                                    <Grid>\n                                        <Grid.ColumnDefinitions>\n                                            <ColumnDefinition Width=\"*\"/>\n                                            <ColumnDefinition Width=\"Auto\"/>\n                                        </Grid.ColumnDefinitions>\n                                        <TextBox Grid.Column=\"0\"\n                                                 Name=\"WPFWin11ISOPath\"\n                                                 IsReadOnly=\"True\"\n                                                 VerticalAlignment=\"Center\"\n                                                 Padding=\"6,4\"\n                                                 Margin=\"0,0,6,0\"\n                                                 Text=\"No ISO selected...\"\n                                                 Foreground=\"{DynamicResource MainForegroundColor}\"\n                                                 Background=\"{DynamicResource MainBackgroundColor}\"/>\n                                        <Button Grid.Column=\"1\"\n                                                Name=\"WPFWin11ISOBrowseButton\"\n                                                Content=\"Browse\"\n                                                Width=\"Auto\" Padding=\"12,0\"\n                                                Height=\"{DynamicResource ButtonHeight}\"/>\n                                    </Grid>\n                                    <TextBlock Name=\"WPFWin11ISOFileInfo\"\n                                               FontSize=\"{DynamicResource FontSize}\"\n                                               Foreground=\"{DynamicResource MainForegroundColor}\"\n                                               Margin=\"0,8,0,0\"\n                                               TextWrapping=\"Wrap\"\n                                               Visibility=\"Collapsed\"/>\n                                </StackPanel>\n\n                                <!-- Right: Download guidance -->\n                                <Border Grid.Column=\"1\"\n                                        Background=\"{DynamicResource MainBackgroundColor}\"\n                                        BorderBrush=\"{DynamicResource BorderColor}\"\n                                        BorderThickness=\"1\" CornerRadius=\"5\"\n                                        Margin=\"5\" Padding=\"15\">\n                                    <StackPanel>\n                                        <TextBlock FontSize=\"{DynamicResource FontSize}\" FontWeight=\"Bold\"\n                                                   Foreground=\"OrangeRed\" Margin=\"0,0,0,10\">\n                                            !!WARNING!! You must use an official Microsoft ISO\n                                        </TextBlock>\n                                        <TextBlock FontSize=\"{DynamicResource FontSize}\"\n                                                   Foreground=\"{DynamicResource MainForegroundColor}\"\n                                                   TextWrapping=\"Wrap\" Margin=\"0,0,0,8\">\n                                            Download the Windows 11 ISO directly from Microsoft.com.\n                                            Third-party, pre-modified, or unofficial images are not supported\n                                            and may produce broken results.\n                                        </TextBlock>\n                                        <TextBlock FontSize=\"{DynamicResource FontSize}\"\n                                                   Foreground=\"{DynamicResource MainForegroundColor}\"\n                                                   TextWrapping=\"Wrap\" Margin=\"0,0,0,6\">\n                                            On the Microsoft download page, choose:\n                                        </TextBlock>\n                                        <TextBlock FontSize=\"{DynamicResource FontSize}\"\n                                                   Foreground=\"{DynamicResource MainForegroundColor}\"\n                                                   TextWrapping=\"Wrap\" Margin=\"12,0,0,12\">\n                                            - Edition  : Windows 11\n                                            <LineBreak/>- Language : your preferred language\n                                            <LineBreak/>- Architecture : 64-bit (x64)\n                                        </TextBlock>\n                                        <Button Name=\"WPFWin11ISODownloadLink\"\n                                                Content=\"Open Microsoft Download Page\"\n                                                HorizontalAlignment=\"Left\"\n                                                Width=\"Auto\" Padding=\"12,0\"\n                                                Height=\"{DynamicResource ButtonHeight}\"/>\n                                    </StackPanel>\n                                </Border>\n                            </Grid>\n\n                            <!-- ─── STEP 2 : Mount & Verify ISO ──────────────────── -->\n                            <Grid Name=\"WPFWin11ISOMountSection\"\n                                  Margin=\"5\"\n                                  Visibility=\"Collapsed\"\n                                  HorizontalAlignment=\"Left\" MinWidth=\"{DynamicResource ButtonWidth}\">\n                                <Grid.ColumnDefinitions>\n                                    <ColumnDefinition Width=\"Auto\"/>\n                                    <ColumnDefinition Width=\"*\"/>\n                                </Grid.ColumnDefinitions>\n\n                                <StackPanel Grid.Column=\"0\" Margin=\"0,0,20,0\" VerticalAlignment=\"Top\">\n                                    <TextBlock FontSize=\"{DynamicResource FontSize}\" FontWeight=\"Bold\"\n                                               Foreground=\"{DynamicResource MainForegroundColor}\" Margin=\"0,0,0,8\">\n                                        Step 2 - Mount &amp; Verify ISO\n                                    </TextBlock>\n                                    <TextBlock FontSize=\"{DynamicResource FontSize}\"\n                                               Foreground=\"{DynamicResource MainForegroundColor}\"\n                                               TextWrapping=\"Wrap\" Margin=\"0,0,0,12\" MaxWidth=\"320\">\n                                        Mount the ISO and confirm it contains a valid Windows 11\n                                        install.wim before any modifications are made.\n                                    </TextBlock>\n                                    <Button Name=\"WPFWin11ISOMountButton\"\n                                            Content=\"Mount &amp; Verify ISO\"\n                                            HorizontalAlignment=\"Left\"\n                                            Width=\"Auto\" Padding=\"12,0\"\n                                            Height=\"{DynamicResource ButtonHeight}\"/>\n                                    <CheckBox Name=\"WPFWin11ISOInjectDrivers\"\n                                              Content=\"Inject current system drivers\"\n                                              FontSize=\"{DynamicResource FontSize}\"\n                                              Foreground=\"{DynamicResource MainForegroundColor}\"\n                                              IsChecked=\"False\"\n                                              Margin=\"0,8,0,0\"\n                                              ToolTip=\"Exports all drivers from this machine and injects them into install.wim and boot.wim. Recommended for systems with unsupported NVMe or network controllers.\"/>\n                                </StackPanel>\n\n                                <!-- Verification results panel -->\n                                <Border Grid.Column=\"1\"\n                                        Name=\"WPFWin11ISOVerifyResultPanel\"\n                                        Background=\"{DynamicResource MainBackgroundColor}\"\n                                        BorderBrush=\"{DynamicResource BorderColor}\"\n                                        BorderThickness=\"1\" CornerRadius=\"5\"\n                                        Padding=\"12\" Margin=\"0,0,0,0\"\n                                        Visibility=\"Collapsed\">\n                                    <StackPanel>\n                                        <TextBlock Name=\"WPFWin11ISOMountDriveLetter\"\n                                                   FontSize=\"{DynamicResource FontSize}\"\n                                                   Foreground=\"{DynamicResource MainForegroundColor}\"\n                                                   Margin=\"0,0,0,4\"/>\n                                        <TextBlock Name=\"WPFWin11ISOArchLabel\"\n                                                   FontSize=\"{DynamicResource FontSize}\"\n                                                   Foreground=\"{DynamicResource MainForegroundColor}\"\n                                                   Margin=\"0,0,0,4\"/>\n                                        <TextBlock FontSize=\"{DynamicResource FontSize}\" FontWeight=\"Bold\"\n                                                   Foreground=\"{DynamicResource MainForegroundColor}\"\n                                                   Margin=\"0,6,0,4\">\n                                            Select Edition:\n                                        </TextBlock>\n                                        <ComboBox Name=\"WPFWin11ISOEditionComboBox\"\n                                                  FontSize=\"{DynamicResource FontSize}\"\n                                                  Foreground=\"{DynamicResource MainForegroundColor}\"\n                                                  Background=\"{DynamicResource MainBackgroundColor}\"\n                                                  HorizontalAlignment=\"Left\"\n                                                  Margin=\"0,0,0,0\"/>\n                                    </StackPanel>\n                                </Border>\n                            </Grid>\n\n                            <!-- ─── STEP 3 : Modify install.wim ───────────────────── -->\n                            <StackPanel Name=\"WPFWin11ISOModifySection\"\n                                        Margin=\"5\"\n                                        Visibility=\"Collapsed\"\n                                        HorizontalAlignment=\"Left\" MinWidth=\"{DynamicResource ButtonWidth}\">\n                                <TextBlock FontSize=\"{DynamicResource FontSize}\" FontWeight=\"Bold\"\n                                           Foreground=\"{DynamicResource MainForegroundColor}\" Margin=\"0,0,0,8\">\n                                    Step 3 - Modify install.wim\n                                </TextBlock>\n                                <TextBlock FontSize=\"{DynamicResource FontSize}\"\n                                           Foreground=\"{DynamicResource MainForegroundColor}\"\n                                           TextWrapping=\"Wrap\" Margin=\"0,0,0,12\">\n                                    The ISO contents will be extracted to a temporary working directory,\n                                    install.wim will be modified (components removed, tweaks applied),\n                                    and the result will be repackaged. This process may take several minutes\n                                    depending on your hardware.\n                                </TextBlock>\n                                <Button Name=\"WPFWin11ISOModifyButton\"\n                                        Content=\"Run Windows ISO Modification and Creator\"\n                                        HorizontalAlignment=\"Left\"\n                                        Width=\"Auto\" Padding=\"12,0\"\n                                        Height=\"{DynamicResource ButtonHeight}\"/>\n                            </StackPanel>\n\n                            <!-- ─── STEP 4 : Output Options ───────────────────────── -->\n                            <StackPanel Name=\"WPFWin11ISOOutputSection\"\n                                        Margin=\"5\"\n                                        Visibility=\"Collapsed\"\n                                        HorizontalAlignment=\"Left\" MinWidth=\"{DynamicResource ButtonWidth}\">\n                                <!-- Header row: title + Clean & Reset button -->\n                                <Grid Margin=\"0,0,0,12\">\n                                    <Grid.ColumnDefinitions>\n                                        <ColumnDefinition Width=\"*\"/>\n                                        <ColumnDefinition Width=\"Auto\"/>\n                                    </Grid.ColumnDefinitions>\n                                    <TextBlock Grid.Column=\"0\" FontSize=\"{DynamicResource FontSize}\" FontWeight=\"Bold\"\n                                               Foreground=\"{DynamicResource MainForegroundColor}\"\n                                               VerticalAlignment=\"Center\">\n                                        Step 4 - Output: What would you like to do with the modified image?\n                                    </TextBlock>\n                                    <Button Grid.Column=\"1\"\n                                            Name=\"WPFWin11ISOCleanResetButton\"\n                                            Content=\"Clean &amp; Reset\"\n                                            Foreground=\"OrangeRed\"\n                                            Width=\"Auto\" Padding=\"12,0\"\n                                            Height=\"{DynamicResource ButtonHeight}\"\n                                            ToolTip=\"Delete the temporary working directory and reset the interface back to Step 1\"\n                                            Margin=\"12,0,0,0\"/>\n                                </Grid>\n\n                                <!-- ── Choice prompt buttons ── -->\n                                <Grid Margin=\"0,0,0,12\">\n                                    <Grid.ColumnDefinitions>\n                                        <ColumnDefinition Width=\"*\"/>\n                                        <ColumnDefinition Width=\"16\"/>\n                                        <ColumnDefinition Width=\"*\"/>\n                                    </Grid.ColumnDefinitions>\n                                    <Button Grid.Column=\"0\"\n                                            Name=\"WPFWin11ISOChooseISOButton\"\n                                            Content=\"Save as an ISO File\"\n                                            HorizontalAlignment=\"Stretch\"\n                                            Width=\"Auto\" Padding=\"12,0\"\n                                            Height=\"{DynamicResource ButtonHeight}\"/>\n                                    <Button Grid.Column=\"2\"\n                                            Name=\"WPFWin11ISOChooseUSBButton\"\n                                            Content=\"Write Directly to a USB Drive (ERASES DRIVE)\"\n                                            Foreground=\"OrangeRed\"\n                                            HorizontalAlignment=\"Stretch\"\n                                            Width=\"Auto\" Padding=\"12,0\"\n                                            Height=\"{DynamicResource ButtonHeight}\"/>\n                                </Grid>\n\n                                <!-- ── USB write sub-panel (revealed on USB choice) ── -->\n                                <Border Name=\"WPFWin11ISOOptionUSB\"\n                                        Style=\"{StaticResource BorderStyle}\"\n                                        Visibility=\"Collapsed\"\n                                        Margin=\"0,8,0,0\">\n                                    <StackPanel>\n                                        <TextBlock FontSize=\"{DynamicResource FontSize}\"\n                                                   Foreground=\"{DynamicResource MainForegroundColor}\"\n                                                   TextWrapping=\"Wrap\" Margin=\"0,0,0,8\">\n                                            <Run FontWeight=\"Bold\" Foreground=\"OrangeRed\">!! All data on the selected USB drive will be permanently erased !!</Run>\n                                            <LineBreak/>\n                                            Select a removable USB drive below, then click Erase &amp; Write.\n                                        </TextBlock>\n                                        <!-- USB drive selector row -->\n                                        <Grid Margin=\"0,0,0,8\">\n                                            <Grid.ColumnDefinitions>\n                                                <ColumnDefinition Width=\"*\"/>\n                                                <ColumnDefinition Width=\"Auto\"/>\n                                            </Grid.ColumnDefinitions>\n                                            <ComboBox Grid.Column=\"0\"\n                                                      Name=\"WPFWin11ISOUSBDriveComboBox\"\n                                                      Foreground=\"{DynamicResource MainForegroundColor}\"\n                                                      Background=\"{DynamicResource MainBackgroundColor}\"\n                                                      VerticalAlignment=\"Center\"\n                                                      Margin=\"0,0,6,0\"/>\n                                            <Button Grid.Column=\"1\"\n                                                    Name=\"WPFWin11ISORefreshUSBButton\"\n                                                    Content=\"Refresh\"\n                                                    Width=\"Auto\" Padding=\"8,0\"\n                                                    Height=\"{DynamicResource ButtonHeight}\"/>\n                                        </Grid>\n                                        <Button Name=\"WPFWin11ISOWriteUSBButton\"\n                                                Content=\"Erase &amp; Write to USB\"\n                                                Foreground=\"OrangeRed\"\n                                                HorizontalAlignment=\"Stretch\"\n                                                Width=\"Auto\" Padding=\"12,0\"\n                                                Height=\"{DynamicResource ButtonHeight}\"\n                                                Margin=\"0,0,0,10\"/>\n                                    </StackPanel>\n                                </Border>\n                            </StackPanel>\n\n                    </StackPanel>\n\n                    <!-- Status Log (fills remaining height) -->\n                    <Grid Grid.Row=\"1\" Margin=\"5\">\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"Auto\"/>\n                            <RowDefinition Height=\"*\"/>\n                        </Grid.RowDefinitions>\n                        <TextBlock Grid.Row=\"0\"\n                                   FontSize=\"{DynamicResource FontSize}\" FontWeight=\"Bold\"\n                                   Foreground=\"{DynamicResource MainForegroundColor}\"\n                                   Margin=\"0,0,0,4\">\n                            Status Log\n                        </TextBlock>\n                        <TextBox Grid.Row=\"1\"\n                                 Name=\"WPFWin11ISOStatusLog\"\n                                 IsReadOnly=\"True\"\n                                 TextWrapping=\"Wrap\"\n                                 VerticalScrollBarVisibility=\"Visible\"\n                                 VerticalAlignment=\"Stretch\"\n                                 Padding=\"6\"\n                                 Background=\"{DynamicResource MainBackgroundColor}\"\n                                 Foreground=\"{DynamicResource MainForegroundColor}\"\n                                 BorderBrush=\"{DynamicResource BorderColor}\"\n                                 BorderThickness=\"1\"\n                                 Text=\"Ready. Please select a Windows 11 ISO to begin.\"/>\n                    </Grid>\n\n                </Grid>\n            </TabItem>\n        </TabControl>\n    </Grid>\n</Window>\n"
  }
]