diff --git a/.cliffignore b/.cliffignore deleted file mode 100644 index 187668fd1..000000000 --- a/.cliffignore +++ /dev/null @@ -1,7 +0,0 @@ -9766c534bddad8e82e6d19f9bad5cf70b9887f9a -92ce77ec0ec703c08a659419087a373f76e711f7 -2d53efc945c7747be1755d0b66557a86bdc12cbd -602137b65129b817811b80975a369ebde3270c6d -4eb26ae37e1f4c82a45961517ffeb54c20200408 -e59adce848a9e10ee5775254045cbbd915236b8b -9e0a64108d62236ab07b3f8d10e8c78269b8e1d1 diff --git a/.github/ISSUE_TEMPLATE/feature---enhancement-request.md b/.github/ISSUE_TEMPLATE/feature---enhancement-request.md deleted file mode 100644 index 9f68fc3a6..000000000 --- a/.github/ISSUE_TEMPLATE/feature---enhancement-request.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: Feature / Enhancement request -about: Suggest an idea for TorrentPier -title: "[Feature]" -labels: [Feature, Enhancement] -assignees: '' ---- diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml deleted file mode 100644 index 8e256db33..000000000 --- a/.github/workflows/cd.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: Continuous Deployment - -on: - push: - tags: - - "v*.*.*" - -jobs: - generate-changelog: - name: Generate changelog - runs-on: ubuntu-22.04 - outputs: - release_body: ${{ steps.git-cliff.outputs.content }} - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Generate a changelog - uses: orhun/git-cliff-action@v4 - id: git-cliff - with: - config: cliff.toml - args: -vv --latest --no-exec --github-repo ${{ github.repository }} - - - name: Print the changelog - run: cat "${{ steps.git-cliff.outputs.changelog }}" - - release: - name: Create release - needs: [ generate-changelog ] - runs-on: ubuntu-22.04 - - steps: - - uses: actions/checkout@v4 - - name: Set the release version - shell: bash - run: echo "RELEASE_VERSION=${GITHUB_REF:11}" >> $GITHUB_ENV - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: '8.3' - - - name: Install Composer dependencies - run: composer install --no-dev --no-progress --prefer-dist --optimize-autoloader - - - name: Cleanup - run: php _cleanup.php && rm _cleanup.php - - - name: Create archive - id: create-zip - run: | - ZIP_NAME="torrentpier-v${{ env.RELEASE_VERSION }}.zip" - zip -r "$ZIP_NAME" . -x ".git/*" - echo "ZIP_NAME=$ZIP_NAME" >> $GITHUB_OUTPUT - - - name: Publish to GitHub - if: ${{ !contains(github.ref, '-') }} - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: ${{ steps.create-zip.outputs.ZIP_NAME }} - overwrite: true - tag: ${{ github.ref }} - release_name: "v${{ env.RELEASE_VERSION }}" - body: "${{ needs.generate-changelog.outputs.release_body }}" - - - name: Publish to GitHub (pre-release) - if: ${{ contains(github.ref, '-') }} - uses: svenstaro/upload-release-action@v2 - with: - repo_token: ${{ secrets.GITHUB_TOKEN }} - file: ${{ steps.create-zip.outputs.ZIP_NAME }} - overwrite: true - tag: ${{ github.ref }} - release_name: "v${{ env.RELEASE_VERSION }}" - body: "${{ needs.generate-changelog.outputs.release_body }}" - prerelease: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 424e53a1f..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: Continuous Integration - -on: - push: - branches: - - master - -jobs: - nightly: - name: Nightly builds ๐Ÿ“ฆ - runs-on: ubuntu-22.04 - - steps: - - name: Checkout code ๐Ÿ—ณ - uses: actions/checkout@v4 - - - name: Setup PHP ๐Ÿ”ฉ - uses: shivammathur/setup-php@v2 - with: - php-version: '8.3' - - - name: Install Composer dependencies ๐Ÿชš - run: composer install --no-dev --no-progress --prefer-dist --optimize-autoloader - - - name: Get commit hash ๐Ÿ”— - id: get-commit-hash - run: | - COMMIT_HASH=$(git rev-parse --short HEAD) - echo "COMMIT_HASH=$COMMIT_HASH" >> $GITHUB_OUTPUT - - - name: Cleanup - run: php _cleanup.php && rm _cleanup.php - - - name: Create archive ๐Ÿ—ž - id: create-zip - run: | - ZIP_NAME="torrentpier-${{ steps.get-commit-hash.outputs.COMMIT_HASH }}.zip" - zip -r "$ZIP_NAME" . -x ".git/*" - echo "ZIP_NAME=$ZIP_NAME" >> $GITHUB_OUTPUT - - - name: Upload Archive ๐Ÿ“ค - uses: actions/upload-artifact@v4 - with: - name: TorrentPier-master - path: ${{ steps.create-zip.outputs.ZIP_NAME }} - - deploy: - name: ๐ŸŽ‰ Deploy - runs-on: ubuntu-22.04 - steps: - - name: ๐Ÿšš Get latest code - uses: actions/checkout@v4 - - - name: ๐Ÿ”ฉ Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: '8.3' - - - name: ๐Ÿ–‡ Install Composer dependencies - run: composer install --no-dev --no-progress --prefer-dist --optimize-autoloader - - - name: ๐Ÿ“‚ Sync files - uses: SamKirkland/FTP-Deploy-Action@v4.3.5 - with: - server: ${{ secrets.FTP_SERVER }} - username: ${{ secrets.FTP_USERNAME }} - password: ${{ secrets.FTP_PASSWORD }} - server-dir: ${{ secrets.FTP_DIR }} - protocol: ${{ secrets.FTP_PROTOCOL }} - port: ${{ secrets.FTP_PORT }} - exclude: | - **/.git* - **/.git*/** - .env diff --git a/.github/workflows/phpmd.yml b/.github/workflows/phpmd.yml deleted file mode 100644 index 3e06d7538..000000000 --- a/.github/workflows/phpmd.yml +++ /dev/null @@ -1,57 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. -# PHPMD is a spin-off project of PHP Depend and -# aims to be a PHP equivalent of the well known Java tool PMD. -# What PHPMD does is: It takes a given PHP source code base -# and look for several potential problems within that source. -# These problems can be things like: -# Possible bugs -# Suboptimal code -# Overcomplicated expressions -# Unused parameters, methods, properties -# More details at https://phpmd.org/ - -name: PHPMD - -on: - push: - branches: [ "master" ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ "master" ] - schedule: - - cron: '40 0 * * 3' - -permissions: - contents: read - -jobs: - PHPMD: - name: Run PHPMD scanning - runs-on: ubuntu-latest - permissions: - contents: read # for checkout to fetch code - security-events: write # for github/codeql-action/upload-sarif to upload SARIF results - actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status - - steps: - - name: Checkout code - uses: actions/checkout@v3 - - - name: Setup PHP - uses: shivammathur/setup-php@aa1fe473f9c687b6fb896056d771232c0bc41161 - with: - coverage: none - tools: phpmd - - - name: Run PHPMD - run: phpmd . sarif codesize --reportfile phpmd-results.sarif - continue-on-error: true - - - name: Upload analysis results to GitHub - uses: github/codeql-action/upload-sarif@v2 - with: - sarif_file: phpmd-results.sarif - wait-for-processing: true diff --git a/.github/workflows/schedule.yml b/.github/workflows/schedule.yml deleted file mode 100644 index c1ad4f3c1..000000000 --- a/.github/workflows/schedule.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Changelog generation - -on: - schedule: - - cron: '0 0 * * *' - workflow_dispatch: - -jobs: - changelog: - name: Changelog generation - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - ref: master - token: ${{ secrets.REPO_TOKEN }} - - - name: Generate a changelog - uses: orhun/git-cliff-action@v4 - id: git-cliff - with: - config: cliff.toml - args: v2.4.6-alpha.4.. --verbose - env: - OUTPUT: CHANGELOG.md - GITHUB_REPO: ${{ github.repository }} - - - name: Print the changelog - run: cat "${{ steps.git-cliff.outputs.changelog }}" - - - name: Commit changelog - run: | - git checkout master - git config --local user.name 'belomaxorka' - git config --local user.email 'roman25052006.kelesh@gmail.com' - set +e - git add CHANGELOG.md - git commit -m "changelog: Update CHANGELOG.md ๐Ÿ“–" - git push https://${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git master diff --git a/.htaccess b/.htaccess deleted file mode 100644 index a689fba84..000000000 --- a/.htaccess +++ /dev/null @@ -1,18 +0,0 @@ -## set default server charset -AddDefaultCharset UTF-8 - -## folder listing access control -Options All -Indexes - -## sitemap and atom rewrite -RewriteEngine On -RewriteRule ^sitemap.xml$ sitemap/sitemap.xml [L] -RewriteRule ^/internal_data/atom/(.*) /atom$1 [L] - -## deny access to git folder -RedirectMatch 404 /\\.git(/|$) - -## deny access to system files - -Require all denied - diff --git a/_cleanup.php b/_cleanup.php deleted file mode 100644 index d9802822a..000000000 --- a/_cleanup.php +++ /dev/null @@ -1,57 +0,0 @@ -php ' . basename(__FILE__) . ' in CLI mode'); -} - -// Get all constants -require_once BB_ROOT . 'library/defines.php'; - -// Include CLI functions -require INC_DIR . '/functions_cli.php'; - -// Welcoming message -out("--- Release creation tool ---\n", 'info'); - -$configFile = BB_PATH . '/library/config.php'; - -if (!is_file($configFile)) { - out('- Config file ' . basename($configFile) . ' not found', 'error'); - exit; -} -if (!is_readable($configFile)) { - out('- Config file ' . basename($configFile) . ' is not readable', 'error'); - exit; -} -if (!is_writable($configFile)) { - out('- Config file ' . basename($configFile) . ' is not writable', 'error'); - exit; -} - -// Ask for version -fwrite(STDOUT, 'Enter version number (e.g, v2.4.0): '); -$version = trim(fgets(STDIN)); - -if (empty($version)) { - out("- Version cannot be empty. Please enter a valid version number", 'error'); - exit; -} else { - // Add 'v' prefix if missing - if (!str_starts_with($version, 'v')) { - $version = 'v' . $version; - } - - out("- Using version: $version", 'info'); -} - -// Ask for version emoji -fwrite(STDOUT, 'Enter version emoji: '); -$versionEmoji = trim(fgets(STDIN)); - -if (!empty($versionEmoji)) { - out("- Using version emoji: $versionEmoji", 'info'); -} - -// Ask for release date or use today's date -fwrite(STDOUT, "Enter release date (e.g. 25-05-2025), leave empty to use today's date: "); -$date = trim(fgets(STDIN)); - -if (empty($date)) { - $date = date('d-m-Y'); - out("- Using current date: $date", 'info'); -} else { - // Validate date format (dd-mm-yyyy) - $dateObj = DateTime::createFromFormat('d-m-Y', $date); - if (!$dateObj || $dateObj->format('d-m-Y') !== $date) { - out("- Invalid date format. Expected format: DD-MM-YYYY", 'error'); - exit; - } - - out("- Using date: $date", 'info'); -} - -// Read config file content -$content = file_get_contents($configFile); - -// Update version -$content = preg_replace( - "/\\\$bb_cfg\['tp_version'\]\s*=\s*'[^']*';/", - "\$bb_cfg['tp_version'] = '$version';", - $content -); - -// Update release date -$content = preg_replace( - "/\\\$bb_cfg\['tp_release_date'\]\s*=\s*'[^']*';/", - "\$bb_cfg['tp_release_date'] = '$date';", - $content -); - -// Save updated config -$bytesWritten = file_put_contents($configFile, $content); - -if ($bytesWritten === false) { - out("- Failed to write to config file", 'error'); - exit; -} - -if ($bytesWritten === 0) { - out("- Config file was not updated (0 bytes written)", 'error'); - exit; -} - -out("\n- Config file has been updated!", 'success'); - -// Update CHANGELOG.md -runProcess('npx git-cliff v2.4.6-alpha.4.. --config cliff.toml --tag "' . $version . '" > CHANGELOG.md'); - -// Git add & commit -runProcess('git add -A && git commit -m "release: ' . escapeshellarg($version) . (!empty($versionEmoji) ? (' ' . $versionEmoji) : '') . '"'); - -// Git tag -runProcess("git tag -a \"$version\" -m \"Release $version\""); -runProcess("git tag -v \"$version\""); - -// Git push -runProcess("git push origin master"); -runProcess("git push origin $version"); - -out("\n- Release $version has been successfully prepared, committed and pushed!", 'success'); diff --git a/config/environments/.keep b/app/Console/Commands/.keep similarity index 100% rename from config/environments/.keep rename to app/Console/Commands/.keep diff --git a/internal_data/cache/.keep b/app/Exceptions/.keep similarity index 100% rename from internal_data/cache/.keep rename to app/Exceptions/.keep diff --git a/app/Http/Controllers/Admin/.keep b/app/Http/Controllers/Admin/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/cliff.toml b/cliff.toml deleted file mode 100644 index 1798567f1..000000000 --- a/cliff.toml +++ /dev/null @@ -1,126 +0,0 @@ -# git-cliff ~ TorrentPier configuration file -# https://git-cliff.org/docs/configuration -# -# Lines starting with "#" are comments. -# Configuration options are organized into tables and keys. -# See documentation for more information on available options. - -[remote.github] -owner = "torrentpier" -repo = "torrentpier" - -[changelog] -# template for the changelog header -header = """ -[![TorrentPier](https://raw.githubusercontent.com/torrentpier/.github/refs/heads/main/versions/Cattle.png)](https://github.com/torrentpier)\n -# ๐Ÿ“– Change Log\n -""" -# template for the changelog body -# https://keats.github.io/tera/docs/#introduction -body = """ -{%- macro remote_url() -%} - https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} -{%- endmacro -%} - -{%- macro nightly_url() -%} - https://nightly.link/{{ remote.github.owner }}/{{ remote.github.repo }}/workflows/ci/master/TorrentPier-master -{%- endmacro -%} - -{% macro print_commit(commit) -%} - - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ - {% if commit.breaking %}[**breaking**] {% endif %}\ - {{ commit.message | upper_first }} - \ - ([{{ commit.id | truncate(length=7, end="") }}]({{ self::remote_url() }}/commit/{{ commit.id }}))\ -{% endmacro -%} - -{% if version %}\ - {% if previous.version %}\ - ## [{{ version }}]\ - ({{ self::remote_url() }}/compare/{{ previous.version }}..{{ version }}) ({{ timestamp | date(format="%Y-%m-%d") }}) - {% else %}\ - ## {{ version }} ({{ timestamp | date(format="%Y-%m-%d") }}) - {% endif %}\ -{% else %}\ - ## [nightly]({{ self::nightly_url() }}) -{% endif %}\ - -{% for group, commits in commits | group_by(attribute="group") %} - ### {{ group | striptags | trim | upper_first }} - {% for commit in commits - | filter(attribute="scope") - | sort(attribute="scope") %} - {{ self::print_commit(commit=commit) }} - {%- endfor %} - {% for commit in commits %} - {%- if not commit.scope -%} - {{ self::print_commit(commit=commit) }} - {% endif -%} - {% endfor -%} -{% endfor -%} -{%- if github -%} -{% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} - ## New Contributors โค๏ธ -{% endif %}\ -{% for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} - * @{{ contributor.username }} made their first contribution - {%- if contributor.pr_number %} in \ - [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ - {%- endif %} -{%- endfor -%} -{%- endif %} - - -""" -# template for the changelog footer -footer = """ -""" -# remove the leading and trailing whitespace from the templates -trim = true -# postprocessors -postprocessors = [ - { pattern = '', replace = "https://github.com/torrentpier/torrentpier" }, # replace repository URL -] - -[git] -# parse the commits based on https://www.conventionalcommits.org -conventional_commits = true -# filter out the commits that are not conventional -filter_unconventional = true -# process each line of a commit as an individual commit -split_commits = false -# regex for preprocessing the commit messages -commit_preprocessors = [ - # Replace issue numbers - { pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/pull/${2}))" }, - # Check spelling of the commit with https://github.com/crate-ci/typos - # If the spelling is incorrect, it will be automatically fixed. - # { pattern = '.*', replace_command = 'typos --write-changes -' }, -] -# regex for parsing and grouping commits -commit_parsers = [ - { message = "^feat", group = "๐Ÿš€ Features" }, - { message = "^fix", group = "๐Ÿ› Bug Fixes" }, - { message = "^doc", group = "๐Ÿ“š Documentation" }, - { message = "^perf", group = "โšก Performance" }, - { message = "^refactor", group = "๐Ÿšœ Refactor" }, - { message = "^style", group = "๐ŸŽจ Styling" }, - { message = "^test", group = "๐Ÿงช Testing" }, - { message = "^ignore|^release|^changelog", skip = true }, - { message = "^chore|^ci|^misc", group = "โš™๏ธ Miscellaneous" }, - { body = ".*security", group = "๐Ÿ›ก๏ธ Security" }, - { message = "^revert", group = "โ—€๏ธ Revert" }, - { message = "^crowdin|^crodwin", group = "๐Ÿˆณ New translations" }, # crowdin pulls supporting - { message = "^Composer", group = "๐Ÿ“ฆ Dependencies" }, # dependabot pulls supporting - { message = "^rem|^drop|^removed", group = "๐Ÿ—‘๏ธ Removed" }, - { message = ".*", group = "๐Ÿ’ผ Other" }, -] -# protect breaking changes from being skipped due to matching a skipping commit_parser -protect_breaking_commits = false -# filter out the commits that are not matched by commit parsers -filter_commits = false -# regex for matching git tags -tag_pattern = "v[0-9].*" -# sort the tags topologically -topo_order = false -# sort the commits inside sections by oldest/newest order -sort_commits = "newest" diff --git a/common.php b/common.php index a5f2ae3d4..0c3c346b3 100644 --- a/common.php +++ b/common.php @@ -55,18 +55,6 @@ if (!is_file(BB_PATH . '/vendor/autoload.php')) { } require_once BB_PATH . '/vendor/autoload.php'; -/** - * Gets the value of an environment variable. - * - * @param string $key - * @param mixed|null $default - * @return mixed - */ -function env(string $key, mixed $default = null): mixed -{ - return \TorrentPier\Env::get($key, $default); -} - // Load ENV try { $dotenv = Dotenv\Dotenv::createMutable(BB_PATH); diff --git a/composer.json b/composer.json index d8e73149b..20b053793 100644 --- a/composer.json +++ b/composer.json @@ -59,16 +59,17 @@ "gemorroj/m3u-parser": "^6.0.1", "gigablah/sphinxphp": "2.0.8", "google/recaptcha": "^1.3", + "illuminate/container": "^12.19", + "illuminate/http": "^12.19", + "illuminate/support": "^12.19", "jacklul/monolog-telegram": "^3.1", "josantonius/cookie": "^2.0", "league/flysystem": "^3.28", - "league/route": "^6.2", "longman/ip-tools": "1.2.1", "monolog/monolog": "^3.4", "nette/caching": "^3.3", "nette/database": "^3.2", "php-curl-class/php-curl-class": "^12.0.0", - "php-di/php-di": "^7.0", "robmorgan/phinx": "^0.16.9", "samdark/sitemap": "2.4.1", "symfony/mailer": "^7.3", @@ -83,10 +84,12 @@ }, "autoload": { "psr-4": { - "TorrentPier\\": "src/" + "TorrentPier\\": "src/", + "App\\": "app/" }, "files": [ - "src/helpers.php" + "src/helpers.php", + "app/helpers.php" ] }, "autoload-dev": { diff --git a/composer.lock b/composer.lock index ad808f575..d3502768f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8334ef08115fb688baf7bde81a18031c", + "content-hash": "99433ae342bb6c1dc1d9a8e9f933d1f1", "packages": [ { "name": "arokettu/bencode", @@ -867,6 +867,75 @@ }, "time": "2025-05-21T14:35:19+00:00" }, + { + "name": "carbonphp/carbon-doctrine-types", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon-doctrine-types.git", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/dbal": "<4.0.0 || >=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, { "name": "claviska/simpleimage", "version": "4.2.1", @@ -996,6 +1065,97 @@ ], "time": "2025-05-26T15:08:54+00:00" }, + { + "name": "doctrine/inflector", + "version": "2.0.10", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.10" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2024-02-18T20:23:39+00:00" + }, { "name": "doctrine/lexer", "version": "3.0.1", @@ -1211,6 +1371,77 @@ ], "time": "2025-06-16T00:02:10+00:00" }, + { + "name": "fruitcake/php-cors", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/3d158f36e7875e2f040f37bc0573956240a5a38b", + "reference": "3d158f36e7875e2f040f37bc0573956240a5a38b", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6|^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2023-10-12T05:21:21+00:00" + }, { "name": "gemorroj/m3u-parser", "version": "6.0.1", @@ -1754,6 +1985,602 @@ ], "time": "2025-03-27T12:30:47+00:00" }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "30e286560c137526eccd4ce21b2de477ab0676d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/30e286560c137526eccd4ce21b2de477ab0676d2", + "reference": "30e286560c137526eccd4ce21b2de477ab0676d2", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2025-02-03T10:55:03+00:00" + }, + { + "name": "illuminate/collections", + "version": "v12.19.3", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "21a206b2b2297e838c181b482b5f8bbe7ac48f61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/21a206b2b2297e838c181b482b5f8bbe7ac48f61", + "reference": "21a206b2b2297e838c181b482b5f8bbe7ac48f61", + "shasum": "" + }, + "require": { + "illuminate/conditionable": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "php": "^8.2" + }, + "suggest": { + "illuminate/http": "Required to convert collections to API resources (^12.0).", + "symfony/var-dumper": "Required to use the dump method (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php", + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-06-12T14:21:37+00:00" + }, + { + "name": "illuminate/conditionable", + "version": "v12.19.3", + "source": { + "type": "git", + "url": "https://github.com/illuminate/conditionable.git", + "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/ec677967c1f2faf90b8428919124d2184a4c9b49", + "reference": "ec677967c1f2faf90b8428919124d2184a4c9b49", + "shasum": "" + }, + "require": { + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Conditionable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-05-13T15:08:45+00:00" + }, + { + "name": "illuminate/container", + "version": "v12.19.3", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "ff9dde2c8dce16ea9ecf0418095749311240aff9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/ff9dde2c8dce16ea9ecf0418095749311240aff9", + "reference": "ff9dde2c8dce16ea9ecf0418095749311240aff9", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^12.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1" + }, + "provide": { + "psr/container-implementation": "1.1|2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-06-09T14:04:48+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v12.19.3", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "ad1d16d827927455d3b7e39fabac66b1afb82582" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/ad1d16d827927455d3b7e39fabac66b1afb82582", + "reference": "ad1d16d827927455d3b7e39fabac66b1afb82582", + "shasum": "" + }, + "require": { + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-06-12T15:07:31+00:00" + }, + { + "name": "illuminate/filesystem", + "version": "v12.19.3", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "a5ec0cc347d46ff4aa3615c7739f321df3183fb7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/a5ec0cc347d46ff4aa3615c7739f321df3183fb7", + "reference": "a5ec0cc347d46ff4aa3615c7739f321df3183fb7", + "shasum": "" + }, + "require": { + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2", + "symfony/finder": "^7.2.0" + }, + "suggest": { + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-hash": "Required to use the Filesystem class.", + "illuminate/http": "Required for handling uploaded files (^12.0).", + "league/flysystem": "Required to use the Flysystem local driver (^3.25.1).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/mime": "Required to enable support for guessing extensions (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-06-17T23:40:32+00:00" + }, + { + "name": "illuminate/http", + "version": "v12.19.3", + "source": { + "type": "git", + "url": "https://github.com/illuminate/http.git", + "reference": "a2a8a2ee62a6dacee2dc4162c59f9bbeb68ec9ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/http/zipball/a2a8a2ee62a6dacee2dc4162c59f9bbeb68ec9ee", + "reference": "a2a8a2ee62a6dacee2dc4162c59f9bbeb68ec9ee", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "illuminate/collections": "^12.0", + "illuminate/macroable": "^12.0", + "illuminate/session": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.31" + }, + "suggest": { + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image()." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Http\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Http package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-06-11T21:44:58+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v12.19.3", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "e862e5648ee34004fa56046b746f490dfa86c613" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e862e5648ee34004fa56046b746f490dfa86c613", + "reference": "e862e5648ee34004fa56046b746f490dfa86c613", + "shasum": "" + }, + "require": { + "php": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-07-23T16:31:01+00:00" + }, + { + "name": "illuminate/session", + "version": "v12.19.3", + "source": { + "type": "git", + "url": "https://github.com/illuminate/session.git", + "reference": "9d27155b34bca502fe3e1adc16035b46d5ef3ed8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/session/zipball/9d27155b34bca502fe3e1adc16035b46d5ef3ed8", + "reference": "9d27155b34bca502fe3e1adc16035b46d5ef3ed8", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-session": "*", + "illuminate/collections": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/filesystem": "^12.0", + "illuminate/support": "^12.0", + "php": "^8.2", + "symfony/finder": "^7.2.0", + "symfony/http-foundation": "^7.2.0" + }, + "suggest": { + "illuminate/console": "Required to use the session:table command (^12.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Session\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Session package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-05-13T15:08:45+00:00" + }, + { + "name": "illuminate/support", + "version": "v12.19.3", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "4e5d098d1cdbf5cabff09c1903a141bd9747ae75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/4e5d098d1cdbf5cabff09c1903a141bd9747ae75", + "reference": "4e5d098d1cdbf5cabff09c1903a141bd9747ae75", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-mbstring": "*", + "illuminate/collections": "^12.0", + "illuminate/conditionable": "^12.0", + "illuminate/contracts": "^12.0", + "illuminate/macroable": "^12.0", + "nesbot/carbon": "^3.8.4", + "php": "^8.2", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "replace": { + "spatie/once": "*" + }, + "suggest": { + "illuminate/filesystem": "Required to use the Composer class (^12.0).", + "laravel/serializable-closure": "Required to use the once function (^1.3|^2.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.7).", + "league/uri": "Required to use the Uri class (^7.5.1).", + "ramsey/uuid": "Required to use Str::uuid() (^4.7).", + "symfony/process": "Required to use the Composer class (^7.2).", + "symfony/uid": "Required to use Str::ulid() (^7.2).", + "symfony/var-dumper": "Required to use the dd function (^7.2).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.6.1)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php", + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2025-06-12T15:07:56+00:00" + }, { "name": "jacklul/monolog-telegram", "version": "3.2.0", @@ -1879,67 +2706,6 @@ ], "time": "2024-09-11T14:15:04+00:00" }, - { - "name": "laravel/serializable-closure", - "version": "v2.0.4", - "source": { - "type": "git", - "url": "https://github.com/laravel/serializable-closure.git", - "reference": "b352cf0534aa1ae6b4d825d1e762e35d43f8a841" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b352cf0534aa1ae6b4d825d1e762e35d43f8a841", - "reference": "b352cf0534aa1ae6b4d825d1e762e35d43f8a841", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "illuminate/support": "^10.0|^11.0|^12.0", - "nesbot/carbon": "^2.67|^3.0", - "pestphp/pest": "^2.36|^3.0", - "phpstan/phpstan": "^2.0", - "symfony/var-dumper": "^6.2.0|^7.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Laravel\\SerializableClosure\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Taylor Otwell", - "email": "taylor@laravel.com" - }, - { - "name": "Nuno Maduro", - "email": "nuno@laravel.com" - } - ], - "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", - "keywords": [ - "closure", - "laravel", - "serializable" - ], - "support": { - "issues": "https://github.com/laravel/serializable-closure/issues", - "source": "https://github.com/laravel/serializable-closure" - }, - "time": "2025-03-19T13:51:03+00:00" - }, { "name": "league/color-extractor", "version": "0.4.0", @@ -2271,96 +3037,6 @@ ], "time": "2024-09-21T08:32:55+00:00" }, - { - "name": "league/route", - "version": "6.2.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/route.git", - "reference": "38775ed32d49ff1ce98d88adaa06a8d66b923436" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/route/zipball/38775ed32d49ff1ce98d88adaa06a8d66b923436", - "reference": "38775ed32d49ff1ce98d88adaa06a8d66b923436", - "shasum": "" - }, - "require": { - "laravel/serializable-closure": "^2.0.0", - "nikic/fast-route": "^1.3", - "php": "^8.1", - "psr/container": "^2.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^2.0", - "psr/http-server-handler": "^1.0.1", - "psr/http-server-middleware": "^1.0.1", - "psr/simple-cache": "^3.0" - }, - "replace": { - "orno/http": "~1.0", - "orno/route": "~1.0" - }, - "require-dev": { - "laminas/laminas-diactoros": "^3.5", - "phpstan/phpstan": "^1.12", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^10.2", - "roave/security-advisories": "dev-latest", - "scrutinizer/ocular": "^1.8", - "squizlabs/php_codesniffer": "^3.7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev", - "dev-2.x": "2.x-dev", - "dev-3.x": "3.x-dev", - "dev-4.x": "4.x-dev", - "dev-5.x": "5.x-dev", - "dev-6.x": "6.x-dev", - "dev-master": "6.x-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Route\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Phil Bennett", - "email": "mail@philbennett.co.uk", - "role": "Developer" - } - ], - "description": "Fast routing and dispatch component including PSR-15 middleware, built on top of FastRoute.", - "homepage": "https://github.com/thephpleague/route", - "keywords": [ - "dispatcher", - "league", - "psr-15", - "psr-7", - "psr15", - "psr7", - "route", - "router" - ], - "support": { - "issues": "https://github.com/thephpleague/route/issues", - "source": "https://github.com/thephpleague/route/tree/6.2.0" - }, - "funding": [ - { - "url": "https://github.com/philipobenito", - "type": "github" - } - ], - "time": "2024-11-25T08:10:15+00:00" - }, { "name": "longman/ip-tools", "version": "1.2.1", @@ -2524,6 +3200,111 @@ ], "time": "2025-03-24T10:02:05+00:00" }, + { + "name": "nesbot/carbon", + "version": "3.10.1", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "1fd1935b2d90aef2f093c5e35f7ae1257c448d00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/1fd1935b2d90aef2f093c5e35f7ae1257c448d00", + "reference": "1fd1935b2d90aef2f093c5e35f7ae1257c448d00", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.75.0", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.17", + "phpunit/phpunit": "^10.5.46", + "squizlabs/php_codesniffer": "^3.13.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2025-06-21T15:19:35+00:00" + }, { "name": "nette/caching", "version": "v3.3.1", @@ -2759,56 +3540,6 @@ }, "time": "2025-06-03T04:55:08+00:00" }, - { - "name": "nikic/fast-route", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/FastRoute.git", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", - "reference": "181d480e08d9476e61381e04a71b34dc0432e812", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35|~5.7" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "FastRoute\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov", - "email": "nikic@php.net" - } - ], - "description": "Fast request router for PHP", - "keywords": [ - "router", - "routing" - ], - "support": { - "issues": "https://github.com/nikic/FastRoute/issues", - "source": "https://github.com/nikic/FastRoute/tree/master" - }, - "time": "2018-02-13T20:26:39+00:00" - }, { "name": "nikic/iter", "version": "v2.4.1", @@ -2941,134 +3672,6 @@ }, "time": "2025-03-25T18:04:16+00:00" }, - { - "name": "php-di/invoker", - "version": "2.3.6", - "source": { - "type": "git", - "url": "https://github.com/PHP-DI/Invoker.git", - "reference": "59f15608528d8a8838d69b422a919fd6b16aa576" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/59f15608528d8a8838d69b422a919fd6b16aa576", - "reference": "59f15608528d8a8838d69b422a919fd6b16aa576", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "psr/container": "^1.0|^2.0" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "mnapoli/hard-mode": "~0.3.0", - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Invoker\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Generic and extensible callable invoker", - "homepage": "https://github.com/PHP-DI/Invoker", - "keywords": [ - "callable", - "dependency", - "dependency-injection", - "injection", - "invoke", - "invoker" - ], - "support": { - "issues": "https://github.com/PHP-DI/Invoker/issues", - "source": "https://github.com/PHP-DI/Invoker/tree/2.3.6" - }, - "funding": [ - { - "url": "https://github.com/mnapoli", - "type": "github" - } - ], - "time": "2025-01-17T12:49:27+00:00" - }, - { - "name": "php-di/php-di", - "version": "7.0.11", - "source": { - "type": "git", - "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "32f111a6d214564520a57831d397263e8946c1d2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/32f111a6d214564520a57831d397263e8946c1d2", - "reference": "32f111a6d214564520a57831d397263e8946c1d2", - "shasum": "" - }, - "require": { - "laravel/serializable-closure": "^1.0 || ^2.0", - "php": ">=8.0", - "php-di/invoker": "^2.0", - "psr/container": "^1.1 || ^2.0" - }, - "provide": { - "psr/container-implementation": "^1.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3", - "friendsofphp/proxy-manager-lts": "^1", - "mnapoli/phpunit-easymock": "^1.3", - "phpunit/phpunit": "^9.6 || ^10 || ^11", - "vimeo/psalm": "^5|^6" - }, - "suggest": { - "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions.php" - ], - "psr-4": { - "DI\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The dependency injection container for humans", - "homepage": "https://php-di.org/", - "keywords": [ - "PSR-11", - "container", - "container-interop", - "dependency injection", - "di", - "ioc", - "psr11" - ], - "support": { - "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.11" - }, - "funding": [ - { - "url": "https://github.com/mnapoli", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/php-di/php-di", - "type": "tidelift" - } - ], - "time": "2025-06-03T07:45:57+00:00" - }, { "name": "phpoption/phpoption", "version": "1.9.3", @@ -3455,119 +4058,6 @@ }, "time": "2023-04-04T09:54:51+00:00" }, - { - "name": "psr/http-server-handler", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-server-handler.git", - "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", - "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "psr/http-message": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Server\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP server-side request handler", - "keywords": [ - "handler", - "http", - "http-interop", - "psr", - "psr-15", - "psr-7", - "request", - "response", - "server" - ], - "support": { - "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" - }, - "time": "2023-04-10T20:06:20+00:00" - }, - { - "name": "psr/http-server-middleware", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-server-middleware.git", - "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", - "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", - "shasum": "" - }, - "require": { - "php": ">=7.0", - "psr/http-message": "^1.0 || ^2.0", - "psr/http-server-handler": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Server\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP server-side middleware", - "keywords": [ - "http", - "http-interop", - "middleware", - "psr", - "psr-15", - "psr-7", - "request", - "response" - ], - "support": { - "issues": "https://github.com/php-fig/http-server-middleware/issues", - "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" - }, - "time": "2023-04-11T06:14:47+00:00" - }, { "name": "psr/log", "version": "3.0.2", @@ -3859,6 +4349,80 @@ ], "time": "2023-11-01T08:41:34+00:00" }, + { + "name": "symfony/clock", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, { "name": "symfony/config", "version": "v7.3.0", @@ -4095,6 +4659,83 @@ ], "time": "2024-09-25T14:21:43+00:00" }, + { + "name": "symfony/error-handler", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "cf68d225bc43629de4ff54778029aee6dc191b83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/cf68d225bc43629de4ff54778029aee6dc191b83", + "reference": "cf68d225bc43629de4ff54778029aee6dc191b83", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-05-29T07:19:49+00:00" + }, { "name": "symfony/event-dispatcher", "version": "v7.3.0", @@ -4381,6 +5022,199 @@ ], "time": "2024-12-30T19:00:26+00:00" }, + { + "name": "symfony/http-foundation", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "4236baf01609667d53b20371486228231eb135fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4236baf01609667d53b20371486228231eb135fd", + "reference": "4236baf01609667d53b20371486228231eb135fd", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-05-12T14:48:23+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "ac7b8e163e8c83dce3abcc055a502d4486051a9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ac7b8e163e8c83dce3abcc055a502d4486051a9f", + "reference": "ac7b8e163e8c83dce3abcc055a502d4486051a9f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", + "symfony/http-foundation": "^7.3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-05-29T07:47:32+00:00" + }, { "name": "symfony/mailer", "version": "v7.3.0", @@ -4832,6 +5666,264 @@ ], "time": "2025-04-20T20:19:01+00:00" }, + { + "name": "symfony/translation", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "4aba29076a29a3aa667e09b791e5f868973a8667" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/4aba29076a29a3aa667e09b791e5f868973a8667", + "reference": "4aba29076a29a3aa667e09b791e5f868973a8667", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-05-29T07:19:49+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-27T08:32:26+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "548f6760c54197b1084e1e5c71f6d9d523f2f78e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/548f6760c54197b1084e1e5c71f6d9d523f2f78e", + "reference": "548f6760c54197b1084e1e5c71f6d9d523f2f78e", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.3.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-04-27T18:39:23+00:00" + }, { "name": "vlucas/phpdotenv", "version": "v5.6.2", @@ -4916,6 +6008,80 @@ ], "time": "2025-04-30T23:37:27+00:00" }, + { + "name": "voku/portable-ascii", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2024-11-21T01:49:47+00:00" + }, { "name": "z4kn4fein/php-semver", "version": "v3.0.0", @@ -7823,90 +8989,6 @@ ], "time": "2025-04-17T09:11:12+00:00" }, - { - "name": "symfony/var-dumper", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "548f6760c54197b1084e1e5c71f6d9d523f2f78e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/548f6760c54197b1084e1e5c71f6d9d523f2f78e", - "reference": "548f6760c54197b1084e1e5c71f6d9d523f2f78e", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/console": "<6.4" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.12" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides mechanisms for walking through any arbitrary PHP variable", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-04-27T18:39:23+00:00" - }, { "name": "ta-tikoma/phpunit-architecture-test", "version": "0.8.5", diff --git a/migrations/20250619000001_initial_schema.php b/database/migrations/20250619000001_initial_schema.php similarity index 100% rename from migrations/20250619000001_initial_schema.php rename to database/migrations/20250619000001_initial_schema.php diff --git a/migrations/20250619000002_seed_initial_data.php b/database/migrations/20250619000002_seed_initial_data.php similarity index 100% rename from migrations/20250619000002_seed_initial_data.php rename to database/migrations/20250619000002_seed_initial_data.php diff --git a/migrations/20250620001449_remove_demo_mode.php b/database/migrations/20250620001449_remove_demo_mode.php similarity index 100% rename from migrations/20250620001449_remove_demo_mode.php rename to database/migrations/20250620001449_remove_demo_mode.php diff --git a/docs/examples/di-container-usage.php b/docs/examples/di-container-usage.php deleted file mode 100644 index fcfc0bdf9..000000000 --- a/docs/examples/di-container-usage.php +++ /dev/null @@ -1,99 +0,0 @@ -has('some.service'); // Check if service exists - -// ===== PHASE 2: Domain Modeling (FUTURE) ===== - -// 3. Repository interfaces (when implemented in Domain layer) -// $userRepository = app('TorrentPier\Domain\User\Repository\UserRepositoryInterface'); -// $torrentRepository = app('TorrentPier\Domain\Tracker\Repository\TorrentRepositoryInterface'); -// $forumRepository = app('TorrentPier\Domain\Forum\Repository\ForumRepositoryInterface'); - -// ===== PHASE 3: Application Services (FUTURE) ===== - -// 4. Command/Query handlers (when implemented) -// $registerUserHandler = app('TorrentPier\Application\User\Handler\RegisterUserHandler'); -// $announceHandler = app('TorrentPier\Application\Tracker\Handler\ProcessAnnounceHandler'); -// $createPostHandler = app('TorrentPier\Application\Forum\Handler\CreatePostHandler'); - -// 5. Making command instances with parameters -// $command = $container->make('TorrentPier\Application\User\Command\RegisterUserCommand', [ -// 'username' => 'john_doe', -// 'email' => 'john@example.com', -// 'password' => 'secure_password' -// ]); - -// ===== PHASE 4: Infrastructure (FUTURE) ===== - -// 6. Database and cache (when infrastructure is implemented) -// $database = app('database.connection.default'); -// $cache = app('cache.factory')('forum'); // Get cache instance for 'forum' namespace - -// ===== PHASE 5: Presentation (FUTURE) ===== - -// 7. Controllers (when implemented) -// $userController = app('TorrentPier\Presentation\Http\Controllers\Api\UserController'); -// $trackerController = app('TorrentPier\Presentation\Http\Controllers\Web\TrackerController'); - -// ===== TESTING EXAMPLES ===== - -// 8. Testing with custom container (works now) -$testContainer = ContainerFactory::create([ - 'definitions' => [ - 'test.service' => \DI\factory(function () { - return new class { - public function test() { return 'test'; } - }; - }), - ], - 'environment' => 'testing', -]); - -// 9. Safe service resolution (works now) -try { - $service = app('optional.service'); -} catch (RuntimeException $e) { - // Service not found, handle gracefully - $service = null; -} - -// ===== LEGACY INTEGRATION (CURRENT) ===== - -// 10. Integration with legacy code -// In legacy files, after including common.php or similar: -if (!Bootstrap::getContainer()) { - Bootstrap::init(BB_ROOT ?? __DIR__ . '/../..'); -} - -// 11. Method injection (works now if service exists) -class ExampleService -{ - public function processData(string $data) - { - // Container can inject dependencies when calling this method - return "Processed: $data"; - } -} - -$exampleService = new ExampleService(); -$result = $container->call([$exampleService, 'processData'], [ - 'data' => 'test data' -]); \ No newline at end of file diff --git a/docs/specs/hexagonal-architecture-spec.md b/docs/specs/hexagonal-architecture-spec.md deleted file mode 100644 index 07dc0a672..000000000 --- a/docs/specs/hexagonal-architecture-spec.md +++ /dev/null @@ -1,436 +0,0 @@ -# Hexagonal Architecture Directory Structure Specification - -## Overview - -This document specifies the new hexagonal architecture directory structure for TorrentPier 3.0. The structure follows Domain-Driven Design (DDD) principles and implements a clean separation of concerns through hexagonal architecture (ports and adapters pattern). - -## Directory Structure - -``` -/src/ -โ”œโ”€โ”€ Domain/ # Core business logic - no framework dependencies -โ”‚ โ”œโ”€โ”€ Forum/ # Forum bounded context -โ”‚ โ”‚ โ”œโ”€โ”€ Model/ # Aggregates and entities -โ”‚ โ”‚ โ”œโ”€โ”€ ValueObject/ # Value objects (PostId, ThreadTitle, etc.) -โ”‚ โ”‚ โ”œโ”€โ”€ Repository/ # Repository interfaces -โ”‚ โ”‚ โ””โ”€โ”€ Exception/ # Domain-specific exceptions -โ”‚ โ”œโ”€โ”€ Tracker/ # BitTorrent tracker bounded context -โ”‚ โ”‚ โ”œโ”€โ”€ Model/ # Torrent, Peer aggregates -โ”‚ โ”‚ โ”œโ”€โ”€ ValueObject/ # InfoHash, PeerId, etc. -โ”‚ โ”‚ โ”œโ”€โ”€ Repository/ # Repository interfaces -โ”‚ โ”‚ โ””โ”€โ”€ Exception/ # Tracker-specific exceptions -โ”‚ โ”œโ”€โ”€ User/ # User management bounded context -โ”‚ โ”‚ โ”œโ”€โ”€ Model/ # User aggregate -โ”‚ โ”‚ โ”œโ”€โ”€ ValueObject/ # UserId, Email, Username -โ”‚ โ”‚ โ”œโ”€โ”€ Repository/ # User repository interface -โ”‚ โ”‚ โ””โ”€โ”€ Exception/ # Authentication/authorization exceptions -โ”‚ โ””โ”€โ”€ Shared/ # Shared kernel - minimal shared concepts -โ”‚ โ”œโ”€โ”€ Model/ # Base classes (AggregateRoot, Entity) -โ”‚ โ”œโ”€โ”€ ValueObject/ # Common value objects (Id, DateTime) -โ”‚ โ””โ”€โ”€ Event/ # Domain events base classes -โ”‚ -โ”œโ”€โ”€ Application/ # Application services - orchestration layer -โ”‚ โ”œโ”€โ”€ Forum/ -โ”‚ โ”‚ โ”œโ”€โ”€ Command/ # Commands (CreatePost, LockThread) -โ”‚ โ”‚ โ”œโ”€โ”€ Query/ # Queries (GetThreadList, SearchPosts) -โ”‚ โ”‚ โ””โ”€โ”€ Handler/ # Command and query handlers -โ”‚ โ”œโ”€โ”€ Tracker/ -โ”‚ โ”‚ โ”œโ”€โ”€ Command/ # Commands (RegisterTorrent, ProcessAnnounce) -โ”‚ โ”‚ โ”œโ”€โ”€ Query/ # Queries (GetPeerList, GetTorrentStats) -โ”‚ โ”‚ โ””โ”€โ”€ Handler/ # Command and query handlers -โ”‚ โ””โ”€โ”€ User/ -โ”‚ โ”œโ”€โ”€ Command/ # Commands (RegisterUser, ChangePassword) -โ”‚ โ”œโ”€โ”€ Query/ # Queries (GetUserProfile, SearchUsers) -โ”‚ โ””โ”€โ”€ Handler/ # Command and query handlers -โ”‚ -โ”œโ”€โ”€ Infrastructure/ # External concerns and implementations -โ”‚ โ”œโ”€โ”€ Persistence/ # Data persistence layer -โ”‚ โ”‚ โ”œโ”€โ”€ Database/ # Database adapter and connection management -โ”‚ โ”‚ โ”œโ”€โ”€ Migration/ # Database migrations -โ”‚ โ”‚ โ””โ”€โ”€ Repository/ # Repository implementations -โ”‚ โ”œโ”€โ”€ Cache/ # Caching implementations -โ”‚ โ”‚ โ”œโ”€โ”€ Redis/ # Redis adapter -โ”‚ โ”‚ โ”œโ”€โ”€ Memcached/ # Memcached adapter -โ”‚ โ”‚ โ””โ”€โ”€ File/ # File-based cache adapter -โ”‚ โ”œโ”€โ”€ Email/ # Email service implementations -โ”‚ โ”‚ โ”œโ”€โ”€ Template/ # Email templates -โ”‚ โ”‚ โ””โ”€โ”€ Transport/ # SMTP, API transports -โ”‚ โ””โ”€โ”€ FileStorage/ # File storage abstractions -โ”‚ โ”œโ”€โ”€ Local/ # Local filesystem storage -โ”‚ โ””โ”€โ”€ S3/ # AWS S3 storage adapter -โ”‚ -โ””โ”€โ”€ Presentation/ # User interface layer - โ”œโ”€โ”€ Http/ # Web interface - โ”‚ โ”œโ”€โ”€ Controllers/ # HTTP controllers - โ”‚ โ”‚ โ”œโ”€โ”€ Admin/ # Admin panel controllers - โ”‚ โ”‚ โ”œโ”€โ”€ Api/ # REST API controllers - โ”‚ โ”‚ โ””โ”€โ”€ Web/ # Web UI controllers - โ”‚ โ”œโ”€โ”€ Middleware/ # HTTP middleware (auth, CORS, etc.) - โ”‚ โ”œโ”€โ”€ Requests/ # Request DTOs and validation - โ”‚ โ””โ”€โ”€ Responses/ # Response transformers - โ””โ”€โ”€ Cli/ # Command line interface - โ””โ”€โ”€ Commands/ # Console commands - -# Additional directories (outside /src/) -/config/ # Application configuration -โ”œโ”€โ”€ app.php # Main application settings -โ”œโ”€โ”€ database.php # Database connections -โ”œโ”€โ”€ cache.php # Cache drivers configuration -โ”œโ”€โ”€ tracker.php # BitTorrent tracker settings -โ””โ”€โ”€ environments/ # Environment-specific overrides - -/tests/ # Test suites (Pest) -โ”œโ”€โ”€ Unit/ # Unit tests (mirrors src/ structure) -โ”œโ”€โ”€ Feature/ # Feature/Integration tests -โ”œโ”€โ”€ Pest.php # Pest configuration -โ””โ”€โ”€ TestCase.php # Base test case -``` - -## Directory README.md Templates - -### Domain Layer READMEs - -#### `/src/Domain/README.md` -```markdown -# Domain Layer - -This directory contains the core business logic of TorrentPier. Code here should: -- Have no dependencies on frameworks or infrastructure -- Represent pure business rules and domain models -- Be testable in isolation -- Use only PHP language features and domain concepts - -## Bounded Contexts -- **Forum**: Discussion forums, posts, threads -- **Tracker**: BitTorrent tracking, peers, torrents -- **User**: User management, authentication, profiles -- **Shared**: Minimal shared concepts between contexts -``` - -#### `/src/Domain/Tracker/Model/README.md` -```markdown -# Tracker Domain Models - -Contains aggregate roots and entities for the BitTorrent tracker: -- `Torrent`: Aggregate root for torrent management -- `Peer`: Entity representing a BitTorrent peer -- `TorrentStatistics`: Value object for torrent stats - -Example: -```php -class Torrent extends AggregateRoot -{ - public function announce(Peer $peer, AnnounceEvent $event): void - { - // Business logic for handling announces - } -} -``` - -#### `/src/Domain/Tracker/ValueObject/README.md` -```markdown -# Tracker Value Objects - -Immutable objects representing domain concepts: -- `InfoHash`: 20-byte torrent identifier -- `PeerId`: Peer client identifier -- `Port`: Network port (1-65535) -- `BytesTransferred`: Upload/download bytes - -Example: -```php -final class InfoHash -{ - private string $hash; - - public function __construct(string $hash) - { - $this->guardAgainstInvalidHash($hash); - $this->hash = $hash; - } -} -``` - -### Application Layer READMEs - -#### `/src/Application/README.md` -```markdown -# Application Layer - -Contains application services that orchestrate domain objects to fulfill use cases. -- Commands: Write operations that change state -- Queries: Read operations for data retrieval -- Handlers: Process commands and queries - -This layer should: -- Coordinate domain objects -- Handle transactions -- Dispatch domain events -- Not contain business logic -``` - -#### `/src/Application/Tracker/Command/README.md` -```markdown -# Tracker Commands - -Commands representing write operations: -- `RegisterTorrentCommand`: Register new torrent -- `UpdateTorrentCommand`: Modify torrent details -- `DeleteTorrentCommand`: Remove torrent from tracker - -Example: -```php -final class RegisterTorrentCommand -{ - public function __construct( - public readonly string $infoHash, - public readonly int $uploaderId, - public readonly string $name, - public readonly int $size - ) {} -} -``` - -### Infrastructure Layer READMEs - -#### `/src/Infrastructure/README.md` -```markdown -# Infrastructure Layer - -Technical implementations and external service adapters: -- Database persistence -- Caching mechanisms -- Email services -- File storage -- Third-party integrations - -Infrastructure depends on domain, not vice versa. -``` - -#### `/src/Infrastructure/Persistence/Repository/README.md` -```markdown -# Repository Implementations - -Concrete implementations of domain repository interfaces: -- Uses database adapter for persistence -- Implements caching strategies -- Handles query optimization -- Supports multiple database backends - -Example: -```php -class TorrentRepository implements TorrentRepositoryInterface -{ - public function __construct( - private DatabaseAdapterInterface $db - ) {} - - public function findByInfoHash(InfoHash $infoHash): ?Torrent - { - // Database adapter implementation - $row = $this->db->select('torrents') - ->where('info_hash', $infoHash->toString()) - ->first(); - - return $row ? $this->hydrateFromRow($row) : null; - } -} -``` - -### Presentation Layer READMEs - -#### `/src/Presentation/README.md` -```markdown -# Presentation Layer - -User interface implementations: -- HTTP controllers for web and API -- CLI commands for console operations -- Request/response handling -- Input validation -- Output formatting - -This layer translates between external format and application format. -``` - -#### `/src/Presentation/Http/Controllers/Api/README.md` -```markdown -# API Controllers - -RESTful API endpoints following OpenAPI specification: -- JSON request/response format -- Proper HTTP status codes -- HATEOAS where applicable -- Rate limiting aware - -Example: -```php -class UserController -{ - public function register(RegisterRequest $request): JsonResponse - { - $command = new RegisterUserCommand( - $request->getUsername(), - $request->getEmail(), - $request->getPassword() - ); - - $userId = $this->commandBus->handle($command); - - return new JsonResponse([ - 'id' => $userId, - 'username' => $request->getUsername() - ], Response::HTTP_CREATED); - } -} -``` - -#### `/src/Presentation/Http/Controllers/Admin/README.md` -```markdown -# Admin Panel Controllers - -Administrative interface controllers with enhanced security: -- Role-based access control (RBAC) -- Audit logging for all actions -- Additional authentication checks -- Administrative dashboards and reports - -Example: -```php -class AdminUserController -{ - public function index(Request $request): Response - { - $query = new GetUsersQuery( - page: $request->getPage(), - filters: $request->getFilters() - ); - - $users = $this->queryBus->handle($query); - - return $this->render('admin/users/index', [ - 'users' => $users, - 'filters' => $request->getFilters() - ]); - } -} -``` - -#### `/config/README.md` -```markdown -# Application Configuration - -System configuration files using PHP arrays for type safety and IDE support: - -- **app.php**: Core application settings - - Site name, URL, timezone - - Debug mode, environment - - Feature flags and toggles - -- **database.php**: Database connection settings - - Multiple connection definitions - - Read/write splitting configuration - - Connection pooling settings - -- **cache.php**: Cache driver configurations - - Redis, Memcached, file-based settings - - TTL defaults per cache type - - Cache key prefixes - -- **tracker.php**: BitTorrent tracker settings - - Announce intervals - - Peer limits - - Ratio requirements - -- **environments/**: Environment-specific overrides - - Development, staging, production settings - - Local developer configurations - -Example database configuration: -```php - env('DB_CONNECTION', 'mysql'), - - 'connections' => [ - 'mysql' => [ - 'driver' => 'mysql', - 'host' => env('DB_HOST', '127.0.0.1'), - 'port' => env('DB_PORT', 3306), - 'database' => env('DB_DATABASE', 'tp'), - 'username' => env('DB_USERNAME', 'root'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8mb4', - 'collation' => 'utf8mb4_unicode_ci', - 'options' => [ - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, - PDO::ATTR_EMULATE_PREPARES => false, - ], - ], - ], -]; -``` - -## Implementation Order - -1. **Phase 1: Foundation** - - - Create directory structure - - Set up base classes in Domain/Shared - - Configure dependency injection - -2. **Phase 2: Domain Modeling** - - - Implement core aggregates - - Create value objects - - Define repository interfaces - -3. **Phase 3: Application Services** - - - Create commands and queries - - Implement handlers - - Set up event dispatching - -4. **Phase 4: Infrastructure** - - - Implement repositories - - Configure database adapter - - Set up caching - -5. **Phase 5: Presentation** - - - Create controllers - - Implement middleware - - Build CLI commands - -## Migration Strategy - -- Existing code remains in current locations -- New features built in hexagonal architecture -- Gradual migration using strangler fig pattern -- Legacy adapters bridge old and new code -- Feature flags control rollout - -## Key Principles - -1. **Dependency Rule**: Dependencies point inward (Presentation โ†’ Application โ†’ Domain) -2. **Domain Isolation**: Business logic has no framework dependencies -3. **Interface Segregation**: Small, focused interfaces -4. **CQRS**: Separate read and write models -5. **Event-Driven**: Domain events for cross-context communication - -## Testing Strategy - -- **Domain**: Pure unit tests, no mocks needed -- **Application**: Unit tests with mocked repositories -- **Infrastructure**: Integration tests with real services -- **Presentation**: E2E tests for user journeys - -## Notes for Developers - -- Start reading code from the Domain layer -- Business rules live in aggregates, not services -- Use value objects for type safety -- Prefer composition over inheritance -- Keep bounded contexts loosely coupled diff --git a/docs/specs/mvc-architecture-spec.md b/docs/specs/mvc-architecture-spec.md new file mode 100644 index 000000000..54da5b03c --- /dev/null +++ b/docs/specs/mvc-architecture-spec.md @@ -0,0 +1,496 @@ +# MVC Architecture Directory Structure Specification + +## Overview + +This document specifies the MVC (Model-View-Controller) architecture directory structure for TorrentPier 3.0. The structure follows a simple, Laravel-inspired approach that prioritizes developer familiarity and ease of maintenance over complex enterprise patterns. + +## Directory Structure + +``` +# Laravel-style root structure +/app/ # Application code (PSR-4: App\) +โ”œโ”€โ”€ Console/ # Console commands +โ”‚ โ””โ”€โ”€ Commands/ # Artisan-style commands +โ”œโ”€โ”€ Http/ # HTTP layer +โ”‚ โ”œโ”€โ”€ Controllers/ # Controllers +โ”‚ โ”‚ โ”œโ”€โ”€ Admin/ # Admin panel controllers +โ”‚ โ”‚ โ”œโ”€โ”€ Api/ # API controllers +โ”‚ โ”‚ โ””โ”€โ”€ Web/ # Web controllers +โ”‚ โ”œโ”€โ”€ Middleware/ # HTTP middleware +โ”‚ โ””โ”€โ”€ Requests/ # Form request validation +โ”œโ”€โ”€ Models/ # Data models (using Nette Database) +โ”‚ โ”œโ”€โ”€ Forum/ # Forum models (Post, Thread, Forum) +โ”‚ โ”œโ”€โ”€ Tracker/ # Tracker models (Torrent, Peer, Announce) +โ”‚ โ””โ”€โ”€ User/ # User models (User, Profile, Permission) +โ”œโ”€โ”€ Services/ # Business logic services +โ”‚ โ”œโ”€โ”€ Forum/ # Forum services +โ”‚ โ”œโ”€โ”€ Tracker/ # Tracker services +โ”‚ โ””โ”€โ”€ User/ # User services +โ”œโ”€โ”€ Repositories/ # Data access layer (optional) +โ”œโ”€โ”€ Events/ # Event classes +โ”œโ”€โ”€ Listeners/ # Event listeners +โ”œโ”€โ”€ Jobs/ # Background jobs +โ”œโ”€โ”€ Mail/ # Mailable classes +โ”œโ”€โ”€ Notifications/ # Notification classes +โ””โ”€โ”€ Exceptions/ # Exception handling + +/bootstrap/ # Application bootstrap +โ”œโ”€โ”€ app.php # Application bootstrap +โ”œโ”€โ”€ console.php # Console bootstrap +โ””โ”€โ”€ cache/ # Bootstrap cache + +/config/ # Configuration files +โ”œโ”€โ”€ app.php # Application config +โ”œโ”€โ”€ auth.php # Authentication config +โ”œโ”€โ”€ cache.php # Cache configuration +โ”œโ”€โ”€ database.php # Database connections +โ”œโ”€โ”€ filesystems.php # File storage config +โ”œโ”€โ”€ tracker.php # BitTorrent tracker settings +โ””โ”€โ”€ (legacy configs...) # Existing config files + +/database/ # Database files +โ”œโ”€โ”€ migrations/ # Database migrations (moved from /migrations/) +โ”œโ”€โ”€ factories/ # Model factories for testing +โ””โ”€โ”€ seeders/ # Database seeders + +/public/ # Public web root +โ”œโ”€โ”€ index.php # Front controller +โ”œโ”€โ”€ css/ # Public CSS +โ”œโ”€โ”€ js/ # Public JavaScript +โ”œโ”€โ”€ images/ # Public images +โ””โ”€โ”€ fonts/ # Web fonts + +/resources/ # Resources +โ”œโ”€โ”€ views/ # View templates +โ”‚ โ”œโ”€โ”€ admin/ # Admin panel views +โ”‚ โ”œโ”€โ”€ forum/ # Forum views +โ”‚ โ”œโ”€โ”€ tracker/ # Tracker views +โ”‚ โ””โ”€โ”€ layouts/ # Layout templates +โ”œโ”€โ”€ lang/ # Language files +โ”œโ”€โ”€ js/ # JavaScript source +โ””โ”€โ”€ css/ # CSS/SCSS source + +/routes/ # Route definitions +โ”œโ”€โ”€ web.php # Web routes +โ”œโ”€โ”€ api.php # API routes +โ”œโ”€โ”€ admin.php # Admin routes +โ””โ”€โ”€ console.php # Console routes + +/src/ # Framework/Infrastructure code (PSR-4: TorrentPier\) +โ”œโ”€โ”€ Database/ # Database abstraction +โ”œโ”€โ”€ Cache/ # Cache system +โ”œโ”€โ”€ Infrastructure/ # DI container, HTTP routing, etc. +โ”œโ”€โ”€ Legacy/ # Legacy code adapters +โ””โ”€โ”€ helpers.php # Global helper functions + +/storage/ # Storage directory +โ”œโ”€โ”€ app/ # Application storage +โ”‚ โ”œโ”€โ”€ public/ # Publicly accessible files +โ”‚ โ””โ”€โ”€ private/ # Private files +โ”œโ”€โ”€ framework/ # Framework storage +โ”‚ โ”œโ”€โ”€ cache/ # File cache +โ”‚ โ”œโ”€โ”€ sessions/ # Session files +โ”‚ โ””โ”€โ”€ views/ # Compiled view cache +โ””โ”€โ”€ logs/ # Application logs + +/tests/ # Test suites +โ”œโ”€โ”€ Feature/ # Feature tests +โ”œโ”€โ”€ Unit/ # Unit tests +โ””โ”€โ”€ TestCase.php # Base test case + +# Legacy directories (being migrated) +/library/ # Legacy core code +/controllers/ # Legacy PHP controllers +/admin/ # Legacy admin interface +/styles/ # Legacy templates/assets +/internal_data/ # Legacy cache/logs + +# Root files +.env # Environment variables +.env.example # Environment example +composer.json # Dependencies (App\ and TorrentPier\ namespaces) +artisan # CLI interface +index.php # Legacy entry point (redirects to public/) +``` + +## Directory README.md Templates + +### Application Layer READMEs + +#### `/app/README.md` +```markdown +# Application Directory + +This directory contains the core application code following MVC pattern: +- **Models**: Database models and business entities +- **Controllers**: Handle HTTP requests and responses +- **Services**: Business logic and application services +- **Console**: CLI commands for maintenance and operations + +## Key Components +- **Http**: Web and API controllers, middleware, requests +- **Models**: Database models using Nette Database +- **Services**: Reusable business logic +- **Events**: Application events and listeners +``` + +#### `/app/Models/Tracker/README.md` +```markdown +# Tracker Models + +Database models for BitTorrent tracker functionality: +- `Torrent`: Torrent information and metadata +- `Peer`: Active peers in swarms +- `Announce`: Announce history and statistics + +Example: +```php +class Torrent extends Model +{ + protected string $table = 'bb_torrents'; + + public function getPeers(): array + { + return $this->db->table('bb_peers') + ->where('torrent_id', $this->id) + ->fetchAll(); + } + + public function getUser(): ?User + { + return User::find($this->user_id); + } +} +``` + +#### `/app/Services/Tracker/README.md` +```markdown +# Tracker Services + +Business logic for tracker operations: +- `AnnounceService`: Handle peer announces +- `ScrapeService`: Provide torrent statistics +- `TorrentService`: Torrent management operations + +Example: +```php +class AnnounceService +{ + public function __construct( + private TorrentRepository $torrents, + private PeerRepository $peers + ) {} + + public function handleAnnounce(string $infoHash, array $data): array + { + $torrent = $this->torrents->findByInfoHash($infoHash); + $peers = $this->peers->getActivePeers($torrent->id); + + return ['peers' => $peers, 'interval' => 900]; + } +} +``` + +### Controllers READMEs + +#### `/app/Http/Controllers/README.md` +```markdown +# Controllers + +HTTP controllers following RESTful conventions: +- Accept HTTP requests +- Validate input +- Call services for business logic +- Return appropriate responses + +Controllers should be thin - delegate business logic to services. +``` + +#### `/app/Http/Controllers/Web/TrackerController.php` +```markdown +# Tracker Web Controller + +Handles web interface for tracker functionality: + +Example: +```php +class TrackerController extends Controller +{ + public function __construct( + private TorrentService $torrentService + ) {} + + public function index(Request $request) + { + $torrents = $this->torrentService->paginate( + $request->get('page', 1), + $request->get('category') + ); + + return view('tracker.index', compact('torrents')); + } + + public function store(StoreTorrentRequest $request) + { + $torrent = $this->torrentService->create( + $request->validated(), + $request->user() + ); + + return redirect()->route('torrents.show', $torrent); + } +} +``` + +### Services Layer READMEs + +#### `/app/Services/README.md` +```markdown +# Services + +Reusable business logic organized by feature: +- Encapsulate complex operations +- Coordinate between models +- Handle external integrations +- Maintain single responsibility + +Services are injected into controllers and commands. +``` + +#### `/app/Repositories/README.md` +```markdown +# Repositories (Optional) + +Data access layer for complex queries: +- Abstracts database queries from models +- Implements caching strategies +- Handles query optimization + +Example: +```php +class TorrentRepository +{ + public function __construct( + private Database $db, + private CacheManager $cache + ) {} + + public function findByInfoHash(string $infoHash): ?Torrent + { + return $this->cache->remember("torrent:{$infoHash}", 3600, function() use ($infoHash) { + $data = $this->db->table('bb_torrents') + ->where('info_hash', $infoHash) + ->fetch(); + + return $data ? new Torrent($data) : null; + }); + } + + public function getPopularTorrents(int $limit = 10): array + { + return $this->db->table('bb_torrents') + ->select('torrents.*, COUNT(peers.id) as peer_count') + ->leftJoin('bb_peers', 'peers.torrent_id = torrents.id') + ->groupBy('torrents.id') + ->orderBy('peer_count DESC') + ->limit($limit) + ->fetchAll(); + } +} +``` + +### Views READMEs + +#### `/resources/views/README.md` +```markdown +# Views + +Template files for rendering HTML: +- Layouts for consistent structure +- Partials for reusable components +- Feature-specific views +- Email templates + +Using PHP templates with simple helper functions. +``` + +#### `/app/Http/Controllers/Api/README.md` +```markdown +# API Controllers + +RESTful API endpoints: +- JSON request/response format +- Proper HTTP status codes +- API versioning support +- Rate limiting aware + +Example: +```php +class UserController extends Controller +{ + public function __construct( + private UserService $userService + ) {} + + public function register(Request $request): JsonResponse + { + $validatedData = $this->validate($request, [ + 'username' => 'required|unique:users', + 'email' => 'required|email|unique:users', + 'password' => 'required|min:8' + ]); + + $user = $this->userService->register($validatedData); + + return response()->json([ + 'id' => $user->id, + 'username' => $user->username + ], 201); + } +} +``` + +#### `/app/Http/Controllers/Admin/README.md` +```markdown +# Admin Panel Controllers + +Administrative interface controllers: +- Protected by admin middleware +- Activity logging +- Bulk operations support +- Dashboard and reports + +Example: +```php +class AdminUserController extends Controller +{ + public function __construct( + private UserService $userService + ) { + $this->middleware('admin'); + } + + public function index(Request $request) + { + $query = $request->get('search'); + + $users = $this->userService->searchUsers($query) + ->paginate(20); + + return view('admin.users.index', compact('users')); + } +} +``` + +#### `/config/README.md` +```markdown +# Application Configuration + +System configuration files using PHP arrays: + +- **app.php**: Core application settings + - Site name, URL, timezone + - Debug mode, environment + - Feature flags and toggles + +- **database.php**: Database connection settings + - Multiple connection definitions + - Read/write splitting configuration + - Connection pooling settings + +- **cache.php**: Cache driver configurations + - Redis, Memcached, file-based settings + - TTL defaults per cache type + - Cache key prefixes + +- **tracker.php**: BitTorrent tracker settings + - Announce intervals + - Peer limits + - Ratio requirements + +Example database configuration: +```php + env('DB_CONNECTION', 'mysql'), + + 'connections' => [ + 'mysql' => [ + 'driver' => 'mysql', + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', 3306), + 'database' => env('DB_DATABASE', 'torrentpier'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'options' => [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ], + ], + ], +]; +``` + +## Implementation Order + +1. **Phase 1: Foundation** + - Create directory structure + - Set up routing files + - Configure service providers + - Set up middleware + +2. **Phase 2: Models & Database** + - Create database models + - Define relationships + - Set up migrations + - Create seeders + +3. **Phase 3: Services & Business Logic** + - Implement service classes + - Create repositories (if needed) + - Set up events and listeners + +4. **Phase 4: Controllers & Routes** + - Create web controllers + - Build API endpoints + - Set up admin controllers + - Define routes + +5. **Phase 5: Views & Frontend** + - Create template layouts + - Build view components + - Set up assets pipeline + +## Migration Strategy + +- Move existing controllers to /app/Http/Controllers/Legacy +- Gradually rewrite to new MVC structure +- Use service classes to encapsulate business logic +- Maintain backward compatibility through routing +- Progressive enhancement approach + +## Key Principles + +1. **Simplicity**: Straightforward MVC pattern +2. **Convention over Configuration**: Consistent naming and structure +3. **Fat Models, Skinny Controllers**: Business logic in models/services +4. **Service Layer**: Complex operations in service classes +5. **Repository Pattern**: Optional for complex queries + +## Testing Strategy + +- **Unit Tests**: Models and services +- **Feature Tests**: HTTP endpoints and user flows +- **Integration Tests**: Database and external services +- **Browser Tests**: Critical user journeys + +## Notes for Developers + +- Keep controllers thin, move logic to services +- Use dependency injection for testability +- Use Nette Database for data access +- Write readable code over clever code +- Focus on maintainability diff --git a/index.php b/index.php deleted file mode 100644 index 27192ad80..000000000 --- a/index.php +++ /dev/null @@ -1,35 +0,0 @@ -get(Kernel::class); - -// Load web routes -$routesFile = __DIR__ . '/src/Presentation/Http/Routes/web.php'; -$kernel->loadRoutes($routesFile); - -// Handle the request and send response -$kernel->run(); diff --git a/install.php b/install.php deleted file mode 100644 index 0d1516ce5..000000000 --- a/install.php +++ /dev/null @@ -1,331 +0,0 @@ -php ' . basename(__FILE__) . ' in CLI mode'); -} - -// Get all constants -require_once BB_ROOT . 'library/defines.php'; - -// Include CLI functions -require INC_DIR . '/functions_cli.php'; - -/** - * System requirements - */ -const CHECK_REQUIREMENTS = [ - 'php_min_version' => '8.3.0', - 'ext_list' => [ - 'json', - 'curl', - 'readline', - 'mysqli', - 'bcmath', - 'mbstring', - 'intl', - 'xml', - 'xmlwriter', - 'zip', - 'gd' - ], -]; - -// Welcoming message -out("--- TorrentPier Installer ---\n", 'info'); - -// Checking extensions -out("- Checking installed extensions...", 'info'); - -// [1] Check PHP Version -if (!version_compare(PHP_VERSION, CHECK_REQUIREMENTS['php_min_version'], '>=')) { - out("- TorrentPier requires PHP version " . CHECK_REQUIREMENTS['php_min_version'] . "+ Your PHP version " . PHP_VERSION, 'warning'); -} - -// [2] Check installed PHP Extensions on server -foreach (CHECK_REQUIREMENTS['ext_list'] as $ext) { - if (!extension_loaded($ext)) { - out("- ext-$ext not installed. Check out php.ini file", 'error'); - if (!defined('EXTENSIONS_NOT_INSTALLED')) { - define('EXTENSIONS_NOT_INSTALLED', true); - } - } else { - out("- ext-$ext installed!"); - } -} -if (!defined('EXTENSIONS_NOT_INSTALLED')) { - out("- All extensions are installed!\n", 'success'); -} else { - exit; -} - -// Check if already installed -if (is_file(BB_ROOT . '.env')) { - out('- TorrentPier already installed', 'warning'); - echo 'Are you sure want to re-install TorrentPier? [y/N]: '; - if (str_starts_with(mb_strtolower(trim(readline())), 'y')) { - out("\n- Re-install process started...", 'info'); - // environment - if (is_file(BB_ROOT . '.env')) { - if (unlink(BB_ROOT . '.env')) { - out('- Environment file successfully removed!'); - } else { - out('- Cannot remove environment (.env) file. Delete it manually', 'error'); - exit; - } - } - // composer.phar - if (is_file(BB_ROOT . 'composer.phar')) { - if (unlink(BB_ROOT . 'composer.phar')) { - out("- composer.phar file successfully removed!"); - } else { - out('- Cannot remove composer.phar file. Delete it manually', 'error'); - exit; - } - } - // composer dir - if (is_dir(BB_ROOT . 'vendor')) { - removeDir(BB_ROOT . 'vendor', true); - if (!is_dir(BB_ROOT . 'vendor')) { - out("- Composer directory successfully removed!"); - } else { - out('- Cannot remove Composer directory. Delete it manually', 'error'); - exit; - } - } - out("- Re-install process completed!\n", 'success'); - out('- Starting installation...', 'info'); - } else { - exit; - } -} - -// Applying permissions -out("- Applying permissions for folders...", 'info'); -chmod_r(BB_ROOT . 'data', 0755, 0644); -chmod_r(BB_ROOT . 'internal_data', 0755, 0644); -chmod_r(BB_ROOT . 'sitemap', 0755, 0644); -out("- Permissions successfully applied!\n", 'success'); - -// Check composer installation -if (!is_file(BB_ROOT . 'vendor/autoload.php')) { - out('- Hmm, it seems there are no Composer dependencies', 'info'); - - // Downloading composer - if (!is_file(BB_ROOT . 'composer.phar')) { - out('- Downloading Composer...', 'info'); - if (copy('https://getcomposer.org/installer', BB_ROOT . 'composer-setup.php')) { - out("- Composer successfully downloaded!\n", 'success'); - runProcess('php ' . BB_ROOT . 'composer-setup.php --install-dir=' . BB_ROOT); - } else { - out('- Cannot download Composer. Please, download it (composer.phar) manually', 'error'); - exit; - } - if (is_file(BB_ROOT . 'composer-setup.php')) { - if (unlink(BB_ROOT . 'composer-setup.php')) { - out("- Composer installation file successfully removed!\n", 'success'); - } else { - out('- Cannot remove Composer installation file (composer-setup.php). Please, delete it manually', 'warning'); - } - } - } else { - out("- composer.phar file found!\n", 'success'); - } - - // Installing dependencies - if (is_file(BB_ROOT . 'composer.phar')) { - out('- Installing dependencies...', 'info'); - - runProcess('php ' . BB_ROOT . 'composer.phar install --no-interaction --no-ansi'); - define('COMPOSER_COMPLETED', true); - } else { - out('- composer.phar not found. Please, download it (composer.phar) manually', 'error'); - exit; - } -} else { - out('- Composer dependencies are present!', 'success'); - out("- Note: Remove 'vendor' folder if you want to re-install dependencies\n"); -} - -// Check composer dependencies -if (defined('COMPOSER_COMPLETED')) { - if (is_file(BB_ROOT . 'vendor/autoload.php')) { - out("- Completed! Composer dependencies are installed!\n", 'success'); - } else { - exit; - } -} - -// Preparing ENV -if (is_file(BB_ROOT . '.env.example') && !is_file(BB_ROOT . '.env')) { - if (copy(BB_ROOT . '.env.example', BB_ROOT . '.env')) { - out("- Environment file created!\n", 'success'); - } else { - out('- Cannot create environment file', 'error'); - exit; - } -} - -// Editing ENV file -$DB_HOST = 'localhost'; -$DB_PORT = 3306; -$DB_DATABASE = ''; -$DB_USERNAME = ''; -$DB_PASSWORD = ''; - -if (is_file(BB_ROOT . '.env')) { - out("--- Configuring TorrentPier ---", 'info'); - - $envContent = file_get_contents(BB_ROOT . '.env'); - if ($envContent === false) { - out('- Cannot open environment file', 'error'); - exit; - } - $envLines = explode("\n", $envContent); - - $editedLines = []; - foreach ($envLines as $line) { - if (trim($line) !== '' && !str_starts_with($line, '#')) { - $parts = explode('=', $line, 2); - $key = trim($parts[0]); - $value = (!empty($parts[1]) && $key !== 'DB_PASSWORD') ? trim($parts[1]) : ''; - - out("\nCurrent value of $key: $value", 'debug'); - echo "Enter a new value for $key (or leave empty to not change): "; - $newValue = trim(readline()); - - if (!empty($newValue) || $key === 'DB_PASSWORD') { - if ($key === 'TP_HOST') { - if (!preg_match('/^https?:\/\//', $newValue)) { - $newValue = 'https://' . $newValue; - } - $newValue = parse_url($newValue, PHP_URL_HOST); - } - $line = "$key=$newValue"; - $$key = $newValue; - } else { - $$key = $value; - } - } - - $editedLines[] = $line; - } - - $newEnvContent = implode("\n", $editedLines); - if (file_put_contents(BB_ROOT . '.env', $newEnvContent)) { - out("- TorrentPier successfully configured!\n", 'success'); - } else { - out('- Cannot save environment file', 'error'); - exit; - } -} else { - out('- Environment file not found', 'error'); - exit; -} - -if (!empty($DB_HOST) && !empty($DB_DATABASE) && !empty($DB_USERNAME)) { - out("--- Checking environment settings ---\n", 'info'); - // Connecting to database - out("- Trying connect to MySQL...", 'info'); - - // Checking mysqli extension installed - if (!extension_loaded('mysqli')) { - out('- ext-mysqli not found. Check out php.ini file', 'error'); - exit; - } - - // Connect to MySQL server - try { - $conn = new mysqli($DB_HOST, $DB_USERNAME, $DB_PASSWORD, port: $DB_PORT); - } catch (mysqli_sql_exception $exception) { - out("- Connection failed: {$exception->getMessage()}", 'error'); - exit; - } - if (!$conn->connect_error) { - out('- Connected successfully!', 'success'); - } - - // Creating database if not exist - if ($conn->query("CREATE DATABASE IF NOT EXISTS $DB_DATABASE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci")) { - out('- Database created successfully!', 'success'); - } else { - out("- Cannot create database: $DB_DATABASE", 'error'); - exit; - } - $conn->select_db($DB_DATABASE); - - // Close database connection - migrations will handle their own connections - $conn->close(); - - // Run database migrations - out('- Setting up database using migrations...', 'info'); - - // Check if phinx.php exists - if (!is_file(BB_ROOT . 'phinx.php')) { - out('- Migration configuration (phinx.php) not found', 'error'); - exit; - } - - // Run migrations - $migrationResult = runProcess('php vendor/bin/phinx migrate --configuration=' . BB_ROOT . 'phinx.php'); - if ($migrationResult !== 0) { - out('- Database migration failed', 'error'); - exit; - } - - out("- Database setup completed!\n", 'success'); - - // Autofill host in robots.txt - $robots_txt_file = BB_ROOT . 'robots.txt'; - if (isset($TP_HOST) && is_file($robots_txt_file)) { - $content = file_get_contents($robots_txt_file); - $content = str_replace('example.com', $TP_HOST, $content); - file_put_contents($robots_txt_file, $content); - } - - if (isset($APP_ENV) && $APP_ENV === 'local') { - if (!is_file(BB_ROOT . 'library/config.local.php')) { - if (copy(BB_ROOT . 'library/config.php', BB_ROOT . 'library/config.local.php')) { - out('- Local configuration file created!', 'success'); - } else { - out('- Cannot create library/config.local.php file. You can create it manually, just copy config.php and rename it to config.local.php', 'warning'); - } - } - } else { - if (rename(__FILE__, __FILE__ . '_' . hash('xxh128', time()))) { - out("- Installation file renamed!", 'success'); - } else { - out('- Cannot rename installation file (' . __FILE__ . '). Please, rename it manually for security reasons', 'warning'); - } - } - - // Cleanup... - if (is_file(BB_ROOT . '_cleanup.php')) { - out("\n--- Finishing installation (Cleanup) ---\n", 'info'); - out('The cleanup process will remove:'); - out('- Development documentation (README, CHANGELOG)', 'debug'); - out('- Git configuration files', 'debug'); - out('- CI/CD pipelines and code analysis tools', 'debug'); - out('- Translation and contribution guidelines', 'debug'); - echo 'Do you want to delete these files permanently? [y/N]: '; - if (str_starts_with(mb_strtolower(trim(readline())), 'y')) { - out("\n- Cleanup...", 'info'); - require_once BB_ROOT . '_cleanup.php'; - unlink(BB_ROOT . '_cleanup.php'); - } else { - out('- Skipping...', 'info'); - } - } - - out("\n- Voila! Good luck & have fun!", 'success'); -} diff --git a/install/Caddyfile b/install/Caddyfile deleted file mode 100644 index 683d69994..000000000 --- a/install/Caddyfile +++ /dev/null @@ -1,27 +0,0 @@ -# Example Caddy configuration for TorrentPier - -example.com { - root * /path/to/root - encode gzip zstd - php_fastcgi unix//run/php/php-fpm.sock - try_files {path} {path}/ /index.php?{query} - file_server - - @blocked { - path /install/* /internal_data/* /library/* - path /.ht* /.en* - path /.git/* - path *.sql *.tpl *.db *.inc *.log *.md - } - respond @blocked 404 - - redir /sitemap.xml /sitemap/sitemap.xml - - @html_css_js { - path *.html *.css *.js *.json *.xml *.txt - } - header @html_css_js Content-Type "{mime}; charset=utf-8" -} - -# Refer to the Caddy docs for more information: -# https://caddyserver.com/docs/caddyfile diff --git a/install/nginx.conf b/install/nginx.conf deleted file mode 100644 index 49a407ba4..000000000 --- a/install/nginx.conf +++ /dev/null @@ -1,39 +0,0 @@ -# Example nginx configuration for TorrentPier - -server { - listen 80; # port - server_name example.com; # your domain - root /path/to/root; # folder with TorrentPier installed - index index.php; - charset utf-8; - - location / { - try_files \$uri \$uri/ /index.php?\$args; - } - - location ~ \/(install|internal_data|library)\/ { - return 404; - } - - location ~ /\.(ht|en) { - return 404; - } - - location ~ /\.git { - return 404; - } - - location ~ \.(.*sql|tpl|db|inc|log|md)$ { - return 404; - } - - rewrite ^/sitemap.xml$ /sitemap/sitemap.xml; - - location ~ \.php$ { - include fastcgi_params; - fastcgi_pass unix:/run/php/php-fpm.sock; - fastcgi_index index.php; - fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name; - include fastcgi_params; - } -} diff --git a/public/css/.keep b/public/css/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/favicon.png b/public/favicon.png similarity index 100% rename from favicon.png rename to public/favicon.png diff --git a/public/fonts/.keep b/public/fonts/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/public/images/.keep b/public/images/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/robots.txt b/public/robots.txt similarity index 100% rename from robots.txt rename to public/robots.txt diff --git a/styles/images/bad.gif b/public/styles/images/bad.gif similarity index 100% rename from styles/images/bad.gif rename to public/styles/images/bad.gif diff --git a/styles/images/clients/Ares.png b/public/styles/images/clients/Ares.png similarity index 100% rename from styles/images/clients/Ares.png rename to public/styles/images/clients/Ares.png diff --git a/styles/images/clients/Aria2.png b/public/styles/images/clients/Aria2.png similarity index 100% rename from styles/images/clients/Aria2.png rename to public/styles/images/clients/Aria2.png diff --git a/styles/images/clients/BiglyBT.png b/public/styles/images/clients/BiglyBT.png similarity index 100% rename from styles/images/clients/BiglyBT.png rename to public/styles/images/clients/BiglyBT.png diff --git a/styles/images/clients/BitComet.png b/public/styles/images/clients/BitComet.png similarity index 100% rename from styles/images/clients/BitComet.png rename to public/styles/images/clients/BitComet.png diff --git a/styles/images/clients/BitLord.png b/public/styles/images/clients/BitLord.png similarity index 100% rename from styles/images/clients/BitLord.png rename to public/styles/images/clients/BitLord.png diff --git a/styles/images/clients/BitSpirit.png b/public/styles/images/clients/BitSpirit.png similarity index 100% rename from styles/images/clients/BitSpirit.png rename to public/styles/images/clients/BitSpirit.png diff --git a/styles/images/clients/BitTorrent SDK.png b/public/styles/images/clients/BitTorrent SDK.png similarity index 100% rename from styles/images/clients/BitTorrent SDK.png rename to public/styles/images/clients/BitTorrent SDK.png diff --git a/styles/images/clients/BitTorrent.png b/public/styles/images/clients/BitTorrent.png similarity index 100% rename from styles/images/clients/BitTorrent.png rename to public/styles/images/clients/BitTorrent.png diff --git a/styles/images/clients/Blackberry.png b/public/styles/images/clients/Blackberry.png similarity index 100% rename from styles/images/clients/Blackberry.png rename to public/styles/images/clients/Blackberry.png diff --git a/styles/images/clients/CTorrent.png b/public/styles/images/clients/CTorrent.png similarity index 100% rename from styles/images/clients/CTorrent.png rename to public/styles/images/clients/CTorrent.png diff --git a/styles/images/clients/Deluge.png b/public/styles/images/clients/Deluge.png similarity index 100% rename from styles/images/clients/Deluge.png rename to public/styles/images/clients/Deluge.png diff --git a/styles/images/clients/FakeUT.png b/public/styles/images/clients/FakeUT.png similarity index 100% rename from styles/images/clients/FakeUT.png rename to public/styles/images/clients/FakeUT.png diff --git a/styles/images/clients/FlashGet.png b/public/styles/images/clients/FlashGet.png similarity index 100% rename from styles/images/clients/FlashGet.png rename to public/styles/images/clients/FlashGet.png diff --git a/styles/images/clients/Folx.png b/public/styles/images/clients/Folx.png similarity index 100% rename from styles/images/clients/Folx.png rename to public/styles/images/clients/Folx.png diff --git a/styles/images/clients/Free Download Manager.png b/public/styles/images/clients/Free Download Manager.png similarity index 100% rename from styles/images/clients/Free Download Manager.png rename to public/styles/images/clients/Free Download Manager.png diff --git a/styles/images/clients/Freebox.png b/public/styles/images/clients/Freebox.png similarity index 100% rename from styles/images/clients/Freebox.png rename to public/styles/images/clients/Freebox.png diff --git a/styles/images/clients/Halite.png b/public/styles/images/clients/Halite.png similarity index 100% rename from styles/images/clients/Halite.png rename to public/styles/images/clients/Halite.png diff --git a/styles/images/clients/KGet.png b/public/styles/images/clients/KGet.png similarity index 100% rename from styles/images/clients/KGet.png rename to public/styles/images/clients/KGet.png diff --git a/styles/images/clients/KTorrent.png b/public/styles/images/clients/KTorrent.png similarity index 100% rename from styles/images/clients/KTorrent.png rename to public/styles/images/clients/KTorrent.png diff --git a/styles/images/clients/LibreTorrent.png b/public/styles/images/clients/LibreTorrent.png similarity index 100% rename from styles/images/clients/LibreTorrent.png rename to public/styles/images/clients/LibreTorrent.png diff --git a/styles/images/clients/MLDonkey.png b/public/styles/images/clients/MLDonkey.png similarity index 100% rename from styles/images/clients/MLDonkey.png rename to public/styles/images/clients/MLDonkey.png diff --git a/styles/images/clients/MediaGet.png b/public/styles/images/clients/MediaGet.png similarity index 100% rename from styles/images/clients/MediaGet.png rename to public/styles/images/clients/MediaGet.png diff --git a/styles/images/clients/Monsoon.png b/public/styles/images/clients/Monsoon.png similarity index 100% rename from styles/images/clients/Monsoon.png rename to public/styles/images/clients/Monsoon.png diff --git a/styles/images/clients/Opera.png b/public/styles/images/clients/Opera.png similarity index 100% rename from styles/images/clients/Opera.png rename to public/styles/images/clients/Opera.png diff --git a/styles/images/clients/PicoTorrent.png b/public/styles/images/clients/PicoTorrent.png similarity index 100% rename from styles/images/clients/PicoTorrent.png rename to public/styles/images/clients/PicoTorrent.png diff --git a/styles/images/clients/Tixati.png b/public/styles/images/clients/Tixati.png similarity index 100% rename from styles/images/clients/Tixati.png rename to public/styles/images/clients/Tixati.png diff --git a/styles/images/clients/TorrentStream.png b/public/styles/images/clients/TorrentStream.png similarity index 100% rename from styles/images/clients/TorrentStream.png rename to public/styles/images/clients/TorrentStream.png diff --git a/styles/images/clients/Transmission.png b/public/styles/images/clients/Transmission.png similarity index 100% rename from styles/images/clients/Transmission.png rename to public/styles/images/clients/Transmission.png diff --git a/styles/images/clients/Vuze.png b/public/styles/images/clients/Vuze.png similarity index 100% rename from styles/images/clients/Vuze.png rename to public/styles/images/clients/Vuze.png diff --git a/styles/images/clients/WebTorrent.png b/public/styles/images/clients/WebTorrent.png similarity index 100% rename from styles/images/clients/WebTorrent.png rename to public/styles/images/clients/WebTorrent.png diff --git a/styles/images/clients/Xunlei.png b/public/styles/images/clients/Xunlei.png similarity index 100% rename from styles/images/clients/Xunlei.png rename to public/styles/images/clients/Xunlei.png diff --git a/styles/images/clients/libTorrent.png b/public/styles/images/clients/libTorrent.png similarity index 100% rename from styles/images/clients/libTorrent.png rename to public/styles/images/clients/libTorrent.png diff --git a/styles/images/clients/qBittorrent.png b/public/styles/images/clients/qBittorrent.png similarity index 100% rename from styles/images/clients/qBittorrent.png rename to public/styles/images/clients/qBittorrent.png diff --git a/styles/images/clients/tTorrent.png b/public/styles/images/clients/tTorrent.png similarity index 100% rename from styles/images/clients/tTorrent.png rename to public/styles/images/clients/tTorrent.png diff --git a/styles/images/clients/uTorrent Mac.png b/public/styles/images/clients/uTorrent Mac.png similarity index 100% rename from styles/images/clients/uTorrent Mac.png rename to public/styles/images/clients/uTorrent Mac.png diff --git a/styles/images/clients/uTorrent Web.png b/public/styles/images/clients/uTorrent Web.png similarity index 100% rename from styles/images/clients/uTorrent Web.png rename to public/styles/images/clients/uTorrent Web.png diff --git a/styles/images/clients/uTorrent.png b/public/styles/images/clients/uTorrent.png similarity index 100% rename from styles/images/clients/uTorrent.png rename to public/styles/images/clients/uTorrent.png diff --git a/styles/images/flags/AD.svg b/public/styles/images/flags/AD.svg similarity index 100% rename from styles/images/flags/AD.svg rename to public/styles/images/flags/AD.svg diff --git a/styles/images/flags/AE.svg b/public/styles/images/flags/AE.svg similarity index 100% rename from styles/images/flags/AE.svg rename to public/styles/images/flags/AE.svg diff --git a/styles/images/flags/AF.svg b/public/styles/images/flags/AF.svg similarity index 100% rename from styles/images/flags/AF.svg rename to public/styles/images/flags/AF.svg diff --git a/styles/images/flags/AG.svg b/public/styles/images/flags/AG.svg similarity index 100% rename from styles/images/flags/AG.svg rename to public/styles/images/flags/AG.svg diff --git a/styles/images/flags/AI.svg b/public/styles/images/flags/AI.svg similarity index 100% rename from styles/images/flags/AI.svg rename to public/styles/images/flags/AI.svg diff --git a/styles/images/flags/AL.svg b/public/styles/images/flags/AL.svg similarity index 100% rename from styles/images/flags/AL.svg rename to public/styles/images/flags/AL.svg diff --git a/styles/images/flags/AM.svg b/public/styles/images/flags/AM.svg similarity index 100% rename from styles/images/flags/AM.svg rename to public/styles/images/flags/AM.svg diff --git a/styles/images/flags/AO.svg b/public/styles/images/flags/AO.svg similarity index 100% rename from styles/images/flags/AO.svg rename to public/styles/images/flags/AO.svg diff --git a/styles/images/flags/AQ.svg b/public/styles/images/flags/AQ.svg similarity index 100% rename from styles/images/flags/AQ.svg rename to public/styles/images/flags/AQ.svg diff --git a/styles/images/flags/AR.svg b/public/styles/images/flags/AR.svg similarity index 100% rename from styles/images/flags/AR.svg rename to public/styles/images/flags/AR.svg diff --git a/styles/images/flags/ARAB.svg b/public/styles/images/flags/ARAB.svg similarity index 100% rename from styles/images/flags/ARAB.svg rename to public/styles/images/flags/ARAB.svg diff --git a/styles/images/flags/AS.svg b/public/styles/images/flags/AS.svg similarity index 100% rename from styles/images/flags/AS.svg rename to public/styles/images/flags/AS.svg diff --git a/styles/images/flags/AT.svg b/public/styles/images/flags/AT.svg similarity index 100% rename from styles/images/flags/AT.svg rename to public/styles/images/flags/AT.svg diff --git a/styles/images/flags/AU.svg b/public/styles/images/flags/AU.svg similarity index 100% rename from styles/images/flags/AU.svg rename to public/styles/images/flags/AU.svg diff --git a/styles/images/flags/AW.svg b/public/styles/images/flags/AW.svg similarity index 100% rename from styles/images/flags/AW.svg rename to public/styles/images/flags/AW.svg diff --git a/styles/images/flags/AX.svg b/public/styles/images/flags/AX.svg similarity index 100% rename from styles/images/flags/AX.svg rename to public/styles/images/flags/AX.svg diff --git a/styles/images/flags/AZ.svg b/public/styles/images/flags/AZ.svg similarity index 100% rename from styles/images/flags/AZ.svg rename to public/styles/images/flags/AZ.svg diff --git a/styles/images/flags/BA.svg b/public/styles/images/flags/BA.svg similarity index 100% rename from styles/images/flags/BA.svg rename to public/styles/images/flags/BA.svg diff --git a/styles/images/flags/BB.svg b/public/styles/images/flags/BB.svg similarity index 100% rename from styles/images/flags/BB.svg rename to public/styles/images/flags/BB.svg diff --git a/styles/images/flags/BD.svg b/public/styles/images/flags/BD.svg similarity index 100% rename from styles/images/flags/BD.svg rename to public/styles/images/flags/BD.svg diff --git a/styles/images/flags/BE.svg b/public/styles/images/flags/BE.svg similarity index 100% rename from styles/images/flags/BE.svg rename to public/styles/images/flags/BE.svg diff --git a/styles/images/flags/BF.svg b/public/styles/images/flags/BF.svg similarity index 100% rename from styles/images/flags/BF.svg rename to public/styles/images/flags/BF.svg diff --git a/styles/images/flags/BG.svg b/public/styles/images/flags/BG.svg similarity index 100% rename from styles/images/flags/BG.svg rename to public/styles/images/flags/BG.svg diff --git a/styles/images/flags/BH.svg b/public/styles/images/flags/BH.svg similarity index 100% rename from styles/images/flags/BH.svg rename to public/styles/images/flags/BH.svg diff --git a/styles/images/flags/BI.svg b/public/styles/images/flags/BI.svg similarity index 100% rename from styles/images/flags/BI.svg rename to public/styles/images/flags/BI.svg diff --git a/styles/images/flags/BJ.svg b/public/styles/images/flags/BJ.svg similarity index 100% rename from styles/images/flags/BJ.svg rename to public/styles/images/flags/BJ.svg diff --git a/styles/images/flags/BL.svg b/public/styles/images/flags/BL.svg similarity index 100% rename from styles/images/flags/BL.svg rename to public/styles/images/flags/BL.svg diff --git a/styles/images/flags/BM.svg b/public/styles/images/flags/BM.svg similarity index 100% rename from styles/images/flags/BM.svg rename to public/styles/images/flags/BM.svg diff --git a/styles/images/flags/BN.svg b/public/styles/images/flags/BN.svg similarity index 100% rename from styles/images/flags/BN.svg rename to public/styles/images/flags/BN.svg diff --git a/styles/images/flags/BO.svg b/public/styles/images/flags/BO.svg similarity index 100% rename from styles/images/flags/BO.svg rename to public/styles/images/flags/BO.svg diff --git a/styles/images/flags/BQ.svg b/public/styles/images/flags/BQ.svg similarity index 100% rename from styles/images/flags/BQ.svg rename to public/styles/images/flags/BQ.svg diff --git a/styles/images/flags/BR.svg b/public/styles/images/flags/BR.svg similarity index 100% rename from styles/images/flags/BR.svg rename to public/styles/images/flags/BR.svg diff --git a/styles/images/flags/BS.svg b/public/styles/images/flags/BS.svg similarity index 100% rename from styles/images/flags/BS.svg rename to public/styles/images/flags/BS.svg diff --git a/styles/images/flags/BT.svg b/public/styles/images/flags/BT.svg similarity index 100% rename from styles/images/flags/BT.svg rename to public/styles/images/flags/BT.svg diff --git a/styles/images/flags/BV.svg b/public/styles/images/flags/BV.svg similarity index 100% rename from styles/images/flags/BV.svg rename to public/styles/images/flags/BV.svg diff --git a/styles/images/flags/BW.svg b/public/styles/images/flags/BW.svg similarity index 100% rename from styles/images/flags/BW.svg rename to public/styles/images/flags/BW.svg diff --git a/styles/images/flags/BY.svg b/public/styles/images/flags/BY.svg similarity index 100% rename from styles/images/flags/BY.svg rename to public/styles/images/flags/BY.svg diff --git a/styles/images/flags/BZ.svg b/public/styles/images/flags/BZ.svg similarity index 100% rename from styles/images/flags/BZ.svg rename to public/styles/images/flags/BZ.svg diff --git a/styles/images/flags/CA.svg b/public/styles/images/flags/CA.svg similarity index 100% rename from styles/images/flags/CA.svg rename to public/styles/images/flags/CA.svg diff --git a/styles/images/flags/CC.svg b/public/styles/images/flags/CC.svg similarity index 100% rename from styles/images/flags/CC.svg rename to public/styles/images/flags/CC.svg diff --git a/styles/images/flags/CD.svg b/public/styles/images/flags/CD.svg similarity index 100% rename from styles/images/flags/CD.svg rename to public/styles/images/flags/CD.svg diff --git a/styles/images/flags/CEFTA.svg b/public/styles/images/flags/CEFTA.svg similarity index 100% rename from styles/images/flags/CEFTA.svg rename to public/styles/images/flags/CEFTA.svg diff --git a/styles/images/flags/CF.svg b/public/styles/images/flags/CF.svg similarity index 100% rename from styles/images/flags/CF.svg rename to public/styles/images/flags/CF.svg diff --git a/styles/images/flags/CG.svg b/public/styles/images/flags/CG.svg similarity index 100% rename from styles/images/flags/CG.svg rename to public/styles/images/flags/CG.svg diff --git a/styles/images/flags/CH.svg b/public/styles/images/flags/CH.svg similarity index 100% rename from styles/images/flags/CH.svg rename to public/styles/images/flags/CH.svg diff --git a/styles/images/flags/CI.svg b/public/styles/images/flags/CI.svg similarity index 100% rename from styles/images/flags/CI.svg rename to public/styles/images/flags/CI.svg diff --git a/styles/images/flags/CK.svg b/public/styles/images/flags/CK.svg similarity index 100% rename from styles/images/flags/CK.svg rename to public/styles/images/flags/CK.svg diff --git a/styles/images/flags/CL.svg b/public/styles/images/flags/CL.svg similarity index 100% rename from styles/images/flags/CL.svg rename to public/styles/images/flags/CL.svg diff --git a/styles/images/flags/CM.svg b/public/styles/images/flags/CM.svg similarity index 100% rename from styles/images/flags/CM.svg rename to public/styles/images/flags/CM.svg diff --git a/styles/images/flags/CN.svg b/public/styles/images/flags/CN.svg similarity index 100% rename from styles/images/flags/CN.svg rename to public/styles/images/flags/CN.svg diff --git a/styles/images/flags/CO.svg b/public/styles/images/flags/CO.svg similarity index 100% rename from styles/images/flags/CO.svg rename to public/styles/images/flags/CO.svg diff --git a/styles/images/flags/CP.svg b/public/styles/images/flags/CP.svg similarity index 100% rename from styles/images/flags/CP.svg rename to public/styles/images/flags/CP.svg diff --git a/styles/images/flags/CR.svg b/public/styles/images/flags/CR.svg similarity index 100% rename from styles/images/flags/CR.svg rename to public/styles/images/flags/CR.svg diff --git a/styles/images/flags/CU.svg b/public/styles/images/flags/CU.svg similarity index 100% rename from styles/images/flags/CU.svg rename to public/styles/images/flags/CU.svg diff --git a/styles/images/flags/CV.svg b/public/styles/images/flags/CV.svg similarity index 100% rename from styles/images/flags/CV.svg rename to public/styles/images/flags/CV.svg diff --git a/styles/images/flags/CW.svg b/public/styles/images/flags/CW.svg similarity index 100% rename from styles/images/flags/CW.svg rename to public/styles/images/flags/CW.svg diff --git a/styles/images/flags/CX.svg b/public/styles/images/flags/CX.svg similarity index 100% rename from styles/images/flags/CX.svg rename to public/styles/images/flags/CX.svg diff --git a/styles/images/flags/CY.svg b/public/styles/images/flags/CY.svg similarity index 100% rename from styles/images/flags/CY.svg rename to public/styles/images/flags/CY.svg diff --git a/styles/images/flags/CZ.svg b/public/styles/images/flags/CZ.svg similarity index 100% rename from styles/images/flags/CZ.svg rename to public/styles/images/flags/CZ.svg diff --git a/styles/images/flags/DE.svg b/public/styles/images/flags/DE.svg similarity index 100% rename from styles/images/flags/DE.svg rename to public/styles/images/flags/DE.svg diff --git a/styles/images/flags/DG.svg b/public/styles/images/flags/DG.svg similarity index 100% rename from styles/images/flags/DG.svg rename to public/styles/images/flags/DG.svg diff --git a/styles/images/flags/DJ.svg b/public/styles/images/flags/DJ.svg similarity index 100% rename from styles/images/flags/DJ.svg rename to public/styles/images/flags/DJ.svg diff --git a/styles/images/flags/DK.svg b/public/styles/images/flags/DK.svg similarity index 100% rename from styles/images/flags/DK.svg rename to public/styles/images/flags/DK.svg diff --git a/styles/images/flags/DM.svg b/public/styles/images/flags/DM.svg similarity index 100% rename from styles/images/flags/DM.svg rename to public/styles/images/flags/DM.svg diff --git a/styles/images/flags/DO.svg b/public/styles/images/flags/DO.svg similarity index 100% rename from styles/images/flags/DO.svg rename to public/styles/images/flags/DO.svg diff --git a/styles/images/flags/DZ.svg b/public/styles/images/flags/DZ.svg similarity index 100% rename from styles/images/flags/DZ.svg rename to public/styles/images/flags/DZ.svg diff --git a/styles/images/flags/EAC.svg b/public/styles/images/flags/EAC.svg similarity index 100% rename from styles/images/flags/EAC.svg rename to public/styles/images/flags/EAC.svg diff --git a/styles/images/flags/EC.svg b/public/styles/images/flags/EC.svg similarity index 100% rename from styles/images/flags/EC.svg rename to public/styles/images/flags/EC.svg diff --git a/styles/images/flags/EE.svg b/public/styles/images/flags/EE.svg similarity index 100% rename from styles/images/flags/EE.svg rename to public/styles/images/flags/EE.svg diff --git a/styles/images/flags/EG.svg b/public/styles/images/flags/EG.svg similarity index 100% rename from styles/images/flags/EG.svg rename to public/styles/images/flags/EG.svg diff --git a/styles/images/flags/EH.svg b/public/styles/images/flags/EH.svg similarity index 100% rename from styles/images/flags/EH.svg rename to public/styles/images/flags/EH.svg diff --git a/styles/images/flags/ER.svg b/public/styles/images/flags/ER.svg similarity index 100% rename from styles/images/flags/ER.svg rename to public/styles/images/flags/ER.svg diff --git a/styles/images/flags/ES-CT.svg b/public/styles/images/flags/ES-CT.svg similarity index 100% rename from styles/images/flags/ES-CT.svg rename to public/styles/images/flags/ES-CT.svg diff --git a/styles/images/flags/ES-GA.svg b/public/styles/images/flags/ES-GA.svg similarity index 100% rename from styles/images/flags/ES-GA.svg rename to public/styles/images/flags/ES-GA.svg diff --git a/styles/images/flags/ES-PV.svg b/public/styles/images/flags/ES-PV.svg similarity index 100% rename from styles/images/flags/ES-PV.svg rename to public/styles/images/flags/ES-PV.svg diff --git a/styles/images/flags/ES.svg b/public/styles/images/flags/ES.svg similarity index 100% rename from styles/images/flags/ES.svg rename to public/styles/images/flags/ES.svg diff --git a/styles/images/flags/ET.svg b/public/styles/images/flags/ET.svg similarity index 100% rename from styles/images/flags/ET.svg rename to public/styles/images/flags/ET.svg diff --git a/styles/images/flags/EU.svg b/public/styles/images/flags/EU.svg similarity index 100% rename from styles/images/flags/EU.svg rename to public/styles/images/flags/EU.svg diff --git a/styles/images/flags/FI.svg b/public/styles/images/flags/FI.svg similarity index 100% rename from styles/images/flags/FI.svg rename to public/styles/images/flags/FI.svg diff --git a/styles/images/flags/FJ.svg b/public/styles/images/flags/FJ.svg similarity index 100% rename from styles/images/flags/FJ.svg rename to public/styles/images/flags/FJ.svg diff --git a/styles/images/flags/FK.svg b/public/styles/images/flags/FK.svg similarity index 100% rename from styles/images/flags/FK.svg rename to public/styles/images/flags/FK.svg diff --git a/styles/images/flags/FM.svg b/public/styles/images/flags/FM.svg similarity index 100% rename from styles/images/flags/FM.svg rename to public/styles/images/flags/FM.svg diff --git a/styles/images/flags/FO.svg b/public/styles/images/flags/FO.svg similarity index 100% rename from styles/images/flags/FO.svg rename to public/styles/images/flags/FO.svg diff --git a/styles/images/flags/FR.svg b/public/styles/images/flags/FR.svg similarity index 100% rename from styles/images/flags/FR.svg rename to public/styles/images/flags/FR.svg diff --git a/styles/images/flags/GA.svg b/public/styles/images/flags/GA.svg similarity index 100% rename from styles/images/flags/GA.svg rename to public/styles/images/flags/GA.svg diff --git a/styles/images/flags/GB-ENG.svg b/public/styles/images/flags/GB-ENG.svg similarity index 100% rename from styles/images/flags/GB-ENG.svg rename to public/styles/images/flags/GB-ENG.svg diff --git a/styles/images/flags/GB-NIR.svg b/public/styles/images/flags/GB-NIR.svg similarity index 100% rename from styles/images/flags/GB-NIR.svg rename to public/styles/images/flags/GB-NIR.svg diff --git a/styles/images/flags/GB-SCT.svg b/public/styles/images/flags/GB-SCT.svg similarity index 100% rename from styles/images/flags/GB-SCT.svg rename to public/styles/images/flags/GB-SCT.svg diff --git a/styles/images/flags/GB-WLS.svg b/public/styles/images/flags/GB-WLS.svg similarity index 100% rename from styles/images/flags/GB-WLS.svg rename to public/styles/images/flags/GB-WLS.svg diff --git a/styles/images/flags/GB.svg b/public/styles/images/flags/GB.svg similarity index 100% rename from styles/images/flags/GB.svg rename to public/styles/images/flags/GB.svg diff --git a/styles/images/flags/GD.svg b/public/styles/images/flags/GD.svg similarity index 100% rename from styles/images/flags/GD.svg rename to public/styles/images/flags/GD.svg diff --git a/styles/images/flags/GE.svg b/public/styles/images/flags/GE.svg similarity index 100% rename from styles/images/flags/GE.svg rename to public/styles/images/flags/GE.svg diff --git a/styles/images/flags/GF.svg b/public/styles/images/flags/GF.svg similarity index 100% rename from styles/images/flags/GF.svg rename to public/styles/images/flags/GF.svg diff --git a/styles/images/flags/GG.svg b/public/styles/images/flags/GG.svg similarity index 100% rename from styles/images/flags/GG.svg rename to public/styles/images/flags/GG.svg diff --git a/styles/images/flags/GH.svg b/public/styles/images/flags/GH.svg similarity index 100% rename from styles/images/flags/GH.svg rename to public/styles/images/flags/GH.svg diff --git a/styles/images/flags/GI.svg b/public/styles/images/flags/GI.svg similarity index 100% rename from styles/images/flags/GI.svg rename to public/styles/images/flags/GI.svg diff --git a/styles/images/flags/GL.svg b/public/styles/images/flags/GL.svg similarity index 100% rename from styles/images/flags/GL.svg rename to public/styles/images/flags/GL.svg diff --git a/styles/images/flags/GM.svg b/public/styles/images/flags/GM.svg similarity index 100% rename from styles/images/flags/GM.svg rename to public/styles/images/flags/GM.svg diff --git a/styles/images/flags/GN.svg b/public/styles/images/flags/GN.svg similarity index 100% rename from styles/images/flags/GN.svg rename to public/styles/images/flags/GN.svg diff --git a/styles/images/flags/GP.svg b/public/styles/images/flags/GP.svg similarity index 100% rename from styles/images/flags/GP.svg rename to public/styles/images/flags/GP.svg diff --git a/styles/images/flags/GQ.svg b/public/styles/images/flags/GQ.svg similarity index 100% rename from styles/images/flags/GQ.svg rename to public/styles/images/flags/GQ.svg diff --git a/styles/images/flags/GR.svg b/public/styles/images/flags/GR.svg similarity index 100% rename from styles/images/flags/GR.svg rename to public/styles/images/flags/GR.svg diff --git a/styles/images/flags/GS.svg b/public/styles/images/flags/GS.svg similarity index 100% rename from styles/images/flags/GS.svg rename to public/styles/images/flags/GS.svg diff --git a/styles/images/flags/GT.svg b/public/styles/images/flags/GT.svg similarity index 100% rename from styles/images/flags/GT.svg rename to public/styles/images/flags/GT.svg diff --git a/styles/images/flags/GU.svg b/public/styles/images/flags/GU.svg similarity index 100% rename from styles/images/flags/GU.svg rename to public/styles/images/flags/GU.svg diff --git a/styles/images/flags/GW.svg b/public/styles/images/flags/GW.svg similarity index 100% rename from styles/images/flags/GW.svg rename to public/styles/images/flags/GW.svg diff --git a/styles/images/flags/GY.svg b/public/styles/images/flags/GY.svg similarity index 100% rename from styles/images/flags/GY.svg rename to public/styles/images/flags/GY.svg diff --git a/styles/images/flags/HK.svg b/public/styles/images/flags/HK.svg similarity index 100% rename from styles/images/flags/HK.svg rename to public/styles/images/flags/HK.svg diff --git a/styles/images/flags/HM.svg b/public/styles/images/flags/HM.svg similarity index 100% rename from styles/images/flags/HM.svg rename to public/styles/images/flags/HM.svg diff --git a/styles/images/flags/HN.svg b/public/styles/images/flags/HN.svg similarity index 100% rename from styles/images/flags/HN.svg rename to public/styles/images/flags/HN.svg diff --git a/styles/images/flags/HR.svg b/public/styles/images/flags/HR.svg similarity index 100% rename from styles/images/flags/HR.svg rename to public/styles/images/flags/HR.svg diff --git a/styles/images/flags/HT.svg b/public/styles/images/flags/HT.svg similarity index 100% rename from styles/images/flags/HT.svg rename to public/styles/images/flags/HT.svg diff --git a/styles/images/flags/HU.svg b/public/styles/images/flags/HU.svg similarity index 100% rename from styles/images/flags/HU.svg rename to public/styles/images/flags/HU.svg diff --git a/styles/images/flags/IC.svg b/public/styles/images/flags/IC.svg similarity index 100% rename from styles/images/flags/IC.svg rename to public/styles/images/flags/IC.svg diff --git a/styles/images/flags/ID.svg b/public/styles/images/flags/ID.svg similarity index 100% rename from styles/images/flags/ID.svg rename to public/styles/images/flags/ID.svg diff --git a/styles/images/flags/IE.svg b/public/styles/images/flags/IE.svg similarity index 100% rename from styles/images/flags/IE.svg rename to public/styles/images/flags/IE.svg diff --git a/styles/images/flags/IL.svg b/public/styles/images/flags/IL.svg similarity index 100% rename from styles/images/flags/IL.svg rename to public/styles/images/flags/IL.svg diff --git a/styles/images/flags/IM.svg b/public/styles/images/flags/IM.svg similarity index 100% rename from styles/images/flags/IM.svg rename to public/styles/images/flags/IM.svg diff --git a/styles/images/flags/IN.svg b/public/styles/images/flags/IN.svg similarity index 100% rename from styles/images/flags/IN.svg rename to public/styles/images/flags/IN.svg diff --git a/styles/images/flags/IO.svg b/public/styles/images/flags/IO.svg similarity index 100% rename from styles/images/flags/IO.svg rename to public/styles/images/flags/IO.svg diff --git a/styles/images/flags/IQ.svg b/public/styles/images/flags/IQ.svg similarity index 100% rename from styles/images/flags/IQ.svg rename to public/styles/images/flags/IQ.svg diff --git a/styles/images/flags/IR.svg b/public/styles/images/flags/IR.svg similarity index 100% rename from styles/images/flags/IR.svg rename to public/styles/images/flags/IR.svg diff --git a/styles/images/flags/IS.svg b/public/styles/images/flags/IS.svg similarity index 100% rename from styles/images/flags/IS.svg rename to public/styles/images/flags/IS.svg diff --git a/styles/images/flags/IT.svg b/public/styles/images/flags/IT.svg similarity index 100% rename from styles/images/flags/IT.svg rename to public/styles/images/flags/IT.svg diff --git a/styles/images/flags/JE.svg b/public/styles/images/flags/JE.svg similarity index 100% rename from styles/images/flags/JE.svg rename to public/styles/images/flags/JE.svg diff --git a/styles/images/flags/JM.svg b/public/styles/images/flags/JM.svg similarity index 100% rename from styles/images/flags/JM.svg rename to public/styles/images/flags/JM.svg diff --git a/styles/images/flags/JO.svg b/public/styles/images/flags/JO.svg similarity index 100% rename from styles/images/flags/JO.svg rename to public/styles/images/flags/JO.svg diff --git a/styles/images/flags/JP.svg b/public/styles/images/flags/JP.svg similarity index 100% rename from styles/images/flags/JP.svg rename to public/styles/images/flags/JP.svg diff --git a/styles/images/flags/KE.svg b/public/styles/images/flags/KE.svg similarity index 100% rename from styles/images/flags/KE.svg rename to public/styles/images/flags/KE.svg diff --git a/styles/images/flags/KG.svg b/public/styles/images/flags/KG.svg similarity index 100% rename from styles/images/flags/KG.svg rename to public/styles/images/flags/KG.svg diff --git a/styles/images/flags/KH.svg b/public/styles/images/flags/KH.svg similarity index 100% rename from styles/images/flags/KH.svg rename to public/styles/images/flags/KH.svg diff --git a/styles/images/flags/KI.svg b/public/styles/images/flags/KI.svg similarity index 100% rename from styles/images/flags/KI.svg rename to public/styles/images/flags/KI.svg diff --git a/styles/images/flags/KM.svg b/public/styles/images/flags/KM.svg similarity index 100% rename from styles/images/flags/KM.svg rename to public/styles/images/flags/KM.svg diff --git a/styles/images/flags/KN.svg b/public/styles/images/flags/KN.svg similarity index 100% rename from styles/images/flags/KN.svg rename to public/styles/images/flags/KN.svg diff --git a/styles/images/flags/KP.svg b/public/styles/images/flags/KP.svg similarity index 100% rename from styles/images/flags/KP.svg rename to public/styles/images/flags/KP.svg diff --git a/styles/images/flags/KR.svg b/public/styles/images/flags/KR.svg similarity index 100% rename from styles/images/flags/KR.svg rename to public/styles/images/flags/KR.svg diff --git a/styles/images/flags/KW.svg b/public/styles/images/flags/KW.svg similarity index 100% rename from styles/images/flags/KW.svg rename to public/styles/images/flags/KW.svg diff --git a/styles/images/flags/KY.svg b/public/styles/images/flags/KY.svg similarity index 100% rename from styles/images/flags/KY.svg rename to public/styles/images/flags/KY.svg diff --git a/styles/images/flags/KZ.svg b/public/styles/images/flags/KZ.svg similarity index 100% rename from styles/images/flags/KZ.svg rename to public/styles/images/flags/KZ.svg diff --git a/styles/images/flags/LA.svg b/public/styles/images/flags/LA.svg similarity index 100% rename from styles/images/flags/LA.svg rename to public/styles/images/flags/LA.svg diff --git a/styles/images/flags/LB.svg b/public/styles/images/flags/LB.svg similarity index 100% rename from styles/images/flags/LB.svg rename to public/styles/images/flags/LB.svg diff --git a/styles/images/flags/LC.svg b/public/styles/images/flags/LC.svg similarity index 100% rename from styles/images/flags/LC.svg rename to public/styles/images/flags/LC.svg diff --git a/styles/images/flags/LGBT.svg b/public/styles/images/flags/LGBT.svg similarity index 100% rename from styles/images/flags/LGBT.svg rename to public/styles/images/flags/LGBT.svg diff --git a/styles/images/flags/LI.svg b/public/styles/images/flags/LI.svg similarity index 100% rename from styles/images/flags/LI.svg rename to public/styles/images/flags/LI.svg diff --git a/styles/images/flags/LK.svg b/public/styles/images/flags/LK.svg similarity index 100% rename from styles/images/flags/LK.svg rename to public/styles/images/flags/LK.svg diff --git a/styles/images/flags/LR.svg b/public/styles/images/flags/LR.svg similarity index 100% rename from styles/images/flags/LR.svg rename to public/styles/images/flags/LR.svg diff --git a/styles/images/flags/LS.svg b/public/styles/images/flags/LS.svg similarity index 100% rename from styles/images/flags/LS.svg rename to public/styles/images/flags/LS.svg diff --git a/styles/images/flags/LT.svg b/public/styles/images/flags/LT.svg similarity index 100% rename from styles/images/flags/LT.svg rename to public/styles/images/flags/LT.svg diff --git a/styles/images/flags/LU.svg b/public/styles/images/flags/LU.svg similarity index 100% rename from styles/images/flags/LU.svg rename to public/styles/images/flags/LU.svg diff --git a/styles/images/flags/LV.svg b/public/styles/images/flags/LV.svg similarity index 100% rename from styles/images/flags/LV.svg rename to public/styles/images/flags/LV.svg diff --git a/styles/images/flags/LY.svg b/public/styles/images/flags/LY.svg similarity index 100% rename from styles/images/flags/LY.svg rename to public/styles/images/flags/LY.svg diff --git a/styles/images/flags/MA.svg b/public/styles/images/flags/MA.svg similarity index 100% rename from styles/images/flags/MA.svg rename to public/styles/images/flags/MA.svg diff --git a/styles/images/flags/MC.svg b/public/styles/images/flags/MC.svg similarity index 100% rename from styles/images/flags/MC.svg rename to public/styles/images/flags/MC.svg diff --git a/styles/images/flags/MD.svg b/public/styles/images/flags/MD.svg similarity index 100% rename from styles/images/flags/MD.svg rename to public/styles/images/flags/MD.svg diff --git a/styles/images/flags/ME.svg b/public/styles/images/flags/ME.svg similarity index 100% rename from styles/images/flags/ME.svg rename to public/styles/images/flags/ME.svg diff --git a/styles/images/flags/MF.svg b/public/styles/images/flags/MF.svg similarity index 100% rename from styles/images/flags/MF.svg rename to public/styles/images/flags/MF.svg diff --git a/styles/images/flags/MG.svg b/public/styles/images/flags/MG.svg similarity index 100% rename from styles/images/flags/MG.svg rename to public/styles/images/flags/MG.svg diff --git a/styles/images/flags/MH.svg b/public/styles/images/flags/MH.svg similarity index 100% rename from styles/images/flags/MH.svg rename to public/styles/images/flags/MH.svg diff --git a/styles/images/flags/MK.svg b/public/styles/images/flags/MK.svg similarity index 100% rename from styles/images/flags/MK.svg rename to public/styles/images/flags/MK.svg diff --git a/styles/images/flags/ML.svg b/public/styles/images/flags/ML.svg similarity index 100% rename from styles/images/flags/ML.svg rename to public/styles/images/flags/ML.svg diff --git a/styles/images/flags/MM.svg b/public/styles/images/flags/MM.svg similarity index 100% rename from styles/images/flags/MM.svg rename to public/styles/images/flags/MM.svg diff --git a/styles/images/flags/MN.svg b/public/styles/images/flags/MN.svg similarity index 100% rename from styles/images/flags/MN.svg rename to public/styles/images/flags/MN.svg diff --git a/styles/images/flags/MO.svg b/public/styles/images/flags/MO.svg similarity index 100% rename from styles/images/flags/MO.svg rename to public/styles/images/flags/MO.svg diff --git a/styles/images/flags/MP.svg b/public/styles/images/flags/MP.svg similarity index 100% rename from styles/images/flags/MP.svg rename to public/styles/images/flags/MP.svg diff --git a/styles/images/flags/MQ.svg b/public/styles/images/flags/MQ.svg similarity index 100% rename from styles/images/flags/MQ.svg rename to public/styles/images/flags/MQ.svg diff --git a/styles/images/flags/MR.svg b/public/styles/images/flags/MR.svg similarity index 100% rename from styles/images/flags/MR.svg rename to public/styles/images/flags/MR.svg diff --git a/styles/images/flags/MS.svg b/public/styles/images/flags/MS.svg similarity index 100% rename from styles/images/flags/MS.svg rename to public/styles/images/flags/MS.svg diff --git a/styles/images/flags/MT.svg b/public/styles/images/flags/MT.svg similarity index 100% rename from styles/images/flags/MT.svg rename to public/styles/images/flags/MT.svg diff --git a/styles/images/flags/MU.svg b/public/styles/images/flags/MU.svg similarity index 100% rename from styles/images/flags/MU.svg rename to public/styles/images/flags/MU.svg diff --git a/styles/images/flags/MV.svg b/public/styles/images/flags/MV.svg similarity index 100% rename from styles/images/flags/MV.svg rename to public/styles/images/flags/MV.svg diff --git a/styles/images/flags/MW.svg b/public/styles/images/flags/MW.svg similarity index 100% rename from styles/images/flags/MW.svg rename to public/styles/images/flags/MW.svg diff --git a/styles/images/flags/MX.svg b/public/styles/images/flags/MX.svg similarity index 100% rename from styles/images/flags/MX.svg rename to public/styles/images/flags/MX.svg diff --git a/styles/images/flags/MY.svg b/public/styles/images/flags/MY.svg similarity index 100% rename from styles/images/flags/MY.svg rename to public/styles/images/flags/MY.svg diff --git a/styles/images/flags/MZ.svg b/public/styles/images/flags/MZ.svg similarity index 100% rename from styles/images/flags/MZ.svg rename to public/styles/images/flags/MZ.svg diff --git a/styles/images/flags/NA.svg b/public/styles/images/flags/NA.svg similarity index 100% rename from styles/images/flags/NA.svg rename to public/styles/images/flags/NA.svg diff --git a/styles/images/flags/NC.svg b/public/styles/images/flags/NC.svg similarity index 100% rename from styles/images/flags/NC.svg rename to public/styles/images/flags/NC.svg diff --git a/styles/images/flags/NE.svg b/public/styles/images/flags/NE.svg similarity index 100% rename from styles/images/flags/NE.svg rename to public/styles/images/flags/NE.svg diff --git a/styles/images/flags/NF.svg b/public/styles/images/flags/NF.svg similarity index 100% rename from styles/images/flags/NF.svg rename to public/styles/images/flags/NF.svg diff --git a/styles/images/flags/NG.svg b/public/styles/images/flags/NG.svg similarity index 100% rename from styles/images/flags/NG.svg rename to public/styles/images/flags/NG.svg diff --git a/styles/images/flags/NI.svg b/public/styles/images/flags/NI.svg similarity index 100% rename from styles/images/flags/NI.svg rename to public/styles/images/flags/NI.svg diff --git a/styles/images/flags/NL.svg b/public/styles/images/flags/NL.svg similarity index 100% rename from styles/images/flags/NL.svg rename to public/styles/images/flags/NL.svg diff --git a/styles/images/flags/NO.svg b/public/styles/images/flags/NO.svg similarity index 100% rename from styles/images/flags/NO.svg rename to public/styles/images/flags/NO.svg diff --git a/styles/images/flags/NP.svg b/public/styles/images/flags/NP.svg similarity index 100% rename from styles/images/flags/NP.svg rename to public/styles/images/flags/NP.svg diff --git a/styles/images/flags/NR.svg b/public/styles/images/flags/NR.svg similarity index 100% rename from styles/images/flags/NR.svg rename to public/styles/images/flags/NR.svg diff --git a/styles/images/flags/NU.svg b/public/styles/images/flags/NU.svg similarity index 100% rename from styles/images/flags/NU.svg rename to public/styles/images/flags/NU.svg diff --git a/styles/images/flags/NZ.svg b/public/styles/images/flags/NZ.svg similarity index 100% rename from styles/images/flags/NZ.svg rename to public/styles/images/flags/NZ.svg diff --git a/styles/images/flags/OM.svg b/public/styles/images/flags/OM.svg similarity index 100% rename from styles/images/flags/OM.svg rename to public/styles/images/flags/OM.svg diff --git a/styles/images/flags/PA.svg b/public/styles/images/flags/PA.svg similarity index 100% rename from styles/images/flags/PA.svg rename to public/styles/images/flags/PA.svg diff --git a/styles/images/flags/PACE.svg b/public/styles/images/flags/PACE.svg similarity index 100% rename from styles/images/flags/PACE.svg rename to public/styles/images/flags/PACE.svg diff --git a/styles/images/flags/PC.svg b/public/styles/images/flags/PC.svg similarity index 100% rename from styles/images/flags/PC.svg rename to public/styles/images/flags/PC.svg diff --git a/styles/images/flags/PE.svg b/public/styles/images/flags/PE.svg similarity index 100% rename from styles/images/flags/PE.svg rename to public/styles/images/flags/PE.svg diff --git a/styles/images/flags/PF.svg b/public/styles/images/flags/PF.svg similarity index 100% rename from styles/images/flags/PF.svg rename to public/styles/images/flags/PF.svg diff --git a/styles/images/flags/PG.svg b/public/styles/images/flags/PG.svg similarity index 100% rename from styles/images/flags/PG.svg rename to public/styles/images/flags/PG.svg diff --git a/styles/images/flags/PH.svg b/public/styles/images/flags/PH.svg similarity index 100% rename from styles/images/flags/PH.svg rename to public/styles/images/flags/PH.svg diff --git a/styles/images/flags/PK.svg b/public/styles/images/flags/PK.svg similarity index 100% rename from styles/images/flags/PK.svg rename to public/styles/images/flags/PK.svg diff --git a/styles/images/flags/PL.svg b/public/styles/images/flags/PL.svg similarity index 100% rename from styles/images/flags/PL.svg rename to public/styles/images/flags/PL.svg diff --git a/styles/images/flags/PM.svg b/public/styles/images/flags/PM.svg similarity index 100% rename from styles/images/flags/PM.svg rename to public/styles/images/flags/PM.svg diff --git a/styles/images/flags/PN.svg b/public/styles/images/flags/PN.svg similarity index 100% rename from styles/images/flags/PN.svg rename to public/styles/images/flags/PN.svg diff --git a/styles/images/flags/PR.svg b/public/styles/images/flags/PR.svg similarity index 100% rename from styles/images/flags/PR.svg rename to public/styles/images/flags/PR.svg diff --git a/styles/images/flags/PS.svg b/public/styles/images/flags/PS.svg similarity index 100% rename from styles/images/flags/PS.svg rename to public/styles/images/flags/PS.svg diff --git a/styles/images/flags/PT.svg b/public/styles/images/flags/PT.svg similarity index 100% rename from styles/images/flags/PT.svg rename to public/styles/images/flags/PT.svg diff --git a/styles/images/flags/PW.svg b/public/styles/images/flags/PW.svg similarity index 100% rename from styles/images/flags/PW.svg rename to public/styles/images/flags/PW.svg diff --git a/styles/images/flags/PY.svg b/public/styles/images/flags/PY.svg similarity index 100% rename from styles/images/flags/PY.svg rename to public/styles/images/flags/PY.svg diff --git a/styles/images/flags/QA.svg b/public/styles/images/flags/QA.svg similarity index 100% rename from styles/images/flags/QA.svg rename to public/styles/images/flags/QA.svg diff --git a/styles/images/flags/RE.svg b/public/styles/images/flags/RE.svg similarity index 100% rename from styles/images/flags/RE.svg rename to public/styles/images/flags/RE.svg diff --git a/styles/images/flags/RO.svg b/public/styles/images/flags/RO.svg similarity index 100% rename from styles/images/flags/RO.svg rename to public/styles/images/flags/RO.svg diff --git a/styles/images/flags/RS.svg b/public/styles/images/flags/RS.svg similarity index 100% rename from styles/images/flags/RS.svg rename to public/styles/images/flags/RS.svg diff --git a/styles/images/flags/RU.svg b/public/styles/images/flags/RU.svg similarity index 100% rename from styles/images/flags/RU.svg rename to public/styles/images/flags/RU.svg diff --git a/styles/images/flags/RW.svg b/public/styles/images/flags/RW.svg similarity index 100% rename from styles/images/flags/RW.svg rename to public/styles/images/flags/RW.svg diff --git a/styles/images/flags/SA.svg b/public/styles/images/flags/SA.svg similarity index 100% rename from styles/images/flags/SA.svg rename to public/styles/images/flags/SA.svg diff --git a/styles/images/flags/SB.svg b/public/styles/images/flags/SB.svg similarity index 100% rename from styles/images/flags/SB.svg rename to public/styles/images/flags/SB.svg diff --git a/styles/images/flags/SC.svg b/public/styles/images/flags/SC.svg similarity index 100% rename from styles/images/flags/SC.svg rename to public/styles/images/flags/SC.svg diff --git a/styles/images/flags/SD.svg b/public/styles/images/flags/SD.svg similarity index 100% rename from styles/images/flags/SD.svg rename to public/styles/images/flags/SD.svg diff --git a/styles/images/flags/SE.svg b/public/styles/images/flags/SE.svg similarity index 100% rename from styles/images/flags/SE.svg rename to public/styles/images/flags/SE.svg diff --git a/styles/images/flags/SG.svg b/public/styles/images/flags/SG.svg similarity index 100% rename from styles/images/flags/SG.svg rename to public/styles/images/flags/SG.svg diff --git a/styles/images/flags/SH-AC.svg b/public/styles/images/flags/SH-AC.svg similarity index 100% rename from styles/images/flags/SH-AC.svg rename to public/styles/images/flags/SH-AC.svg diff --git a/styles/images/flags/SH-HL.svg b/public/styles/images/flags/SH-HL.svg similarity index 100% rename from styles/images/flags/SH-HL.svg rename to public/styles/images/flags/SH-HL.svg diff --git a/styles/images/flags/SH-TA.svg b/public/styles/images/flags/SH-TA.svg similarity index 100% rename from styles/images/flags/SH-TA.svg rename to public/styles/images/flags/SH-TA.svg diff --git a/styles/images/flags/SH.svg b/public/styles/images/flags/SH.svg similarity index 100% rename from styles/images/flags/SH.svg rename to public/styles/images/flags/SH.svg diff --git a/styles/images/flags/SI.svg b/public/styles/images/flags/SI.svg similarity index 100% rename from styles/images/flags/SI.svg rename to public/styles/images/flags/SI.svg diff --git a/styles/images/flags/SJ.svg b/public/styles/images/flags/SJ.svg similarity index 100% rename from styles/images/flags/SJ.svg rename to public/styles/images/flags/SJ.svg diff --git a/styles/images/flags/SK.svg b/public/styles/images/flags/SK.svg similarity index 100% rename from styles/images/flags/SK.svg rename to public/styles/images/flags/SK.svg diff --git a/styles/images/flags/SL.svg b/public/styles/images/flags/SL.svg similarity index 100% rename from styles/images/flags/SL.svg rename to public/styles/images/flags/SL.svg diff --git a/styles/images/flags/SM.svg b/public/styles/images/flags/SM.svg similarity index 100% rename from styles/images/flags/SM.svg rename to public/styles/images/flags/SM.svg diff --git a/styles/images/flags/SN.svg b/public/styles/images/flags/SN.svg similarity index 100% rename from styles/images/flags/SN.svg rename to public/styles/images/flags/SN.svg diff --git a/styles/images/flags/SO.svg b/public/styles/images/flags/SO.svg similarity index 100% rename from styles/images/flags/SO.svg rename to public/styles/images/flags/SO.svg diff --git a/styles/images/flags/SR.svg b/public/styles/images/flags/SR.svg similarity index 100% rename from styles/images/flags/SR.svg rename to public/styles/images/flags/SR.svg diff --git a/styles/images/flags/SS.svg b/public/styles/images/flags/SS.svg similarity index 100% rename from styles/images/flags/SS.svg rename to public/styles/images/flags/SS.svg diff --git a/styles/images/flags/ST.svg b/public/styles/images/flags/ST.svg similarity index 100% rename from styles/images/flags/ST.svg rename to public/styles/images/flags/ST.svg diff --git a/styles/images/flags/SU.svg b/public/styles/images/flags/SU.svg similarity index 100% rename from styles/images/flags/SU.svg rename to public/styles/images/flags/SU.svg diff --git a/styles/images/flags/SV.svg b/public/styles/images/flags/SV.svg similarity index 100% rename from styles/images/flags/SV.svg rename to public/styles/images/flags/SV.svg diff --git a/styles/images/flags/SX.svg b/public/styles/images/flags/SX.svg similarity index 100% rename from styles/images/flags/SX.svg rename to public/styles/images/flags/SX.svg diff --git a/styles/images/flags/SY.svg b/public/styles/images/flags/SY.svg similarity index 100% rename from styles/images/flags/SY.svg rename to public/styles/images/flags/SY.svg diff --git a/styles/images/flags/SZ.svg b/public/styles/images/flags/SZ.svg similarity index 100% rename from styles/images/flags/SZ.svg rename to public/styles/images/flags/SZ.svg diff --git a/styles/images/flags/TC.svg b/public/styles/images/flags/TC.svg similarity index 100% rename from styles/images/flags/TC.svg rename to public/styles/images/flags/TC.svg diff --git a/styles/images/flags/TD.svg b/public/styles/images/flags/TD.svg similarity index 100% rename from styles/images/flags/TD.svg rename to public/styles/images/flags/TD.svg diff --git a/styles/images/flags/TF.svg b/public/styles/images/flags/TF.svg similarity index 100% rename from styles/images/flags/TF.svg rename to public/styles/images/flags/TF.svg diff --git a/styles/images/flags/TG.svg b/public/styles/images/flags/TG.svg similarity index 100% rename from styles/images/flags/TG.svg rename to public/styles/images/flags/TG.svg diff --git a/styles/images/flags/TH.svg b/public/styles/images/flags/TH.svg similarity index 100% rename from styles/images/flags/TH.svg rename to public/styles/images/flags/TH.svg diff --git a/styles/images/flags/TJ.svg b/public/styles/images/flags/TJ.svg similarity index 100% rename from styles/images/flags/TJ.svg rename to public/styles/images/flags/TJ.svg diff --git a/styles/images/flags/TK.svg b/public/styles/images/flags/TK.svg similarity index 100% rename from styles/images/flags/TK.svg rename to public/styles/images/flags/TK.svg diff --git a/styles/images/flags/TL.svg b/public/styles/images/flags/TL.svg similarity index 100% rename from styles/images/flags/TL.svg rename to public/styles/images/flags/TL.svg diff --git a/styles/images/flags/TM.svg b/public/styles/images/flags/TM.svg similarity index 100% rename from styles/images/flags/TM.svg rename to public/styles/images/flags/TM.svg diff --git a/styles/images/flags/TN.svg b/public/styles/images/flags/TN.svg similarity index 100% rename from styles/images/flags/TN.svg rename to public/styles/images/flags/TN.svg diff --git a/styles/images/flags/TO.svg b/public/styles/images/flags/TO.svg similarity index 100% rename from styles/images/flags/TO.svg rename to public/styles/images/flags/TO.svg diff --git a/styles/images/flags/TR.svg b/public/styles/images/flags/TR.svg similarity index 100% rename from styles/images/flags/TR.svg rename to public/styles/images/flags/TR.svg diff --git a/styles/images/flags/TT.svg b/public/styles/images/flags/TT.svg similarity index 100% rename from styles/images/flags/TT.svg rename to public/styles/images/flags/TT.svg diff --git a/styles/images/flags/TV.svg b/public/styles/images/flags/TV.svg similarity index 100% rename from styles/images/flags/TV.svg rename to public/styles/images/flags/TV.svg diff --git a/styles/images/flags/TW.svg b/public/styles/images/flags/TW.svg similarity index 100% rename from styles/images/flags/TW.svg rename to public/styles/images/flags/TW.svg diff --git a/styles/images/flags/TZ.svg b/public/styles/images/flags/TZ.svg similarity index 100% rename from styles/images/flags/TZ.svg rename to public/styles/images/flags/TZ.svg diff --git a/styles/images/flags/UA.svg b/public/styles/images/flags/UA.svg similarity index 100% rename from styles/images/flags/UA.svg rename to public/styles/images/flags/UA.svg diff --git a/styles/images/flags/UG.svg b/public/styles/images/flags/UG.svg similarity index 100% rename from styles/images/flags/UG.svg rename to public/styles/images/flags/UG.svg diff --git a/styles/images/flags/UM.svg b/public/styles/images/flags/UM.svg similarity index 100% rename from styles/images/flags/UM.svg rename to public/styles/images/flags/UM.svg diff --git a/styles/images/flags/UN.svg b/public/styles/images/flags/UN.svg similarity index 100% rename from styles/images/flags/UN.svg rename to public/styles/images/flags/UN.svg diff --git a/styles/images/flags/US.svg b/public/styles/images/flags/US.svg similarity index 100% rename from styles/images/flags/US.svg rename to public/styles/images/flags/US.svg diff --git a/styles/images/flags/UY.svg b/public/styles/images/flags/UY.svg similarity index 100% rename from styles/images/flags/UY.svg rename to public/styles/images/flags/UY.svg diff --git a/styles/images/flags/UZ.svg b/public/styles/images/flags/UZ.svg similarity index 100% rename from styles/images/flags/UZ.svg rename to public/styles/images/flags/UZ.svg diff --git a/styles/images/flags/VA.svg b/public/styles/images/flags/VA.svg similarity index 100% rename from styles/images/flags/VA.svg rename to public/styles/images/flags/VA.svg diff --git a/styles/images/flags/VC.svg b/public/styles/images/flags/VC.svg similarity index 100% rename from styles/images/flags/VC.svg rename to public/styles/images/flags/VC.svg diff --git a/styles/images/flags/VE.svg b/public/styles/images/flags/VE.svg similarity index 100% rename from styles/images/flags/VE.svg rename to public/styles/images/flags/VE.svg diff --git a/styles/images/flags/VG.svg b/public/styles/images/flags/VG.svg similarity index 100% rename from styles/images/flags/VG.svg rename to public/styles/images/flags/VG.svg diff --git a/styles/images/flags/VI.svg b/public/styles/images/flags/VI.svg similarity index 100% rename from styles/images/flags/VI.svg rename to public/styles/images/flags/VI.svg diff --git a/styles/images/flags/VN.svg b/public/styles/images/flags/VN.svg similarity index 100% rename from styles/images/flags/VN.svg rename to public/styles/images/flags/VN.svg diff --git a/styles/images/flags/VU.svg b/public/styles/images/flags/VU.svg similarity index 100% rename from styles/images/flags/VU.svg rename to public/styles/images/flags/VU.svg diff --git a/styles/images/flags/WBW.svg b/public/styles/images/flags/WBW.svg similarity index 100% rename from styles/images/flags/WBW.svg rename to public/styles/images/flags/WBW.svg diff --git a/styles/images/flags/WF.svg b/public/styles/images/flags/WF.svg similarity index 100% rename from styles/images/flags/WF.svg rename to public/styles/images/flags/WF.svg diff --git a/styles/images/flags/WS.svg b/public/styles/images/flags/WS.svg similarity index 100% rename from styles/images/flags/WS.svg rename to public/styles/images/flags/WS.svg diff --git a/styles/images/flags/XK.svg b/public/styles/images/flags/XK.svg similarity index 100% rename from styles/images/flags/XK.svg rename to public/styles/images/flags/XK.svg diff --git a/styles/images/flags/XX.svg b/public/styles/images/flags/XX.svg similarity index 100% rename from styles/images/flags/XX.svg rename to public/styles/images/flags/XX.svg diff --git a/styles/images/flags/YE.svg b/public/styles/images/flags/YE.svg similarity index 100% rename from styles/images/flags/YE.svg rename to public/styles/images/flags/YE.svg diff --git a/styles/images/flags/YT.svg b/public/styles/images/flags/YT.svg similarity index 100% rename from styles/images/flags/YT.svg rename to public/styles/images/flags/YT.svg diff --git a/styles/images/flags/YU.svg b/public/styles/images/flags/YU.svg similarity index 100% rename from styles/images/flags/YU.svg rename to public/styles/images/flags/YU.svg diff --git a/styles/images/flags/ZA.svg b/public/styles/images/flags/ZA.svg similarity index 100% rename from styles/images/flags/ZA.svg rename to public/styles/images/flags/ZA.svg diff --git a/styles/images/flags/ZM.svg b/public/styles/images/flags/ZM.svg similarity index 100% rename from styles/images/flags/ZM.svg rename to public/styles/images/flags/ZM.svg diff --git a/styles/images/flags/ZW.svg b/public/styles/images/flags/ZW.svg similarity index 100% rename from styles/images/flags/ZW.svg rename to public/styles/images/flags/ZW.svg diff --git a/styles/images/folder.gif b/public/styles/images/folder.gif similarity index 100% rename from styles/images/folder.gif rename to public/styles/images/folder.gif diff --git a/styles/images/good.gif b/public/styles/images/good.gif similarity index 100% rename from styles/images/good.gif rename to public/styles/images/good.gif diff --git a/styles/images/icon_clip.gif b/public/styles/images/icon_clip.gif similarity index 100% rename from styles/images/icon_clip.gif rename to public/styles/images/icon_clip.gif diff --git a/styles/images/icon_delete.gif b/public/styles/images/icon_delete.gif similarity index 100% rename from styles/images/icon_delete.gif rename to public/styles/images/icon_delete.gif diff --git a/styles/images/icon_dn.gif b/public/styles/images/icon_dn.gif similarity index 100% rename from styles/images/icon_dn.gif rename to public/styles/images/icon_dn.gif diff --git a/styles/images/icon_edit.gif b/public/styles/images/icon_edit.gif similarity index 100% rename from styles/images/icon_edit.gif rename to public/styles/images/icon_edit.gif diff --git a/styles/images/icon_external.png b/public/styles/images/icon_external.png similarity index 100% rename from styles/images/icon_external.png rename to public/styles/images/icon_external.png diff --git a/styles/images/icon_run.gif b/public/styles/images/icon_run.gif similarity index 100% rename from styles/images/icon_run.gif rename to public/styles/images/icon_run.gif diff --git a/styles/images/icon_sync.gif b/public/styles/images/icon_sync.gif similarity index 100% rename from styles/images/icon_sync.gif rename to public/styles/images/icon_sync.gif diff --git a/styles/images/logo/logo.png b/public/styles/images/logo/logo.png similarity index 100% rename from styles/images/logo/logo.png rename to public/styles/images/logo/logo.png diff --git a/styles/images/magnet.png b/public/styles/images/magnet.png similarity index 100% rename from styles/images/magnet.png rename to public/styles/images/magnet.png diff --git a/styles/images/magnet_v2.png b/public/styles/images/magnet_v2.png similarity index 100% rename from styles/images/magnet_v2.png rename to public/styles/images/magnet_v2.png diff --git a/styles/images/page.gif b/public/styles/images/page.gif similarity index 100% rename from styles/images/page.gif rename to public/styles/images/page.gif diff --git a/styles/images/pic_loading.gif b/public/styles/images/pic_loading.gif similarity index 100% rename from styles/images/pic_loading.gif rename to public/styles/images/pic_loading.gif diff --git a/styles/images/ranks/admin.png b/public/styles/images/ranks/admin.png similarity index 100% rename from styles/images/ranks/admin.png rename to public/styles/images/ranks/admin.png diff --git a/styles/images/ranks/user.png b/public/styles/images/ranks/user.png similarity index 100% rename from styles/images/ranks/user.png rename to public/styles/images/ranks/user.png diff --git a/styles/images/smiles/aa.gif b/public/styles/images/smiles/aa.gif similarity index 100% rename from styles/images/smiles/aa.gif rename to public/styles/images/smiles/aa.gif diff --git a/styles/images/smiles/ab.gif b/public/styles/images/smiles/ab.gif similarity index 100% rename from styles/images/smiles/ab.gif rename to public/styles/images/smiles/ab.gif diff --git a/styles/images/smiles/ac.gif b/public/styles/images/smiles/ac.gif similarity index 100% rename from styles/images/smiles/ac.gif rename to public/styles/images/smiles/ac.gif diff --git a/styles/images/smiles/ae.gif b/public/styles/images/smiles/ae.gif similarity index 100% rename from styles/images/smiles/ae.gif rename to public/styles/images/smiles/ae.gif diff --git a/styles/images/smiles/af.gif b/public/styles/images/smiles/af.gif similarity index 100% rename from styles/images/smiles/af.gif rename to public/styles/images/smiles/af.gif diff --git a/styles/images/smiles/ag.gif b/public/styles/images/smiles/ag.gif similarity index 100% rename from styles/images/smiles/ag.gif rename to public/styles/images/smiles/ag.gif diff --git a/styles/images/smiles/ah.gif b/public/styles/images/smiles/ah.gif similarity index 100% rename from styles/images/smiles/ah.gif rename to public/styles/images/smiles/ah.gif diff --git a/styles/images/smiles/ai.gif b/public/styles/images/smiles/ai.gif similarity index 100% rename from styles/images/smiles/ai.gif rename to public/styles/images/smiles/ai.gif diff --git a/styles/images/smiles/aj.gif b/public/styles/images/smiles/aj.gif similarity index 100% rename from styles/images/smiles/aj.gif rename to public/styles/images/smiles/aj.gif diff --git a/styles/images/smiles/ak.gif b/public/styles/images/smiles/ak.gif similarity index 100% rename from styles/images/smiles/ak.gif rename to public/styles/images/smiles/ak.gif diff --git a/styles/images/smiles/al.gif b/public/styles/images/smiles/al.gif similarity index 100% rename from styles/images/smiles/al.gif rename to public/styles/images/smiles/al.gif diff --git a/styles/images/smiles/am.gif b/public/styles/images/smiles/am.gif similarity index 100% rename from styles/images/smiles/am.gif rename to public/styles/images/smiles/am.gif diff --git a/styles/images/smiles/an.gif b/public/styles/images/smiles/an.gif similarity index 100% rename from styles/images/smiles/an.gif rename to public/styles/images/smiles/an.gif diff --git a/styles/images/smiles/ao.gif b/public/styles/images/smiles/ao.gif similarity index 100% rename from styles/images/smiles/ao.gif rename to public/styles/images/smiles/ao.gif diff --git a/styles/images/smiles/ap.gif b/public/styles/images/smiles/ap.gif similarity index 100% rename from styles/images/smiles/ap.gif rename to public/styles/images/smiles/ap.gif diff --git a/styles/images/smiles/aq.gif b/public/styles/images/smiles/aq.gif similarity index 100% rename from styles/images/smiles/aq.gif rename to public/styles/images/smiles/aq.gif diff --git a/styles/images/smiles/ar.gif b/public/styles/images/smiles/ar.gif similarity index 100% rename from styles/images/smiles/ar.gif rename to public/styles/images/smiles/ar.gif diff --git a/styles/images/smiles/as.gif b/public/styles/images/smiles/as.gif similarity index 100% rename from styles/images/smiles/as.gif rename to public/styles/images/smiles/as.gif diff --git a/styles/images/smiles/at.gif b/public/styles/images/smiles/at.gif similarity index 100% rename from styles/images/smiles/at.gif rename to public/styles/images/smiles/at.gif diff --git a/styles/images/smiles/au.gif b/public/styles/images/smiles/au.gif similarity index 100% rename from styles/images/smiles/au.gif rename to public/styles/images/smiles/au.gif diff --git a/styles/images/smiles/av.gif b/public/styles/images/smiles/av.gif similarity index 100% rename from styles/images/smiles/av.gif rename to public/styles/images/smiles/av.gif diff --git a/styles/images/smiles/aw.gif b/public/styles/images/smiles/aw.gif similarity index 100% rename from styles/images/smiles/aw.gif rename to public/styles/images/smiles/aw.gif diff --git a/styles/images/smiles/ax.gif b/public/styles/images/smiles/ax.gif similarity index 100% rename from styles/images/smiles/ax.gif rename to public/styles/images/smiles/ax.gif diff --git a/styles/images/smiles/ay.gif b/public/styles/images/smiles/ay.gif similarity index 100% rename from styles/images/smiles/ay.gif rename to public/styles/images/smiles/ay.gif diff --git a/styles/images/smiles/az.gif b/public/styles/images/smiles/az.gif similarity index 100% rename from styles/images/smiles/az.gif rename to public/styles/images/smiles/az.gif diff --git a/styles/images/smiles/ba.gif b/public/styles/images/smiles/ba.gif similarity index 100% rename from styles/images/smiles/ba.gif rename to public/styles/images/smiles/ba.gif diff --git a/styles/images/smiles/bb.gif b/public/styles/images/smiles/bb.gif similarity index 100% rename from styles/images/smiles/bb.gif rename to public/styles/images/smiles/bb.gif diff --git a/styles/images/smiles/bc.gif b/public/styles/images/smiles/bc.gif similarity index 100% rename from styles/images/smiles/bc.gif rename to public/styles/images/smiles/bc.gif diff --git a/styles/images/smiles/bd.gif b/public/styles/images/smiles/bd.gif similarity index 100% rename from styles/images/smiles/bd.gif rename to public/styles/images/smiles/bd.gif diff --git a/styles/images/smiles/be.gif b/public/styles/images/smiles/be.gif similarity index 100% rename from styles/images/smiles/be.gif rename to public/styles/images/smiles/be.gif diff --git a/styles/images/smiles/bf.gif b/public/styles/images/smiles/bf.gif similarity index 100% rename from styles/images/smiles/bf.gif rename to public/styles/images/smiles/bf.gif diff --git a/styles/images/smiles/bg.gif b/public/styles/images/smiles/bg.gif similarity index 100% rename from styles/images/smiles/bg.gif rename to public/styles/images/smiles/bg.gif diff --git a/styles/images/smiles/bh.gif b/public/styles/images/smiles/bh.gif similarity index 100% rename from styles/images/smiles/bh.gif rename to public/styles/images/smiles/bh.gif diff --git a/styles/images/smiles/bi.gif b/public/styles/images/smiles/bi.gif similarity index 100% rename from styles/images/smiles/bi.gif rename to public/styles/images/smiles/bi.gif diff --git a/styles/images/smiles/bj.gif b/public/styles/images/smiles/bj.gif similarity index 100% rename from styles/images/smiles/bj.gif rename to public/styles/images/smiles/bj.gif diff --git a/styles/images/smiles/bk.gif b/public/styles/images/smiles/bk.gif similarity index 100% rename from styles/images/smiles/bk.gif rename to public/styles/images/smiles/bk.gif diff --git a/styles/images/smiles/bl.gif b/public/styles/images/smiles/bl.gif similarity index 100% rename from styles/images/smiles/bl.gif rename to public/styles/images/smiles/bl.gif diff --git a/styles/images/smiles/bm.gif b/public/styles/images/smiles/bm.gif similarity index 100% rename from styles/images/smiles/bm.gif rename to public/styles/images/smiles/bm.gif diff --git a/styles/images/smiles/bn.gif b/public/styles/images/smiles/bn.gif similarity index 100% rename from styles/images/smiles/bn.gif rename to public/styles/images/smiles/bn.gif diff --git a/styles/images/smiles/bo.gif b/public/styles/images/smiles/bo.gif similarity index 100% rename from styles/images/smiles/bo.gif rename to public/styles/images/smiles/bo.gif diff --git a/styles/images/smiles/bp.gif b/public/styles/images/smiles/bp.gif similarity index 100% rename from styles/images/smiles/bp.gif rename to public/styles/images/smiles/bp.gif diff --git a/styles/images/smiles/bq.gif b/public/styles/images/smiles/bq.gif similarity index 100% rename from styles/images/smiles/bq.gif rename to public/styles/images/smiles/bq.gif diff --git a/styles/images/smiles/br.gif b/public/styles/images/smiles/br.gif similarity index 100% rename from styles/images/smiles/br.gif rename to public/styles/images/smiles/br.gif diff --git a/styles/images/smiles/bs.gif b/public/styles/images/smiles/bs.gif similarity index 100% rename from styles/images/smiles/bs.gif rename to public/styles/images/smiles/bs.gif diff --git a/styles/images/smiles/bt.gif b/public/styles/images/smiles/bt.gif similarity index 100% rename from styles/images/smiles/bt.gif rename to public/styles/images/smiles/bt.gif diff --git a/styles/images/smiles/bu.gif b/public/styles/images/smiles/bu.gif similarity index 100% rename from styles/images/smiles/bu.gif rename to public/styles/images/smiles/bu.gif diff --git a/styles/images/smiles/bv.gif b/public/styles/images/smiles/bv.gif similarity index 100% rename from styles/images/smiles/bv.gif rename to public/styles/images/smiles/bv.gif diff --git a/styles/images/smiles/bw.gif b/public/styles/images/smiles/bw.gif similarity index 100% rename from styles/images/smiles/bw.gif rename to public/styles/images/smiles/bw.gif diff --git a/styles/images/smiles/bx.gif b/public/styles/images/smiles/bx.gif similarity index 100% rename from styles/images/smiles/bx.gif rename to public/styles/images/smiles/bx.gif diff --git a/styles/images/smiles/by.gif b/public/styles/images/smiles/by.gif similarity index 100% rename from styles/images/smiles/by.gif rename to public/styles/images/smiles/by.gif diff --git a/styles/images/smiles/bz.gif b/public/styles/images/smiles/bz.gif similarity index 100% rename from styles/images/smiles/bz.gif rename to public/styles/images/smiles/bz.gif diff --git a/styles/images/smiles/ca.gif b/public/styles/images/smiles/ca.gif similarity index 100% rename from styles/images/smiles/ca.gif rename to public/styles/images/smiles/ca.gif diff --git a/styles/images/smiles/cb.gif b/public/styles/images/smiles/cb.gif similarity index 100% rename from styles/images/smiles/cb.gif rename to public/styles/images/smiles/cb.gif diff --git a/styles/images/smiles/cc.gif b/public/styles/images/smiles/cc.gif similarity index 100% rename from styles/images/smiles/cc.gif rename to public/styles/images/smiles/cc.gif diff --git a/styles/images/smiles/cd.gif b/public/styles/images/smiles/cd.gif similarity index 100% rename from styles/images/smiles/cd.gif rename to public/styles/images/smiles/cd.gif diff --git a/styles/images/smiles/tr_oops.gif b/public/styles/images/smiles/tr_oops.gif similarity index 100% rename from styles/images/smiles/tr_oops.gif rename to public/styles/images/smiles/tr_oops.gif diff --git a/styles/images/spacer.gif b/public/styles/images/spacer.gif similarity index 100% rename from styles/images/spacer.gif rename to public/styles/images/spacer.gif diff --git a/styles/images/t_info.png b/public/styles/images/t_info.png similarity index 100% rename from styles/images/t_info.png rename to public/styles/images/t_info.png diff --git a/styles/images/tor_gold.gif b/public/styles/images/tor_gold.gif similarity index 100% rename from styles/images/tor_gold.gif rename to public/styles/images/tor_gold.gif diff --git a/styles/images/tor_m3u_format.png b/public/styles/images/tor_m3u_format.png similarity index 100% rename from styles/images/tor_m3u_format.png rename to public/styles/images/tor_m3u_format.png diff --git a/styles/images/tor_silver.gif b/public/styles/images/tor_silver.gif similarity index 100% rename from styles/images/tor_silver.gif rename to public/styles/images/tor_silver.gif diff --git a/styles/images/user_offline.gif b/public/styles/images/user_offline.gif similarity index 100% rename from styles/images/user_offline.gif rename to public/styles/images/user_offline.gif diff --git a/styles/images/user_online.gif b/public/styles/images/user_online.gif similarity index 100% rename from styles/images/user_online.gif rename to public/styles/images/user_online.gif diff --git a/styles/js/bbcode.js b/public/styles/js/bbcode.js similarity index 100% rename from styles/js/bbcode.js rename to public/styles/js/bbcode.js diff --git a/styles/js/libs/clipboard.min.js b/public/styles/js/libs/clipboard.min.js similarity index 100% rename from styles/js/libs/clipboard.min.js rename to public/styles/js/libs/clipboard.min.js diff --git a/styles/js/libs/jquery-1.12.4.min.js b/public/styles/js/libs/jquery-1.12.4.min.js similarity index 100% rename from styles/js/libs/jquery-1.12.4.min.js rename to public/styles/js/libs/jquery-1.12.4.min.js diff --git a/styles/js/libs/jquery-migrate.min.js b/public/styles/js/libs/jquery-migrate.min.js similarity index 100% rename from styles/js/libs/jquery-migrate.min.js rename to public/styles/js/libs/jquery-migrate.min.js diff --git a/styles/js/libs/legacy.js b/public/styles/js/libs/legacy.js similarity index 100% rename from styles/js/libs/legacy.js rename to public/styles/js/libs/legacy.js diff --git a/styles/js/libs/oldbrowserdetector.min.js b/public/styles/js/libs/oldbrowserdetector.min.js similarity index 100% rename from styles/js/libs/oldbrowserdetector.min.js rename to public/styles/js/libs/oldbrowserdetector.min.js diff --git a/styles/js/libs/printThis.min.js b/public/styles/js/libs/printThis.min.js similarity index 100% rename from styles/js/libs/printThis.min.js rename to public/styles/js/libs/printThis.min.js diff --git a/styles/js/main.js b/public/styles/js/main.js similarity index 100% rename from styles/js/main.js rename to public/styles/js/main.js diff --git a/styles/templates/default/css/admin.css b/public/styles/templates/default/css/admin.css similarity index 100% rename from styles/templates/default/css/admin.css rename to public/styles/templates/default/css/admin.css diff --git a/styles/templates/default/css/ajax.css b/public/styles/templates/default/css/ajax.css similarity index 100% rename from styles/templates/default/css/ajax.css rename to public/styles/templates/default/css/ajax.css diff --git a/styles/templates/default/css/alert.css b/public/styles/templates/default/css/alert.css similarity index 100% rename from styles/templates/default/css/alert.css rename to public/styles/templates/default/css/alert.css diff --git a/styles/templates/default/css/globals.css b/public/styles/templates/default/css/globals.css similarity index 100% rename from styles/templates/default/css/globals.css rename to public/styles/templates/default/css/globals.css diff --git a/styles/templates/default/css/images.css b/public/styles/templates/default/css/images.css similarity index 100% rename from styles/templates/default/css/images.css rename to public/styles/templates/default/css/images.css diff --git a/styles/templates/default/css/initial.css b/public/styles/templates/default/css/initial.css similarity index 100% rename from styles/templates/default/css/initial.css rename to public/styles/templates/default/css/initial.css diff --git a/styles/templates/default/css/main.css b/public/styles/templates/default/css/main.css similarity index 100% rename from styles/templates/default/css/main.css rename to public/styles/templates/default/css/main.css diff --git a/styles/templates/default/css/main_content.css b/public/styles/templates/default/css/main_content.css similarity index 100% rename from styles/templates/default/css/main_content.css rename to public/styles/templates/default/css/main_content.css diff --git a/styles/templates/default/css/menus.css b/public/styles/templates/default/css/menus.css similarity index 100% rename from styles/templates/default/css/menus.css rename to public/styles/templates/default/css/menus.css diff --git a/styles/templates/default/css/misc.css b/public/styles/templates/default/css/misc.css similarity index 100% rename from styles/templates/default/css/misc.css rename to public/styles/templates/default/css/misc.css diff --git a/styles/templates/default/css/modern-normalize.css b/public/styles/templates/default/css/modern-normalize.css similarity index 100% rename from styles/templates/default/css/modern-normalize.css rename to public/styles/templates/default/css/modern-normalize.css diff --git a/styles/templates/default/css/page_content.css b/public/styles/templates/default/css/page_content.css similarity index 100% rename from styles/templates/default/css/page_content.css rename to public/styles/templates/default/css/page_content.css diff --git a/styles/templates/default/css/page_footer.css b/public/styles/templates/default/css/page_footer.css similarity index 100% rename from styles/templates/default/css/page_footer.css rename to public/styles/templates/default/css/page_footer.css diff --git a/styles/templates/default/css/page_header.css b/public/styles/templates/default/css/page_header.css similarity index 100% rename from styles/templates/default/css/page_header.css rename to public/styles/templates/default/css/page_header.css diff --git a/styles/templates/default/css/shortcuts.css b/public/styles/templates/default/css/shortcuts.css similarity index 100% rename from styles/templates/default/css/shortcuts.css rename to public/styles/templates/default/css/shortcuts.css diff --git a/styles/templates/default/css/tablesorter.css b/public/styles/templates/default/css/tablesorter.css similarity index 100% rename from styles/templates/default/css/tablesorter.css rename to public/styles/templates/default/css/tablesorter.css diff --git a/styles/templates/default/css/top.css b/public/styles/templates/default/css/top.css similarity index 100% rename from styles/templates/default/css/top.css rename to public/styles/templates/default/css/top.css diff --git a/styles/templates/default/css/youtube.css b/public/styles/templates/default/css/youtube.css similarity index 100% rename from styles/templates/default/css/youtube.css rename to public/styles/templates/default/css/youtube.css diff --git a/styles/templates/default/images/aerobg.png b/public/styles/templates/default/images/aerobg.png similarity index 100% rename from styles/templates/default/images/aerobg.png rename to public/styles/templates/default/images/aerobg.png diff --git a/styles/templates/default/images/arrow1.gif b/public/styles/templates/default/images/arrow1.gif similarity index 100% rename from styles/templates/default/images/arrow1.gif rename to public/styles/templates/default/images/arrow1.gif diff --git a/styles/templates/default/images/button.gif b/public/styles/templates/default/images/button.gif similarity index 100% rename from styles/templates/default/images/button.gif rename to public/styles/templates/default/images/button.gif diff --git a/styles/templates/default/images/cellpic.gif b/public/styles/templates/default/images/cellpic.gif similarity index 100% rename from styles/templates/default/images/cellpic.gif rename to public/styles/templates/default/images/cellpic.gif diff --git a/styles/templates/default/images/cellpic1.gif b/public/styles/templates/default/images/cellpic1.gif similarity index 100% rename from styles/templates/default/images/cellpic1.gif rename to public/styles/templates/default/images/cellpic1.gif diff --git a/styles/templates/default/images/def_button.png b/public/styles/templates/default/images/def_button.png similarity index 100% rename from styles/templates/default/images/def_button.png rename to public/styles/templates/default/images/def_button.png diff --git a/styles/templates/default/images/def_button_light.png b/public/styles/templates/default/images/def_button_light.png similarity index 100% rename from styles/templates/default/images/def_button_light.png rename to public/styles/templates/default/images/def_button_light.png diff --git a/styles/templates/default/images/feed.png b/public/styles/templates/default/images/feed.png similarity index 100% rename from styles/templates/default/images/feed.png rename to public/styles/templates/default/images/feed.png diff --git a/styles/templates/default/images/folder.gif b/public/styles/templates/default/images/folder.gif similarity index 100% rename from styles/templates/default/images/folder.gif rename to public/styles/templates/default/images/folder.gif diff --git a/styles/templates/default/images/folder_announce.gif b/public/styles/templates/default/images/folder_announce.gif similarity index 100% rename from styles/templates/default/images/folder_announce.gif rename to public/styles/templates/default/images/folder_announce.gif diff --git a/styles/templates/default/images/folder_announce_new.gif b/public/styles/templates/default/images/folder_announce_new.gif similarity index 100% rename from styles/templates/default/images/folder_announce_new.gif rename to public/styles/templates/default/images/folder_announce_new.gif diff --git a/styles/templates/default/images/folder_big.gif b/public/styles/templates/default/images/folder_big.gif similarity index 100% rename from styles/templates/default/images/folder_big.gif rename to public/styles/templates/default/images/folder_big.gif diff --git a/styles/templates/default/images/folder_dl.gif b/public/styles/templates/default/images/folder_dl.gif similarity index 100% rename from styles/templates/default/images/folder_dl.gif rename to public/styles/templates/default/images/folder_dl.gif diff --git a/styles/templates/default/images/folder_dl_hot.gif b/public/styles/templates/default/images/folder_dl_hot.gif similarity index 100% rename from styles/templates/default/images/folder_dl_hot.gif rename to public/styles/templates/default/images/folder_dl_hot.gif diff --git a/styles/templates/default/images/folder_dl_hot_new.gif b/public/styles/templates/default/images/folder_dl_hot_new.gif similarity index 100% rename from styles/templates/default/images/folder_dl_hot_new.gif rename to public/styles/templates/default/images/folder_dl_hot_new.gif diff --git a/styles/templates/default/images/folder_dl_new.gif b/public/styles/templates/default/images/folder_dl_new.gif similarity index 100% rename from styles/templates/default/images/folder_dl_new.gif rename to public/styles/templates/default/images/folder_dl_new.gif diff --git a/styles/templates/default/images/folder_hot.gif b/public/styles/templates/default/images/folder_hot.gif similarity index 100% rename from styles/templates/default/images/folder_hot.gif rename to public/styles/templates/default/images/folder_hot.gif diff --git a/styles/templates/default/images/folder_lock.gif b/public/styles/templates/default/images/folder_lock.gif similarity index 100% rename from styles/templates/default/images/folder_lock.gif rename to public/styles/templates/default/images/folder_lock.gif diff --git a/styles/templates/default/images/folder_lock_new.gif b/public/styles/templates/default/images/folder_lock_new.gif similarity index 100% rename from styles/templates/default/images/folder_lock_new.gif rename to public/styles/templates/default/images/folder_lock_new.gif diff --git a/styles/templates/default/images/folder_locked_big.gif b/public/styles/templates/default/images/folder_locked_big.gif similarity index 100% rename from styles/templates/default/images/folder_locked_big.gif rename to public/styles/templates/default/images/folder_locked_big.gif diff --git a/styles/templates/default/images/folder_new.gif b/public/styles/templates/default/images/folder_new.gif similarity index 100% rename from styles/templates/default/images/folder_new.gif rename to public/styles/templates/default/images/folder_new.gif diff --git a/styles/templates/default/images/folder_new_big.gif b/public/styles/templates/default/images/folder_new_big.gif similarity index 100% rename from styles/templates/default/images/folder_new_big.gif rename to public/styles/templates/default/images/folder_new_big.gif diff --git a/styles/templates/default/images/folder_new_hot.gif b/public/styles/templates/default/images/folder_new_hot.gif similarity index 100% rename from styles/templates/default/images/folder_new_hot.gif rename to public/styles/templates/default/images/folder_new_hot.gif diff --git a/styles/templates/default/images/folder_sticky.gif b/public/styles/templates/default/images/folder_sticky.gif similarity index 100% rename from styles/templates/default/images/folder_sticky.gif rename to public/styles/templates/default/images/folder_sticky.gif diff --git a/styles/templates/default/images/folder_sticky_new.gif b/public/styles/templates/default/images/folder_sticky_new.gif similarity index 100% rename from styles/templates/default/images/folder_sticky_new.gif rename to public/styles/templates/default/images/folder_sticky_new.gif diff --git a/styles/templates/default/images/hr200_ltr_gradient.jpg b/public/styles/templates/default/images/hr200_ltr_gradient.jpg similarity index 100% rename from styles/templates/default/images/hr200_ltr_gradient.jpg rename to public/styles/templates/default/images/hr200_ltr_gradient.jpg diff --git a/styles/templates/default/images/hr400_ltr_gradient.jpg b/public/styles/templates/default/images/hr400_ltr_gradient.jpg similarity index 100% rename from styles/templates/default/images/hr400_ltr_gradient.jpg rename to public/styles/templates/default/images/hr400_ltr_gradient.jpg diff --git a/styles/templates/default/images/icon_birthday.gif b/public/styles/templates/default/images/icon_birthday.gif similarity index 100% rename from styles/templates/default/images/icon_birthday.gif rename to public/styles/templates/default/images/icon_birthday.gif diff --git a/styles/templates/default/images/icon_delete.gif b/public/styles/templates/default/images/icon_delete.gif similarity index 100% rename from styles/templates/default/images/icon_delete.gif rename to public/styles/templates/default/images/icon_delete.gif diff --git a/styles/templates/default/images/icon_female.gif b/public/styles/templates/default/images/icon_female.gif similarity index 100% rename from styles/templates/default/images/icon_female.gif rename to public/styles/templates/default/images/icon_female.gif diff --git a/styles/templates/default/images/icon_latest_reply.gif b/public/styles/templates/default/images/icon_latest_reply.gif similarity index 100% rename from styles/templates/default/images/icon_latest_reply.gif rename to public/styles/templates/default/images/icon_latest_reply.gif diff --git a/styles/templates/default/images/icon_male.gif b/public/styles/templates/default/images/icon_male.gif similarity index 100% rename from styles/templates/default/images/icon_male.gif rename to public/styles/templates/default/images/icon_male.gif diff --git a/styles/templates/default/images/icon_minipost.gif b/public/styles/templates/default/images/icon_minipost.gif similarity index 100% rename from styles/templates/default/images/icon_minipost.gif rename to public/styles/templates/default/images/icon_minipost.gif diff --git a/styles/templates/default/images/icon_minipost_new.gif b/public/styles/templates/default/images/icon_minipost_new.gif similarity index 100% rename from styles/templates/default/images/icon_minipost_new.gif rename to public/styles/templates/default/images/icon_minipost_new.gif diff --git a/styles/templates/default/images/icon_minus_1.gif b/public/styles/templates/default/images/icon_minus_1.gif similarity index 100% rename from styles/templates/default/images/icon_minus_1.gif rename to public/styles/templates/default/images/icon_minus_1.gif diff --git a/styles/templates/default/images/icon_minus_2.gif b/public/styles/templates/default/images/icon_minus_2.gif similarity index 100% rename from styles/templates/default/images/icon_minus_2.gif rename to public/styles/templates/default/images/icon_minus_2.gif diff --git a/styles/templates/default/images/icon_mod.gif b/public/styles/templates/default/images/icon_mod.gif similarity index 100% rename from styles/templates/default/images/icon_mod.gif rename to public/styles/templates/default/images/icon_mod.gif diff --git a/styles/templates/default/images/icon_newest_reply.gif b/public/styles/templates/default/images/icon_newest_reply.gif similarity index 100% rename from styles/templates/default/images/icon_newest_reply.gif rename to public/styles/templates/default/images/icon_newest_reply.gif diff --git a/styles/templates/default/images/icon_nogender.gif b/public/styles/templates/default/images/icon_nogender.gif similarity index 100% rename from styles/templates/default/images/icon_nogender.gif rename to public/styles/templates/default/images/icon_nogender.gif diff --git a/styles/templates/default/images/icon_plus_1.gif b/public/styles/templates/default/images/icon_plus_1.gif similarity index 100% rename from styles/templates/default/images/icon_plus_1.gif rename to public/styles/templates/default/images/icon_plus_1.gif diff --git a/styles/templates/default/images/icon_plus_2.gif b/public/styles/templates/default/images/icon_plus_2.gif similarity index 100% rename from styles/templates/default/images/icon_plus_2.gif rename to public/styles/templates/default/images/icon_plus_2.gif diff --git a/styles/templates/default/images/img_alert.gif b/public/styles/templates/default/images/img_alert.gif similarity index 100% rename from styles/templates/default/images/img_alert.gif rename to public/styles/templates/default/images/img_alert.gif diff --git a/styles/templates/default/images/lang/af/icon_code.gif b/public/styles/templates/default/images/lang/en/icon_code.gif similarity index 100% rename from styles/templates/default/images/lang/af/icon_code.gif rename to public/styles/templates/default/images/lang/en/icon_code.gif diff --git a/styles/templates/default/images/lang/af/icon_edit.gif b/public/styles/templates/default/images/lang/en/icon_edit.gif similarity index 100% rename from styles/templates/default/images/lang/af/icon_edit.gif rename to public/styles/templates/default/images/lang/en/icon_edit.gif diff --git a/styles/templates/default/images/lang/af/icon_email.gif b/public/styles/templates/default/images/lang/en/icon_email.gif similarity index 100% rename from styles/templates/default/images/lang/af/icon_email.gif rename to public/styles/templates/default/images/lang/en/icon_email.gif diff --git a/styles/templates/default/images/lang/af/icon_icq_add.gif b/public/styles/templates/default/images/lang/en/icon_icq_add.gif similarity index 100% rename from styles/templates/default/images/lang/af/icon_icq_add.gif rename to public/styles/templates/default/images/lang/en/icon_icq_add.gif diff --git a/styles/templates/default/images/lang/af/icon_ip.gif b/public/styles/templates/default/images/lang/en/icon_ip.gif similarity index 100% rename from styles/templates/default/images/lang/af/icon_ip.gif rename to public/styles/templates/default/images/lang/en/icon_ip.gif diff --git a/styles/templates/default/images/lang/af/icon_mc.gif b/public/styles/templates/default/images/lang/en/icon_mc.gif similarity index 100% rename from styles/templates/default/images/lang/af/icon_mc.gif rename to public/styles/templates/default/images/lang/en/icon_mc.gif diff --git a/styles/templates/default/images/lang/af/icon_pm.gif b/public/styles/templates/default/images/lang/en/icon_pm.gif similarity index 100% rename from styles/templates/default/images/lang/af/icon_pm.gif rename to public/styles/templates/default/images/lang/en/icon_pm.gif diff --git a/styles/templates/default/images/lang/af/icon_poll.gif b/public/styles/templates/default/images/lang/en/icon_poll.gif similarity index 100% rename from styles/templates/default/images/lang/af/icon_poll.gif rename to public/styles/templates/default/images/lang/en/icon_poll.gif diff --git a/styles/templates/default/images/lang/af/icon_profile.gif b/public/styles/templates/default/images/lang/en/icon_profile.gif similarity index 100% rename from styles/templates/default/images/lang/af/icon_profile.gif rename to public/styles/templates/default/images/lang/en/icon_profile.gif diff --git a/styles/templates/default/images/lang/af/icon_quote.gif b/public/styles/templates/default/images/lang/en/icon_quote.gif similarity index 100% rename from styles/templates/default/images/lang/af/icon_quote.gif rename to public/styles/templates/default/images/lang/en/icon_quote.gif diff --git a/styles/templates/default/images/lang/af/icon_search.gif b/public/styles/templates/default/images/lang/en/icon_search.gif similarity index 100% rename from styles/templates/default/images/lang/af/icon_search.gif rename to public/styles/templates/default/images/lang/en/icon_search.gif diff --git a/styles/templates/default/images/lang/af/icon_www.gif b/public/styles/templates/default/images/lang/en/icon_www.gif similarity index 100% rename from styles/templates/default/images/lang/af/icon_www.gif rename to public/styles/templates/default/images/lang/en/icon_www.gif diff --git a/styles/templates/default/images/lang/af/msg_newpost.gif b/public/styles/templates/default/images/lang/en/msg_newpost.gif similarity index 100% rename from styles/templates/default/images/lang/af/msg_newpost.gif rename to public/styles/templates/default/images/lang/en/msg_newpost.gif diff --git a/styles/templates/default/images/lang/af/post.gif b/public/styles/templates/default/images/lang/en/post.gif similarity index 100% rename from styles/templates/default/images/lang/af/post.gif rename to public/styles/templates/default/images/lang/en/post.gif diff --git a/styles/templates/default/images/lang/af/release.gif b/public/styles/templates/default/images/lang/en/release.gif similarity index 100% rename from styles/templates/default/images/lang/af/release.gif rename to public/styles/templates/default/images/lang/en/release.gif diff --git a/styles/templates/default/images/lang/af/reply-locked.gif b/public/styles/templates/default/images/lang/en/reply-locked.gif similarity index 100% rename from styles/templates/default/images/lang/af/reply-locked.gif rename to public/styles/templates/default/images/lang/en/reply-locked.gif diff --git a/styles/templates/default/images/lang/af/reply.gif b/public/styles/templates/default/images/lang/en/reply.gif similarity index 100% rename from styles/templates/default/images/lang/af/reply.gif rename to public/styles/templates/default/images/lang/en/reply.gif diff --git a/styles/templates/default/images/link_help.cur b/public/styles/templates/default/images/link_help.cur similarity index 100% rename from styles/templates/default/images/link_help.cur rename to public/styles/templates/default/images/link_help.cur diff --git a/styles/templates/default/images/loading.gif b/public/styles/templates/default/images/loading.gif similarity index 100% rename from styles/templates/default/images/loading.gif rename to public/styles/templates/default/images/loading.gif diff --git a/styles/templates/default/images/menu_open.gif b/public/styles/templates/default/images/menu_open.gif similarity index 100% rename from styles/templates/default/images/menu_open.gif rename to public/styles/templates/default/images/menu_open.gif diff --git a/styles/templates/default/images/menu_open_1.gif b/public/styles/templates/default/images/menu_open_1.gif similarity index 100% rename from styles/templates/default/images/menu_open_1.gif rename to public/styles/templates/default/images/menu_open_1.gif diff --git a/styles/templates/default/images/msg_inbox.gif b/public/styles/templates/default/images/msg_inbox.gif similarity index 100% rename from styles/templates/default/images/msg_inbox.gif rename to public/styles/templates/default/images/msg_inbox.gif diff --git a/styles/templates/default/images/msg_outbox.gif b/public/styles/templates/default/images/msg_outbox.gif similarity index 100% rename from styles/templates/default/images/msg_outbox.gif rename to public/styles/templates/default/images/msg_outbox.gif diff --git a/styles/templates/default/images/msg_savebox.gif b/public/styles/templates/default/images/msg_savebox.gif similarity index 100% rename from styles/templates/default/images/msg_savebox.gif rename to public/styles/templates/default/images/msg_savebox.gif diff --git a/styles/templates/default/images/msg_sentbox.gif b/public/styles/templates/default/images/msg_sentbox.gif similarity index 100% rename from styles/templates/default/images/msg_sentbox.gif rename to public/styles/templates/default/images/msg_sentbox.gif diff --git a/styles/templates/default/images/progress_bar.gif b/public/styles/templates/default/images/progress_bar.gif similarity index 100% rename from styles/templates/default/images/progress_bar.gif rename to public/styles/templates/default/images/progress_bar.gif diff --git a/styles/templates/default/images/progress_bar_full.gif b/public/styles/templates/default/images/progress_bar_full.gif similarity index 100% rename from styles/templates/default/images/progress_bar_full.gif rename to public/styles/templates/default/images/progress_bar_full.gif diff --git a/styles/templates/default/images/spacer.gif b/public/styles/templates/default/images/spacer.gif similarity index 100% rename from styles/templates/default/images/spacer.gif rename to public/styles/templates/default/images/spacer.gif diff --git a/styles/templates/default/images/tbl_sort_asc.gif b/public/styles/templates/default/images/tbl_sort_asc.gif similarity index 100% rename from styles/templates/default/images/tbl_sort_asc.gif rename to public/styles/templates/default/images/tbl_sort_asc.gif diff --git a/styles/templates/default/images/tbl_sort_bg.gif b/public/styles/templates/default/images/tbl_sort_bg.gif similarity index 100% rename from styles/templates/default/images/tbl_sort_bg.gif rename to public/styles/templates/default/images/tbl_sort_bg.gif diff --git a/styles/templates/default/images/tbl_sort_desc.gif b/public/styles/templates/default/images/tbl_sort_desc.gif similarity index 100% rename from styles/templates/default/images/tbl_sort_desc.gif rename to public/styles/templates/default/images/tbl_sort_desc.gif diff --git a/styles/templates/default/images/topic_delete.gif b/public/styles/templates/default/images/topic_delete.gif similarity index 100% rename from styles/templates/default/images/topic_delete.gif rename to public/styles/templates/default/images/topic_delete.gif diff --git a/styles/templates/default/images/topic_dl.gif b/public/styles/templates/default/images/topic_dl.gif similarity index 100% rename from styles/templates/default/images/topic_dl.gif rename to public/styles/templates/default/images/topic_dl.gif diff --git a/styles/templates/default/images/topic_lock.gif b/public/styles/templates/default/images/topic_lock.gif similarity index 100% rename from styles/templates/default/images/topic_lock.gif rename to public/styles/templates/default/images/topic_lock.gif diff --git a/styles/templates/default/images/topic_move.gif b/public/styles/templates/default/images/topic_move.gif similarity index 100% rename from styles/templates/default/images/topic_move.gif rename to public/styles/templates/default/images/topic_move.gif diff --git a/styles/templates/default/images/topic_normal.gif b/public/styles/templates/default/images/topic_normal.gif similarity index 100% rename from styles/templates/default/images/topic_normal.gif rename to public/styles/templates/default/images/topic_normal.gif diff --git a/styles/templates/default/images/topic_split.gif b/public/styles/templates/default/images/topic_split.gif similarity index 100% rename from styles/templates/default/images/topic_split.gif rename to public/styles/templates/default/images/topic_split.gif diff --git a/styles/templates/default/images/topic_unlock.gif b/public/styles/templates/default/images/topic_unlock.gif similarity index 100% rename from styles/templates/default/images/topic_unlock.gif rename to public/styles/templates/default/images/topic_unlock.gif diff --git a/styles/templates/default/images/treeview/treeview-default-line.gif b/public/styles/templates/default/images/treeview/treeview-default-line.gif similarity index 100% rename from styles/templates/default/images/treeview/treeview-default-line.gif rename to public/styles/templates/default/images/treeview/treeview-default-line.gif diff --git a/styles/templates/default/images/treeview/treeview-default.gif b/public/styles/templates/default/images/treeview/treeview-default.gif similarity index 100% rename from styles/templates/default/images/treeview/treeview-default.gif rename to public/styles/templates/default/images/treeview/treeview-default.gif diff --git a/styles/templates/default/images/vote_lcap.gif b/public/styles/templates/default/images/vote_lcap.gif similarity index 100% rename from styles/templates/default/images/vote_lcap.gif rename to public/styles/templates/default/images/vote_lcap.gif diff --git a/styles/templates/default/images/vote_rcap.gif b/public/styles/templates/default/images/vote_rcap.gif similarity index 100% rename from styles/templates/default/images/vote_rcap.gif rename to public/styles/templates/default/images/vote_rcap.gif diff --git a/styles/templates/default/images/voting_bar.gif b/public/styles/templates/default/images/voting_bar.gif similarity index 100% rename from styles/templates/default/images/voting_bar.gif rename to public/styles/templates/default/images/voting_bar.gif diff --git a/styles/templates/default/images/whosonline.gif b/public/styles/templates/default/images/whosonline.gif similarity index 100% rename from styles/templates/default/images/whosonline.gif rename to public/styles/templates/default/images/whosonline.gif diff --git a/src/Application/Forum/Command/README.md b/src/Application/Forum/Command/README.md deleted file mode 100644 index eae098d4a..000000000 --- a/src/Application/Forum/Command/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Forum Commands - -Commands representing write operations: - -- `CreateThreadCommand`: Start new discussion -- `CreatePostCommand`: Reply to thread -- `EditPostCommand`: Modify existing post -- `LockThreadCommand`: Lock thread from replies -- `DeletePostCommand`: Remove post - -Commands are simple DTOs containing operation data. \ No newline at end of file diff --git a/src/Application/Forum/Handler/README.md b/src/Application/Forum/Handler/README.md deleted file mode 100644 index 4af804611..000000000 --- a/src/Application/Forum/Handler/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Forum Handlers - -Command and query handlers for forum operations: - -- `CreateThreadHandler`: Handles thread creation -- `CreatePostHandler`: Handles post creation -- `GetThreadListHandler`: Retrieves thread listings - -Handlers coordinate between domain and infrastructure layers. \ No newline at end of file diff --git a/src/Application/Forum/Query/README.md b/src/Application/Forum/Query/README.md deleted file mode 100644 index 845ef3948..000000000 --- a/src/Application/Forum/Query/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Forum Queries - -Read-only queries for forum data: - -- `GetThreadListQuery`: Paginated thread listing -- `GetPostsByThreadQuery`: Thread posts with pagination -- `SearchPostsQuery`: Full-text post search -- `GetForumStatsQuery`: Forum statistics - -Queries return DTOs optimized for presentation. \ No newline at end of file diff --git a/src/Application/README.md b/src/Application/README.md deleted file mode 100644 index f7a27973c..000000000 --- a/src/Application/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Application Layer - -Contains application services that orchestrate domain objects to fulfill use cases. - -- Commands: Write operations that change state -- Queries: Read operations for data retrieval -- Handlers: Process commands and queries - -This layer should: - -- Coordinate domain objects -- Handle transactions -- Dispatch domain events -- Not contain business logic \ No newline at end of file diff --git a/src/Application/Tracker/Command/README.md b/src/Application/Tracker/Command/README.md deleted file mode 100644 index 800c6579d..000000000 --- a/src/Application/Tracker/Command/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Tracker Commands - -Commands representing write operations: - -- `RegisterTorrentCommand`: Register new torrent -- `UpdateTorrentCommand`: Modify torrent details -- `DeleteTorrentCommand`: Remove torrent from tracker - -Example: - -```php -final class RegisterTorrentCommand -{ - public function __construct( - public readonly string $infoHash, - public readonly int $uploaderId, - public readonly string $name, - public readonly int $size - ) {} -} -``` \ No newline at end of file diff --git a/src/Application/Tracker/Handler/README.md b/src/Application/Tracker/Handler/README.md deleted file mode 100644 index b30755d33..000000000 --- a/src/Application/Tracker/Handler/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Tracker Handlers - -Command and query handlers for tracker operations: - -- `RegisterTorrentHandler`: Processes torrent registration -- `GetTorrentDetailsHandler`: Retrieves torrent information -- `UpdateTorrentHandler`: Handles torrent updates - -Note: High-performance announce operations bypass this layer. \ No newline at end of file diff --git a/src/Application/Tracker/Query/README.md b/src/Application/Tracker/Query/README.md deleted file mode 100644 index 05e42e39f..000000000 --- a/src/Application/Tracker/Query/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Tracker Queries - -Read-only queries for tracker data: - -- `GetTorrentDetailsQuery`: Single torrent information -- `GetPeerListQuery`: Active peers for torrent -- `GetTorrentStatsQuery`: Download/upload statistics -- `SearchTorrentsQuery`: Browse and filter torrents - -Optimized for high-performance read operations. \ No newline at end of file diff --git a/src/Application/User/Command/README.md b/src/Application/User/Command/README.md deleted file mode 100644 index fbf0342be..000000000 --- a/src/Application/User/Command/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# User Commands - -Commands for user management operations: - -- `RegisterUserCommand`: New user registration -- `ChangePasswordCommand`: Password update -- `UpdateProfileCommand`: Profile modifications -- `ActivateUserCommand`: Account activation -- `BanUserCommand`: User suspension - -These commands trigger domain events for cross-context synchronization. \ No newline at end of file diff --git a/src/Application/User/Handler/README.md b/src/Application/User/Handler/README.md deleted file mode 100644 index 8f34ce418..000000000 --- a/src/Application/User/Handler/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# User Handlers - -Command and query handlers for user operations: - -- `RegisterUserHandler`: Processes user registration -- `ChangePasswordHandler`: Handles password changes -- `GetUserProfileHandler`: Retrieves user profiles - -Handlers manage transactions and event dispatching. \ No newline at end of file diff --git a/src/Application/User/Query/README.md b/src/Application/User/Query/README.md deleted file mode 100644 index 1307a51ec..000000000 --- a/src/Application/User/Query/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# User Queries - -Read operations for user data: - -- `GetUserProfileQuery`: User profile details -- `SearchUsersQuery`: User search with filters -- `GetUserStatisticsQuery`: Upload/download stats -- `GetUserPermissionsQuery`: Authorization data - -Returns DTOs suitable for presentation layer. \ No newline at end of file diff --git a/src/Domain/Forum/Exception/README.md b/src/Domain/Forum/Exception/README.md deleted file mode 100644 index 07a483fe6..000000000 --- a/src/Domain/Forum/Exception/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Forum Domain Exceptions - -Domain-specific exceptions for forum operations: - -- `ThreadLockedException`: Attempt to post in locked thread -- `PostEditTimeExpiredException`: Edit time limit exceeded -- `ForumAccessDeniedException`: Insufficient permissions -- `InvalidPostContentException`: Post validation failed \ No newline at end of file diff --git a/src/Domain/Forum/Model/README.md b/src/Domain/Forum/Model/README.md deleted file mode 100644 index 6dafb0894..000000000 --- a/src/Domain/Forum/Model/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Forum Domain Models - -Contains aggregate roots and entities for the forum system: - -- `Forum`: Forum category aggregate -- `Thread`: Discussion thread aggregate root -- `Post`: Individual post entity -- `Attachment`: File attachment entity - -Business rules enforced at this level: - -- Post editing time limits -- Thread locking rules -- Forum access permissions -- Post moderation workflow \ No newline at end of file diff --git a/src/Domain/Forum/Repository/README.md b/src/Domain/Forum/Repository/README.md deleted file mode 100644 index 1a8430801..000000000 --- a/src/Domain/Forum/Repository/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Forum Repository Interfaces - -Repository interfaces for forum aggregates: - -- `ForumRepositoryInterface`: Forum aggregate persistence -- `ThreadRepositoryInterface`: Thread aggregate persistence -- `PostRepositoryInterface`: Post queries (read-only) - -These interfaces define contracts that infrastructure must implement. \ No newline at end of file diff --git a/src/Domain/Forum/ValueObject/README.md b/src/Domain/Forum/ValueObject/README.md deleted file mode 100644 index eb8aec659..000000000 --- a/src/Domain/Forum/ValueObject/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Forum Value Objects - -Immutable objects representing forum concepts: - -- `PostId`: Unique post identifier -- `ThreadTitle`: Thread title with validation -- `PostContent`: Formatted post content -- `ForumSlug`: URL-friendly forum identifier - -These objects ensure type safety and encapsulate validation rules. \ No newline at end of file diff --git a/src/Domain/README.md b/src/Domain/README.md deleted file mode 100644 index cb9254a68..000000000 --- a/src/Domain/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Domain Layer - -This directory contains the core business logic of TorrentPier. Code here should: - -- Have no dependencies on frameworks or infrastructure -- Represent pure business rules and domain models -- Be testable in isolation -- Use only PHP language features and domain concepts - -## Bounded Contexts - -- **Forum**: Discussion forums, posts, threads -- **Tracker**: BitTorrent tracking, peers, torrents -- **User**: User management, authentication, profiles -- **Shared**: Minimal shared concepts between contexts \ No newline at end of file diff --git a/src/Domain/Shared/Event/README.md b/src/Domain/Shared/Event/README.md deleted file mode 100644 index 11656fb4a..000000000 --- a/src/Domain/Shared/Event/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Domain Events - -Base classes and interfaces for domain event system: - -- `DomainEvent`: Base event interface -- `EventRecording`: Trait for aggregate event recording -- `AggregateHistory`: Event sourcing support - -Example events: - -- `UserRegisteredEvent` -- `TorrentUploadedEvent` -- `ThreadCreatedEvent` - -Events enable loose coupling between bounded contexts. \ No newline at end of file diff --git a/src/Domain/Shared/Exception/README.md b/src/Domain/Shared/Exception/README.md deleted file mode 100644 index 2c5a556bd..000000000 --- a/src/Domain/Shared/Exception/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Shared Domain Exceptions - -Base exception classes used across all bounded contexts: - -- `DomainException`: Base domain exception -- `InvalidArgumentException`: Invalid input validation -- `EntityNotFoundException`: Generic entity not found -- `BusinessRuleViolationException`: Business rule violations - -These provide common exception handling patterns without coupling contexts. \ No newline at end of file diff --git a/src/Domain/Shared/Model/README.md b/src/Domain/Shared/Model/README.md deleted file mode 100644 index 4daf36150..000000000 --- a/src/Domain/Shared/Model/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Shared Domain Models - -Base classes and interfaces used across bounded contexts: - -- `AggregateRoot`: Base class for all aggregates -- `Entity`: Base class for entities -- `DomainEvent`: Interface for domain events -- `ValueObject`: Base value object interface - -These provide common functionality while maintaining context boundaries. \ No newline at end of file diff --git a/src/Domain/Shared/Repository/README.md b/src/Domain/Shared/Repository/README.md deleted file mode 100644 index 999f9d300..000000000 --- a/src/Domain/Shared/Repository/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Shared Repository Interfaces - -Common repository patterns and base interfaces: - -- `RepositoryInterface`: Base repository contract -- `ReadOnlyRepositoryInterface`: Query-only operations -- `AggregateRepositoryInterface`: Aggregate-specific methods - -These define common persistence patterns without implementation details. \ No newline at end of file diff --git a/src/Domain/Shared/ValueObject/README.md b/src/Domain/Shared/ValueObject/README.md deleted file mode 100644 index afc5b7bc6..000000000 --- a/src/Domain/Shared/ValueObject/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Shared Value Objects - -Common value objects used across contexts: - -- `Id`: Generic identifier base class -- `DateTime`: Immutable datetime wrapper -- `Money`: Monetary value representation -- `Percentage`: Percentage value (0-100) - -These are minimal shared concepts that don't violate bounded context principles. \ No newline at end of file diff --git a/src/Domain/Tracker/Exception/README.md b/src/Domain/Tracker/Exception/README.md deleted file mode 100644 index 73ae0f882..000000000 --- a/src/Domain/Tracker/Exception/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Tracker Domain Exceptions - -Domain-specific exceptions for tracker operations: - -- `InvalidInfoHashException`: Malformed info hash -- `InactiveTorrentException`: Torrent not active -- `PeerLimitExceededException`: Too many peers -- `InvalidAnnounceException`: Protocol violation \ No newline at end of file diff --git a/src/Domain/Tracker/Model/README.md b/src/Domain/Tracker/Model/README.md deleted file mode 100644 index 124456276..000000000 --- a/src/Domain/Tracker/Model/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Tracker Domain Models - -Contains aggregate roots and entities for the BitTorrent tracker: - -- `Torrent`: Aggregate root for torrent management -- `Peer`: Entity representing a BitTorrent peer -- `TorrentStatistics`: Value object for torrent stats - -Example: - -```php -class Torrent extends AggregateRoot -{ - public function announce(Peer $peer, AnnounceEvent $event): void - { - // Business logic for handling announces - } -} -``` \ No newline at end of file diff --git a/src/Domain/Tracker/Repository/README.md b/src/Domain/Tracker/Repository/README.md deleted file mode 100644 index 3745d6e4e..000000000 --- a/src/Domain/Tracker/Repository/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Tracker Repository Interfaces - -Repository interfaces for tracker aggregates: - -- `TorrentRepositoryInterface`: Torrent aggregate persistence -- `PeerRepositoryInterface`: Peer data access -- `TrackerStatsRepositoryInterface`: Statistics queries - -These define persistence contracts without implementation details. \ No newline at end of file diff --git a/src/Domain/Tracker/ValueObject/README.md b/src/Domain/Tracker/ValueObject/README.md deleted file mode 100644 index cd3fcf0ee..000000000 --- a/src/Domain/Tracker/ValueObject/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# Tracker Value Objects - -Immutable objects representing domain concepts: - -- `InfoHash`: 20-byte torrent identifier -- `PeerId`: Peer client identifier -- `Port`: Network port (1-65535) -- `BytesTransferred`: Upload/download bytes - -Example: - -```php -final class InfoHash -{ - private string $hash; - - public function __construct(string $hash) - { - $this->guardAgainstInvalidHash($hash); - $this->hash = $hash; - } -} -``` \ No newline at end of file diff --git a/src/Domain/User/Exception/README.md b/src/Domain/User/Exception/README.md deleted file mode 100644 index f689a7943..000000000 --- a/src/Domain/User/Exception/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# User Domain Exceptions - -Domain-specific exceptions for user operations: - -- `UserNotFoundException`: User not found -- `DuplicateUsernameException`: Username already taken -- `InvalidCredentialsException`: Authentication failed -- `UserNotActivatedException`: Account not activated -- `PasswordComplexityException`: Weak password \ No newline at end of file diff --git a/src/Domain/User/Model/README.md b/src/Domain/User/Model/README.md deleted file mode 100644 index 2001b3ebd..000000000 --- a/src/Domain/User/Model/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# User Domain Models - -Contains user management aggregates and entities: - -- `User`: User aggregate root -- `UserProfile`: User profile information -- `UserCredentials`: Authentication credentials -- `UserPermissions`: Authorization rules - -Business rules: - -- Password complexity requirements -- Username uniqueness -- Email verification workflow -- Account activation/deactivation \ No newline at end of file diff --git a/src/Domain/User/Repository/README.md b/src/Domain/User/Repository/README.md deleted file mode 100644 index 9d4c463c7..000000000 --- a/src/Domain/User/Repository/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# User Repository Interface - -Repository interface for user aggregate: - -- `UserRepositoryInterface`: User persistence and retrieval - - `findById(UserId $id): ?User` - - `findByUsername(Username $username): ?User` - - `findByEmail(Email $email): ?User` - - `save(User $user): void` - - `delete(User $user): void` \ No newline at end of file diff --git a/src/Domain/User/ValueObject/README.md b/src/Domain/User/ValueObject/README.md deleted file mode 100644 index 79c930883..000000000 --- a/src/Domain/User/ValueObject/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# User Value Objects - -Immutable objects for user domain: - -- `UserId`: Unique user identifier -- `Username`: Username with validation -- `Email`: Email address with format validation -- `HashedPassword`: Secure password representation -- `UserRole`: User role enumeration - -These ensure data integrity and type safety. \ No newline at end of file diff --git a/src/Env.php b/src/Env.php deleted file mode 100644 index 52e1e7cac..000000000 --- a/src/Env.php +++ /dev/null @@ -1,116 +0,0 @@ -addAdapter(PutenvAdapter::class); - } - - static::$repository = $builder->immutable()->make(); - } - - return static::$repository; - } - - /** - * Gets the value of an environment variable. - * - * @param string $key - * @param mixed|null $default - * @return mixed - */ - public static function get(string $key, mixed $default = null): mixed - { - return Option::fromValue(static::getRepository()->get($key)) - ->map(function ($value) { - switch (strtolower($value)) { - case 'true': - case '(true)': - return true; - case 'false': - case '(false)': - return false; - case 'empty': - case '(empty)': - return ''; - case 'null': - case '(null)': - return null; - } - - if (preg_match('/\A([\'"])(.*)\1\z/', $value, $matches)) { - return $matches[2]; - } - - return $value; - }) - ->getOrCall(fn () => $default instanceof Closure ? $default() : $default); - } -} diff --git a/src/Infrastructure/Cache/File/README.md b/src/Infrastructure/Cache/File/README.md deleted file mode 100644 index 9f781c1b9..000000000 --- a/src/Infrastructure/Cache/File/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# File Cache Adapter - -File system-based caching implementation: - -- Simple file-based storage -- Suitable for single-server deployments -- Directory structure optimization -- Lock file support for concurrency -- Automatic garbage collection \ No newline at end of file diff --git a/src/Infrastructure/Cache/Memcached/README.md b/src/Infrastructure/Cache/Memcached/README.md deleted file mode 100644 index 2e60b7e0b..000000000 --- a/src/Infrastructure/Cache/Memcached/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Memcached Cache Adapter - -Memcached-based caching implementation: - -- Simple key-value caching -- Distributed cache support -- Automatic key expiration -- Connection pooling -- Consistent hashing for distribution \ No newline at end of file diff --git a/src/Infrastructure/Cache/Redis/README.md b/src/Infrastructure/Cache/Redis/README.md deleted file mode 100644 index da7e090aa..000000000 --- a/src/Infrastructure/Cache/Redis/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Redis Cache Adapter - -Redis-based caching implementation: - -- High-performance key-value storage -- Support for data structures (lists, sets, hashes) -- TTL management -- Pub/sub for cache invalidation -- Cluster support for scalability \ No newline at end of file diff --git a/src/Infrastructure/DependencyInjection/Bootstrap.php b/src/Infrastructure/DependencyInjection/Bootstrap.php deleted file mode 100644 index 8eee918ee..000000000 --- a/src/Infrastructure/DependencyInjection/Bootstrap.php +++ /dev/null @@ -1,89 +0,0 @@ -getWrappedContainer()->set(Container::class, self::$container); - self::$container->getWrappedContainer()->set('container', self::$container); - - return self::$container; - } - - public static function getContainer(): ?Container - { - return self::$container; - } - - public static function reset(): void - { - self::$container = null; - } - - private static function loadEnvironment(string $rootPath): void - { - if (file_exists($rootPath . '/.env')) { - $dotenv = Dotenv::createImmutable($rootPath); - $dotenv->load(); - } - } - - private static function loadConfiguration(string $rootPath, array $config): array - { - // Load base configuration - $configPath = $rootPath . '/config'; - - // Container configuration - if (file_exists($configPath . '/container.php')) { - $containerConfig = require $configPath . '/container.php'; - $config = array_merge($config, $containerConfig); - } - - // Services configuration - if (file_exists($configPath . '/services.php')) { - $servicesConfig = require $configPath . '/services.php'; - $config['definitions'] = array_merge( - $config['definitions'] ?? [], - $servicesConfig - ); - } - - // Database configuration - if (file_exists($configPath . '/database.php')) { - $config['database'] = require $configPath . '/database.php'; - } - - // Cache configuration - if (file_exists($configPath . '/cache.php')) { - $config['cache'] = require $configPath . '/cache.php'; - } - - // Environment from .env - $config['environment'] = $_ENV['APP_ENV'] ?? 'development'; - $config['debug'] = filter_var($_ENV['APP_DEBUG'] ?? false, FILTER_VALIDATE_BOOLEAN); - - return $config; - } -} diff --git a/src/Infrastructure/DependencyInjection/Container.php b/src/Infrastructure/DependencyInjection/Container.php deleted file mode 100644 index 25254bd3c..000000000 --- a/src/Infrastructure/DependencyInjection/Container.php +++ /dev/null @@ -1,49 +0,0 @@ -container = $container; - } - - public function get(string $id): mixed - { - return $this->container->get($id); - } - - public function has(string $id): bool - { - return $this->container->has($id); - } - - public function make(string $name, array $parameters = []): mixed - { - return $this->container->make($name, $parameters); - } - - public function call(callable $callable, array $parameters = []): mixed - { - return $this->container->call($callable, $parameters); - } - - public function injectOn(object $instance): object - { - return $this->container->injectOn($instance); - } - - public function getWrappedContainer(): DIContainer - { - return $this->container; - } -} diff --git a/src/Infrastructure/DependencyInjection/ContainerFactory.php b/src/Infrastructure/DependencyInjection/ContainerFactory.php deleted file mode 100644 index e4424c230..000000000 --- a/src/Infrastructure/DependencyInjection/ContainerFactory.php +++ /dev/null @@ -1,93 +0,0 @@ -build(); - $container = new Container($diContainer); - - // Register and boot service providers - self::registerProviders($container, $config); - - return $container; - } - - private static function configureContainer(ContainerBuilder $builder, array $config): void - { - // Enable compilation in production for better performance - $isProduction = ($config['environment'] ?? 'development') === 'production'; - - if ($isProduction) { - $builder->enableCompilation($config['compilation_dir'] ?? __DIR__ . '/../../../internal_data/cache/container'); - $builder->writeProxiesToFile(true, $config['proxies_dir'] ?? __DIR__ . '/../../../internal_data/cache/proxies'); - } - - // Enable autowiring by default - $builder->useAutowiring($config['autowiring'] ?? true); - } - - private static function addDefinitions(ContainerBuilder $builder, array $config): void - { - // Add config definitions first - if (isset($config['definitions'])) { - $builder->addDefinitions($config['definitions']); - } - - // Add layer-specific definitions - $builder->addDefinitions(DomainDefinitions::getDefinitions()); - $builder->addDefinitions(ApplicationDefinitions::getDefinitions()); - $builder->addDefinitions(InfrastructureDefinitions::getDefinitions($config)); - $builder->addDefinitions(PresentationDefinitions::getDefinitions()); - - // Add custom definition files if provided - if (isset($config['definition_files'])) { - foreach ($config['definition_files'] as $file) { - if (file_exists($file)) { - $builder->addDefinitions($file); - } - } - } - } - - private static function registerProviders(Container $container, array $config): void - { - $providers = $config['providers'] ?? []; - - // Instantiate providers - $instances = []; - foreach ($providers as $providerClass) { - if (class_exists($providerClass)) { - $provider = new $providerClass(); - if ($provider instanceof ServiceProvider) { - $instances[] = $provider; - $provider->register($container); - } - } - } - - // Boot all providers after registration - foreach ($instances as $provider) { - $provider->boot($container); - } - } -} diff --git a/src/Infrastructure/DependencyInjection/Definitions/ApplicationDefinitions.php b/src/Infrastructure/DependencyInjection/Definitions/ApplicationDefinitions.php deleted file mode 100644 index d8e6d2842..000000000 --- a/src/Infrastructure/DependencyInjection/Definitions/ApplicationDefinitions.php +++ /dev/null @@ -1,46 +0,0 @@ - DI\factory(function (ContainerInterface $c) { - // return new CommandBus($c); - // }), - - // Query Bus - // 'QueryBusInterface' => DI\factory(function (ContainerInterface $c) { - // return new QueryBus($c); - // }), - - // Event Dispatcher - // 'EventDispatcherInterface' => DI\factory(function (ContainerInterface $c) { - // return new EventDispatcher(); - // }), - - // Application Services - // These typically orchestrate domain objects and handle use cases - - // Forum Handlers - // 'TorrentPier\Application\Forum\Handler\CreatePostHandler' => DI\autowire(), - // 'TorrentPier\Application\Forum\Handler\GetThreadListHandler' => DI\autowire(), - - // Tracker Handlers - // 'TorrentPier\Application\Tracker\Handler\RegisterTorrentHandler' => DI\autowire(), - // 'TorrentPier\Application\Tracker\Handler\ProcessAnnounceHandler' => DI\autowire(), - - // User Handlers - // 'TorrentPier\Application\User\Handler\RegisterUserHandler' => DI\autowire(), - // 'TorrentPier\Application\User\Handler\AuthenticateUserHandler' => DI\autowire(), - ]; - } -} diff --git a/src/Infrastructure/DependencyInjection/Definitions/DomainDefinitions.php b/src/Infrastructure/DependencyInjection/Definitions/DomainDefinitions.php deleted file mode 100644 index 330d5add0..000000000 --- a/src/Infrastructure/DependencyInjection/Definitions/DomainDefinitions.php +++ /dev/null @@ -1,32 +0,0 @@ - DI\factory(function (ContainerInterface $c) { - // return $c->get('TorrentPier\Infrastructure\Persistence\Repository\ForumRepository'); - // }), - - // 'TorrentPier\Domain\Tracker\Repository\TorrentRepositoryInterface' => DI\factory(function (ContainerInterface $c) { - // return $c->get('TorrentPier\Infrastructure\Persistence\Repository\TorrentRepository'); - // }), - - // 'TorrentPier\Domain\User\Repository\UserRepositoryInterface' => DI\factory(function (ContainerInterface $c) { - // return $c->get('TorrentPier\Infrastructure\Persistence\Repository\UserRepository'); - // }), - ]; - } -} diff --git a/src/Infrastructure/DependencyInjection/Definitions/InfrastructureDefinitions.php b/src/Infrastructure/DependencyInjection/Definitions/InfrastructureDefinitions.php deleted file mode 100644 index b5c4efed4..000000000 --- a/src/Infrastructure/DependencyInjection/Definitions/InfrastructureDefinitions.php +++ /dev/null @@ -1,99 +0,0 @@ - DI\factory(function () { - // Use the config singleton that's already initialized in common.php - return config(); - }), - - // HTTP Infrastructure - 'TorrentPier\Infrastructure\Http\Router' => DI\autowire(), - 'TorrentPier\Infrastructure\Http\RequestFactory' => DI\autowire(), - 'TorrentPier\Infrastructure\Http\ResponseFactory' => DI\autowire(), - - // Middleware - 'TorrentPier\Infrastructure\Http\Middleware\CorsMiddleware' => DI\autowire(), - - // TODO: Add infrastructure service definitions as they are implemented - - // Example: Database Connection (implement when Nette Database integration is ready) - // 'database.connection.default' => DI\factory(function () use ($config) { - // $dbConfig = $config['database'] ?? []; - // $dsn = sprintf( - // 'mysql:host=%s;port=%s;dbname=%s;charset=%s', - // $dbConfig['host'] ?? '127.0.0.1', - // $dbConfig['port'] ?? 3306, - // $dbConfig['database'] ?? 'tp', - // $dbConfig['charset'] ?? 'utf8mb4' - // ); - // - // return new Connection( - // $dsn, - // $dbConfig['username'] ?? 'root', - // $dbConfig['password'] ?? '' - // ); - // }), - - // Example: Cache Storage (implement when cache infrastructure is ready) - // 'cache.storage' => DI\factory(function () use ($config) { - // $cacheConfig = $config['cache'] ?? []; - // $driver = $cacheConfig['driver'] ?? 'file'; - // - // switch ($driver) { - // case 'memcached': - // $memcached = new \Memcached(); - // $memcached->addServer( - // $cacheConfig['memcached']['host'] ?? '127.0.0.1', - // $cacheConfig['memcached']['port'] ?? 11211 - // ); - // return new MemcachedStorage($memcached); - // - // case 'sqlite': - // return new SQLiteStorage($cacheConfig['sqlite']['path'] ?? __DIR__ . '/../../../../internal_data/cache/cache.db'); - // - // case 'file': - // default: - // return new FileStorage($cacheConfig['file']['path'] ?? __DIR__ . '/../../../../internal_data/cache'); - // } - // }), - - // Example: Repository Implementations (implement when repositories are created) - // 'TorrentPier\Infrastructure\Persistence\Repository\ForumRepository' => DI\autowire() - // ->constructorParameter('connection', DI\get('database.connection.default')) - // ->constructorParameter('cache', DI\get('cache.factory')), - - // Example: Email Service (implement when email infrastructure is ready) - // 'EmailServiceInterface' => DI\factory(function (ContainerInterface $c) use ($config) { - // $emailConfig = $config['email'] ?? []; - // return new SmtpEmailService($emailConfig); - // }), - - // Example: File Storage (implement when file storage abstraction is ready) - // 'FileStorageInterface' => DI\factory(function (ContainerInterface $c) use ($config) { - // $storageConfig = $config['storage'] ?? []; - // return match ($storageConfig['driver'] ?? 'local') { - // 's3' => new S3FileStorage($storageConfig['s3']), - // default => new LocalFileStorage($storageConfig['local']['path'] ?? __DIR__ . '/../../../../internal_data/uploads'), - // }; - // }), - ]; - } -} diff --git a/src/Infrastructure/DependencyInjection/Definitions/PresentationDefinitions.php b/src/Infrastructure/DependencyInjection/Definitions/PresentationDefinitions.php deleted file mode 100644 index 39af7d211..000000000 --- a/src/Infrastructure/DependencyInjection/Definitions/PresentationDefinitions.php +++ /dev/null @@ -1,57 +0,0 @@ - DI\autowire(), - - // HTTP Controllers - // Controllers are typically autowired with their dependencies - 'TorrentPier\Presentation\Http\Controllers\Web\HelloWorldController' => DI\autowire(), - 'TorrentPier\Presentation\Http\Controllers\Web\LegacyController' => DI\autowire(), - - // Web Controllers - // 'TorrentPier\Presentation\Http\Controllers\Web\HomeController' => DI\autowire(), - // 'TorrentPier\Presentation\Http\Controllers\Web\ForumController' => DI\autowire(), - // 'TorrentPier\Presentation\Http\Controllers\Web\TrackerController' => DI\autowire(), - // 'TorrentPier\Presentation\Http\Controllers\Web\UserController' => DI\autowire(), - - // API Controllers - // 'TorrentPier\Presentation\Http\Controllers\Api\UserController' => DI\autowire(), - // 'TorrentPier\Presentation\Http\Controllers\Api\TorrentController' => DI\autowire(), - // 'TorrentPier\Presentation\Http\Controllers\Api\ForumController' => DI\autowire(), - - // Admin Controllers - // 'TorrentPier\Presentation\Http\Controllers\Admin\DashboardController' => DI\autowire(), - // 'TorrentPier\Presentation\Http\Controllers\Admin\UserController' => DI\autowire(), - // 'TorrentPier\Presentation\Http\Controllers\Admin\ForumController' => DI\autowire(), - // 'TorrentPier\Presentation\Http\Controllers\Admin\TrackerController' => DI\autowire(), - - // Middleware - // 'AuthenticationMiddleware' => DI\autowire('TorrentPier\Presentation\Http\Middleware\AuthenticationMiddleware'), - // 'AuthorizationMiddleware' => DI\autowire('TorrentPier\Presentation\Http\Middleware\AuthorizationMiddleware'), - // 'CorsMiddleware' => DI\autowire('TorrentPier\Presentation\Http\Middleware\CorsMiddleware'), - // 'RateLimitMiddleware' => DI\autowire('TorrentPier\Presentation\Http\Middleware\RateLimitMiddleware'), - - // CLI Commands - // 'TorrentPier\Presentation\Cli\Commands\CacheCommand' => DI\autowire(), - // 'TorrentPier\Presentation\Cli\Commands\MigrateCommand' => DI\autowire(), - // 'TorrentPier\Presentation\Cli\Commands\SeedCommand' => DI\autowire(), - // 'TorrentPier\Presentation\Cli\Commands\TrackerCommand' => DI\autowire(), - - // View/Response Transformers - // 'JsonResponseTransformer' => DI\autowire('TorrentPier\Presentation\Http\Responses\JsonResponseTransformer'), - // 'HtmlResponseTransformer' => DI\autowire('TorrentPier\Presentation\Http\Responses\HtmlResponseTransformer'), - ]; - } -} diff --git a/src/Infrastructure/DependencyInjection/README.md b/src/Infrastructure/DependencyInjection/README.md deleted file mode 100644 index e65de5a19..000000000 --- a/src/Infrastructure/DependencyInjection/README.md +++ /dev/null @@ -1,171 +0,0 @@ -# Dependency Injection Infrastructure - -This directory contains the dependency injection container implementation using PHP-DI, following hexagonal architecture principles. - -## Architecture Overview - -The DI container is placed in the Infrastructure layer because: -- Dependency injection is a technical implementation detail -- It handles wiring and bootstrapping, not business logic -- The domain layer remains pure without framework dependencies - -## Structure - -``` -DependencyInjection/ -โ”œโ”€โ”€ Container.php # Wrapper around PHP-DI container -โ”œโ”€โ”€ ContainerFactory.php # Factory for building configured containers -โ”œโ”€โ”€ Bootstrap.php # Application bootstrapper -โ””โ”€โ”€ Definitions/ # Service definitions by layer - โ”œโ”€โ”€ DomainDefinitions.php - โ”œโ”€โ”€ ApplicationDefinitions.php - โ”œโ”€โ”€ InfrastructureDefinitions.php - โ””โ”€โ”€ PresentationDefinitions.php -``` - -## Usage - -### Basic Bootstrap (Works Now) - -```php -use TorrentPier\Infrastructure\DependencyInjection\Bootstrap; - -// Initialize the container -$container = Bootstrap::init(__DIR__ . '/../..'); - -// Basic usage -$containerInstance = app(); // Get container itself -$hasService = $container->has('some.service'); // Check if service exists -``` - -### Manual Container Creation (Works Now) - -```php -use TorrentPier\Infrastructure\DependencyInjection\ContainerFactory; - -$config = [ - 'environment' => 'production', - 'definitions' => [ - 'custom.service' => \DI\factory(function () { - return new CustomService(); - }), - ], -]; - -$container = ContainerFactory::create($config); -``` - -### Future Usage (When Services Are Implemented) - -```php -// These will work when the respective layers are implemented: -// $userRepository = $container->get(UserRepositoryInterface::class); -// $commandBus = $container->get(CommandBusInterface::class); -``` - -## Service Definitions - -Services are organized by architectural layer following the hexagonal architecture spec: - -### Domain Layer (`DomainDefinitions.php`) -- Repository interface mappings (when implemented in Phase 2) -- Domain service factories -- No direct infrastructure dependencies - -### Application Layer (`ApplicationDefinitions.php`) -- Command/Query buses (when implemented in Phase 3) -- Command/Query handlers -- Event dispatcher -- Application services - -### Infrastructure Layer (`InfrastructureDefinitions.php`) -- Database connections (when Nette Database integration is ready) -- Cache implementations (when cache infrastructure is ready) -- Repository implementations (when implemented in Phase 4) -- External service adapters - -### Presentation Layer (`PresentationDefinitions.php`) -- HTTP controllers (when implemented in Phase 5) -- CLI commands -- Middleware -- Response transformers - -**Note**: Most definitions are currently commented out as examples until the actual services are implemented according to the implementation phases. - -## Configuration - -Configuration is loaded from multiple sources: - -1. **Environment Variables** (`.env` file) -2. **Configuration Files** (`/config/*.php`) -3. **Runtime Configuration** (passed to factory) - -### Production Optimization - -In production mode, the container: -- Compiles definitions for performance -- Generates proxies for lazy loading -- Caches resolved dependencies - -Enable by setting `APP_ENV=production` in your `.env` file. - -## Best Practices - -1. **Use Interfaces**: Define interfaces in domain, implement in infrastructure -2. **Explicit Definitions**: Prefer explicit over magic for complex services -3. **Layer Separation**: Keep definitions organized by architectural layer -4. **Lazy Loading**: Use factories for expensive services -5. **Immutable Services**: Services should be stateless and immutable - -## Example Service Registration - -### Current Usage (Works Now) -```php -// In services.php or custom definitions -return [ - 'custom.service' => \DI\factory(function () { - return new CustomService(); - }), - - 'test.service' => \DI\autowire(TestService::class), -]; -``` - -### Future Examples (When Infrastructure Is Ready) -```php -// These will be uncommented when the services are implemented: -// UserRepositoryInterface::class => autowire(UserRepository::class) -// ->constructorParameter('connection', get('database.connection.default')) -// ->constructorParameter('cache', get('cache.factory')), -// -// 'email.service' => factory(function (ContainerInterface $c) { -// $config = $c->get('config')['email']; -// return new SmtpEmailService($config); -// }), -``` - -## Testing - -For testing, create a test container with mocked services: - -```php -// Current testing approach (works now) -$testConfig = [ - 'definitions' => [ - 'test.service' => \DI\factory(function () { - return new MockTestService(); - }), - ], - 'environment' => 'testing', -]; - -$container = ContainerFactory::create($testConfig); - -// Future testing (when services are implemented) -// $testConfig = [ -// 'definitions' => [ -// UserRepositoryInterface::class => $mockUserRepository, -// EmailServiceInterface::class => $mockEmailService, -// ], -// ]; -``` diff --git a/src/Infrastructure/DependencyInjection/ServiceProvider.php b/src/Infrastructure/DependencyInjection/ServiceProvider.php deleted file mode 100644 index 6bd480beb..000000000 --- a/src/Infrastructure/DependencyInjection/ServiceProvider.php +++ /dev/null @@ -1,24 +0,0 @@ -before($request); - $response = $handler->handle($request); - return $this->after($request, $response); - } - - protected function before(ServerRequestInterface $request): ServerRequestInterface - { - return $request; - } - - protected function after(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface - { - return $response; - } -} diff --git a/src/Infrastructure/Http/Middleware/CorsMiddleware.php b/src/Infrastructure/Http/Middleware/CorsMiddleware.php deleted file mode 100644 index a2ec4d43a..000000000 --- a/src/Infrastructure/Http/Middleware/CorsMiddleware.php +++ /dev/null @@ -1,58 +0,0 @@ -allowedOrigins = $allowedOrigins; - $this->allowedHeaders = $allowedHeaders; - $this->allowedMethods = $allowedMethods; - } - - public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface - { - if ($request->getMethod() === 'OPTIONS') { - return $this->createPreflightResponse(); - } - - $response = $handler->handle($request); - return $this->addCorsHeaders($response, $request); - } - - private function createPreflightResponse(): ResponseInterface - { - $response = new \GuzzleHttp\Psr7\Response(200); - return $this->addCorsHeaders($response); - } - - private function addCorsHeaders(ResponseInterface $response, ?ServerRequestInterface $request = null): ResponseInterface - { - $origin = $request ? $request->getHeaderLine('Origin') : ''; - - if (in_array('*', $this->allowedOrigins) || in_array($origin, $this->allowedOrigins)) { - $response = $response->withHeader('Access-Control-Allow-Origin', $origin ?: '*'); - } - - $response = $response->withHeader('Access-Control-Allow-Methods', implode(', ', $this->allowedMethods)); - $response = $response->withHeader('Access-Control-Allow-Headers', implode(', ', $this->allowedHeaders)); - $response = $response->withHeader('Access-Control-Max-Age', '86400'); - - return $response; - } -} diff --git a/src/Infrastructure/Http/RequestFactory.php b/src/Infrastructure/Http/RequestFactory.php deleted file mode 100644 index 152533037..000000000 --- a/src/Infrastructure/Http/RequestFactory.php +++ /dev/null @@ -1,28 +0,0 @@ -withProtocolVersion($protocolVersion); - } - - public static function json( - array $data, - int $status = 200, - array $headers = [], - int $encodingOptions = JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT - ): ResponseInterface - { - $json = json_encode($data, $encodingOptions); - $headers['content-type'] = 'application/json; charset=utf-8'; - return new Response($status, $headers, $json); - } - - public static function html( - string $html, - int $status = 200, - array $headers = [] - ): ResponseInterface - { - $headers['content-type'] = 'text/html; charset=utf-8'; - return new Response($status, $headers, $html); - } - - public static function redirect( - string $uri, - int $status = 302, - array $headers = [] - ): ResponseInterface - { - $headers['location'] = $uri; - return new Response($status, $headers); - } -} diff --git a/src/Infrastructure/Http/Router.php b/src/Infrastructure/Http/Router.php deleted file mode 100644 index 00761b395..000000000 --- a/src/Infrastructure/Http/Router.php +++ /dev/null @@ -1,91 +0,0 @@ -container = $container; - $this->router = new LeagueRouter(); - - // Set up the application strategy with DI container - $strategy = new ApplicationStrategy(); - $strategy->setContainer($this->container->getWrappedContainer()); - $this->router->setStrategy($strategy); - } - - public function get(string $path, $handler): \League\Route\Route - { - return $this->router->map('GET', $path, $handler); - } - - public function post(string $path, $handler): \League\Route\Route - { - return $this->router->map('POST', $path, $handler); - } - - public function put(string $path, $handler): \League\Route\Route - { - return $this->router->map('PUT', $path, $handler); - } - - public function patch(string $path, $handler): \League\Route\Route - { - return $this->router->map('PATCH', $path, $handler); - } - - public function delete(string $path, $handler): \League\Route\Route - { - return $this->router->map('DELETE', $path, $handler); - } - - public function options(string $path, $handler): \League\Route\Route - { - return $this->router->map('OPTIONS', $path, $handler); - } - - public function head(string $path, $handler): \League\Route\Route - { - return $this->router->map('HEAD', $path, $handler); - } - - public function any(string $path, $handler): \League\Route\Route - { - return $this->router->map(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], $path, $handler); - } - - public function group(string $prefix, callable $callback): RouteGroup - { - return $this->router->group($prefix, $callback); - } - - public function middleware(MiddlewareInterface $middleware): self - { - $this->router->middleware($middleware); - return $this; - } - - public function dispatch(ServerRequestInterface $request): ResponseInterface - { - return $this->router->dispatch($request); - } - - public function getLeagueRouter(): LeagueRouter - { - return $this->router; - } -} diff --git a/src/Infrastructure/Persistence/Database/README.md b/src/Infrastructure/Persistence/Database/README.md deleted file mode 100644 index c250b60e8..000000000 --- a/src/Infrastructure/Persistence/Database/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Database Adapter - -Database connection and query building layer: - -- `DatabaseAdapterInterface`: Common database operations -- `QueryBuilder`: Fluent query construction -- `ConnectionPool`: Connection management - -Provides abstraction over raw database access. diff --git a/src/Infrastructure/Persistence/Migration/README.md b/src/Infrastructure/Persistence/Migration/README.md deleted file mode 100644 index 1f203e645..000000000 --- a/src/Infrastructure/Persistence/Migration/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Database Migrations - -Schema version control and migration management: - -- Migration files for schema changes -- Seed data for initial setup -- Rollback support -- Migration history tracking - -Uses Phinx or similar migration tool. \ No newline at end of file diff --git a/src/Infrastructure/Persistence/Repository/README.md b/src/Infrastructure/Persistence/Repository/README.md deleted file mode 100644 index 002760d4a..000000000 --- a/src/Infrastructure/Persistence/Repository/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Repository Implementations - -Concrete implementations of domain repository interfaces: - -- Uses database adapter for persistence -- Implements caching strategies -- Handles query optimization -- Supports multiple database backends - -Example: - -```php -class TorrentRepository implements TorrentRepositoryInterface -{ - public function __construct( - private DatabaseAdapterInterface $db - ) {} - - public function findByInfoHash(InfoHash $infoHash): ?Torrent - { - // Database adapter implementation - $row = $this->db->select('torrents') - ->where('info_hash', $infoHash->toString()) - ->first(); - - return $row ? $this->hydrateFromRow($row) : null; - } -} -``` \ No newline at end of file diff --git a/src/Infrastructure/README.md b/src/Infrastructure/README.md deleted file mode 100644 index 2098a9f97..000000000 --- a/src/Infrastructure/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Infrastructure Layer - -Technical implementations and external service adapters: - -- Database persistence -- Caching mechanisms -- Email services -- File storage -- Third-party integrations - -Infrastructure depends on domain, not vice versa. \ No newline at end of file diff --git a/src/Presentation/Cli/Commands/README.md b/src/Presentation/Cli/Commands/README.md deleted file mode 100644 index 5e2cf1239..000000000 --- a/src/Presentation/Cli/Commands/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# CLI Commands - -Console commands for administrative tasks: - -- `UserCreateCommand`: Create users from CLI -- `CacheClearCommand`: Clear cache stores -- `MigrateCommand`: Run database migrations -- `CronCommand`: Execute scheduled tasks - -Built using Symfony Console component. \ No newline at end of file diff --git a/src/Presentation/Http/Controllers/Admin/README.md b/src/Presentation/Http/Controllers/Admin/README.md deleted file mode 100644 index 6e478949b..000000000 --- a/src/Presentation/Http/Controllers/Admin/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Admin Panel Controllers - -Administrative interface controllers with enhanced security: - -- Role-based access control (RBAC) -- Audit logging for all actions -- Additional authentication checks -- Administrative dashboards and reports - -Example: - -```php -class AdminUserController -{ - public function index(Request $request): Response - { - $query = new GetUsersQuery( - page: $request->getPage(), - filters: $request->getFilters() - ); - - $users = $this->queryBus->handle($query); - - return $this->render('admin/users/index', [ - 'users' => $users, - 'filters' => $request->getFilters() - ]); - } -} -``` \ No newline at end of file diff --git a/src/Presentation/Http/Controllers/Api/README.md b/src/Presentation/Http/Controllers/Api/README.md deleted file mode 100644 index 7d944db2e..000000000 --- a/src/Presentation/Http/Controllers/Api/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# API Controllers - -RESTful API endpoints following OpenAPI specification: - -- JSON request/response format -- Proper HTTP status codes -- HATEOAS where applicable -- Rate limiting aware - -Example: - -```php -class UserController -{ - public function register(RegisterRequest $request): JsonResponse - { - $command = new RegisterUserCommand( - $request->getUsername(), - $request->getEmail(), - $request->getPassword() - ); - - $userId = $this->commandBus->handle($command); - - return new JsonResponse([ - 'id' => $userId, - 'username' => $request->getUsername() - ], Response::HTTP_CREATED); - } -} -``` \ No newline at end of file diff --git a/src/Presentation/Http/Controllers/Web/HelloWorldController.php b/src/Presentation/Http/Controllers/Web/HelloWorldController.php deleted file mode 100644 index a4117d3d4..000000000 --- a/src/Presentation/Http/Controllers/Web/HelloWorldController.php +++ /dev/null @@ -1,108 +0,0 @@ -config = $config; - } - - public function index(ServerRequestInterface $request): ResponseInterface - { - $siteName = $this->config->get('sitename', 'TorrentPier'); - $currentTime = date('Y-m-d H:i:s'); - - $html = " - - - - - - Hello World - {$siteName} - - - -
-

Hello World from {$siteName}!

-

This is a test route demonstrating the new hexagonal architecture routing system.

- -
- Route Information:
- URI: {$request->getUri()}
- Method: {$request->getMethod()}
- Time: {$currentTime}
- Controller: HelloWorldController -
- -

The routing system is working correctly! This response was generated using:

-
    -
  • League/Route for routing
  • -
  • PSR-7 HTTP messages
  • -
  • Dependency Injection Container
  • -
  • Hexagonal Architecture structure
  • -
- -

โ† Back to main site

-
- - "; - - return ResponseFactory::html($html); - } - - public function json(ServerRequestInterface $request): ResponseInterface - { - $siteName = $this->config->get('sitename', 'TorrentPier'); - - return ResponseFactory::json([ - 'message' => 'Hello World!', - 'site' => $siteName, - 'timestamp' => time(), - 'datetime' => date('c'), - 'route' => [ - 'uri' => (string)$request->getUri(), - 'method' => $request->getMethod(), - 'controller' => self::class, - ], - 'architecture' => [ - 'pattern' => 'Hexagonal Architecture', - 'router' => 'League/Route', - 'psr' => 'PSR-7 HTTP Messages', - 'di' => 'PHP-DI Container' - ] - ]); - } -} diff --git a/src/Presentation/Http/Controllers/Web/LegacyController.php b/src/Presentation/Http/Controllers/Web/LegacyController.php deleted file mode 100644 index ec0baf82d..000000000 --- a/src/Presentation/Http/Controllers/Web/LegacyController.php +++ /dev/null @@ -1,120 +0,0 @@ -config = $config; - } - - public function handle(ServerRequestInterface $request): ResponseInterface - { - // Get the legacy controller name from the URL path - $path = $request->getUri()->getPath(); - $controller = null; - - // Extract controller name from .php files or without extension - if (preg_match('/\/([^\/]+)\.php$/', $path, $matches)) { - // URL like /terms.php - $controller = $matches[1]; - } elseif (preg_match('/\/([^\/]+)$/', $path, $matches)) { - // URL like /terms (without extension) - $controller = $matches[1]; - } elseif ($path === '/') { - // Root path should serve index.php - $controller = 'index'; - } - - if (!$controller) { - return ResponseFactory::html('Legacy controller not specified', 404); - } - - $rootPath = dirname(__DIR__, 5); - $controllerPath = $rootPath . '/controllers/' . $controller . '.php'; - - if (!file_exists($controllerPath)) { - return ResponseFactory::html( - "

404 - Not Found

Legacy controller '{$controller}' not found

", - 404 - ); - } - - // Capture the legacy controller output - $output = ''; - $originalObLevel = ob_get_level(); - - try { - ob_start(); - - // Save current globals state (in case they're modified) - $originalServer = $_SERVER; - $originalGet = $_GET; - $originalPost = $_POST; - - // Import essential legacy globals into local scope - global $bb_cfg, $config, $user, $template, $datastore, $lang, $userdata, $userinfo, $images, - $tracking_topics, $tracking_forums, $theme, $bf, $attach_config, $gen_simple_header, - $client_ip, $user_ip, $log_action, $html, $wordCensor, $forum_key, $search_id, - $session_id, $items_found, $per_page, $topic_id, $req_topics, $forum_id, $mode, - $is_auth, $t_data, $postrow, $group_id, $group_info, $post_id, $folder, $post_info, - $tor, $post_data, $privmsg, $forums, $redirect, $attachment, $forum_data, $search_all, - $redirect_url, $topic_csv, $poster_id, $emailer, $s_hidden_fields, $opt, $msg, $stats, - $poster_id_key, $text_match_key, $poster_name_key, $my_topics_key, $my_topics_val, $title_only_key, - $all_words_key, $dl_cancel_key, $dl_cancel_val, $dl_compl_key, $dl_compl_val, $dl_down_key, $dl_down_val, - $dl_will_key, $dl_will_val, $new_key, $new_val, $new_topics_key, $new_topics_val, $time_key, $time_val, - $order_key, $order_val, $sort_key, $sort_val, $display_as_key, $display_as_val, $topic_key, $topic_val, - $poster_id_val, $poster_id_key, $forum_val, $forum_key; - - // Signal to legacy code that we're running through modern routing - if (!defined('MODERN_ROUTING')) { - define('MODERN_ROUTING', true); - } - - // Include the legacy controller - // Note: We don't use require_once to allow multiple includes if needed - include $controllerPath; - - // Get the captured output - make sure we only clean our own buffer - $output = ob_get_clean(); - - // Restore globals if needed - $_SERVER = $originalServer; - $_GET = $originalGet; - $_POST = $originalPost; - - // Return the output as HTML response - return ResponseFactory::html($output); - - } catch (\Throwable $e) { - // Clean up any extra output buffers that were started, but preserve original level - while (ob_get_level() > $originalObLevel) { - ob_end_clean(); - } - - // Return error response - $errorHtml = " -

Legacy Controller Error

-

Controller: {$controller}

-

Error: " . htmlspecialchars($e->getMessage()) . "

-

File: " . htmlspecialchars($e->getFile()) . ":" . $e->getLine() . "

- "; - - if (function_exists('dev') && dev()->isDebugEnabled()) { - $errorHtml .= "
" . htmlspecialchars($e->getTraceAsString()) . "
"; - } - - return ResponseFactory::html($errorHtml, 500); - } - } -} diff --git a/src/Presentation/Http/Controllers/Web/README.md b/src/Presentation/Http/Controllers/Web/README.md deleted file mode 100644 index 015c2d19c..000000000 --- a/src/Presentation/Http/Controllers/Web/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Web Controllers - -Traditional web interface controllers: - -- HTML response generation -- Template rendering -- Form handling -- Session management -- CSRF protection - -Controllers for: - -- Forum browsing and posting -- Torrent browsing and downloading -- User profiles and settings -- Search functionality \ No newline at end of file diff --git a/src/Presentation/Http/Kernel.php b/src/Presentation/Http/Kernel.php deleted file mode 100644 index 99a8e0c17..000000000 --- a/src/Presentation/Http/Kernel.php +++ /dev/null @@ -1,156 +0,0 @@ -container = $container; - $this->router = $container->get(Router::class); - } - - public function addMiddleware(MiddlewareInterface $middleware): self - { - $this->middleware[] = $middleware; - return $this; - } - - public function loadRoutes(string $routesFile): self - { - if (!file_exists($routesFile)) { - throw new \RuntimeException("Routes file not found: {$routesFile}"); - } - - $routeLoader = require $routesFile; - if (is_callable($routeLoader)) { - $routeLoader($this->router); - } - - return $this; - } - - public function handle(?ServerRequestInterface $request = null): ResponseInterface - { - try { - $request = $request ?: RequestFactory::fromGlobals(); - - // Apply middleware to router - foreach ($this->middleware as $middleware) { - $this->router->middleware($middleware); - } - - return $this->router->dispatch($request); - - } catch (NotFoundException $e) { - return ResponseFactory::html( - '

404 - Not Found

The requested page could not be found.

', - 404 - ); - } catch (MethodNotAllowedException $e) { - return ResponseFactory::html( - '

405 - Method Not Allowed

The request method is not allowed for this endpoint.

', - 405 - ); - } catch (Throwable $e) { - return $this->handleException($e, $request); - } - } - - public function run(?ServerRequestInterface $request = null): void - { - $response = $this->handle($request); - $this->sendResponse($response); - } - - private function handleException(Throwable $e, ?ServerRequestInterface $request = null): ResponseInterface - { - // TODO: Replace bb_log() with injected PSR-3 LoggerInterface - // This is a temporary coupling to the legacy logging system - if (function_exists('bb_log')) { - bb_log($e->getMessage() . "\n" . $e->getTraceAsString(), 'kernel_errors'); - } - - // TODO: Replace legacy dev() singleton with injected EnvironmentInterface - // This is a temporary coupling to the legacy system during the migration period - // Once all legacy controllers are migrated, inject a proper debug/environment service - if (function_exists('dev') && dev()->isDebugEnabled()) { - $html = " - - - - Application Error - - - -
-

Application Error

-

Message: " . htmlspecialchars($e->getMessage()) . "

-

File: " . htmlspecialchars($e->getFile()) . ":" . $e->getLine() . "

-
- Stack Trace: -
" . htmlspecialchars($e->getTraceAsString()) . "
-
-
- - "; - - return ResponseFactory::html($html, 500); - } - - // Production error response - return ResponseFactory::html(' - - - Server Error - -

500 - Internal Server Error

-

Something went wrong. Please try again later.

- - - ', 500); - } - - private function sendResponse(ResponseInterface $response): void - { - // Send status line (only if headers haven't been sent already) - if (!headers_sent()) { - http_response_code($response->getStatusCode()); - } - - // Send headers (only if headers haven't been sent already) - if (!headers_sent()) { - foreach ($response->getHeaders() as $name => $values) { - foreach ($values as $value) { - header("{$name}: {$value}", false); - } - } - } - - // Send body - echo $response->getBody()->getContents(); - } -} diff --git a/src/Presentation/Http/Middleware/README.md b/src/Presentation/Http/Middleware/README.md deleted file mode 100644 index c5a1d1a0c..000000000 --- a/src/Presentation/Http/Middleware/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# HTTP Middleware - -Request/response pipeline middleware: - -- `AuthenticationMiddleware`: User authentication -- `AuthorizationMiddleware`: Permission checks -- `CsrfProtectionMiddleware`: CSRF token validation -- `RateLimitMiddleware`: Request throttling -- `LocalizationMiddleware`: Language detection -- `CorsMiddleware`: Cross-origin resource sharing - -Middleware follows PSR-15 standard. \ No newline at end of file diff --git a/src/Presentation/Http/Requests/README.md b/src/Presentation/Http/Requests/README.md deleted file mode 100644 index 8e0a47d1c..000000000 --- a/src/Presentation/Http/Requests/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# HTTP Requests - -Request objects and validation: - -- Request DTOs with validation rules -- Type-safe access to request data -- File upload handling -- Input sanitization -- Custom validation rules - -Example: - -```php -class RegisterRequest extends FormRequest -{ - public function rules(): array - { - return [ - 'username' => ['required', 'string', 'min:3', 'max:20', 'unique:users'], - 'email' => ['required', 'email', 'unique:users'], - 'password' => ['required', 'string', 'min:8', 'confirmed'], - ]; - } -} -``` \ No newline at end of file diff --git a/src/Presentation/Http/Responses/README.md b/src/Presentation/Http/Responses/README.md deleted file mode 100644 index bce8c8325..000000000 --- a/src/Presentation/Http/Responses/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# HTTP Responses - -Response transformation and formatting: - -- Response factories -- JSON transformers -- View presenters -- Error response formatting -- Content negotiation - -Ensures consistent API responses and proper HTTP semantics. \ No newline at end of file diff --git a/src/Presentation/Http/Routes/web.php b/src/Presentation/Http/Routes/web.php deleted file mode 100644 index 0b78f8432..000000000 --- a/src/Presentation/Http/Routes/web.php +++ /dev/null @@ -1,53 +0,0 @@ -get('/hello', [HelloWorldController::class, 'index']); - $router->get('/hello/json', [HelloWorldController::class, 'json']); - - // Legacy controller routes (hacky but organized approach) - $legacyRoutes = [ - 'ajax.php', - 'dl.php', - 'dl_list.php', - 'feed.php', - 'filelist.php', - 'group.php', - 'group_edit.php', - 'index.php', - 'info.php', - 'login.php', - 'memberlist.php', - 'modcp.php', - 'playback_m3u.php', - 'poll.php', - 'posting.php', - 'privmsg.php', - 'profile.php', - 'search.php', - 'terms.php', - 'tracker.php', - 'viewforum.php', - 'viewtopic.php', - ]; - - foreach ($legacyRoutes as $route) { - // Route with .php extension - $router->any('/' . $route, [LegacyController::class, 'handle']); - - // Route without .php extension (e.g., /terms for /terms.php) - $routeWithoutExtension = str_replace('.php', '', $route); - $router->any('/' . $routeWithoutExtension, [LegacyController::class, 'handle']); - } - - // Root route should serve the legacy index.php controller - $router->any('/', [LegacyController::class, 'handle']); - - // Future modern routes will be added here -}; diff --git a/src/Presentation/README.md b/src/Presentation/README.md deleted file mode 100644 index 3e99a424b..000000000 --- a/src/Presentation/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Presentation Layer - -User interface implementations: - -- HTTP controllers for web and API -- CLI commands for console operations -- Request/response handling -- Input validation -- Output formatting - -This layer translates between external format and application format. \ No newline at end of file diff --git a/src/helpers.php b/src/helpers.php deleted file mode 100644 index b01f1bea5..000000000 --- a/src/helpers.php +++ /dev/null @@ -1,50 +0,0 @@ -get($id); - } catch (NotFoundExceptionInterface $e) { - throw new RuntimeException("Service '$id' not found in container: " . $e->getMessage(), 0, $e); - } catch (ContainerExceptionInterface $e) { - throw new RuntimeException("Container error while resolving '$id': " . $e->getMessage(), 0, $e); - } - } -} diff --git a/storage/app/.gitignore b/storage/app/.gitignore new file mode 100644 index 000000000..5ee79db67 --- /dev/null +++ b/storage/app/.gitignore @@ -0,0 +1,3 @@ +* +!public/ +!.gitignore \ No newline at end of file diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore new file mode 100644 index 000000000..c96a04f00 --- /dev/null +++ b/storage/app/public/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/storage/framework/.gitignore b/storage/framework/.gitignore new file mode 100644 index 000000000..f72889920 --- /dev/null +++ b/storage/framework/.gitignore @@ -0,0 +1,6 @@ +cache/* +sessions/* +views/* +!cache/.gitignore +!sessions/.gitignore +!views/.gitignore \ No newline at end of file diff --git a/storage/logs/.gitignore b/storage/logs/.gitignore new file mode 100644 index 000000000..c96a04f00 --- /dev/null +++ b/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/styles/templates/default/images/lang/ar/icon_code.gif b/styles/templates/default/images/lang/ar/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/ar/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/icon_edit.gif b/styles/templates/default/images/lang/ar/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/ar/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/icon_email.gif b/styles/templates/default/images/lang/ar/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/ar/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/icon_icq_add.gif b/styles/templates/default/images/lang/ar/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/ar/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/icon_ip.gif b/styles/templates/default/images/lang/ar/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/ar/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/icon_mc.gif b/styles/templates/default/images/lang/ar/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/ar/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/icon_pm.gif b/styles/templates/default/images/lang/ar/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/ar/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/icon_poll.gif b/styles/templates/default/images/lang/ar/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/ar/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/icon_profile.gif b/styles/templates/default/images/lang/ar/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/ar/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/icon_quote.gif b/styles/templates/default/images/lang/ar/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/ar/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/icon_search.gif b/styles/templates/default/images/lang/ar/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/ar/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/icon_www.gif b/styles/templates/default/images/lang/ar/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/ar/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/msg_newpost.gif b/styles/templates/default/images/lang/ar/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/ar/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/post.gif b/styles/templates/default/images/lang/ar/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/ar/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/release.gif b/styles/templates/default/images/lang/ar/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/ar/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/reply-locked.gif b/styles/templates/default/images/lang/ar/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/ar/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ar/reply.gif b/styles/templates/default/images/lang/ar/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/ar/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/icon_code.gif b/styles/templates/default/images/lang/az/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/az/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/icon_edit.gif b/styles/templates/default/images/lang/az/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/az/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/icon_email.gif b/styles/templates/default/images/lang/az/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/az/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/icon_icq_add.gif b/styles/templates/default/images/lang/az/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/az/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/icon_ip.gif b/styles/templates/default/images/lang/az/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/az/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/icon_mc.gif b/styles/templates/default/images/lang/az/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/az/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/icon_pm.gif b/styles/templates/default/images/lang/az/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/az/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/icon_poll.gif b/styles/templates/default/images/lang/az/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/az/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/icon_profile.gif b/styles/templates/default/images/lang/az/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/az/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/icon_quote.gif b/styles/templates/default/images/lang/az/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/az/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/icon_search.gif b/styles/templates/default/images/lang/az/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/az/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/icon_www.gif b/styles/templates/default/images/lang/az/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/az/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/msg_newpost.gif b/styles/templates/default/images/lang/az/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/az/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/post.gif b/styles/templates/default/images/lang/az/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/az/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/release.gif b/styles/templates/default/images/lang/az/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/az/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/reply-locked.gif b/styles/templates/default/images/lang/az/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/az/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/az/reply.gif b/styles/templates/default/images/lang/az/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/az/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/icon_code.gif b/styles/templates/default/images/lang/be/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/be/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/icon_edit.gif b/styles/templates/default/images/lang/be/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/be/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/icon_email.gif b/styles/templates/default/images/lang/be/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/be/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/icon_icq_add.gif b/styles/templates/default/images/lang/be/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/be/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/icon_ip.gif b/styles/templates/default/images/lang/be/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/be/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/icon_mc.gif b/styles/templates/default/images/lang/be/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/be/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/icon_pm.gif b/styles/templates/default/images/lang/be/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/be/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/icon_poll.gif b/styles/templates/default/images/lang/be/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/be/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/icon_profile.gif b/styles/templates/default/images/lang/be/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/be/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/icon_quote.gif b/styles/templates/default/images/lang/be/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/be/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/icon_search.gif b/styles/templates/default/images/lang/be/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/be/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/icon_www.gif b/styles/templates/default/images/lang/be/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/be/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/msg_newpost.gif b/styles/templates/default/images/lang/be/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/be/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/post.gif b/styles/templates/default/images/lang/be/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/be/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/release.gif b/styles/templates/default/images/lang/be/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/be/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/reply-locked.gif b/styles/templates/default/images/lang/be/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/be/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/be/reply.gif b/styles/templates/default/images/lang/be/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/be/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/icon_code.gif b/styles/templates/default/images/lang/bg/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/bg/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/icon_edit.gif b/styles/templates/default/images/lang/bg/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/bg/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/icon_email.gif b/styles/templates/default/images/lang/bg/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/bg/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/icon_icq_add.gif b/styles/templates/default/images/lang/bg/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/bg/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/icon_ip.gif b/styles/templates/default/images/lang/bg/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/bg/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/icon_mc.gif b/styles/templates/default/images/lang/bg/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/bg/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/icon_pm.gif b/styles/templates/default/images/lang/bg/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/bg/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/icon_poll.gif b/styles/templates/default/images/lang/bg/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/bg/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/icon_profile.gif b/styles/templates/default/images/lang/bg/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/bg/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/icon_quote.gif b/styles/templates/default/images/lang/bg/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/bg/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/icon_search.gif b/styles/templates/default/images/lang/bg/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/bg/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/icon_www.gif b/styles/templates/default/images/lang/bg/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/bg/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/msg_newpost.gif b/styles/templates/default/images/lang/bg/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/bg/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/post.gif b/styles/templates/default/images/lang/bg/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/bg/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/release.gif b/styles/templates/default/images/lang/bg/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/bg/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/reply-locked.gif b/styles/templates/default/images/lang/bg/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/bg/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bg/reply.gif b/styles/templates/default/images/lang/bg/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/bg/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/icon_code.gif b/styles/templates/default/images/lang/bs/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/bs/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/icon_edit.gif b/styles/templates/default/images/lang/bs/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/bs/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/icon_email.gif b/styles/templates/default/images/lang/bs/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/bs/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/icon_icq_add.gif b/styles/templates/default/images/lang/bs/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/bs/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/icon_ip.gif b/styles/templates/default/images/lang/bs/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/bs/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/icon_mc.gif b/styles/templates/default/images/lang/bs/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/bs/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/icon_pm.gif b/styles/templates/default/images/lang/bs/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/bs/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/icon_poll.gif b/styles/templates/default/images/lang/bs/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/bs/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/icon_profile.gif b/styles/templates/default/images/lang/bs/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/bs/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/icon_quote.gif b/styles/templates/default/images/lang/bs/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/bs/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/icon_search.gif b/styles/templates/default/images/lang/bs/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/bs/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/icon_www.gif b/styles/templates/default/images/lang/bs/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/bs/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/msg_newpost.gif b/styles/templates/default/images/lang/bs/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/bs/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/post.gif b/styles/templates/default/images/lang/bs/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/bs/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/release.gif b/styles/templates/default/images/lang/bs/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/bs/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/reply-locked.gif b/styles/templates/default/images/lang/bs/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/bs/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/bs/reply.gif b/styles/templates/default/images/lang/bs/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/bs/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/icon_code.gif b/styles/templates/default/images/lang/ca/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/ca/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/icon_edit.gif b/styles/templates/default/images/lang/ca/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/ca/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/icon_email.gif b/styles/templates/default/images/lang/ca/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/ca/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/icon_icq_add.gif b/styles/templates/default/images/lang/ca/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/ca/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/icon_ip.gif b/styles/templates/default/images/lang/ca/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/ca/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/icon_mc.gif b/styles/templates/default/images/lang/ca/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/ca/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/icon_pm.gif b/styles/templates/default/images/lang/ca/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/ca/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/icon_poll.gif b/styles/templates/default/images/lang/ca/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/ca/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/icon_profile.gif b/styles/templates/default/images/lang/ca/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/ca/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/icon_quote.gif b/styles/templates/default/images/lang/ca/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/ca/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/icon_search.gif b/styles/templates/default/images/lang/ca/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/ca/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/icon_www.gif b/styles/templates/default/images/lang/ca/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/ca/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/msg_newpost.gif b/styles/templates/default/images/lang/ca/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/ca/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/post.gif b/styles/templates/default/images/lang/ca/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/ca/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/release.gif b/styles/templates/default/images/lang/ca/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/ca/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/reply-locked.gif b/styles/templates/default/images/lang/ca/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/ca/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ca/reply.gif b/styles/templates/default/images/lang/ca/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/ca/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/icon_code.gif b/styles/templates/default/images/lang/cs/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/cs/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/icon_edit.gif b/styles/templates/default/images/lang/cs/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/cs/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/icon_email.gif b/styles/templates/default/images/lang/cs/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/cs/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/icon_icq_add.gif b/styles/templates/default/images/lang/cs/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/cs/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/icon_ip.gif b/styles/templates/default/images/lang/cs/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/cs/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/icon_mc.gif b/styles/templates/default/images/lang/cs/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/cs/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/icon_pm.gif b/styles/templates/default/images/lang/cs/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/cs/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/icon_poll.gif b/styles/templates/default/images/lang/cs/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/cs/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/icon_profile.gif b/styles/templates/default/images/lang/cs/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/cs/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/icon_quote.gif b/styles/templates/default/images/lang/cs/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/cs/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/icon_search.gif b/styles/templates/default/images/lang/cs/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/cs/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/icon_www.gif b/styles/templates/default/images/lang/cs/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/cs/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/msg_newpost.gif b/styles/templates/default/images/lang/cs/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/cs/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/post.gif b/styles/templates/default/images/lang/cs/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/cs/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/release.gif b/styles/templates/default/images/lang/cs/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/cs/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/reply-locked.gif b/styles/templates/default/images/lang/cs/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/cs/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/cs/reply.gif b/styles/templates/default/images/lang/cs/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/cs/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/icon_code.gif b/styles/templates/default/images/lang/da/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/da/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/icon_edit.gif b/styles/templates/default/images/lang/da/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/da/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/icon_email.gif b/styles/templates/default/images/lang/da/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/da/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/icon_icq_add.gif b/styles/templates/default/images/lang/da/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/da/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/icon_ip.gif b/styles/templates/default/images/lang/da/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/da/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/icon_mc.gif b/styles/templates/default/images/lang/da/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/da/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/icon_pm.gif b/styles/templates/default/images/lang/da/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/da/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/icon_poll.gif b/styles/templates/default/images/lang/da/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/da/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/icon_profile.gif b/styles/templates/default/images/lang/da/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/da/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/icon_quote.gif b/styles/templates/default/images/lang/da/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/da/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/icon_search.gif b/styles/templates/default/images/lang/da/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/da/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/icon_www.gif b/styles/templates/default/images/lang/da/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/da/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/msg_newpost.gif b/styles/templates/default/images/lang/da/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/da/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/post.gif b/styles/templates/default/images/lang/da/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/da/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/release.gif b/styles/templates/default/images/lang/da/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/da/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/reply-locked.gif b/styles/templates/default/images/lang/da/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/da/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/da/reply.gif b/styles/templates/default/images/lang/da/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/da/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/icon_code.gif b/styles/templates/default/images/lang/de/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/de/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/icon_edit.gif b/styles/templates/default/images/lang/de/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/de/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/icon_email.gif b/styles/templates/default/images/lang/de/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/de/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/icon_icq_add.gif b/styles/templates/default/images/lang/de/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/de/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/icon_ip.gif b/styles/templates/default/images/lang/de/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/de/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/icon_mc.gif b/styles/templates/default/images/lang/de/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/de/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/icon_pm.gif b/styles/templates/default/images/lang/de/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/de/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/icon_poll.gif b/styles/templates/default/images/lang/de/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/de/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/icon_profile.gif b/styles/templates/default/images/lang/de/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/de/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/icon_quote.gif b/styles/templates/default/images/lang/de/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/de/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/icon_search.gif b/styles/templates/default/images/lang/de/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/de/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/icon_www.gif b/styles/templates/default/images/lang/de/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/de/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/msg_newpost.gif b/styles/templates/default/images/lang/de/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/de/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/post.gif b/styles/templates/default/images/lang/de/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/de/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/release.gif b/styles/templates/default/images/lang/de/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/de/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/reply-locked.gif b/styles/templates/default/images/lang/de/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/de/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/de/reply.gif b/styles/templates/default/images/lang/de/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/de/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/icon_code.gif b/styles/templates/default/images/lang/el/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/el/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/icon_edit.gif b/styles/templates/default/images/lang/el/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/el/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/icon_email.gif b/styles/templates/default/images/lang/el/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/el/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/icon_icq_add.gif b/styles/templates/default/images/lang/el/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/el/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/icon_ip.gif b/styles/templates/default/images/lang/el/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/el/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/icon_mc.gif b/styles/templates/default/images/lang/el/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/el/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/icon_pm.gif b/styles/templates/default/images/lang/el/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/el/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/icon_poll.gif b/styles/templates/default/images/lang/el/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/el/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/icon_profile.gif b/styles/templates/default/images/lang/el/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/el/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/icon_quote.gif b/styles/templates/default/images/lang/el/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/el/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/icon_search.gif b/styles/templates/default/images/lang/el/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/el/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/icon_www.gif b/styles/templates/default/images/lang/el/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/el/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/msg_newpost.gif b/styles/templates/default/images/lang/el/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/el/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/post.gif b/styles/templates/default/images/lang/el/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/el/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/release.gif b/styles/templates/default/images/lang/el/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/el/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/reply-locked.gif b/styles/templates/default/images/lang/el/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/el/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/el/reply.gif b/styles/templates/default/images/lang/el/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/el/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/icon_code.gif b/styles/templates/default/images/lang/en/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/en/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/icon_edit.gif b/styles/templates/default/images/lang/en/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/en/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/icon_email.gif b/styles/templates/default/images/lang/en/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/en/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/icon_icq_add.gif b/styles/templates/default/images/lang/en/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/en/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/icon_ip.gif b/styles/templates/default/images/lang/en/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/en/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/icon_mc.gif b/styles/templates/default/images/lang/en/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/en/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/icon_pm.gif b/styles/templates/default/images/lang/en/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/en/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/icon_poll.gif b/styles/templates/default/images/lang/en/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/en/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/icon_profile.gif b/styles/templates/default/images/lang/en/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/en/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/icon_quote.gif b/styles/templates/default/images/lang/en/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/en/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/icon_search.gif b/styles/templates/default/images/lang/en/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/en/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/icon_www.gif b/styles/templates/default/images/lang/en/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/en/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/msg_newpost.gif b/styles/templates/default/images/lang/en/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/en/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/post.gif b/styles/templates/default/images/lang/en/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/en/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/release.gif b/styles/templates/default/images/lang/en/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/en/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/reply-locked.gif b/styles/templates/default/images/lang/en/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/en/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/en/reply.gif b/styles/templates/default/images/lang/en/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/en/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/icon_code.gif b/styles/templates/default/images/lang/es/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/es/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/icon_edit.gif b/styles/templates/default/images/lang/es/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/es/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/icon_email.gif b/styles/templates/default/images/lang/es/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/es/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/icon_icq_add.gif b/styles/templates/default/images/lang/es/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/es/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/icon_ip.gif b/styles/templates/default/images/lang/es/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/es/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/icon_mc.gif b/styles/templates/default/images/lang/es/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/es/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/icon_pm.gif b/styles/templates/default/images/lang/es/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/es/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/icon_poll.gif b/styles/templates/default/images/lang/es/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/es/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/icon_profile.gif b/styles/templates/default/images/lang/es/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/es/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/icon_quote.gif b/styles/templates/default/images/lang/es/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/es/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/icon_search.gif b/styles/templates/default/images/lang/es/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/es/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/icon_www.gif b/styles/templates/default/images/lang/es/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/es/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/msg_newpost.gif b/styles/templates/default/images/lang/es/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/es/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/post.gif b/styles/templates/default/images/lang/es/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/es/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/release.gif b/styles/templates/default/images/lang/es/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/es/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/reply-locked.gif b/styles/templates/default/images/lang/es/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/es/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/es/reply.gif b/styles/templates/default/images/lang/es/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/es/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/icon_code.gif b/styles/templates/default/images/lang/et/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/et/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/icon_edit.gif b/styles/templates/default/images/lang/et/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/et/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/icon_email.gif b/styles/templates/default/images/lang/et/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/et/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/icon_icq_add.gif b/styles/templates/default/images/lang/et/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/et/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/icon_ip.gif b/styles/templates/default/images/lang/et/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/et/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/icon_mc.gif b/styles/templates/default/images/lang/et/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/et/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/icon_pm.gif b/styles/templates/default/images/lang/et/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/et/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/icon_poll.gif b/styles/templates/default/images/lang/et/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/et/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/icon_profile.gif b/styles/templates/default/images/lang/et/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/et/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/icon_quote.gif b/styles/templates/default/images/lang/et/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/et/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/icon_search.gif b/styles/templates/default/images/lang/et/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/et/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/icon_www.gif b/styles/templates/default/images/lang/et/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/et/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/msg_newpost.gif b/styles/templates/default/images/lang/et/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/et/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/post.gif b/styles/templates/default/images/lang/et/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/et/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/release.gif b/styles/templates/default/images/lang/et/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/et/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/reply-locked.gif b/styles/templates/default/images/lang/et/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/et/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/et/reply.gif b/styles/templates/default/images/lang/et/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/et/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/icon_code.gif b/styles/templates/default/images/lang/fi/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/fi/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/icon_edit.gif b/styles/templates/default/images/lang/fi/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/fi/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/icon_email.gif b/styles/templates/default/images/lang/fi/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/fi/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/icon_icq_add.gif b/styles/templates/default/images/lang/fi/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/fi/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/icon_ip.gif b/styles/templates/default/images/lang/fi/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/fi/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/icon_mc.gif b/styles/templates/default/images/lang/fi/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/fi/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/icon_pm.gif b/styles/templates/default/images/lang/fi/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/fi/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/icon_poll.gif b/styles/templates/default/images/lang/fi/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/fi/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/icon_profile.gif b/styles/templates/default/images/lang/fi/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/fi/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/icon_quote.gif b/styles/templates/default/images/lang/fi/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/fi/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/icon_search.gif b/styles/templates/default/images/lang/fi/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/fi/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/icon_www.gif b/styles/templates/default/images/lang/fi/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/fi/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/msg_newpost.gif b/styles/templates/default/images/lang/fi/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/fi/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/post.gif b/styles/templates/default/images/lang/fi/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/fi/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/release.gif b/styles/templates/default/images/lang/fi/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/fi/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/reply-locked.gif b/styles/templates/default/images/lang/fi/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/fi/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fi/reply.gif b/styles/templates/default/images/lang/fi/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/fi/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/icon_code.gif b/styles/templates/default/images/lang/fr/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/fr/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/icon_edit.gif b/styles/templates/default/images/lang/fr/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/fr/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/icon_email.gif b/styles/templates/default/images/lang/fr/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/fr/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/icon_icq_add.gif b/styles/templates/default/images/lang/fr/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/fr/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/icon_ip.gif b/styles/templates/default/images/lang/fr/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/fr/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/icon_mc.gif b/styles/templates/default/images/lang/fr/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/fr/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/icon_pm.gif b/styles/templates/default/images/lang/fr/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/fr/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/icon_poll.gif b/styles/templates/default/images/lang/fr/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/fr/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/icon_profile.gif b/styles/templates/default/images/lang/fr/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/fr/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/icon_quote.gif b/styles/templates/default/images/lang/fr/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/fr/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/icon_search.gif b/styles/templates/default/images/lang/fr/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/fr/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/icon_www.gif b/styles/templates/default/images/lang/fr/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/fr/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/msg_newpost.gif b/styles/templates/default/images/lang/fr/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/fr/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/post.gif b/styles/templates/default/images/lang/fr/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/fr/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/release.gif b/styles/templates/default/images/lang/fr/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/fr/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/reply-locked.gif b/styles/templates/default/images/lang/fr/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/fr/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/fr/reply.gif b/styles/templates/default/images/lang/fr/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/fr/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/icon_code.gif b/styles/templates/default/images/lang/he/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/he/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/icon_edit.gif b/styles/templates/default/images/lang/he/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/he/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/icon_email.gif b/styles/templates/default/images/lang/he/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/he/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/icon_icq_add.gif b/styles/templates/default/images/lang/he/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/he/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/icon_ip.gif b/styles/templates/default/images/lang/he/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/he/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/icon_mc.gif b/styles/templates/default/images/lang/he/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/he/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/icon_pm.gif b/styles/templates/default/images/lang/he/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/he/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/icon_poll.gif b/styles/templates/default/images/lang/he/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/he/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/icon_profile.gif b/styles/templates/default/images/lang/he/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/he/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/icon_quote.gif b/styles/templates/default/images/lang/he/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/he/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/icon_search.gif b/styles/templates/default/images/lang/he/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/he/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/icon_www.gif b/styles/templates/default/images/lang/he/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/he/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/msg_newpost.gif b/styles/templates/default/images/lang/he/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/he/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/post.gif b/styles/templates/default/images/lang/he/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/he/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/release.gif b/styles/templates/default/images/lang/he/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/he/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/reply-locked.gif b/styles/templates/default/images/lang/he/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/he/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/he/reply.gif b/styles/templates/default/images/lang/he/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/he/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/icon_code.gif b/styles/templates/default/images/lang/hi/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/hi/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/icon_edit.gif b/styles/templates/default/images/lang/hi/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/hi/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/icon_email.gif b/styles/templates/default/images/lang/hi/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/hi/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/icon_icq_add.gif b/styles/templates/default/images/lang/hi/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/hi/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/icon_ip.gif b/styles/templates/default/images/lang/hi/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/hi/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/icon_mc.gif b/styles/templates/default/images/lang/hi/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/hi/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/icon_pm.gif b/styles/templates/default/images/lang/hi/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/hi/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/icon_poll.gif b/styles/templates/default/images/lang/hi/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/hi/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/icon_profile.gif b/styles/templates/default/images/lang/hi/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/hi/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/icon_quote.gif b/styles/templates/default/images/lang/hi/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/hi/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/icon_search.gif b/styles/templates/default/images/lang/hi/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/hi/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/icon_www.gif b/styles/templates/default/images/lang/hi/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/hi/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/msg_newpost.gif b/styles/templates/default/images/lang/hi/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/hi/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/post.gif b/styles/templates/default/images/lang/hi/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/hi/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/release.gif b/styles/templates/default/images/lang/hi/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/hi/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/reply-locked.gif b/styles/templates/default/images/lang/hi/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/hi/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hi/reply.gif b/styles/templates/default/images/lang/hi/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/hi/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/icon_code.gif b/styles/templates/default/images/lang/hr/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/hr/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/icon_edit.gif b/styles/templates/default/images/lang/hr/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/hr/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/icon_email.gif b/styles/templates/default/images/lang/hr/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/hr/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/icon_icq_add.gif b/styles/templates/default/images/lang/hr/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/hr/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/icon_ip.gif b/styles/templates/default/images/lang/hr/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/hr/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/icon_mc.gif b/styles/templates/default/images/lang/hr/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/hr/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/icon_pm.gif b/styles/templates/default/images/lang/hr/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/hr/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/icon_poll.gif b/styles/templates/default/images/lang/hr/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/hr/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/icon_profile.gif b/styles/templates/default/images/lang/hr/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/hr/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/icon_quote.gif b/styles/templates/default/images/lang/hr/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/hr/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/icon_search.gif b/styles/templates/default/images/lang/hr/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/hr/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/icon_www.gif b/styles/templates/default/images/lang/hr/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/hr/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/msg_newpost.gif b/styles/templates/default/images/lang/hr/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/hr/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/post.gif b/styles/templates/default/images/lang/hr/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/hr/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/release.gif b/styles/templates/default/images/lang/hr/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/hr/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/reply-locked.gif b/styles/templates/default/images/lang/hr/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/hr/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hr/reply.gif b/styles/templates/default/images/lang/hr/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/hr/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/icon_code.gif b/styles/templates/default/images/lang/hu/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/hu/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/icon_edit.gif b/styles/templates/default/images/lang/hu/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/hu/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/icon_email.gif b/styles/templates/default/images/lang/hu/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/hu/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/icon_icq_add.gif b/styles/templates/default/images/lang/hu/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/hu/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/icon_ip.gif b/styles/templates/default/images/lang/hu/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/hu/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/icon_mc.gif b/styles/templates/default/images/lang/hu/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/hu/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/icon_pm.gif b/styles/templates/default/images/lang/hu/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/hu/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/icon_poll.gif b/styles/templates/default/images/lang/hu/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/hu/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/icon_profile.gif b/styles/templates/default/images/lang/hu/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/hu/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/icon_quote.gif b/styles/templates/default/images/lang/hu/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/hu/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/icon_search.gif b/styles/templates/default/images/lang/hu/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/hu/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/icon_www.gif b/styles/templates/default/images/lang/hu/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/hu/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/msg_newpost.gif b/styles/templates/default/images/lang/hu/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/hu/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/post.gif b/styles/templates/default/images/lang/hu/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/hu/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/release.gif b/styles/templates/default/images/lang/hu/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/hu/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/reply-locked.gif b/styles/templates/default/images/lang/hu/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/hu/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hu/reply.gif b/styles/templates/default/images/lang/hu/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/hu/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/icon_code.gif b/styles/templates/default/images/lang/hy/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/hy/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/icon_edit.gif b/styles/templates/default/images/lang/hy/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/hy/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/icon_email.gif b/styles/templates/default/images/lang/hy/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/hy/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/icon_icq_add.gif b/styles/templates/default/images/lang/hy/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/hy/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/icon_ip.gif b/styles/templates/default/images/lang/hy/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/hy/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/icon_mc.gif b/styles/templates/default/images/lang/hy/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/hy/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/icon_pm.gif b/styles/templates/default/images/lang/hy/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/hy/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/icon_poll.gif b/styles/templates/default/images/lang/hy/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/hy/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/icon_profile.gif b/styles/templates/default/images/lang/hy/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/hy/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/icon_quote.gif b/styles/templates/default/images/lang/hy/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/hy/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/icon_search.gif b/styles/templates/default/images/lang/hy/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/hy/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/icon_www.gif b/styles/templates/default/images/lang/hy/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/hy/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/msg_newpost.gif b/styles/templates/default/images/lang/hy/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/hy/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/post.gif b/styles/templates/default/images/lang/hy/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/hy/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/release.gif b/styles/templates/default/images/lang/hy/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/hy/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/reply-locked.gif b/styles/templates/default/images/lang/hy/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/hy/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/hy/reply.gif b/styles/templates/default/images/lang/hy/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/hy/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/icon_code.gif b/styles/templates/default/images/lang/id/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/id/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/icon_edit.gif b/styles/templates/default/images/lang/id/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/id/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/icon_email.gif b/styles/templates/default/images/lang/id/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/id/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/icon_icq_add.gif b/styles/templates/default/images/lang/id/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/id/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/icon_ip.gif b/styles/templates/default/images/lang/id/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/id/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/icon_mc.gif b/styles/templates/default/images/lang/id/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/id/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/icon_pm.gif b/styles/templates/default/images/lang/id/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/id/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/icon_poll.gif b/styles/templates/default/images/lang/id/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/id/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/icon_profile.gif b/styles/templates/default/images/lang/id/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/id/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/icon_quote.gif b/styles/templates/default/images/lang/id/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/id/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/icon_search.gif b/styles/templates/default/images/lang/id/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/id/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/icon_www.gif b/styles/templates/default/images/lang/id/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/id/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/msg_newpost.gif b/styles/templates/default/images/lang/id/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/id/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/post.gif b/styles/templates/default/images/lang/id/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/id/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/release.gif b/styles/templates/default/images/lang/id/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/id/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/reply-locked.gif b/styles/templates/default/images/lang/id/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/id/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/id/reply.gif b/styles/templates/default/images/lang/id/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/id/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/icon_code.gif b/styles/templates/default/images/lang/it/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/it/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/icon_edit.gif b/styles/templates/default/images/lang/it/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/it/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/icon_email.gif b/styles/templates/default/images/lang/it/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/it/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/icon_icq_add.gif b/styles/templates/default/images/lang/it/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/it/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/icon_ip.gif b/styles/templates/default/images/lang/it/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/it/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/icon_mc.gif b/styles/templates/default/images/lang/it/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/it/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/icon_pm.gif b/styles/templates/default/images/lang/it/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/it/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/icon_poll.gif b/styles/templates/default/images/lang/it/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/it/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/icon_profile.gif b/styles/templates/default/images/lang/it/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/it/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/icon_quote.gif b/styles/templates/default/images/lang/it/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/it/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/icon_search.gif b/styles/templates/default/images/lang/it/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/it/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/icon_www.gif b/styles/templates/default/images/lang/it/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/it/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/msg_newpost.gif b/styles/templates/default/images/lang/it/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/it/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/post.gif b/styles/templates/default/images/lang/it/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/it/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/release.gif b/styles/templates/default/images/lang/it/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/it/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/reply-locked.gif b/styles/templates/default/images/lang/it/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/it/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/it/reply.gif b/styles/templates/default/images/lang/it/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/it/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/icon_code.gif b/styles/templates/default/images/lang/ja/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/ja/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/icon_edit.gif b/styles/templates/default/images/lang/ja/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/ja/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/icon_email.gif b/styles/templates/default/images/lang/ja/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/ja/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/icon_icq_add.gif b/styles/templates/default/images/lang/ja/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/ja/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/icon_ip.gif b/styles/templates/default/images/lang/ja/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/ja/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/icon_mc.gif b/styles/templates/default/images/lang/ja/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/ja/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/icon_pm.gif b/styles/templates/default/images/lang/ja/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/ja/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/icon_poll.gif b/styles/templates/default/images/lang/ja/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/ja/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/icon_profile.gif b/styles/templates/default/images/lang/ja/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/ja/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/icon_quote.gif b/styles/templates/default/images/lang/ja/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/ja/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/icon_search.gif b/styles/templates/default/images/lang/ja/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/ja/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/icon_www.gif b/styles/templates/default/images/lang/ja/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/ja/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/msg_newpost.gif b/styles/templates/default/images/lang/ja/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/ja/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/post.gif b/styles/templates/default/images/lang/ja/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/ja/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/release.gif b/styles/templates/default/images/lang/ja/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/ja/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/reply-locked.gif b/styles/templates/default/images/lang/ja/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/ja/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ja/reply.gif b/styles/templates/default/images/lang/ja/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/ja/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/icon_code.gif b/styles/templates/default/images/lang/ka/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/ka/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/icon_edit.gif b/styles/templates/default/images/lang/ka/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/ka/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/icon_email.gif b/styles/templates/default/images/lang/ka/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/ka/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/icon_icq_add.gif b/styles/templates/default/images/lang/ka/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/ka/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/icon_ip.gif b/styles/templates/default/images/lang/ka/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/ka/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/icon_mc.gif b/styles/templates/default/images/lang/ka/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/ka/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/icon_pm.gif b/styles/templates/default/images/lang/ka/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/ka/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/icon_poll.gif b/styles/templates/default/images/lang/ka/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/ka/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/icon_profile.gif b/styles/templates/default/images/lang/ka/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/ka/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/icon_quote.gif b/styles/templates/default/images/lang/ka/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/ka/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/icon_search.gif b/styles/templates/default/images/lang/ka/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/ka/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/icon_www.gif b/styles/templates/default/images/lang/ka/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/ka/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/msg_newpost.gif b/styles/templates/default/images/lang/ka/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/ka/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/post.gif b/styles/templates/default/images/lang/ka/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/ka/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/release.gif b/styles/templates/default/images/lang/ka/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/ka/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/reply-locked.gif b/styles/templates/default/images/lang/ka/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/ka/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ka/reply.gif b/styles/templates/default/images/lang/ka/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/ka/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/icon_code.gif b/styles/templates/default/images/lang/kk/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/kk/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/icon_edit.gif b/styles/templates/default/images/lang/kk/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/kk/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/icon_email.gif b/styles/templates/default/images/lang/kk/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/kk/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/icon_icq_add.gif b/styles/templates/default/images/lang/kk/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/kk/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/icon_ip.gif b/styles/templates/default/images/lang/kk/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/kk/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/icon_mc.gif b/styles/templates/default/images/lang/kk/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/kk/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/icon_pm.gif b/styles/templates/default/images/lang/kk/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/kk/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/icon_poll.gif b/styles/templates/default/images/lang/kk/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/kk/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/icon_profile.gif b/styles/templates/default/images/lang/kk/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/kk/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/icon_quote.gif b/styles/templates/default/images/lang/kk/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/kk/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/icon_search.gif b/styles/templates/default/images/lang/kk/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/kk/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/icon_www.gif b/styles/templates/default/images/lang/kk/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/kk/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/msg_newpost.gif b/styles/templates/default/images/lang/kk/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/kk/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/post.gif b/styles/templates/default/images/lang/kk/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/kk/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/release.gif b/styles/templates/default/images/lang/kk/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/kk/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/reply-locked.gif b/styles/templates/default/images/lang/kk/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/kk/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/kk/reply.gif b/styles/templates/default/images/lang/kk/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/kk/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/icon_code.gif b/styles/templates/default/images/lang/ko/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/ko/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/icon_edit.gif b/styles/templates/default/images/lang/ko/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/ko/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/icon_email.gif b/styles/templates/default/images/lang/ko/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/ko/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/icon_icq_add.gif b/styles/templates/default/images/lang/ko/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/ko/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/icon_ip.gif b/styles/templates/default/images/lang/ko/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/ko/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/icon_mc.gif b/styles/templates/default/images/lang/ko/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/ko/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/icon_pm.gif b/styles/templates/default/images/lang/ko/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/ko/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/icon_poll.gif b/styles/templates/default/images/lang/ko/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/ko/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/icon_profile.gif b/styles/templates/default/images/lang/ko/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/ko/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/icon_quote.gif b/styles/templates/default/images/lang/ko/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/ko/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/icon_search.gif b/styles/templates/default/images/lang/ko/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/ko/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/icon_www.gif b/styles/templates/default/images/lang/ko/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/ko/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/msg_newpost.gif b/styles/templates/default/images/lang/ko/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/ko/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/post.gif b/styles/templates/default/images/lang/ko/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/ko/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/release.gif b/styles/templates/default/images/lang/ko/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/ko/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/reply-locked.gif b/styles/templates/default/images/lang/ko/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/ko/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ko/reply.gif b/styles/templates/default/images/lang/ko/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/ko/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/icon_code.gif b/styles/templates/default/images/lang/lt/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/lt/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/icon_edit.gif b/styles/templates/default/images/lang/lt/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/lt/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/icon_email.gif b/styles/templates/default/images/lang/lt/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/lt/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/icon_icq_add.gif b/styles/templates/default/images/lang/lt/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/lt/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/icon_ip.gif b/styles/templates/default/images/lang/lt/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/lt/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/icon_mc.gif b/styles/templates/default/images/lang/lt/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/lt/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/icon_pm.gif b/styles/templates/default/images/lang/lt/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/lt/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/icon_poll.gif b/styles/templates/default/images/lang/lt/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/lt/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/icon_profile.gif b/styles/templates/default/images/lang/lt/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/lt/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/icon_quote.gif b/styles/templates/default/images/lang/lt/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/lt/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/icon_search.gif b/styles/templates/default/images/lang/lt/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/lt/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/icon_www.gif b/styles/templates/default/images/lang/lt/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/lt/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/msg_newpost.gif b/styles/templates/default/images/lang/lt/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/lt/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/post.gif b/styles/templates/default/images/lang/lt/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/lt/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/release.gif b/styles/templates/default/images/lang/lt/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/lt/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/reply-locked.gif b/styles/templates/default/images/lang/lt/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/lt/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lt/reply.gif b/styles/templates/default/images/lang/lt/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/lt/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/icon_code.gif b/styles/templates/default/images/lang/lv/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/lv/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/icon_edit.gif b/styles/templates/default/images/lang/lv/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/lv/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/icon_email.gif b/styles/templates/default/images/lang/lv/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/lv/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/icon_icq_add.gif b/styles/templates/default/images/lang/lv/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/lv/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/icon_ip.gif b/styles/templates/default/images/lang/lv/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/lv/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/icon_mc.gif b/styles/templates/default/images/lang/lv/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/lv/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/icon_pm.gif b/styles/templates/default/images/lang/lv/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/lv/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/icon_poll.gif b/styles/templates/default/images/lang/lv/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/lv/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/icon_profile.gif b/styles/templates/default/images/lang/lv/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/lv/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/icon_quote.gif b/styles/templates/default/images/lang/lv/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/lv/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/icon_search.gif b/styles/templates/default/images/lang/lv/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/lv/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/icon_www.gif b/styles/templates/default/images/lang/lv/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/lv/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/msg_newpost.gif b/styles/templates/default/images/lang/lv/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/lv/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/post.gif b/styles/templates/default/images/lang/lv/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/lv/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/release.gif b/styles/templates/default/images/lang/lv/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/lv/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/reply-locked.gif b/styles/templates/default/images/lang/lv/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/lv/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/lv/reply.gif b/styles/templates/default/images/lang/lv/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/lv/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/icon_code.gif b/styles/templates/default/images/lang/nl/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/nl/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/icon_edit.gif b/styles/templates/default/images/lang/nl/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/nl/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/icon_email.gif b/styles/templates/default/images/lang/nl/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/nl/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/icon_icq_add.gif b/styles/templates/default/images/lang/nl/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/nl/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/icon_ip.gif b/styles/templates/default/images/lang/nl/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/nl/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/icon_mc.gif b/styles/templates/default/images/lang/nl/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/nl/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/icon_pm.gif b/styles/templates/default/images/lang/nl/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/nl/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/icon_poll.gif b/styles/templates/default/images/lang/nl/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/nl/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/icon_profile.gif b/styles/templates/default/images/lang/nl/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/nl/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/icon_quote.gif b/styles/templates/default/images/lang/nl/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/nl/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/icon_search.gif b/styles/templates/default/images/lang/nl/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/nl/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/icon_www.gif b/styles/templates/default/images/lang/nl/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/nl/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/msg_newpost.gif b/styles/templates/default/images/lang/nl/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/nl/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/post.gif b/styles/templates/default/images/lang/nl/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/nl/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/release.gif b/styles/templates/default/images/lang/nl/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/nl/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/reply-locked.gif b/styles/templates/default/images/lang/nl/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/nl/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/nl/reply.gif b/styles/templates/default/images/lang/nl/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/nl/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/icon_code.gif b/styles/templates/default/images/lang/no/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/no/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/icon_edit.gif b/styles/templates/default/images/lang/no/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/no/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/icon_email.gif b/styles/templates/default/images/lang/no/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/no/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/icon_icq_add.gif b/styles/templates/default/images/lang/no/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/no/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/icon_ip.gif b/styles/templates/default/images/lang/no/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/no/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/icon_mc.gif b/styles/templates/default/images/lang/no/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/no/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/icon_pm.gif b/styles/templates/default/images/lang/no/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/no/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/icon_poll.gif b/styles/templates/default/images/lang/no/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/no/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/icon_profile.gif b/styles/templates/default/images/lang/no/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/no/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/icon_quote.gif b/styles/templates/default/images/lang/no/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/no/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/icon_search.gif b/styles/templates/default/images/lang/no/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/no/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/icon_www.gif b/styles/templates/default/images/lang/no/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/no/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/msg_newpost.gif b/styles/templates/default/images/lang/no/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/no/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/post.gif b/styles/templates/default/images/lang/no/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/no/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/release.gif b/styles/templates/default/images/lang/no/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/no/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/reply-locked.gif b/styles/templates/default/images/lang/no/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/no/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/no/reply.gif b/styles/templates/default/images/lang/no/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/no/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/icon_code.gif b/styles/templates/default/images/lang/pl/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/pl/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/icon_edit.gif b/styles/templates/default/images/lang/pl/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/pl/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/icon_email.gif b/styles/templates/default/images/lang/pl/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/pl/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/icon_icq_add.gif b/styles/templates/default/images/lang/pl/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/pl/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/icon_ip.gif b/styles/templates/default/images/lang/pl/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/pl/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/icon_mc.gif b/styles/templates/default/images/lang/pl/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/pl/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/icon_pm.gif b/styles/templates/default/images/lang/pl/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/pl/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/icon_poll.gif b/styles/templates/default/images/lang/pl/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/pl/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/icon_profile.gif b/styles/templates/default/images/lang/pl/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/pl/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/icon_quote.gif b/styles/templates/default/images/lang/pl/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/pl/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/icon_search.gif b/styles/templates/default/images/lang/pl/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/pl/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/icon_www.gif b/styles/templates/default/images/lang/pl/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/pl/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/msg_newpost.gif b/styles/templates/default/images/lang/pl/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/pl/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/post.gif b/styles/templates/default/images/lang/pl/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/pl/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/release.gif b/styles/templates/default/images/lang/pl/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/pl/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/reply-locked.gif b/styles/templates/default/images/lang/pl/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/pl/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pl/reply.gif b/styles/templates/default/images/lang/pl/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/pl/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/icon_code.gif b/styles/templates/default/images/lang/pt/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/pt/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/icon_edit.gif b/styles/templates/default/images/lang/pt/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/pt/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/icon_email.gif b/styles/templates/default/images/lang/pt/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/pt/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/icon_icq_add.gif b/styles/templates/default/images/lang/pt/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/pt/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/icon_ip.gif b/styles/templates/default/images/lang/pt/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/pt/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/icon_mc.gif b/styles/templates/default/images/lang/pt/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/pt/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/icon_pm.gif b/styles/templates/default/images/lang/pt/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/pt/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/icon_poll.gif b/styles/templates/default/images/lang/pt/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/pt/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/icon_profile.gif b/styles/templates/default/images/lang/pt/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/pt/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/icon_quote.gif b/styles/templates/default/images/lang/pt/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/pt/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/icon_search.gif b/styles/templates/default/images/lang/pt/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/pt/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/icon_www.gif b/styles/templates/default/images/lang/pt/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/pt/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/msg_newpost.gif b/styles/templates/default/images/lang/pt/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/pt/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/post.gif b/styles/templates/default/images/lang/pt/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/pt/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/release.gif b/styles/templates/default/images/lang/pt/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/pt/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/reply-locked.gif b/styles/templates/default/images/lang/pt/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/pt/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/pt/reply.gif b/styles/templates/default/images/lang/pt/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/pt/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/icon_code.gif b/styles/templates/default/images/lang/ro/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/ro/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/icon_edit.gif b/styles/templates/default/images/lang/ro/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/ro/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/icon_email.gif b/styles/templates/default/images/lang/ro/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/ro/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/icon_icq_add.gif b/styles/templates/default/images/lang/ro/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/ro/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/icon_ip.gif b/styles/templates/default/images/lang/ro/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/ro/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/icon_mc.gif b/styles/templates/default/images/lang/ro/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/ro/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/icon_pm.gif b/styles/templates/default/images/lang/ro/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/ro/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/icon_poll.gif b/styles/templates/default/images/lang/ro/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/ro/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/icon_profile.gif b/styles/templates/default/images/lang/ro/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/ro/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/icon_quote.gif b/styles/templates/default/images/lang/ro/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/ro/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/icon_search.gif b/styles/templates/default/images/lang/ro/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/ro/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/icon_www.gif b/styles/templates/default/images/lang/ro/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/ro/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/msg_newpost.gif b/styles/templates/default/images/lang/ro/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/ro/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/post.gif b/styles/templates/default/images/lang/ro/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/ro/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/release.gif b/styles/templates/default/images/lang/ro/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/ro/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/reply-locked.gif b/styles/templates/default/images/lang/ro/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/ro/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ro/reply.gif b/styles/templates/default/images/lang/ro/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/ro/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/icon_code.gif b/styles/templates/default/images/lang/ru/icon_code.gif deleted file mode 100644 index b3d65a375..000000000 Binary files a/styles/templates/default/images/lang/ru/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/icon_edit.gif b/styles/templates/default/images/lang/ru/icon_edit.gif deleted file mode 100644 index fd52b6b27..000000000 Binary files a/styles/templates/default/images/lang/ru/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/icon_email.gif b/styles/templates/default/images/lang/ru/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/ru/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/icon_icq_add.gif b/styles/templates/default/images/lang/ru/icon_icq_add.gif deleted file mode 100644 index 4309f27b5..000000000 Binary files a/styles/templates/default/images/lang/ru/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/icon_ip.gif b/styles/templates/default/images/lang/ru/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/ru/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/icon_mc.gif b/styles/templates/default/images/lang/ru/icon_mc.gif deleted file mode 100644 index 91460ea53..000000000 Binary files a/styles/templates/default/images/lang/ru/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/icon_pm.gif b/styles/templates/default/images/lang/ru/icon_pm.gif deleted file mode 100644 index 390db0b74..000000000 Binary files a/styles/templates/default/images/lang/ru/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/icon_poll.gif b/styles/templates/default/images/lang/ru/icon_poll.gif deleted file mode 100644 index 30a6c5ed3..000000000 Binary files a/styles/templates/default/images/lang/ru/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/icon_profile.gif b/styles/templates/default/images/lang/ru/icon_profile.gif deleted file mode 100644 index 422304b4f..000000000 Binary files a/styles/templates/default/images/lang/ru/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/icon_quote.gif b/styles/templates/default/images/lang/ru/icon_quote.gif deleted file mode 100644 index 7997dd495..000000000 Binary files a/styles/templates/default/images/lang/ru/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/icon_search.gif b/styles/templates/default/images/lang/ru/icon_search.gif deleted file mode 100644 index 11e09d7a1..000000000 Binary files a/styles/templates/default/images/lang/ru/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/icon_www.gif b/styles/templates/default/images/lang/ru/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/ru/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/msg_newpost.gif b/styles/templates/default/images/lang/ru/msg_newpost.gif deleted file mode 100644 index f5d7bcb81..000000000 Binary files a/styles/templates/default/images/lang/ru/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/post.gif b/styles/templates/default/images/lang/ru/post.gif deleted file mode 100644 index e5e3349a0..000000000 Binary files a/styles/templates/default/images/lang/ru/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/release.gif b/styles/templates/default/images/lang/ru/release.gif deleted file mode 100644 index 8daa8f8cb..000000000 Binary files a/styles/templates/default/images/lang/ru/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/reply-locked.gif b/styles/templates/default/images/lang/ru/reply-locked.gif deleted file mode 100644 index 538693e91..000000000 Binary files a/styles/templates/default/images/lang/ru/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/ru/reply.gif b/styles/templates/default/images/lang/ru/reply.gif deleted file mode 100644 index 37914ed0d..000000000 Binary files a/styles/templates/default/images/lang/ru/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/icon_code.gif b/styles/templates/default/images/lang/sk/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/sk/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/icon_edit.gif b/styles/templates/default/images/lang/sk/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/sk/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/icon_email.gif b/styles/templates/default/images/lang/sk/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/sk/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/icon_icq_add.gif b/styles/templates/default/images/lang/sk/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/sk/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/icon_ip.gif b/styles/templates/default/images/lang/sk/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/sk/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/icon_mc.gif b/styles/templates/default/images/lang/sk/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/sk/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/icon_pm.gif b/styles/templates/default/images/lang/sk/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/sk/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/icon_poll.gif b/styles/templates/default/images/lang/sk/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/sk/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/icon_profile.gif b/styles/templates/default/images/lang/sk/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/sk/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/icon_quote.gif b/styles/templates/default/images/lang/sk/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/sk/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/icon_search.gif b/styles/templates/default/images/lang/sk/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/sk/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/icon_www.gif b/styles/templates/default/images/lang/sk/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/sk/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/msg_newpost.gif b/styles/templates/default/images/lang/sk/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/sk/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/post.gif b/styles/templates/default/images/lang/sk/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/sk/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/release.gif b/styles/templates/default/images/lang/sk/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/sk/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/reply-locked.gif b/styles/templates/default/images/lang/sk/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/sk/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sk/reply.gif b/styles/templates/default/images/lang/sk/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/sk/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/icon_code.gif b/styles/templates/default/images/lang/sl/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/sl/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/icon_edit.gif b/styles/templates/default/images/lang/sl/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/sl/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/icon_email.gif b/styles/templates/default/images/lang/sl/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/sl/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/icon_icq_add.gif b/styles/templates/default/images/lang/sl/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/sl/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/icon_ip.gif b/styles/templates/default/images/lang/sl/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/sl/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/icon_mc.gif b/styles/templates/default/images/lang/sl/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/sl/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/icon_pm.gif b/styles/templates/default/images/lang/sl/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/sl/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/icon_poll.gif b/styles/templates/default/images/lang/sl/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/sl/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/icon_profile.gif b/styles/templates/default/images/lang/sl/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/sl/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/icon_quote.gif b/styles/templates/default/images/lang/sl/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/sl/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/icon_search.gif b/styles/templates/default/images/lang/sl/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/sl/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/icon_www.gif b/styles/templates/default/images/lang/sl/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/sl/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/msg_newpost.gif b/styles/templates/default/images/lang/sl/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/sl/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/post.gif b/styles/templates/default/images/lang/sl/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/sl/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/release.gif b/styles/templates/default/images/lang/sl/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/sl/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/reply-locked.gif b/styles/templates/default/images/lang/sl/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/sl/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sl/reply.gif b/styles/templates/default/images/lang/sl/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/sl/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icon_code.gif b/styles/templates/default/images/lang/source/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/source/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icon_edit.gif b/styles/templates/default/images/lang/source/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/source/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icon_email.gif b/styles/templates/default/images/lang/source/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/source/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icon_icq_add.gif b/styles/templates/default/images/lang/source/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/source/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icon_ip.gif b/styles/templates/default/images/lang/source/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/source/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icon_mc.gif b/styles/templates/default/images/lang/source/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/source/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icon_pm.gif b/styles/templates/default/images/lang/source/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/source/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icon_poll.gif b/styles/templates/default/images/lang/source/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/source/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icon_profile.gif b/styles/templates/default/images/lang/source/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/source/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icon_quote.gif b/styles/templates/default/images/lang/source/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/source/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icon_search.gif b/styles/templates/default/images/lang/source/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/source/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icon_www.gif b/styles/templates/default/images/lang/source/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/source/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icons_sources/icon_large.gif b/styles/templates/default/images/lang/source/icons_sources/icon_large.gif deleted file mode 100644 index e3d072db6..000000000 Binary files a/styles/templates/default/images/lang/source/icons_sources/icon_large.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icons_sources/icon_medium.gif b/styles/templates/default/images/lang/source/icons_sources/icon_medium.gif deleted file mode 100644 index fed70f75e..000000000 Binary files a/styles/templates/default/images/lang/source/icons_sources/icon_medium.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/icons_sources/icon_small.gif b/styles/templates/default/images/lang/source/icons_sources/icon_small.gif deleted file mode 100644 index 85b723015..000000000 Binary files a/styles/templates/default/images/lang/source/icons_sources/icon_small.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/msg_newpost.gif b/styles/templates/default/images/lang/source/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/source/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/post.gif b/styles/templates/default/images/lang/source/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/source/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/release.gif b/styles/templates/default/images/lang/source/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/source/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/reply-locked.gif b/styles/templates/default/images/lang/source/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/source/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/source/reply.gif b/styles/templates/default/images/lang/source/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/source/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/icon_code.gif b/styles/templates/default/images/lang/sq/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/sq/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/icon_edit.gif b/styles/templates/default/images/lang/sq/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/sq/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/icon_email.gif b/styles/templates/default/images/lang/sq/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/sq/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/icon_icq_add.gif b/styles/templates/default/images/lang/sq/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/sq/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/icon_ip.gif b/styles/templates/default/images/lang/sq/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/sq/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/icon_mc.gif b/styles/templates/default/images/lang/sq/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/sq/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/icon_pm.gif b/styles/templates/default/images/lang/sq/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/sq/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/icon_poll.gif b/styles/templates/default/images/lang/sq/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/sq/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/icon_profile.gif b/styles/templates/default/images/lang/sq/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/sq/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/icon_quote.gif b/styles/templates/default/images/lang/sq/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/sq/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/icon_search.gif b/styles/templates/default/images/lang/sq/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/sq/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/icon_www.gif b/styles/templates/default/images/lang/sq/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/sq/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/msg_newpost.gif b/styles/templates/default/images/lang/sq/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/sq/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/post.gif b/styles/templates/default/images/lang/sq/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/sq/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/release.gif b/styles/templates/default/images/lang/sq/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/sq/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/reply-locked.gif b/styles/templates/default/images/lang/sq/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/sq/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sq/reply.gif b/styles/templates/default/images/lang/sq/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/sq/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/icon_code.gif b/styles/templates/default/images/lang/sr/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/sr/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/icon_edit.gif b/styles/templates/default/images/lang/sr/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/sr/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/icon_email.gif b/styles/templates/default/images/lang/sr/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/sr/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/icon_icq_add.gif b/styles/templates/default/images/lang/sr/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/sr/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/icon_ip.gif b/styles/templates/default/images/lang/sr/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/sr/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/icon_mc.gif b/styles/templates/default/images/lang/sr/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/sr/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/icon_pm.gif b/styles/templates/default/images/lang/sr/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/sr/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/icon_poll.gif b/styles/templates/default/images/lang/sr/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/sr/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/icon_profile.gif b/styles/templates/default/images/lang/sr/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/sr/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/icon_quote.gif b/styles/templates/default/images/lang/sr/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/sr/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/icon_search.gif b/styles/templates/default/images/lang/sr/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/sr/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/icon_www.gif b/styles/templates/default/images/lang/sr/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/sr/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/msg_newpost.gif b/styles/templates/default/images/lang/sr/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/sr/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/post.gif b/styles/templates/default/images/lang/sr/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/sr/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/release.gif b/styles/templates/default/images/lang/sr/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/sr/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/reply-locked.gif b/styles/templates/default/images/lang/sr/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/sr/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sr/reply.gif b/styles/templates/default/images/lang/sr/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/sr/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/icon_code.gif b/styles/templates/default/images/lang/sv/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/sv/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/icon_edit.gif b/styles/templates/default/images/lang/sv/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/sv/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/icon_email.gif b/styles/templates/default/images/lang/sv/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/sv/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/icon_icq_add.gif b/styles/templates/default/images/lang/sv/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/sv/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/icon_ip.gif b/styles/templates/default/images/lang/sv/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/sv/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/icon_mc.gif b/styles/templates/default/images/lang/sv/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/sv/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/icon_pm.gif b/styles/templates/default/images/lang/sv/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/sv/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/icon_poll.gif b/styles/templates/default/images/lang/sv/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/sv/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/icon_profile.gif b/styles/templates/default/images/lang/sv/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/sv/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/icon_quote.gif b/styles/templates/default/images/lang/sv/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/sv/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/icon_search.gif b/styles/templates/default/images/lang/sv/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/sv/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/icon_www.gif b/styles/templates/default/images/lang/sv/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/sv/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/msg_newpost.gif b/styles/templates/default/images/lang/sv/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/sv/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/post.gif b/styles/templates/default/images/lang/sv/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/sv/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/release.gif b/styles/templates/default/images/lang/sv/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/sv/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/reply-locked.gif b/styles/templates/default/images/lang/sv/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/sv/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/sv/reply.gif b/styles/templates/default/images/lang/sv/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/sv/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/icon_code.gif b/styles/templates/default/images/lang/tg/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/tg/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/icon_edit.gif b/styles/templates/default/images/lang/tg/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/tg/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/icon_email.gif b/styles/templates/default/images/lang/tg/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/tg/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/icon_icq_add.gif b/styles/templates/default/images/lang/tg/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/tg/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/icon_ip.gif b/styles/templates/default/images/lang/tg/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/tg/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/icon_mc.gif b/styles/templates/default/images/lang/tg/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/tg/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/icon_pm.gif b/styles/templates/default/images/lang/tg/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/tg/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/icon_poll.gif b/styles/templates/default/images/lang/tg/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/tg/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/icon_profile.gif b/styles/templates/default/images/lang/tg/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/tg/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/icon_quote.gif b/styles/templates/default/images/lang/tg/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/tg/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/icon_search.gif b/styles/templates/default/images/lang/tg/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/tg/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/icon_www.gif b/styles/templates/default/images/lang/tg/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/tg/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/msg_newpost.gif b/styles/templates/default/images/lang/tg/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/tg/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/post.gif b/styles/templates/default/images/lang/tg/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/tg/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/release.gif b/styles/templates/default/images/lang/tg/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/tg/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/reply-locked.gif b/styles/templates/default/images/lang/tg/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/tg/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tg/reply.gif b/styles/templates/default/images/lang/tg/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/tg/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/icon_code.gif b/styles/templates/default/images/lang/th/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/th/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/icon_edit.gif b/styles/templates/default/images/lang/th/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/th/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/icon_email.gif b/styles/templates/default/images/lang/th/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/th/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/icon_icq_add.gif b/styles/templates/default/images/lang/th/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/th/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/icon_ip.gif b/styles/templates/default/images/lang/th/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/th/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/icon_mc.gif b/styles/templates/default/images/lang/th/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/th/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/icon_pm.gif b/styles/templates/default/images/lang/th/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/th/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/icon_poll.gif b/styles/templates/default/images/lang/th/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/th/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/icon_profile.gif b/styles/templates/default/images/lang/th/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/th/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/icon_quote.gif b/styles/templates/default/images/lang/th/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/th/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/icon_search.gif b/styles/templates/default/images/lang/th/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/th/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/icon_www.gif b/styles/templates/default/images/lang/th/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/th/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/msg_newpost.gif b/styles/templates/default/images/lang/th/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/th/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/post.gif b/styles/templates/default/images/lang/th/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/th/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/release.gif b/styles/templates/default/images/lang/th/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/th/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/reply-locked.gif b/styles/templates/default/images/lang/th/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/th/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/th/reply.gif b/styles/templates/default/images/lang/th/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/th/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/icon_code.gif b/styles/templates/default/images/lang/tr/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/tr/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/icon_edit.gif b/styles/templates/default/images/lang/tr/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/tr/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/icon_email.gif b/styles/templates/default/images/lang/tr/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/tr/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/icon_icq_add.gif b/styles/templates/default/images/lang/tr/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/tr/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/icon_ip.gif b/styles/templates/default/images/lang/tr/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/tr/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/icon_mc.gif b/styles/templates/default/images/lang/tr/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/tr/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/icon_pm.gif b/styles/templates/default/images/lang/tr/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/tr/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/icon_poll.gif b/styles/templates/default/images/lang/tr/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/tr/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/icon_profile.gif b/styles/templates/default/images/lang/tr/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/tr/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/icon_quote.gif b/styles/templates/default/images/lang/tr/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/tr/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/icon_search.gif b/styles/templates/default/images/lang/tr/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/tr/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/icon_www.gif b/styles/templates/default/images/lang/tr/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/tr/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/msg_newpost.gif b/styles/templates/default/images/lang/tr/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/tr/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/post.gif b/styles/templates/default/images/lang/tr/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/tr/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/release.gif b/styles/templates/default/images/lang/tr/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/tr/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/reply-locked.gif b/styles/templates/default/images/lang/tr/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/tr/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/tr/reply.gif b/styles/templates/default/images/lang/tr/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/tr/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/icon_code.gif b/styles/templates/default/images/lang/uk/icon_code.gif deleted file mode 100644 index b3d65a375..000000000 Binary files a/styles/templates/default/images/lang/uk/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/icon_edit.gif b/styles/templates/default/images/lang/uk/icon_edit.gif deleted file mode 100644 index 2f1f508ce..000000000 Binary files a/styles/templates/default/images/lang/uk/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/icon_email.gif b/styles/templates/default/images/lang/uk/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/uk/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/icon_icq_add.gif b/styles/templates/default/images/lang/uk/icon_icq_add.gif deleted file mode 100644 index 4309f27b5..000000000 Binary files a/styles/templates/default/images/lang/uk/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/icon_ip.gif b/styles/templates/default/images/lang/uk/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/uk/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/icon_mc.gif b/styles/templates/default/images/lang/uk/icon_mc.gif deleted file mode 100644 index 91460ea53..000000000 Binary files a/styles/templates/default/images/lang/uk/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/icon_pm.gif b/styles/templates/default/images/lang/uk/icon_pm.gif deleted file mode 100644 index ff4a918d5..000000000 Binary files a/styles/templates/default/images/lang/uk/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/icon_poll.gif b/styles/templates/default/images/lang/uk/icon_poll.gif deleted file mode 100644 index 05c38021e..000000000 Binary files a/styles/templates/default/images/lang/uk/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/icon_profile.gif b/styles/templates/default/images/lang/uk/icon_profile.gif deleted file mode 100644 index 8e0986c9c..000000000 Binary files a/styles/templates/default/images/lang/uk/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/icon_quote.gif b/styles/templates/default/images/lang/uk/icon_quote.gif deleted file mode 100644 index 33cea78f6..000000000 Binary files a/styles/templates/default/images/lang/uk/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/icon_search.gif b/styles/templates/default/images/lang/uk/icon_search.gif deleted file mode 100644 index 36e607362..000000000 Binary files a/styles/templates/default/images/lang/uk/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/icon_www.gif b/styles/templates/default/images/lang/uk/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/uk/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/msg_newpost.gif b/styles/templates/default/images/lang/uk/msg_newpost.gif deleted file mode 100644 index ed5d027f4..000000000 Binary files a/styles/templates/default/images/lang/uk/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/post.gif b/styles/templates/default/images/lang/uk/post.gif deleted file mode 100644 index 64b754718..000000000 Binary files a/styles/templates/default/images/lang/uk/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/release.gif b/styles/templates/default/images/lang/uk/release.gif deleted file mode 100644 index e33191dbf..000000000 Binary files a/styles/templates/default/images/lang/uk/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/reply-locked.gif b/styles/templates/default/images/lang/uk/reply-locked.gif deleted file mode 100644 index 67aaa9372..000000000 Binary files a/styles/templates/default/images/lang/uk/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uk/reply.gif b/styles/templates/default/images/lang/uk/reply.gif deleted file mode 100644 index 4becf4d1c..000000000 Binary files a/styles/templates/default/images/lang/uk/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/icon_code.gif b/styles/templates/default/images/lang/uz/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/uz/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/icon_edit.gif b/styles/templates/default/images/lang/uz/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/uz/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/icon_email.gif b/styles/templates/default/images/lang/uz/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/uz/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/icon_icq_add.gif b/styles/templates/default/images/lang/uz/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/uz/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/icon_ip.gif b/styles/templates/default/images/lang/uz/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/uz/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/icon_mc.gif b/styles/templates/default/images/lang/uz/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/uz/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/icon_pm.gif b/styles/templates/default/images/lang/uz/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/uz/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/icon_poll.gif b/styles/templates/default/images/lang/uz/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/uz/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/icon_profile.gif b/styles/templates/default/images/lang/uz/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/uz/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/icon_quote.gif b/styles/templates/default/images/lang/uz/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/uz/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/icon_search.gif b/styles/templates/default/images/lang/uz/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/uz/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/icon_www.gif b/styles/templates/default/images/lang/uz/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/uz/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/msg_newpost.gif b/styles/templates/default/images/lang/uz/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/uz/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/post.gif b/styles/templates/default/images/lang/uz/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/uz/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/release.gif b/styles/templates/default/images/lang/uz/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/uz/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/reply-locked.gif b/styles/templates/default/images/lang/uz/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/uz/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/uz/reply.gif b/styles/templates/default/images/lang/uz/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/uz/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/icon_code.gif b/styles/templates/default/images/lang/vi/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/vi/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/icon_edit.gif b/styles/templates/default/images/lang/vi/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/vi/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/icon_email.gif b/styles/templates/default/images/lang/vi/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/vi/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/icon_icq_add.gif b/styles/templates/default/images/lang/vi/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/vi/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/icon_ip.gif b/styles/templates/default/images/lang/vi/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/vi/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/icon_mc.gif b/styles/templates/default/images/lang/vi/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/vi/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/icon_pm.gif b/styles/templates/default/images/lang/vi/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/vi/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/icon_poll.gif b/styles/templates/default/images/lang/vi/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/vi/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/icon_profile.gif b/styles/templates/default/images/lang/vi/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/vi/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/icon_quote.gif b/styles/templates/default/images/lang/vi/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/vi/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/icon_search.gif b/styles/templates/default/images/lang/vi/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/vi/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/icon_www.gif b/styles/templates/default/images/lang/vi/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/vi/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/msg_newpost.gif b/styles/templates/default/images/lang/vi/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/vi/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/post.gif b/styles/templates/default/images/lang/vi/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/vi/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/release.gif b/styles/templates/default/images/lang/vi/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/vi/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/reply-locked.gif b/styles/templates/default/images/lang/vi/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/vi/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/vi/reply.gif b/styles/templates/default/images/lang/vi/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/vi/reply.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/icon_code.gif b/styles/templates/default/images/lang/zh/icon_code.gif deleted file mode 100644 index 5afd6e2c7..000000000 Binary files a/styles/templates/default/images/lang/zh/icon_code.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/icon_edit.gif b/styles/templates/default/images/lang/zh/icon_edit.gif deleted file mode 100644 index 65937c5fc..000000000 Binary files a/styles/templates/default/images/lang/zh/icon_edit.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/icon_email.gif b/styles/templates/default/images/lang/zh/icon_email.gif deleted file mode 100644 index 67137b802..000000000 Binary files a/styles/templates/default/images/lang/zh/icon_email.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/icon_icq_add.gif b/styles/templates/default/images/lang/zh/icon_icq_add.gif deleted file mode 100644 index c0c5cd552..000000000 Binary files a/styles/templates/default/images/lang/zh/icon_icq_add.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/icon_ip.gif b/styles/templates/default/images/lang/zh/icon_ip.gif deleted file mode 100644 index 5822a929a..000000000 Binary files a/styles/templates/default/images/lang/zh/icon_ip.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/icon_mc.gif b/styles/templates/default/images/lang/zh/icon_mc.gif deleted file mode 100644 index 1db8e37f5..000000000 Binary files a/styles/templates/default/images/lang/zh/icon_mc.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/icon_pm.gif b/styles/templates/default/images/lang/zh/icon_pm.gif deleted file mode 100644 index 432075c59..000000000 Binary files a/styles/templates/default/images/lang/zh/icon_pm.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/icon_poll.gif b/styles/templates/default/images/lang/zh/icon_poll.gif deleted file mode 100644 index 73a29852d..000000000 Binary files a/styles/templates/default/images/lang/zh/icon_poll.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/icon_profile.gif b/styles/templates/default/images/lang/zh/icon_profile.gif deleted file mode 100644 index abac5dd87..000000000 Binary files a/styles/templates/default/images/lang/zh/icon_profile.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/icon_quote.gif b/styles/templates/default/images/lang/zh/icon_quote.gif deleted file mode 100644 index 9497b2c57..000000000 Binary files a/styles/templates/default/images/lang/zh/icon_quote.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/icon_search.gif b/styles/templates/default/images/lang/zh/icon_search.gif deleted file mode 100644 index 5d9c01713..000000000 Binary files a/styles/templates/default/images/lang/zh/icon_search.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/icon_www.gif b/styles/templates/default/images/lang/zh/icon_www.gif deleted file mode 100644 index 3da9e0e8c..000000000 Binary files a/styles/templates/default/images/lang/zh/icon_www.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/msg_newpost.gif b/styles/templates/default/images/lang/zh/msg_newpost.gif deleted file mode 100644 index 33a1e1c72..000000000 Binary files a/styles/templates/default/images/lang/zh/msg_newpost.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/post.gif b/styles/templates/default/images/lang/zh/post.gif deleted file mode 100644 index 9d53572cd..000000000 Binary files a/styles/templates/default/images/lang/zh/post.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/release.gif b/styles/templates/default/images/lang/zh/release.gif deleted file mode 100644 index 25440636e..000000000 Binary files a/styles/templates/default/images/lang/zh/release.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/reply-locked.gif b/styles/templates/default/images/lang/zh/reply-locked.gif deleted file mode 100644 index edfd75a87..000000000 Binary files a/styles/templates/default/images/lang/zh/reply-locked.gif and /dev/null differ diff --git a/styles/templates/default/images/lang/zh/reply.gif b/styles/templates/default/images/lang/zh/reply.gif deleted file mode 100644 index f18c08923..000000000 Binary files a/styles/templates/default/images/lang/zh/reply.gif and /dev/null differ diff --git a/tests/Feature/ContainerIntegrationTest.php b/tests/Feature/ContainerIntegrationTest.php deleted file mode 100644 index d972ee3ef..000000000 --- a/tests/Feature/ContainerIntegrationTest.php +++ /dev/null @@ -1,193 +0,0 @@ -createTestRootDirectory(); - $this->createTestConfigFiles($rootPath, [ - 'services' => [ - 'integration.test' => 'integration_value', - ], - ]); - - $container = Bootstrap::init($rootPath); - - expect($container)->toBeInstanceOf(Container::class); - expect($container->get('integration.test'))->toBe('integration_value'); - - removeTempDirectory($rootPath); - }); - - it('integrates with global helper functions', function () { - $rootPath = $this->createTestRootDirectory(); - $this->createTestConfigFiles($rootPath, [ - 'services' => [ - 'helper.test' => 'helper_value', - ], - ]); - - Bootstrap::init($rootPath); - - // Test container() helper - expect(container())->toBeInstanceOf(Container::class); - - // Test app() helper without parameter - expect(app())->toBeInstanceOf(Container::class); - - // Test app() helper with service ID - expect(app('helper.test'))->toBe('helper_value'); - - removeTempDirectory($rootPath); - }); - - it('handles missing services gracefully in helpers', function () { - $rootPath = $this->createTestRootDirectory(); - Bootstrap::init($rootPath); - - // Should throw RuntimeException for missing service - expect(fn() => app('missing.service')) - ->toThrow(RuntimeException::class) - ->toThrow('not found in container'); - - removeTempDirectory($rootPath); - }); - - it('supports autowiring for simple classes', function () { - $rootPath = $this->createTestRootDirectory(); - $container = Bootstrap::init($rootPath); - - // Should be able to autowire stdClass - expect($container->has(stdClass::class))->toBeTrue(); - expect($container->get(stdClass::class))->toBeInstanceOf(stdClass::class); - - removeTempDirectory($rootPath); - }); - - it('loads all architectural layer definitions', function () { - $rootPath = $this->createTestRootDirectory(); - $container = Bootstrap::init($rootPath); - - // Container should be created successfully with all layer definitions loaded - // Even though most definitions are commented out, the loading should work - expect($container)->toBeInstanceOf(Container::class); - - // Container should have itself registered - expect($container->get(Container::class))->toBe($container); - expect($container->get('container'))->toBe($container); - - removeTempDirectory($rootPath); - }); - - it('supports environment-based configuration', function () { - $rootPath = $this->createTestRootDirectory(); - $this->createTestConfigFiles($rootPath, [ - 'container' => [ - 'environment' => 'production', - 'compilation_dir' => $rootPath . '/internal_data/cache/container', - 'proxies_dir' => $rootPath . '/internal_data/cache/proxies', - ], - ]); - - $container = Bootstrap::init($rootPath); - - expect($container)->toBeInstanceOf(Container::class); - - removeTempDirectory($rootPath); - }); - - it('supports service provider registration', function () { - $testProviderClass = new class implements \TorrentPier\Infrastructure\DependencyInjection\ServiceProvider { - public static bool $wasRegistered = false; - public static bool $wasBooted = false; - - public function register(\TorrentPier\Infrastructure\DependencyInjection\Container $container): void - { - self::$wasRegistered = true; - $container->getWrappedContainer()->set('provider.test', 'provider_registered'); - } - - public function boot(\TorrentPier\Infrastructure\DependencyInjection\Container $container): void - { - self::$wasBooted = true; - } - }; - - $rootPath = $this->createTestRootDirectory(); - $this->createTestConfigFiles($rootPath, [ - 'container' => [ - 'providers' => [get_class($testProviderClass)], - ], - ]); - - $container = Bootstrap::init($rootPath); - - expect($testProviderClass::$wasRegistered)->toBeTrue(); - expect($testProviderClass::$wasBooted)->toBeTrue(); - expect($container->get('provider.test'))->toBe('provider_registered'); - - removeTempDirectory($rootPath); - }); - - it('handles configuration file loading priority', function () { - $rootPath = $this->createTestRootDirectory(); - $this->createTestConfigFiles($rootPath, [ - 'services' => [ - 'priority.test' => \DI\factory(function () { - return 'from_services_file'; - }), - ], - ]); - - // Initialize with runtime config that should override file config - $container = Bootstrap::init($rootPath, [ - 'definitions' => [ - 'priority.test' => \DI\factory(function () { - return 'from_runtime_config'; - }), - 'runtime.only' => \DI\factory(function () { - return 'runtime_value'; - }), - ], - ]); - - // Runtime config should override file config - expect($container->get('priority.test'))->toBe('from_runtime_config'); - expect($container->get('runtime.only'))->toBe('runtime_value'); - - removeTempDirectory($rootPath); - }); - - it('provides meaningful error messages', function () { - $rootPath = $this->createTestRootDirectory(); - Bootstrap::init($rootPath); - - try { - app('definitely.missing.service'); - fail('Expected exception to be thrown'); - } catch (RuntimeException $e) { - expect($e->getMessage())->toContain('definitely.missing.service'); - expect($e->getMessage())->toContain('not found in container'); - } - - removeTempDirectory($rootPath); - }); - - it('supports performance measurement', function () { - $rootPath = $this->createTestRootDirectory(); - - $time = measureExecutionTime(function () use ($rootPath) { - Bootstrap::init($rootPath); - }); - - // Container initialization should be reasonably fast - expect($time)->toBeLessThan(1.0); // Should take less than 1 second - - removeTempDirectory($rootPath); - }); -}); diff --git a/tests/README.md b/tests/README.md index 1ec09dc6b..b8d8d126a 100644 --- a/tests/README.md +++ b/tests/README.md @@ -1,76 +1,83 @@ # ๐Ÿงช TorrentPier 3.0 Testing Infrastructure -This document outlines the testing infrastructure for TorrentPier 3.0, built using **Pest PHP** and following the hexagonal architecture principles outlined in the project specification. +This document outlines the testing infrastructure for TorrentPier 3.0, built using **Pest PHP** and following Laravel-style MVC patterns. ## ๐Ÿ“– Table of Contents - [Overview](#overview) -- [Hexagonal Architecture Testing](#hexagonal-architecture-testing) +- [Laravel-style Testing](#laravel-style-testing) - [Test Organization](#test-organization) -- [DI Container Testing](#di-container-testing) +- [Container Testing](#container-testing) - [Testing Patterns](#testing-patterns) - [Test Execution](#test-execution) - [Best Practices](#best-practices) ## ๐ŸŽฏ Overview -TorrentPier 3.0's testing suite is designed following the hexagonal architecture testing strategy: +TorrentPier 3.0's testing suite is designed following Laravel-style testing patterns: -- **Domain**: Pure unit tests, no mocks needed -- **Application**: Unit tests with mocked repositories -- **Infrastructure**: Integration tests with real services -- **Presentation**: E2E tests for user journeys +- **Unit Tests**: Test individual classes and methods in isolation +- **Feature Tests**: Test HTTP endpoints and user workflows +- **Integration Tests**: Test database operations and external services ### Core Testing Principles -1. **Architecture-Driven**: Tests follow the hexagonal architecture layers -2. **Phase-Aligned**: Testing matches the 5-phase implementation strategy +1. **Laravel-style**: Tests follow familiar Laravel testing patterns +2. **Simple & Clear**: Straightforward test organization and execution 3. **Clean Slate**: No legacy dependencies, modern PHP 8.3+ testing -4. **Infrastructure First**: Focus on foundational DI container testing -5. **Future-Ready**: Structure prepared for upcoming domain/application layers +4. **Container-Driven**: Use Illuminate Container for dependency injection +5. **MVC-Focused**: Test controllers, models, and services separately -## ๐Ÿ—๏ธ Hexagonal Architecture Testing +## ๐Ÿ—๏ธ Laravel-style Testing -### Testing Strategy by Layer +### Testing Strategy by Component -#### Domain Layer Testing (Phase 2 - Future) +#### Model Testing (Unit Tests) ```php -// Pure unit tests, no framework dependencies -it('validates business rules without external dependencies', function () { - $user = new User(new UserId(1), new Email('test@example.com')); - expect($user->canPost())->toBeTrue(); -}); -``` - -#### Application Layer Testing (Phase 3 - Future) -```php -// Unit tests with mocked repositories -it('handles user registration command', function () { - $mockRepo = Mockery::mock(UserRepositoryInterface::class); - $handler = new RegisterUserHandler($mockRepo); +// Test model behavior and business logic +it('calculates user ratio correctly', function () { + $user = new \App\Models\User(); + $user->uploaded = 1000000; + $user->downloaded = 500000; - $command = new RegisterUserCommand('john', 'john@example.com'); - $handler->handle($command); + expect($user->getRatio())->toBe(2.0); +}); +``` + +#### Service Testing (Unit Tests) +```php +// Test service layer with mocked dependencies +it('registers user through service', function () { + $userService = new \App\Services\UserService(); - $mockRepo->shouldHaveReceived('save'); + $result = $userService->register('john', 'john@example.com'); + + expect($result)->toBeInstanceOf(\App\Models\User::class); }); ``` -#### Infrastructure Layer Testing (Phase 1 - Current) +#### Controller Testing (Feature Tests) ```php -// Integration tests with real services -it('creates container with real PHP-DI integration', function () { - $container = ContainerFactory::create(); - expect($container)->toBeInstanceOf(Container::class); +// Test HTTP endpoints and responses +it('handles user registration via API', function () { + $response = $this->postJson('/api/users/register', [ + 'username' => 'john', + 'email' => 'john@example.com', + ]); + + $response->assertStatus(201); + $response->assertJson(['username' => 'john']); }); ``` -#### Presentation Layer Testing (Phase 5 - Future) +#### Container Testing (Integration Tests) ```php -// E2E tests for user journeys -it('handles API request end-to-end', function () { - $response = $this->post('/api/users', ['name' => 'John']); - expect($response->status())->toBe(201); +// Test dependency injection and service resolution +it('resolves services from container', function () { + $container = app(); + + expect($container->bound(\App\Services\UserService::class))->toBeTrue(); + expect($container->make(\App\Services\UserService::class))->toBeInstanceOf(\App\Services\UserService::class); }); ``` @@ -82,97 +89,69 @@ it('handles API request end-to-end', function () { tests/ โ”œโ”€โ”€ README.md # This documentation โ”œโ”€โ”€ Pest.php # Clean Pest configuration -โ”œโ”€โ”€ TestCase.php # Enhanced base test case with DI utilities -โ”œโ”€โ”€ Unit/Infrastructure/DependencyInjection/ # DI Container tests (Phase 1) -โ”‚ โ”œโ”€โ”€ ContainerTest.php # Container wrapper tests -โ”‚ โ”œโ”€โ”€ ContainerFactoryTest.php # Factory functionality tests -โ”‚ โ”œโ”€โ”€ BootstrapTest.php # Application bootstrapping tests -โ”‚ โ”œโ”€โ”€ ServiceProviderTest.php # Service provider interface tests -โ”‚ โ””โ”€โ”€ Definitions/ # Layer-specific definition tests -โ”‚ โ”œโ”€โ”€ DomainDefinitionsTest.php -โ”‚ โ”œโ”€โ”€ ApplicationDefinitionsTest.php -โ”‚ โ”œโ”€โ”€ InfrastructureDefinitionsTest.php -โ”‚ โ””โ”€โ”€ PresentationDefinitionsTest.php -โ””โ”€โ”€ Feature/ # Integration tests - โ””โ”€โ”€ ContainerIntegrationTest.php # End-to-end container tests +โ”œโ”€โ”€ TestCase.php # Base test case with container utilities +โ”œโ”€โ”€ Unit/ # Unit tests +โ”‚ โ”œโ”€โ”€ Models/ # Model tests +โ”‚ โ”‚ โ”œโ”€โ”€ UserTest.php +โ”‚ โ”‚ โ”œโ”€โ”€ TorrentTest.php +โ”‚ โ”‚ โ””โ”€โ”€ ForumTest.php +โ”‚ โ”œโ”€โ”€ Services/ # Service tests +โ”‚ โ”‚ โ”œโ”€โ”€ UserServiceTest.php +โ”‚ โ”‚ โ”œโ”€โ”€ TorrentServiceTest.php +โ”‚ โ”‚ โ””โ”€โ”€ AuthServiceTest.php +โ”‚ โ”œโ”€โ”€ Container/ # Container and DI tests +โ”‚ โ”‚ โ”œโ”€โ”€ ContainerTest.php +โ”‚ โ”‚ โ””โ”€โ”€ ServiceProviderTest.php +โ”‚ โ””โ”€โ”€ Support/ # Helper and utility tests +โ”‚ โ”œโ”€โ”€ HelperTest.php +โ”‚ โ””โ”€โ”€ FactoryTest.php +โ””โ”€โ”€ Feature/ # Feature/integration tests + โ”œโ”€โ”€ Http/ # HTTP endpoint tests + โ”‚ โ”œโ”€โ”€ Web/ + โ”‚ โ”‚ โ”œโ”€โ”€ HomeTest.php + โ”‚ โ”‚ โ””โ”€โ”€ AuthTest.php + โ”‚ โ””โ”€โ”€ Api/ + โ”‚ โ”œโ”€โ”€ UserApiTest.php + โ”‚ โ””โ”€โ”€ TorrentApiTest.php + โ”œโ”€โ”€ Database/ # Database integration tests + โ”‚ โ”œโ”€โ”€ MigrationTest.php + โ”‚ โ””โ”€โ”€ SeedingTest.php + โ””โ”€โ”€ Cache/ # Cache integration tests + โ””โ”€โ”€ CacheTest.php ``` -### Future Structure (As Phases Are Implemented) +## ๐Ÿ› ๏ธ Container Testing -``` -tests/ -โ”œโ”€โ”€ Unit/ -โ”‚ โ”œโ”€โ”€ Domain/ # Phase 2: Pure business logic tests -โ”‚ โ”‚ โ”œโ”€โ”€ User/ -โ”‚ โ”‚ โ”œโ”€โ”€ Forum/ -โ”‚ โ”‚ โ””โ”€โ”€ Tracker/ -โ”‚ โ”œโ”€โ”€ Application/ # Phase 3: Use case orchestration tests -โ”‚ โ”‚ โ”œโ”€โ”€ User/ -โ”‚ โ”‚ โ”œโ”€โ”€ Forum/ -โ”‚ โ”‚ โ””โ”€โ”€ Tracker/ -โ”‚ โ”œโ”€โ”€ Infrastructure/ # Phase 4: External service integration tests -โ”‚ โ”‚ โ”œโ”€โ”€ Persistence/ -โ”‚ โ”‚ โ”œโ”€โ”€ Cache/ -โ”‚ โ”‚ โ””โ”€โ”€ Email/ -โ”‚ โ””โ”€โ”€ Presentation/ # Phase 5: Interface layer tests -โ”‚ โ”œโ”€โ”€ Http/ -โ”‚ โ””โ”€โ”€ Cli/ -โ””โ”€โ”€ Feature/ # Cross-layer integration tests -``` +### Current Implementation -## ๐Ÿ› ๏ธ DI Container Testing +The Illuminate Container is the foundation of TorrentPier 3.0's dependency injection. Our tests ensure: -### Current Implementation (Phase 1) - -The DI container is the foundation of TorrentPier 3.0's architecture. Our tests ensure: - -#### Container Wrapper Testing +#### Container Resolution Testing ```php -// tests/Unit/Infrastructure/DependencyInjection/ContainerTest.php -it('implements PSR-11 ContainerInterface', function () { - expect($this->container)->toBeInstanceOf(\Psr\Container\ContainerInterface::class); +// tests/Unit/Container/ContainerTest.php +it('resolves services from container', function () { + $container = app(); + expect($container)->toBeInstanceOf(\Illuminate\Container\Container::class); }); -it('can resolve autowired classes', function () { - $result = $this->container->get(stdClass::class); - expect($result)->toBeInstanceOf(stdClass::class); -}); - -it('throws NotFoundExceptionInterface for non-existent services', function () { - expect(fn() => $this->container->get('non.existent.service')) - ->toThrow(NotFoundExceptionInterface::class); -}); -``` - -#### Factory Configuration Testing -```php -// tests/Unit/Infrastructure/DependencyInjection/ContainerFactoryTest.php -it('applies configuration correctly', function () { - $config = [ - 'environment' => 'testing', - 'autowiring' => true, - 'definitions' => [ - 'test.service' => \DI\factory(fn() => 'test_value'), - ], - ]; - - $container = ContainerFactory::create($config); - expect($container->get('test.service'))->toBe('test_value'); -}); -``` - -#### Bootstrap Integration Testing -```php -// tests/Unit/Infrastructure/DependencyInjection/BootstrapTest.php -it('loads configuration from multiple sources', function () { - $rootPath = $this->createTestRootDirectory(); - $this->createTestConfigFiles($rootPath, [ - 'env' => ['APP_ENV' => 'testing'], - 'services' => ['config.service' => \DI\factory(fn() => 'merged_config')], +it('can bind and resolve services', function () { + $container = $this->createTestContainer([ + 'test.service' => fn() => 'test_value' ]); - $container = Bootstrap::init($rootPath); - expect($container->get('config.service'))->toBe('merged_config'); + expect($container->make('test.service'))->toBe('test_value'); +}); +``` + +#### Service Provider Testing +```php +// tests/Unit/Container/ServiceProviderTest.php +it('registers services through providers', function () { + $provider = new \App\Providers\AppServiceProvider(app()); + $provider->register(); + + // Assert services are registered + expect(app()->bound('some.service'))->toBeTrue(); }); ``` @@ -183,83 +162,61 @@ it('loads configuration from multiple sources', function () { // tests/TestCase.php abstract class TestCase extends BaseTestCase { - protected function createTestContainer(array $config = []): Container + protected function createTestContainer(array $bindings = []): Container { - $defaultConfig = [ - 'environment' => 'testing', - 'autowiring' => true, - 'definitions' => [], - ]; + $container = new Container(); - return ContainerFactory::create(array_merge($defaultConfig, $config)); + foreach ($bindings as $abstract => $concrete) { + $container->bind($abstract, $concrete); + } + + return $container; } - protected function assertCanResolve(Container $container, string $serviceId): void + protected function app(?string $abstract = null): mixed { - $this->assertTrue($container->has($serviceId)); - $this->assertNotNull($container->get($serviceId)); + if (is_null($abstract)) { + return Container::getInstance(); + } + + return Container::getInstance()->make($abstract); } } ``` ## ๐ŸŽจ Testing Patterns -### 1. Infrastructure Integration Testing +### 1. Unit Testing ```php -// Real service integration (current phase) -it('integrates with real PHP-DI container', function () { - $container = $this->createTestContainer([ - 'definitions' => [ - 'real.service' => \DI\autowire(stdClass::class), - ], - ]); +// Test individual components +it('validates user email', function () { + $user = new \App\Models\User(); + $user->email = 'invalid-email'; - $service = $container->get('real.service'); - expect($service)->toBeInstanceOf(stdClass::class); + expect($user->isValidEmail())->toBeFalse(); }); ``` -### 2. Configuration-Driven Testing +### 2. Feature Testing ```php -// Environment-based configuration -it('adapts to different environments', function () { - $prodContainer = $this->createTestContainer(['environment' => 'production']); - $devContainer = $this->createTestContainer(['environment' => 'development']); +// Test HTTP endpoints +it('returns user profile data', function () { + $response = $this->get('/api/users/1'); - expect($prodContainer)->toBeInstanceOf(Container::class); - expect($devContainer)->toBeInstanceOf(Container::class); + $response->assertStatus(200); + $response->assertJsonStructure(['id', 'username', 'email']); }); ``` -### 3. Service Provider Testing +### 3. Integration Testing ```php -// Modular service registration -it('registers services through providers', function () { - $provider = new class implements ServiceProvider { - public function register(Container $container): void { - $container->getWrappedContainer()->set('provider.service', 'registered'); - } - public function boot(Container $container): void {} - }; +// Test service interactions +it('creates user with dependencies', function () { + $userService = app(\App\Services\UserService::class); + $user = $userService->create(['username' => 'john', 'email' => 'john@example.com']); - $container = $this->createTestContainer(); - $provider->register($container); - - expect($container->get('provider.service'))->toBe('registered'); -}); -``` - -### 4. Layer Definition Testing -```php -// Architectural layer compliance -it('follows domain layer principles', function () { - $definitions = DomainDefinitions::getDefinitions(); - - // Domain definitions should be empty in Phase 1 - expect($definitions)->toBe([]); - - // Structure should be prepared for Phase 2 - expect($definitions)->toBeArray(); + expect($user)->toBeInstanceOf(\App\Models\User::class); + expect($user->username)->toBe('john'); }); ``` @@ -271,163 +228,94 @@ it('follows domain layer principles', function () { # Run all tests ./vendor/bin/pest -# Run DI container tests specifically -./vendor/bin/pest tests/Unit/Infrastructure/DependencyInjection/ +# Run unit tests only +./vendor/bin/pest tests/Unit/ -# Run integration tests +# Run feature tests only ./vendor/bin/pest tests/Feature/ # Run with coverage ./vendor/bin/pest --coverage # Run specific test file -./vendor/bin/pest tests/Unit/Infrastructure/DependencyInjection/ContainerTest.php +./vendor/bin/pest tests/Unit/Models/UserTest.php ``` ### Performance Testing ```bash -# Measure container bootstrap performance -./vendor/bin/pest --filter="performance" +# Test specific functionality +./vendor/bin/pest --filter="container" # Container creation should be fast -expectExecutionTimeUnder(fn() => Bootstrap::init($rootPath), 1.0); +expectExecutionTimeUnder(fn() => app(\App\Services\UserService::class), 0.1); ``` ## ๐Ÿ“‹ Best Practices -### 1. Phase-Aligned Testing +### 1. Clear Test Names ```php -// Current Phase 1: Test infrastructure only -it('provides foundation for future phases', function () { - $container = $this->createTestContainer(); - - // Infrastructure works now - expect($container)->toBeInstanceOf(Container::class); - - // Ready for future domain services - expect($container->has(stdClass::class))->toBeTrue(); +// Good: descriptive test names +it('calculates correct torrent ratio when user has downloads', function () { + // Test implementation +}); + +// Bad: vague test names +it('tests ratio', function () { + // Test implementation }); ``` -### 2. Architecture Compliance +### 2. Arrange-Act-Assert Pattern ```php -// Ensure clean architectural boundaries -it('keeps domain layer pure', function () { - $definitions = DomainDefinitions::getDefinitions(); +it('creates user with valid data', function () { + // Arrange + $userData = ['username' => 'john', 'email' => 'john@example.com']; + $userService = app(\App\Services\UserService::class); - // Domain should have no infrastructure dependencies - expect($definitions)->toBeArray(); + // Act + $user = $userService->create($userData); - // Future domain services will be dependency-free + // Assert + expect($user)->toBeInstanceOf(\App\Models\User::class); + expect($user->username)->toBe('john'); }); ``` -### 3. Configuration Testing +### 3. Use Container for Dependencies ```php -// Test multiple configuration sources -it('merges configuration correctly', function () { - $rootPath = $this->createTestRootDirectory(); - $this->createTestConfigFiles($rootPath, [ - 'container' => ['autowiring' => true], - 'services' => ['test.service' => \DI\factory(fn() => 'test')], - ]); - - $container = Bootstrap::init($rootPath, [ - 'definitions' => ['runtime.service' => \DI\factory(fn() => 'runtime')], - ]); - - expect($container->get('test.service'))->toBe('test'); - expect($container->get('runtime.service'))->toBe('runtime'); +// Good: use container +it('service uses correct dependencies', function () { + $service = app(\App\Services\UserService::class); + // Test service behavior }); -``` -### 4. Error Handling -```php -// Comprehensive error testing -it('provides meaningful error messages', function () { - $container = $this->createTestContainer(); - - try { - $container->get('missing.service'); - fail('Expected exception'); - } catch (RuntimeException $e) { - expect($e->getMessage())->toContain('missing.service'); - expect($e->getMessage())->toContain('not found in container'); - } +// Avoid: manual instantiation +it('service works', function () { + $service = new \App\Services\UserService(); // Missing dependencies + // Test may fail due to missing dependencies }); ``` ## ๐Ÿ“Š Current Implementation Status -### โœ… Phase 1 Complete: Infrastructure Foundation +### โœ… Clean Testing Foundation -- **DI Container**: Fully tested container wrapper with PSR-11 compliance -- **Factory Pattern**: Comprehensive configuration and creation testing -- **Bootstrap Process**: Environment loading and configuration merging -- **Service Providers**: Modular service registration interface -- **Helper Functions**: Global container access with proper error handling -- **Layer Definitions**: Prepared structure for all architectural layers +- **Illuminate Container**: Full container-based testing +- **Laravel-style Patterns**: Familiar testing approaches +- **Pest PHP**: Modern, expressive test syntax +- **MVC Testing**: Separate testing for models, services, controllers +- **Feature Tests**: HTTP endpoint and integration testing -### ๐Ÿ”„ Testing Coverage +### ๐Ÿ”„ Testing Coverage Goals -- **Container Core**: 100% coverage of wrapper functionality -- **Configuration**: All config sources and merging scenarios tested -- **Error Handling**: Complete PSR-11 exception compliance -- **Integration**: End-to-end bootstrap and usage scenarios -- **Performance**: Container creation and resolution timing validation - -### ๐Ÿ”ฎ Future Phase Testing - -As TorrentPier 3.0 phases are implemented: - -#### Phase 2: Domain Layer -```php -// Domain entity testing (future) -it('validates user business rules', function () { - $user = new User(UserId::generate(), new Email('test@example.com')); - expect($user->isActive())->toBeTrue(); -}); -``` - -#### Phase 3: Application Layer -```php -// Command handler testing (future) -it('processes registration command', function () { - $handler = app(RegisterUserHandler::class); - $command = new RegisterUserCommand('john', 'john@example.com'); - - $userId = $handler->handle($command); - expect($userId)->toBeInstanceOf(UserId::class); -}); -``` - -#### Phase 4: Infrastructure Layer -```php -// Repository integration testing (future) -it('persists user through repository', function () { - $repository = app(UserRepositoryInterface::class); - $user = User::create('john', 'john@example.com'); - - $repository->save($user); - expect($repository->findById($user->getId()))->not->toBeNull(); -}); -``` - -#### Phase 5: Presentation Layer -```php -// Controller integration testing (future) -it('handles user registration via API', function () { - $response = $this->postJson('/api/users', [ - 'username' => 'john', - 'email' => 'john@example.com', - ]); - - expect($response->status())->toBe(201); -}); -``` +- **Models**: Test business logic and data validation +- **Services**: Test service layer and business workflows +- **Controllers**: Test HTTP responses and request handling +- **Container**: Test dependency injection and service resolution +- **Integration**: Test database operations and external services --- -**TorrentPier 3.0 Testing Philosophy**: Tests serve as both validation and documentation of the hexagonal architecture. Each layer has distinct testing strategies that ensure clean separation of concerns and maintainable code. +**TorrentPier 3.0 Testing Philosophy**: Tests serve as both validation and documentation of the Laravel-style MVC architecture. Clear, simple tests ensure maintainable code and confident development. -For questions about testing patterns or contributions, refer to the [TorrentPier GitHub repository](https://github.com/torrentpier/torrentpier) or the hexagonal architecture specification at `/docs/specs/hexagonal-architecture-spec.md`. \ No newline at end of file +For questions about testing patterns or contributions, refer to the [TorrentPier GitHub repository](https://github.com/torrentpier/torrentpier). \ No newline at end of file diff --git a/tests/TestCase.php b/tests/TestCase.php index e876511f2..06805e174 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -2,10 +2,8 @@ namespace Tests; +use Illuminate\Container\Container; use PHPUnit\Framework\TestCase as BaseTestCase; -use TorrentPier\Infrastructure\DependencyInjection\Bootstrap; -use TorrentPier\Infrastructure\DependencyInjection\Container; -use TorrentPier\Infrastructure\DependencyInjection\ContainerFactory; abstract class TestCase extends BaseTestCase { @@ -13,14 +11,15 @@ abstract class TestCase extends BaseTestCase { parent::setUp(); - // Reset container state for each test - Bootstrap::reset(); + // Create a fresh container for each test + $container = new Container(); + Container::setInstance($container); } protected function tearDown(): void { // Clean up container state - Bootstrap::reset(); + Container::setInstance(null); parent::tearDown(); } @@ -28,77 +27,30 @@ abstract class TestCase extends BaseTestCase /** * Create a test container with optional custom configuration */ - protected function createTestContainer(array $config = []): Container + protected function createTestContainer(array $bindings = []): Container { - $defaultConfig = [ - 'environment' => 'testing', - 'autowiring' => true, - 'definitions' => [], - ]; + $container = new Container(); + + // Add test-specific bindings + foreach ($bindings as $abstract => $concrete) { + $container->bind($abstract, $concrete); + } - return ContainerFactory::create(array_merge($defaultConfig, $config)); + return $container; } /** - * Create a container with custom service definitions + * Get the app container instance */ - protected function createContainerWithDefinitions(array $definitions): Container + protected function app(?string $abstract = null): mixed { - return $this->createTestContainer([ - 'definitions' => $definitions, - ]); - } - - /** - * Create a temporary test root directory - */ - protected function createTestRootDirectory(): string - { - $tempDir = createTempDirectory(); - - // Create basic directory structure - mkdir($tempDir . '/config', 0755, true); - mkdir($tempDir . '/internal_data/cache', 0755, true); - - return $tempDir; - } - - /** - * Create test configuration files - */ - protected function createTestConfigFiles(string $rootPath, array $configs = []): void - { - $configPath = $rootPath . '/config'; - - // Create container.php - if (isset($configs['container'])) { - file_put_contents( - $configPath . '/container.php', - ' $value) { - if (is_string($value)) { - $servicesContent .= " '$key' => factory(function () { return '$value'; }),\n"; - } - } - $servicesContent .= "];\n"; - - file_put_contents($configPath . '/services.php', $servicesContent); - } - - // Create .env file - if (isset($configs['env'])) { - $envContent = ''; - foreach ($configs['env'] as $key => $value) { - $envContent .= "$key=$value\n"; - } - file_put_contents($rootPath . '/.env', $envContent); + $container = Container::getInstance(); + + if (is_null($abstract)) { + return $container; } + + return $container->make($abstract); } /** @@ -106,8 +58,8 @@ abstract class TestCase extends BaseTestCase */ protected function assertCanResolve(Container $container, string $serviceId): void { - $this->assertTrue($container->has($serviceId), "Container should have service: $serviceId"); - $this->assertNotNull($container->get($serviceId), "Should be able to resolve service: $serviceId"); + $this->assertTrue($container->bound($serviceId), "Container should have service: $serviceId"); + $this->assertNotNull($container->make($serviceId), "Should be able to resolve service: $serviceId"); } /** @@ -115,6 +67,6 @@ abstract class TestCase extends BaseTestCase */ protected function assertCannotResolve(Container $container, string $serviceId): void { - $this->assertFalse($container->has($serviceId), "Container should not have service: $serviceId"); + $this->assertFalse($container->bound($serviceId), "Container should not have service: $serviceId"); } } diff --git a/tests/Unit/Config/ConfigSystemTest.php b/tests/Unit/Config/ConfigSystemTest.php new file mode 100644 index 000000000..eb1d051f7 --- /dev/null +++ b/tests/Unit/Config/ConfigSystemTest.php @@ -0,0 +1,65 @@ +assertInstanceOf(\Illuminate\Config\Repository::class, $config); + } + + /** + * Test getting config values + */ + public function testGettingConfigValues(): void + { + // Assuming app.php config exists + $appConfig = config('app'); + $this->assertIsArray($appConfig); + + // Test with default value + $nonExistent = config('non.existent.key', 'default'); + $this->assertEquals('default', $nonExistent); + } + + /** + * Test setting config values + */ + public function testSettingConfigValues(): void + { + // Set a single value + config(['test.key' => 'test value']); + $this->assertEquals('test value', config('test.key')); + + // Set multiple values + config([ + 'test.foo' => 'bar', + 'test.baz' => 'qux' + ]); + + $this->assertEquals('bar', config('test.foo')); + $this->assertEquals('qux', config('test.baz')); + } + + /** + * Test dot notation access + */ + public function testDotNotationAccess(): void + { + config(['deeply.nested.config.value' => 'found it']); + + $this->assertEquals('found it', config('deeply.nested.config.value')); + $this->assertIsArray(config('deeply.nested')); + $this->assertArrayHasKey('config', config('deeply.nested')); + } +} \ No newline at end of file diff --git a/tests/Unit/Events/EventSystemTest.php b/tests/Unit/Events/EventSystemTest.php new file mode 100644 index 000000000..7ce70c0c0 --- /dev/null +++ b/tests/Unit/Events/EventSystemTest.php @@ -0,0 +1,94 @@ +listen(UserRegistered::class, function ($event) use (&$called, &$eventData) { + $called = true; + $eventData = $event; + }); + + // Dispatch the event + $event = new UserRegistered( + userId: 123, + username: 'testuser', + email: 'test@example.com', + registeredAt: new \DateTime('2025-01-01 12:00:00') + ); + + event($event); + + // Assert the listener was called + $this->assertTrue($called); + $this->assertInstanceOf(UserRegistered::class, $eventData); + $this->assertEquals(123, $eventData->getUserId()); + $this->assertEquals('testuser', $eventData->getUsername()); + $this->assertEquals('test@example.com', $eventData->getEmail()); + } + + /** + * Test event helper function + */ + public function testEventHelperFunction(): void + { + $listenerCalled = false; + + app('events')->listen(TorrentUploaded::class, function () use (&$listenerCalled) { + $listenerCalled = true; + }); + + // Use the event() helper + event(new TorrentUploaded( + torrentId: 456, + uploaderId: 789, + torrentName: 'Test Torrent', + size: 1024 * 1024 * 100, // 100MB + uploadedAt: new \DateTime() + )); + + $this->assertTrue($listenerCalled); + } + + /** + * Test that multiple listeners can be attached to an event + */ + public function testMultipleListeners(): void + { + $listener1Called = false; + $listener2Called = false; + + app('events')->listen(UserRegistered::class, function () use (&$listener1Called) { + $listener1Called = true; + }); + + app('events')->listen(UserRegistered::class, function () use (&$listener2Called) { + $listener2Called = true; + }); + + event(new UserRegistered( + userId: 999, + username: 'multitest', + email: 'multi@test.com', + registeredAt: new \DateTime() + )); + + $this->assertTrue($listener1Called); + $this->assertTrue($listener2Called); + } +} \ No newline at end of file diff --git a/tests/Unit/Infrastructure/DependencyInjection/BootstrapTest.php b/tests/Unit/Infrastructure/DependencyInjection/BootstrapTest.php deleted file mode 100644 index 1a0fbaf16..000000000 --- a/tests/Unit/Infrastructure/DependencyInjection/BootstrapTest.php +++ /dev/null @@ -1,190 +0,0 @@ -createTestRootDirectory(); - - $container = Bootstrap::init($rootPath); - - expect($container)->toBeInstanceOf(Container::class); - - removeTempDirectory($rootPath); - }); - - it('returns the same container on subsequent calls', function () { - $rootPath = $this->createTestRootDirectory(); - - $container1 = Bootstrap::init($rootPath); - $container2 = Bootstrap::init($rootPath); - - expect($container1)->toBe($container2); - - removeTempDirectory($rootPath); - }); - - it('registers container instance with itself', function () { - $rootPath = $this->createTestRootDirectory(); - - $container = Bootstrap::init($rootPath); - - expect($container->get(Container::class))->toBe($container); - expect($container->get('container'))->toBe($container); - - removeTempDirectory($rootPath); - }); - - it('loads environment variables from .env file', function () { - $rootPath = $this->createTestRootDirectory(); - $this->createTestConfigFiles($rootPath, [ - 'env' => [ - 'TEST_VAR' => 'test_value', - 'APP_ENV' => 'testing', - ], - ]); - - Bootstrap::init($rootPath); - - expect($_ENV['TEST_VAR'] ?? null)->toBe('test_value'); - expect($_ENV['APP_ENV'] ?? null)->toBe('testing'); - - removeTempDirectory($rootPath); - }); - - it('loads configuration from config files', function () { - $rootPath = $this->createTestRootDirectory(); - $this->createTestConfigFiles($rootPath, [ - 'container' => [ - 'environment' => 'testing', - 'autowiring' => true, - ], - 'services' => [ - 'test.service' => 'config_value', - ], - ]); - - $container = Bootstrap::init($rootPath); - - expect($container->get('test.service'))->toBe('config_value'); - - removeTempDirectory($rootPath); - }); - - it('handles missing config files gracefully', function () { - $rootPath = $this->createTestRootDirectory(); - - // Should not throw exception even without config files - $container = Bootstrap::init($rootPath); - - expect($container)->toBeInstanceOf(Container::class); - - removeTempDirectory($rootPath); - }); - }); - - describe('getContainer() method', function () { - it('returns null when not initialized', function () { - expect(Bootstrap::getContainer())->toBeNull(); - }); - - it('returns container after initialization', function () { - $rootPath = $this->createTestRootDirectory(); - - $container = Bootstrap::init($rootPath); - - expect(Bootstrap::getContainer())->toBe($container); - - removeTempDirectory($rootPath); - }); - }); - - describe('reset() method', function () { - it('clears the container instance', function () { - $rootPath = $this->createTestRootDirectory(); - - Bootstrap::init($rootPath); - expect(Bootstrap::getContainer())->not->toBeNull(); - - Bootstrap::reset(); - expect(Bootstrap::getContainer())->toBeNull(); - - removeTempDirectory($rootPath); - }); - - it('allows re-initialization after reset', function () { - $rootPath = $this->createTestRootDirectory(); - - $container1 = Bootstrap::init($rootPath); - Bootstrap::reset(); - $container2 = Bootstrap::init($rootPath); - - expect($container1)->not->toBe($container2); - expect($container2)->toBeInstanceOf(Container::class); - - removeTempDirectory($rootPath); - }); - }); - - describe('configuration loading', function () { - it('merges configuration from multiple sources', function () { - $rootPath = $this->createTestRootDirectory(); - $this->createTestConfigFiles($rootPath, [ - 'env' => [ - 'APP_ENV' => 'production', - 'APP_DEBUG' => 'false', - ], - 'container' => [ - 'autowiring' => true, - ], - 'services' => [ - 'config.service' => 'merged_config', - ], - ]); - - $container = Bootstrap::init($rootPath, [ - 'definitions' => [ - 'runtime.service' => \DI\factory(function () { - return 'runtime_config'; - }), - ], - ]); - - expect($container->get('config.service'))->toBe('merged_config'); - expect($container->get('runtime.service'))->toBe('runtime_config'); - - removeTempDirectory($rootPath); - }); - - it('sets default environment when no .env file exists', function () { - $rootPath = $this->createTestRootDirectory(); - - $container = Bootstrap::init($rootPath); - - // Container should still be created successfully - expect($container)->toBeInstanceOf(Container::class); - - removeTempDirectory($rootPath); - }); - }); - - describe('error handling', function () { - it('handles invalid root path gracefully', function () { - // Should not throw fatal error for non-existent path - expect(function () { - Bootstrap::init('/non/existent/path'); - })->not->toThrow(Throwable::class); - }); - }); -}); diff --git a/tests/Unit/Infrastructure/DependencyInjection/ContainerFactoryTest.php b/tests/Unit/Infrastructure/DependencyInjection/ContainerFactoryTest.php deleted file mode 100644 index ccd6e1ea8..000000000 --- a/tests/Unit/Infrastructure/DependencyInjection/ContainerFactoryTest.php +++ /dev/null @@ -1,206 +0,0 @@ -toBeInstanceOf(Container::class); - }); - - it('applies configuration correctly', function () { - $config = [ - 'environment' => 'testing', - 'autowiring' => true, - 'annotations' => false, - ]; - - $container = ContainerFactory::create($config); - expect($container)->toBeInstanceOf(Container::class); - }); - - it('loads custom definitions', function () { - $config = [ - 'definitions' => [ - 'test.service' => \DI\factory(function () { - return 'test_value'; - }), - ], - ]; - - $container = ContainerFactory::create($config); - expect($container->get('test.service'))->toBe('test_value'); - }); - - it('configures autowiring when enabled', function () { - $config = ['autowiring' => true]; - $container = ContainerFactory::create($config); - - // Should be able to autowire stdClass - expect($container->has(stdClass::class))->toBeTrue(); - }); - - it('loads definition files when specified', function () { - $tempDir = createTempDirectory(); - $definitionFile = $tempDir . '/definitions.php'; - - file_put_contents($definitionFile, ' \DI\factory(function () { - return "from_file"; - }), - ];'); - - $config = [ - 'definition_files' => [$definitionFile], - ]; - - $container = ContainerFactory::create($config); - expect($container->get('file.service'))->toBe('from_file'); - - removeTempDirectory($tempDir); - }); - - it('handles non-existent definition files gracefully', function () { - $config = [ - 'definition_files' => ['/non/existent/file.php'], - ]; - - // Should not throw an exception - $container = ContainerFactory::create($config); - expect($container)->toBeInstanceOf(Container::class); - }); - }); - - describe('service providers', function () { - it('registers and boots service providers', function () { - $providerClass = new class implements ServiceProvider { - public static bool $registered = false; - public static bool $booted = false; - - public function register(Container $container): void - { - self::$registered = true; - $container->getWrappedContainer()->set('provider.service', 'provider_value'); - } - - public function boot(Container $container): void - { - self::$booted = true; - } - }; - - $config = [ - 'providers' => [get_class($providerClass)], - ]; - - $container = ContainerFactory::create($config); - - expect($providerClass::$registered)->toBeTrue(); - expect($providerClass::$booted)->toBeTrue(); - expect($container->get('provider.service'))->toBe('provider_value'); - }); - - it('handles invalid provider classes gracefully', function () { - $config = [ - 'providers' => ['NonExistentProvider'], - ]; - - // Should not throw an exception - $container = ContainerFactory::create($config); - expect($container)->toBeInstanceOf(Container::class); - }); - - it('boots providers after all registrations', function () { - // Use a simpler approach without constructor dependencies - $testFile = sys_get_temp_dir() . '/provider_order_test.txt'; - if (file_exists($testFile)) { - unlink($testFile); - } - - $provider1Class = new class implements ServiceProvider { - public function register(Container $container): void - { - $testFile = sys_get_temp_dir() . '/provider_order_test.txt'; - file_put_contents($testFile, "register1\n", FILE_APPEND); - } - - public function boot(Container $container): void - { - $testFile = sys_get_temp_dir() . '/provider_order_test.txt'; - file_put_contents($testFile, "boot1\n", FILE_APPEND); - } - }; - - $provider2Class = new class implements ServiceProvider { - public function register(Container $container): void - { - $testFile = sys_get_temp_dir() . '/provider_order_test.txt'; - file_put_contents($testFile, "register2\n", FILE_APPEND); - } - - public function boot(Container $container): void - { - $testFile = sys_get_temp_dir() . '/provider_order_test.txt'; - file_put_contents($testFile, "boot2\n", FILE_APPEND); - } - }; - - $config = [ - 'providers' => [get_class($provider1Class), get_class($provider2Class)], - ]; - - ContainerFactory::create($config); - - // Read the order from the test file - $content = file_get_contents($testFile); - $lines = array_filter(explode("\n", trim($content))); - - // All registrations should happen before any boots - expect($lines)->toBe(['register1', 'register2', 'boot1', 'boot2']); - - // Clean up - unlink($testFile); - }); - }); - - describe('environment configuration', function () { - it('enables compilation in production', function () { - $tempDir = createTempDirectory(); - - $config = [ - 'environment' => 'production', - 'compilation_dir' => $tempDir . '/container', - 'proxies_dir' => $tempDir . '/proxies', - ]; - - $container = ContainerFactory::create($config); - expect($container)->toBeInstanceOf(Container::class); - - removeTempDirectory($tempDir); - }); - - it('skips compilation in development', function () { - $config = [ - 'environment' => 'development', - ]; - - $container = ContainerFactory::create($config); - expect($container)->toBeInstanceOf(Container::class); - }); - }); - - describe('layer definitions integration', function () { - it('loads definitions from all architectural layers', function () { - $container = ContainerFactory::create(); - - // Container should be created successfully with all layer definitions - expect($container)->toBeInstanceOf(Container::class); - - // Since most definitions are commented out, we just verify the container works - expect($container->has(stdClass::class))->toBeTrue(); - }); - }); -}); diff --git a/tests/Unit/Infrastructure/DependencyInjection/ContainerTest.php b/tests/Unit/Infrastructure/DependencyInjection/ContainerTest.php deleted file mode 100644 index d751ecf67..000000000 --- a/tests/Unit/Infrastructure/DependencyInjection/ContainerTest.php +++ /dev/null @@ -1,165 +0,0 @@ -container = $this->createTestContainer(); - }); - - it('implements PSR-11 ContainerInterface', function () { - expect($this->container)->toBeInstanceOf(\Psr\Container\ContainerInterface::class); - }); - - describe('get() method', function () { - it('can resolve a simple service', function () { - $container = $this->createContainerWithDefinitions([ - 'test.service' => \DI\factory(function () { - return 'test_value'; - }), - ]); - - $result = $container->get('test.service'); - expect($result)->toBe('test_value'); - }); - - it('can resolve autowired classes', function () { - $container = $this->createContainerWithDefinitions([ - 'test.class' => \DI\autowire(stdClass::class), - ]); - - $result = $container->get('test.class'); - expect($result)->toBeInstanceOf(stdClass::class); - }); - - it('throws NotFoundExceptionInterface for non-existent services', function () { - expectException( - fn() => $this->container->get('non.existent.service'), - NotFoundExceptionInterface::class, - 'non.existent.service' - ); - }); - - it('returns same instance for singleton services', function () { - $container = $this->createContainerWithDefinitions([ - 'singleton.service' => \DI\factory(function () { - return new stdClass(); - }), - ]); - - $instance1 = $container->get('singleton.service'); - $instance2 = $container->get('singleton.service'); - - expect($instance1)->toBe($instance2); - }); - }); - - describe('has() method', function () { - it('returns true for existing services', function () { - $container = $this->createContainerWithDefinitions([ - 'existing.service' => \DI\factory(function () { - return 'value'; - }), - ]); - - expect($container->has('existing.service'))->toBeTrue(); - }); - - it('returns false for non-existent services', function () { - expect($this->container->has('non.existent.service'))->toBeFalse(); - }); - - it('returns true for autowirable classes', function () { - expect($this->container->has(stdClass::class))->toBeTrue(); - }); - }); - - describe('make() method', function () { - it('can make instances with parameters', function () { - $result = $this->container->make(stdClass::class); - expect($result)->toBeInstanceOf(stdClass::class); - }); - - it('creates new instances each time', function () { - $instance1 = $this->container->make(stdClass::class); - $instance2 = $this->container->make(stdClass::class); - - expect($instance1)->not->toBe($instance2); - }); - }); - - describe('call() method', function () { - it('can call closures with dependency injection', function () { - $result = $this->container->call(function (stdClass $class) { - return get_class($class); - }); - - expect($result)->toBe('stdClass'); - }); - - it('can call methods with parameters', function () { - $service = new class { - public function test(string $param): string - { - return "Hello $param"; - } - }; - - $result = $this->container->call([$service, 'test'], ['param' => 'World']); - expect($result)->toBe('Hello World'); - }); - }); - - describe('injectOn() method', function () { - it('returns the object after injection', function () { - $object = new stdClass(); - - $result = $this->container->injectOn($object); - expect($result)->toBe($object); - }); - }); - - describe('getWrappedContainer() method', function () { - it('returns the underlying PHP-DI container', function () { - $wrapped = $this->container->getWrappedContainer(); - expect($wrapped)->toBeInstanceOf(\DI\Container::class); - }); - - it('allows direct access to PHP-DI functionality', function () { - $wrapped = $this->container->getWrappedContainer(); - $wrapped->set('direct.service', 'direct_value'); - - expect($this->container->get('direct.service'))->toBe('direct_value'); - }); - }); - - describe('error handling', function () { - it('provides meaningful error messages for missing services', function () { - expectException( - fn() => $this->container->get('missing.service'), - NotFoundExceptionInterface::class, - 'missing.service' - ); - }); - - it('handles circular dependencies gracefully', function () { - $container = $this->createContainerWithDefinitions([ - 'service.a' => \DI\factory(function (\Psr\Container\ContainerInterface $c) { - return $c->get('service.b'); - }), - 'service.b' => \DI\factory(function (\Psr\Container\ContainerInterface $c) { - return $c->get('service.a'); - }), - ]); - - expectException( - fn() => $container->get('service.a'), - ContainerExceptionInterface::class, - 'Circular dependency' - ); - }); - }); -}); diff --git a/tests/Unit/Infrastructure/DependencyInjection/Definitions/ApplicationDefinitionsTest.php b/tests/Unit/Infrastructure/DependencyInjection/Definitions/ApplicationDefinitionsTest.php deleted file mode 100644 index 8d686cea1..000000000 --- a/tests/Unit/Infrastructure/DependencyInjection/Definitions/ApplicationDefinitionsTest.php +++ /dev/null @@ -1,100 +0,0 @@ -toBeArray(); - }); - - it('returns empty array when no application services are implemented yet', function () { - $definitions = ApplicationDefinitions::getDefinitions(); - - // Since we're in Phase 1 and application services aren't implemented yet, - // the definitions should be empty (all examples are commented out) - expect($definitions)->toBe([]); - }); - - it('follows application layer principles', function () { - // Application layer should orchestrate domain objects - // This test verifies the structure is ready for future application services - - $definitions = ApplicationDefinitions::getDefinitions(); - - // Should be an array (even if empty) - expect($definitions)->toBeArray(); - - // When application services are added, they should follow these principles: - // - Command and Query handlers - // - Application services that orchestrate domain logic - // - Event dispatchers - // - No direct infrastructure concerns - }); - - it('can be safely called multiple times', function () { - $definitions1 = ApplicationDefinitions::getDefinitions(); - $definitions2 = ApplicationDefinitions::getDefinitions(); - - expect($definitions1)->toBe($definitions2); - }); - - it('is prepared for future command/query handlers', function () { - // This test documents the intended structure for Phase 3 implementation - - $definitions = ApplicationDefinitions::getDefinitions(); - expect($definitions)->toBeArray(); - - // Future command/query handlers will be registered like: - // 'TorrentPier\Application\User\Handler\RegisterUserHandler' => DI\autowire(), - // 'CommandBusInterface' => DI\factory(function (ContainerInterface $c) { - // return new CommandBus($c); - // }), - - // For now, verify the method works without breaking - expect(count($definitions))->toBeGreaterThanOrEqual(0); - }); - }); - - describe('architectural compliance', function () { - it('follows hexagonal architecture principles', function () { - // Application layer should orchestrate domain objects without infrastructure concerns - - $definitions = ApplicationDefinitions::getDefinitions(); - - // Application definitions should focus on: - // 1. Command and Query handlers - // 2. Application services - // 3. Event dispatchers - // 4. Use case orchestration - - expect($definitions)->toBeArray(); - }); - - it('supports CQRS pattern', function () { - // Application layer should separate commands and queries - // This test ensures the structure supports CQRS implementation - - $definitions = ApplicationDefinitions::getDefinitions(); - - // Future implementation will separate: - // - Command handlers (write operations) - // - Query handlers (read operations) - // - Command and Query buses - - expect($definitions)->toBeArray(); - }); - - it('prepares for event-driven architecture', function () { - // Application layer should support domain events - - $definitions = ApplicationDefinitions::getDefinitions(); - - // Future event dispatcher will be registered here - // 'EventDispatcherInterface' => DI\factory(...) - - expect($definitions)->toBeArray(); - }); - }); -}); diff --git a/tests/Unit/Infrastructure/DependencyInjection/Definitions/DomainDefinitionsTest.php b/tests/Unit/Infrastructure/DependencyInjection/Definitions/DomainDefinitionsTest.php deleted file mode 100644 index 787083024..000000000 --- a/tests/Unit/Infrastructure/DependencyInjection/Definitions/DomainDefinitionsTest.php +++ /dev/null @@ -1,84 +0,0 @@ -toBeArray(); - }); - - it('returns empty array when no domain services are implemented yet', function () { - $definitions = DomainDefinitions::getDefinitions(); - - // Since we're in Phase 1 and domain services aren't implemented yet, - // the definitions should be empty (all examples are commented out) - expect($definitions)->toBe([]); - }); - - it('follows domain layer principles', function () { - // Domain definitions should not contain infrastructure dependencies - // This test verifies the structure is ready for future domain services - - $definitions = DomainDefinitions::getDefinitions(); - - // Should be an array (even if empty) - expect($definitions)->toBeArray(); - - // When domain services are added, they should follow these principles: - // - No framework dependencies - // - Repository interfaces mapped to implementations - // - Pure business logic services - }); - - it('can be safely called multiple times', function () { - $definitions1 = DomainDefinitions::getDefinitions(); - $definitions2 = DomainDefinitions::getDefinitions(); - - expect($definitions1)->toBe($definitions2); - }); - - it('is prepared for future repository interface mappings', function () { - // This test documents the intended structure for Phase 2 implementation - - $definitions = DomainDefinitions::getDefinitions(); - expect($definitions)->toBeArray(); - - // Future repository interfaces will be mapped like: - // 'TorrentPier\Domain\User\Repository\UserRepositoryInterface' => - // DI\factory(function (ContainerInterface $c) { - // return $c->get('TorrentPier\Infrastructure\Persistence\Repository\UserRepository'); - // }), - - // For now, verify the method works without breaking - expect(count($definitions))->toBeGreaterThanOrEqual(0); - }); - }); - - describe('architectural compliance', function () { - it('follows hexagonal architecture principles', function () { - // Domain layer should have no infrastructure dependencies - // This test ensures the definition structure is correct - - $definitions = DomainDefinitions::getDefinitions(); - - // Domain definitions should focus on: - // 1. Repository interface mappings - // 2. Domain service factories - // 3. No framework dependencies - - expect($definitions)->toBeArray(); - }); - - it('supports dependency injection inversion', function () { - // Domain interfaces should be mapped to infrastructure implementations - // following the dependency inversion principle - - $definitions = DomainDefinitions::getDefinitions(); - - // Even though empty now, the structure supports proper DI mapping - expect($definitions)->toBeArray(); - }); - }); -}); diff --git a/tests/Unit/Infrastructure/DependencyInjection/Definitions/InfrastructureDefinitionsTest.php b/tests/Unit/Infrastructure/DependencyInjection/Definitions/InfrastructureDefinitionsTest.php deleted file mode 100644 index 8a24c6a1b..000000000 --- a/tests/Unit/Infrastructure/DependencyInjection/Definitions/InfrastructureDefinitionsTest.php +++ /dev/null @@ -1,166 +0,0 @@ -toBeArray(); - }); - - it('accepts configuration parameter', function () { - $config = ['test' => 'value']; - $definitions = InfrastructureDefinitions::getDefinitions($config); - expect($definitions)->toBeArray(); - }); - - it('returns infrastructure service definitions', function () { - $definitions = InfrastructureDefinitions::getDefinitions(); - - // Should contain HTTP infrastructure services that have been implemented - expect($definitions)->toBeArray(); - expect($definitions)->toHaveKey('TorrentPier\Config'); - expect($definitions)->toHaveKey('TorrentPier\Infrastructure\Http\Router'); - expect($definitions)->toHaveKey('TorrentPier\Infrastructure\Http\RequestFactory'); - expect($definitions)->toHaveKey('TorrentPier\Infrastructure\Http\ResponseFactory'); - expect($definitions)->toHaveKey('TorrentPier\Infrastructure\Http\Middleware\CorsMiddleware'); - }); - - it('follows infrastructure layer principles', function () { - // Infrastructure layer should handle external concerns - // This test verifies the structure is ready for future infrastructure services - - $definitions = InfrastructureDefinitions::getDefinitions(); - - // Should be an array (even if empty) - expect($definitions)->toBeArray(); - - // When infrastructure services are added, they should follow these principles: - // - Database connections and repositories - // - Cache implementations - // - External service adapters - // - File storage systems - }); - - it('can be safely called multiple times', function () { - $definitions1 = InfrastructureDefinitions::getDefinitions(); - $definitions2 = InfrastructureDefinitions::getDefinitions(); - - // Should return same structure (though objects may be different instances) - expect(array_keys($definitions1))->toBe(array_keys($definitions2)); - expect(count($definitions1))->toBe(count($definitions2)); - }); - - it('can handle different configurations', function () { - $config1 = ['database' => ['host' => 'localhost']]; - $config2 = ['cache' => ['driver' => 'redis']]; - - $definitions1 = InfrastructureDefinitions::getDefinitions($config1); - $definitions2 = InfrastructureDefinitions::getDefinitions($config2); - - // Should handle different configs without breaking - expect($definitions1)->toBeArray(); - expect($definitions2)->toBeArray(); - }); - - it('is prepared for future database services', function () { - // This test documents the intended structure for Phase 4 implementation - - $definitions = InfrastructureDefinitions::getDefinitions([ - 'database' => [ - 'host' => '127.0.0.1', - 'port' => 3306, - 'database' => 'tp', - 'username' => 'root', - 'password' => '', - 'charset' => 'utf8mb4', - ], - ]); - - expect($definitions)->toBeArray(); - - // Future database services will be registered like: - // 'database.connection.default' => DI\factory(function () use ($config) { ... }), - // Connection::class => DI\get('database.connection.default'), - - // For now, verify the method works without breaking - // Should at least contain the HTTP infrastructure services - expect(count($definitions))->toBeGreaterThanOrEqual(5); - }); - - it('is prepared for future cache services', function () { - $definitions = InfrastructureDefinitions::getDefinitions([ - 'cache' => [ - 'driver' => 'file', - 'file' => ['path' => '/tmp/cache'], - ], - ]); - - expect($definitions)->toBeArray(); - - // Future cache services will be registered like: - // 'cache.storage' => DI\factory(function () use ($config) { ... }), - // 'cache.factory' => DI\factory(function (ContainerInterface $c) { ... }), - }); - }); - - describe('architectural compliance', function () { - it('follows hexagonal architecture principles', function () { - // Infrastructure layer should handle external concerns and adapters - - $definitions = InfrastructureDefinitions::getDefinitions(); - - // Infrastructure definitions should focus on: - // 1. Database connections and persistence - // 2. Cache implementations - // 3. External service adapters - // 4. File storage systems - // 5. Third-party integrations - - expect($definitions)->toBeArray(); - }); - - it('supports dependency inversion', function () { - // Infrastructure should implement domain interfaces - - $definitions = InfrastructureDefinitions::getDefinitions(); - - // Future repository implementations will be registered here: - // 'TorrentPier\Infrastructure\Persistence\Repository\UserRepository' => DI\autowire() - // ->constructorParameter('connection', DI\get('database.connection.default')) - - expect($definitions)->toBeArray(); - }); - - it('handles configuration-based service creation', function () { - // Infrastructure services should be configurable - - $config = [ - 'database' => ['driver' => 'mysql'], - 'cache' => ['driver' => 'redis'], - 'storage' => ['driver' => 's3'], - ]; - - $definitions = InfrastructureDefinitions::getDefinitions($config); - - // Should handle configuration without breaking - expect($definitions)->toBeArray(); - }); - - it('prepares for multiple database connections', function () { - $config = [ - 'database' => [ - 'default' => 'mysql', - 'connections' => [ - 'mysql' => ['driver' => 'mysql'], - 'sqlite' => ['driver' => 'sqlite'], - ], - ], - ]; - - $definitions = InfrastructureDefinitions::getDefinitions($config); - expect($definitions)->toBeArray(); - }); - }); -}); diff --git a/tests/Unit/Infrastructure/DependencyInjection/Definitions/PresentationDefinitionsTest.php b/tests/Unit/Infrastructure/DependencyInjection/Definitions/PresentationDefinitionsTest.php deleted file mode 100644 index 3c950ce25..000000000 --- a/tests/Unit/Infrastructure/DependencyInjection/Definitions/PresentationDefinitionsTest.php +++ /dev/null @@ -1,151 +0,0 @@ -toBeArray(); - }); - - it('returns presentation service definitions', function () { - $definitions = PresentationDefinitions::getDefinitions(); - - // Should contain HTTP presentation services that have been implemented - expect($definitions)->toBeArray(); - expect($definitions)->toHaveKey('TorrentPier\Presentation\Http\Kernel'); - expect($definitions)->toHaveKey('TorrentPier\Presentation\Http\Controllers\Web\HelloWorldController'); - expect($definitions)->toHaveKey('TorrentPier\Presentation\Http\Controllers\Web\LegacyController'); - }); - - it('follows presentation layer principles', function () { - // Presentation layer should handle user interface concerns - // This test verifies the structure is ready for future presentation services - - $definitions = PresentationDefinitions::getDefinitions(); - - // Should be an array (even if empty) - expect($definitions)->toBeArray(); - - // When presentation services are added, they should follow these principles: - // - HTTP controllers for web and API interfaces - // - CLI commands for console operations - // - Middleware for request/response processing - // - Response transformers for output formatting - }); - - it('can be safely called multiple times', function () { - $definitions1 = PresentationDefinitions::getDefinitions(); - $definitions2 = PresentationDefinitions::getDefinitions(); - - // Should return same structure (though objects may be different instances) - expect(array_keys($definitions1))->toBe(array_keys($definitions2)); - expect(count($definitions1))->toBe(count($definitions2)); - }); - - it('is prepared for future HTTP controllers', function () { - // This test documents the intended structure for Phase 5 implementation - - $definitions = PresentationDefinitions::getDefinitions(); - expect($definitions)->toBeArray(); - - // Future HTTP controllers will be registered like: - // 'TorrentPier\Presentation\Http\Controllers\Web\HomeController' => DI\autowire(), - // 'TorrentPier\Presentation\Http\Controllers\Api\UserController' => DI\autowire(), - // 'TorrentPier\Presentation\Http\Controllers\Admin\DashboardController' => DI\autowire(), - - // For now, verify the method works without breaking - expect(count($definitions))->toBeGreaterThanOrEqual(0); - }); - - it('is prepared for future CLI commands', function () { - $definitions = PresentationDefinitions::getDefinitions(); - expect($definitions)->toBeArray(); - - // Future CLI commands will be registered like: - // 'TorrentPier\Presentation\Cli\Commands\CacheCommand' => DI\autowire(), - // 'TorrentPier\Presentation\Cli\Commands\MigrateCommand' => DI\autowire(), - }); - - it('is prepared for future middleware', function () { - $definitions = PresentationDefinitions::getDefinitions(); - expect($definitions)->toBeArray(); - - // Future middleware will be registered like: - // 'AuthenticationMiddleware' => DI\autowire('TorrentPier\Presentation\Http\Middleware\AuthenticationMiddleware'), - // 'CorsMiddleware' => DI\autowire('TorrentPier\Presentation\Http\Middleware\CorsMiddleware'), - }); - }); - - describe('architectural compliance', function () { - it('follows hexagonal architecture principles', function () { - // Presentation layer should handle user interface and external interfaces - - $definitions = PresentationDefinitions::getDefinitions(); - - // Presentation definitions should focus on: - // 1. HTTP controllers (Web, API, Admin) - // 2. CLI commands - // 3. Middleware for request processing - // 4. Response transformers - // 5. Input validation and output formatting - - expect($definitions)->toBeArray(); - }); - - it('supports multiple interface types', function () { - // Presentation layer should support web, API, and CLI interfaces - - $definitions = PresentationDefinitions::getDefinitions(); - - // Future implementation will include: - // - Web controllers for HTML responses - // - API controllers for JSON responses - // - Admin controllers for administrative interface - // - CLI commands for console operations - - expect($definitions)->toBeArray(); - }); - - it('prepares for middleware stack', function () { - // Presentation layer should support request/response middleware - - $definitions = PresentationDefinitions::getDefinitions(); - - // Future middleware will handle: - // - Authentication and authorization - // - CORS headers - // - Rate limiting - // - Request validation - // - Response transformation - - expect($definitions)->toBeArray(); - }); - - it('supports dependency injection for controllers', function () { - // Controllers should have their dependencies injected - - $definitions = PresentationDefinitions::getDefinitions(); - - // Future controllers will be autowired with dependencies: - // - Application services (command/query handlers) - // - Request validators - // - Response transformers - - expect($definitions)->toBeArray(); - }); - - it('prepares for different response formats', function () { - // Presentation layer should support multiple response formats - - $definitions = PresentationDefinitions::getDefinitions(); - - // Future response transformers: - // 'JsonResponseTransformer' => DI\autowire(...), - // 'HtmlResponseTransformer' => DI\autowire(...), - - expect($definitions)->toBeArray(); - }); - }); -}); diff --git a/tests/Unit/Infrastructure/DependencyInjection/ServiceProviderTest.php b/tests/Unit/Infrastructure/DependencyInjection/ServiceProviderTest.php deleted file mode 100644 index 69c7c68ac..000000000 --- a/tests/Unit/Infrastructure/DependencyInjection/ServiceProviderTest.php +++ /dev/null @@ -1,144 +0,0 @@ -isInterface())->toBeTrue(); - expect($reflection->hasMethod('register'))->toBeTrue(); - expect($reflection->hasMethod('boot'))->toBeTrue(); - }); - - it('register method has correct signature', function () { - $reflection = new ReflectionClass(ServiceProvider::class); - $method = $reflection->getMethod('register'); - - expect($method->isPublic())->toBeTrue(); - expect($method->getParameters())->toHaveCount(1); - expect($method->getParameters()[0]->getType()?->getName())->toBe(Container::class); - expect($method->getReturnType()?->getName())->toBe('void'); - }); - - it('boot method has correct signature', function () { - $reflection = new ReflectionClass(ServiceProvider::class); - $method = $reflection->getMethod('boot'); - - expect($method->isPublic())->toBeTrue(); - expect($method->getParameters())->toHaveCount(1); - expect($method->getParameters()[0]->getType()?->getName())->toBe(Container::class); - expect($method->getReturnType()?->getName())->toBe('void'); - }); -}); - -describe('ServiceProvider implementation examples', function () { - it('can implement a basic service provider', function () { - $provider = new class implements ServiceProvider { - public function register(Container $container): void - { - $container->getWrappedContainer()->set('example.service', 'registered'); - } - - public function boot(Container $container): void - { - // Boot logic here - } - }; - - $container = $this->createTestContainer(); - - $provider->register($container); - - expect($container->get('example.service'))->toBe('registered'); - }); - - it('can implement a provider with complex services', function () { - $provider = new class implements ServiceProvider { - public function register(Container $container): void - { - $container->getWrappedContainer()->set('complex.service', \DI\factory(function () { - return new class { - public function getValue(): string - { - return 'complex_value'; - } - }; - })); - } - - public function boot(Container $container): void - { - // Could perform additional setup here - $service = $container->get('complex.service'); - // Setup complete - } - }; - - $container = $this->createTestContainer(); - - $provider->register($container); - $provider->boot($container); - - $service = $container->get('complex.service'); - expect($service->getValue())->toBe('complex_value'); - }); - - it('can implement a provider that registers multiple services', function () { - $provider = new class implements ServiceProvider { - public function register(Container $container): void - { - $wrapped = $container->getWrappedContainer(); - - $wrapped->set('service.a', 'value_a'); - $wrapped->set('service.b', 'value_b'); - $wrapped->set('service.c', \DI\factory(function () { - return 'value_c'; - })); - } - - public function boot(Container $container): void - { - // Boot all registered services - } - }; - - $container = $this->createTestContainer(); - - $provider->register($container); - $provider->boot($container); - - expect($container->get('service.a'))->toBe('value_a'); - expect($container->get('service.b'))->toBe('value_b'); - expect($container->get('service.c'))->toBe('value_c'); - }); - - it('boot method can access services registered by register method', function () { - $bootedServices = []; - - $provider = new class($bootedServices) implements ServiceProvider { - public function __construct(private array &$bootedServices) - { - } - - public function register(Container $container): void - { - $container->getWrappedContainer()->set('bootable.service', 'registered_value'); - } - - public function boot(Container $container): void - { - $value = $container->get('bootable.service'); - $this->bootedServices[] = $value; - } - }; - - $container = $this->createTestContainer(); - - $provider->register($container); - $provider->boot($container); - - expect($bootedServices)->toBe(['registered_value']); - }); -}); diff --git a/tests/Unit/Infrastructure/Http/RouterTest.php b/tests/Unit/Infrastructure/Http/RouterTest.php deleted file mode 100644 index 921fc5b2c..000000000 --- a/tests/Unit/Infrastructure/Http/RouterTest.php +++ /dev/null @@ -1,251 +0,0 @@ -container = new Container($diContainer); - - // Create router instance - $this->router = new Router($this->container); - }); - - describe('route registration', function () { - it('registers GET routes', function () { - $this->router->get('/test', function () { - return new Response(200, [], 'GET test'); - }); - - $request = new ServerRequest('GET', '/test'); - $response = $this->router->dispatch($request); - - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('GET test'); - }); - - it('registers POST routes', function () { - $this->router->post('/test', function () { - return new Response(200, [], 'POST test'); - }); - - $request = new ServerRequest('POST', '/test'); - $response = $this->router->dispatch($request); - - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('POST test'); - }); - - it('registers PUT routes', function () { - $this->router->put('/test', function () { - return new Response(200, [], 'PUT test'); - }); - - $request = new ServerRequest('PUT', '/test'); - $response = $this->router->dispatch($request); - - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('PUT test'); - }); - - it('registers PATCH routes', function () { - $this->router->patch('/test', function () { - return new Response(200, [], 'PATCH test'); - }); - - $request = new ServerRequest('PATCH', '/test'); - $response = $this->router->dispatch($request); - - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('PATCH test'); - }); - - it('registers DELETE routes', function () { - $this->router->delete('/test', function () { - return new Response(200, [], 'DELETE test'); - }); - - $request = new ServerRequest('DELETE', '/test'); - $response = $this->router->dispatch($request); - - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('DELETE test'); - }); - - it('registers HEAD routes', function () { - $this->router->head('/test', function () { - return new Response(200); - }); - - $request = new ServerRequest('HEAD', '/test'); - $response = $this->router->dispatch($request); - - expect($response->getStatusCode())->toBe(200); - }); - - it('registers OPTIONS routes', function () { - $this->router->options('/test', function () { - return new Response(200, ['Allow' => 'GET, POST, OPTIONS']); - }); - - $request = new ServerRequest('OPTIONS', '/test'); - $response = $this->router->dispatch($request); - - expect($response->getStatusCode())->toBe(200); - expect($response->getHeader('Allow'))->toBe(['GET, POST, OPTIONS']); - }); - }); - - describe('route parameters', function () { - it('captures route parameters', function () { - $this->router->get('/user/{id}', function ($request, $args) { - return new Response(200, [], 'User ID: ' . $args['id']); - }); - - $request = new ServerRequest('GET', '/user/123'); - $response = $this->router->dispatch($request); - - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('User ID: 123'); - }); - - it('captures multiple route parameters', function () { - $this->router->get('/post/{year}/{month}/{slug}', function ($request, $args) { - return new Response(200, [], sprintf( - 'Post: %s/%s/%s', - $args['year'], - $args['month'], - $args['slug'] - )); - }); - - $request = new ServerRequest('GET', '/post/2024/06/hello-world'); - $response = $this->router->dispatch($request); - - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('Post: 2024/06/hello-world'); - }); - }); - - describe('controller resolution', function () { - it('resolves controller from DI container', function () { - // Create a test controller - $testController = new class { - public function index() - { - return new Response(200, [], 'Controller response'); - } - }; - - // Register controller in container using the wrapped DI container - $this->container->getWrappedContainer()->set('TestController', $testController); - - // Register route with controller - $this->router->get('/test', ['TestController', 'index']); - - $request = new ServerRequest('GET', '/test'); - $response = $this->router->dispatch($request); - - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('Controller response'); - }); - - it('resolves controller by class name', function () { - // Define a test controller class - $controllerClass = 'TestControllerClass' . uniqid(); - eval(" - class $controllerClass { - public function handle() { - return new \GuzzleHttp\Psr7\Response(200, [], 'Class-based controller'); - } - } - "); - - $this->router->get('/test', [$controllerClass, 'handle']); - - $request = new ServerRequest('GET', '/test'); - $response = $this->router->dispatch($request); - - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('Class-based controller'); - }); - }); - - describe('middleware support', function () { - it('applies middleware to routes', function () { - // Create a simple middleware that implements PSR-15 - $middleware = new class implements \Psr\Http\Server\MiddlewareInterface { - public function process( - \Psr\Http\Message\ServerRequestInterface $request, - \Psr\Http\Server\RequestHandlerInterface $handler - ): \Psr\Http\Message\ResponseInterface - { - $response = $handler->handle($request); - return $response->withHeader('X-Middleware', 'Applied'); - } - }; - - $this->router->middleware($middleware) - ->get('/test', function () { - return new Response(200, [], 'With middleware'); - }); - - $request = new ServerRequest('GET', '/test'); - $response = $this->router->dispatch($request); - - expect($response->getStatusCode())->toBe(200); - expect($response->getHeader('X-Middleware'))->toBe(['Applied']); - expect((string)$response->getBody())->toBe('With middleware'); - }); - }); - - describe('error handling', function () { - it('throws NotFoundException for undefined routes', function () { - $request = new ServerRequest('GET', '/undefined'); - - expect(fn() => $this->router->dispatch($request)) - ->toThrow(League\Route\Http\Exception\NotFoundException::class); - }); - - it('throws MethodNotAllowedException for wrong HTTP method', function () { - $this->router->post('/test', function () { - return new Response(200); - }); - - $request = new ServerRequest('GET', '/test'); - - expect(fn() => $this->router->dispatch($request)) - ->toThrow(League\Route\Http\Exception\MethodNotAllowedException::class); - }); - }); - - describe('route groups', function () { - it('supports route groups with prefix', function () { - $this->router->group('/api', function ($router) { - $router->get('/users', function () { - return new Response(200, [], 'Users list'); - }); - $router->get('/posts', function () { - return new Response(200, [], 'Posts list'); - }); - }); - - // Test /api/users - $request = new ServerRequest('GET', '/api/users'); - $response = $this->router->dispatch($request); - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('Users list'); - - // Test /api/posts - $request = new ServerRequest('GET', '/api/posts'); - $response = $this->router->dispatch($request); - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('Posts list'); - }); - }); -}); diff --git a/tests/Unit/Presentation/Http/Controllers/Web/LegacyControllerTest.php b/tests/Unit/Presentation/Http/Controllers/Web/LegacyControllerTest.php deleted file mode 100644 index 079593828..000000000 --- a/tests/Unit/Presentation/Http/Controllers/Web/LegacyControllerTest.php +++ /dev/null @@ -1,58 +0,0 @@ -shouldReceive('all')->andReturn([]); - $mockConfig->shouldReceive('get')->andReturn('/fake/path/'); - - // Create controller with mock config - $this->controller = new LegacyController($mockConfig); - }); - - afterEach(function () { - Mockery::close(); - }); - - describe('basic functionality', function () { - it('can be instantiated', function () { - expect($this->controller)->toBeInstanceOf(LegacyController::class); - }); - - it('implements proper method signature', function () { - $reflection = new ReflectionClass($this->controller); - $method = $reflection->getMethod('handle'); - - expect($method->getParameters())->toHaveCount(1); - expect($method->getParameters()[0]->getType()->getName())->toBe('Psr\Http\Message\ServerRequestInterface'); - }); - - it('returns PSR-7 response interface', function () { - $request = new ServerRequest('GET', 'http://example.com/nonexistent'); - - $response = $this->controller->handle($request); - expect($response)->toBeInstanceOf(\Psr\Http\Message\ResponseInterface::class); - }); - - it('returns 404 for non-existent files', function () { - $request = new ServerRequest('GET', 'http://example.com/nonexistent'); - - $response = $this->controller->handle($request); - expect($response->getStatusCode())->toBe(404); - }); - }); - - describe('security', function () { - it('prevents directory traversal', function () { - $request = new ServerRequest('GET', 'http://example.com/../../../etc/passwd'); - - $response = $this->controller->handle($request); - expect($response->getStatusCode())->toBe(404); - }); - }); -}); diff --git a/tests/Unit/Presentation/Http/KernelTest.php b/tests/Unit/Presentation/Http/KernelTest.php deleted file mode 100644 index 857f3d9a6..000000000 --- a/tests/Unit/Presentation/Http/KernelTest.php +++ /dev/null @@ -1,201 +0,0 @@ -container = new Container($diContainer); - - // Create a real router instance and register it in the container - $this->router = new Router($this->container); - $this->container->getWrappedContainer()->set(Router::class, $this->router); - - // Create kernel instance - $this->kernel = new Kernel($this->container); - - // Store original superglobals - $this->originalServer = $_SERVER; - $this->originalGet = $_GET; - $this->originalPost = $_POST; - }); - - afterEach(function () { - // Restore original superglobals - $_SERVER = $this->originalServer; - $_GET = $this->originalGet; - $_POST = $this->originalPost; - }); - - describe('route loading', function () { - it('loads routes from a file', function () { - // Create a temporary routes file - $routesFile = tempnam(sys_get_temp_dir(), 'routes'); - file_put_contents($routesFile, 'get("/test", function () { - return new \GuzzleHttp\Psr7\Response(200, [], "Test route"); - }); - }; - '); - - $this->kernel->loadRoutes($routesFile); - - // Clean up - unlink($routesFile); - - // Verify route was loaded by trying to handle it - $request = new ServerRequest('GET', 'http://example.com/test'); - $response = $this->kernel->handle($request); - - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('Test route'); - }); - - it('throws exception for non-existent routes file', function () { - $nonExistentFile = '/path/to/nonexistent/routes.php'; - - expect(fn() => $this->kernel->loadRoutes($nonExistentFile)) - ->toThrow(RuntimeException::class); - }); - }); - - describe('request handling', function () { - beforeEach(function () { - // Set up a test route - $routesFile = tempnam(sys_get_temp_dir(), 'routes'); - file_put_contents($routesFile, 'get("/hello", function () { - return new \GuzzleHttp\Psr7\Response(200, [], "Hello World"); - }); - $router->post("/submit", function ($request) { - $body = $request->getParsedBody(); - return new \GuzzleHttp\Psr7\Response(200, [], json_encode($body)); - }); - }; - '); - $this->kernel->loadRoutes($routesFile); - $this->routesFile = $routesFile; - }); - - afterEach(function () { - if (isset($this->routesFile)) { - unlink($this->routesFile); - } - }); - - it('handles GET requests', function () { - $request = new ServerRequest('GET', 'http://example.com/hello'); - $response = $this->kernel->handle($request); - - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('Hello World'); - }); - - it('handles POST requests', function () { - $request = new ServerRequest('POST', 'http://example.com/submit'); - $request = $request->withParsedBody(['name' => 'John']); - - $response = $this->kernel->handle($request); - - expect($response->getStatusCode())->toBe(200); - expect((string)$response->getBody())->toBe('{"name":"John"}'); - }); - - it('returns 404 for undefined routes', function () { - $request = new ServerRequest('GET', 'http://example.com/undefined'); - $response = $this->kernel->handle($request); - - expect($response->getStatusCode())->toBe(404); - }); - - it('returns 405 for wrong HTTP method', function () { - $request = new ServerRequest('POST', 'http://example.com/hello'); - $response = $this->kernel->handle($request); - - expect($response->getStatusCode())->toBe(405); - }); - }); - - describe('error handling', function () { - it('handles exceptions gracefully', function () { - // Set up a route that throws an exception - $routesFile = tempnam(sys_get_temp_dir(), 'routes'); - file_put_contents($routesFile, 'get("/error", function () { - throw new \RuntimeException("Test exception"); - }); - }; - '); - $this->kernel->loadRoutes($routesFile); - - $request = new ServerRequest('GET', 'http://example.com/error'); - $response = $this->kernel->handle($request); - - expect($response->getStatusCode())->toBe(500); - - // Clean up - unlink($routesFile); - }); - - it('logs exceptions when bb_log function exists', function () { - // This is hard to test without actually defining bb_log - // We'll just verify the error response structure - $routesFile = tempnam(sys_get_temp_dir(), 'routes'); - file_put_contents($routesFile, 'get("/error", function () { - throw new \Exception("Test error"); - }); - }; - '); - $this->kernel->loadRoutes($routesFile); - - $request = new ServerRequest('GET', 'http://example.com/error'); - $response = $this->kernel->handle($request); - - expect($response->getStatusCode())->toBe(500); - expect($response->getBody()->getContents())->toContain('Internal Server Error'); - - unlink($routesFile); - }); - }); - - describe('run method', function () { - it('creates request from globals and sends response', function () { - // Set up globals - $_SERVER['REQUEST_METHOD'] = 'GET'; - $_SERVER['REQUEST_URI'] = '/hello'; - $_SERVER['HTTP_HOST'] = 'example.com'; - $_GET = ['foo' => 'bar']; - - // Set up a route - $routesFile = tempnam(sys_get_temp_dir(), 'routes'); - file_put_contents($routesFile, 'get("/hello", function ($request) { - $query = $request->getQueryParams(); - return new \GuzzleHttp\Psr7\Response(200, [], $query["foo"] ?? "no foo"); - }); - }; - '); - $this->kernel->loadRoutes($routesFile); - - // Capture output - ob_start(); - $this->kernel->run(); - $output = ob_get_clean(); - - expect($output)->toContain('bar'); - - unlink($routesFile); - }); - }); -});