[
  {
    "path": ".github/.php-cs-fixer.php",
    "content": "<?php declare(strict_types = 1);\n\n$finder = Symfony\\Component\\Finder\\Finder::create()\n    ->notPath(dirname(__DIR__, 1) . '/bootstrap/*')\n    ->notPath(dirname(__DIR__, 1) . '/storage/*')\n    ->notPath(dirname(__DIR__, 1) . '/vendor')\n    ->notPath(dirname(__DIR__, 1) . '/resources/view/mail/*')\n    ->in([\n        dirname(__DIR__, 1) . '/src',\n        dirname(__DIR__, 1) . '/tests',\n    ])\n    ->name('*.php')\n    ->notName('*.blade.php')\n    ->ignoreDotFiles(true)\n    ->ignoreVCS(true);\n\nreturn (new PhpCsFixer\\Config())\n    ->setRules([\n        '@PSR2'                             => true,\n        'array_syntax'                      => ['syntax' => 'short'],\n        'ordered_imports'                   => ['sort_algorithm' => 'length'],\n        'no_unused_imports'                 => true,\n        'not_operator_with_successor_space' => true,\n        'trailing_comma_in_multiline'       => ['elements' => ['arrays']],\n        'phpdoc_scalar'                     => true,\n        'unary_operator_spaces'             => true,\n        'binary_operator_spaces'            => [\n            'operators' => ['=' => 'align', '=>' => 'align'],\n        ],\n        'blank_line_before_statement' => [\n            'statements' => ['break', 'continue', 'declare', 'return', 'throw', 'try'],\n        ],\n        'phpdoc_single_line_var_spacing' => true,\n        'phpdoc_var_without_name'        => true,\n        'class_attributes_separation'    => [\n            'elements' => [\n               'method'   => 'one',\n               'property' => 'one',\n            ],\n        ],\n        'method_argument_space' => [\n            'on_multiline'                     => 'ensure_fully_multiline',\n            'keep_multiple_spaces_after_comma' => true,\n        ],\n        'method_chaining_indentation'        => true,\n        'object_operator_without_whitespace' => true,\n        'no_superfluous_phpdoc_tags'         => true,\n        'function_declaration'               => [\n            'closure_function_spacing' => 'none',\n        ],\n    ])\n    ->setFinder($finder);\n"
  },
  {
    "path": ".github/workflows/style.yml",
    "content": "name: styling\n\non: [push]\n\njobs:\n  style:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v2\n\n      - name: Run PHP CS Fixer\n        uses: docker://oskarstark/php-cs-fixer-ga\n        with:\n          args: --config=.github/.php-cs-fixer.php --allow-risky=yes\n\n      - name: Extract branch name\n        shell: bash\n        run: echo \"##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})\"\n        id: extract_branch\n\n      - name: Commit changes\n        uses: stefanzweifel/git-auto-commit-action@v2.3.0\n        with:\n          commit_message: Fix styling\n          branch: ${{ steps.extract_branch.outputs.branch }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/tests.yml",
    "content": "name: tests\n\non: [push, pull_request]\n\njobs:\n  phpunit:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      fail-fast: true\n      matrix:\n        os: [ubuntu-latest]\n        php: [8.0]\n        laravel: [8.*]\n        dependency-version: [prefer-stable]\n        include:\n          - laravel: 8.*\n            testbench: 6.*\n\n    name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.dependency-version }} - ${{ matrix.os }}\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v2\n\n      - name: Cache composer dependencies\n        uses: actions/cache@v1\n        with:\n          path: ~/.composer/cache/files\n          key: dependencies-laravel-${{ matrix.laravel }}-php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }}\n\n      - name: Setup PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: ${{ matrix.php }}\n          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick\n          coverage: none\n\n      - name: Run composer\n        run: |\n          composer require \"laravel/framework:${{ matrix.laravel }}\" \"orchestra/testbench:${{ matrix.testbench }}\" --no-interaction --no-update\n          composer update --${{ matrix.dependency-version }} --prefer-dist --no-interaction --no-suggest\n\n      - name: Run tests\n        run: vendor/bin/phpunit"
  },
  {
    "path": ".gitignore",
    "content": "build\ncomposer.lock\nvendor\n.DS_Store\ncoverage\n.phpunit.result.cache\n.idea\n.php_cs.cache\n"
  },
  {
    "path": ".php-cs-fixer.cache",
    "content": "{\"php\":\"8.1.12\",\"version\":\"3.13.0\",\"indent\":\"    \",\"lineEnding\":\"\\n\",\"rules\":{\"blank_line_after_namespace\":true,\"braces\":true,\"class_definition\":true,\"constant_case\":true,\"elseif\":true,\"function_declaration\":{\"closure_function_spacing\":\"none\"},\"indentation_type\":true,\"line_ending\":true,\"lowercase_keywords\":true,\"method_argument_space\":{\"on_multiline\":\"ensure_fully_multiline\",\"keep_multiple_spaces_after_comma\":true},\"no_break_comment\":true,\"no_closing_tag\":true,\"no_space_around_double_colon\":true,\"no_spaces_after_function_name\":true,\"no_spaces_inside_parenthesis\":true,\"no_trailing_whitespace\":true,\"no_trailing_whitespace_in_comment\":true,\"single_blank_line_at_eof\":true,\"single_class_element_per_statement\":{\"elements\":[\"property\"]},\"single_import_per_statement\":true,\"single_line_after_imports\":true,\"switch_case_semicolon_to_colon\":true,\"switch_case_space\":true,\"visibility_required\":{\"elements\":[\"method\",\"property\"]},\"encoding\":true,\"full_opening_tag\":true,\"array_syntax\":{\"syntax\":\"short\"},\"ordered_imports\":{\"sort_algorithm\":\"length\"},\"no_unused_imports\":true,\"not_operator_with_successor_space\":true,\"trailing_comma_in_multiline\":{\"elements\":[\"arrays\"]},\"phpdoc_scalar\":true,\"unary_operator_spaces\":true,\"binary_operator_spaces\":{\"operators\":{\"=\":\"align\",\"=>\":\"align\"}},\"blank_line_before_statement\":{\"statements\":[\"break\",\"continue\",\"declare\",\"return\",\"throw\",\"try\"]},\"phpdoc_single_line_var_spacing\":true,\"phpdoc_var_without_name\":true,\"class_attributes_separation\":{\"elements\":{\"method\":\"one\",\"property\":\"one\"}},\"method_chaining_indentation\":true,\"object_operator_without_whitespace\":true,\"no_superfluous_phpdoc_tags\":true},\"hashes\":{\"src\\/Types\\/Rule.php\":\"f9bf5c42f39c2c66885642062544f9ae\",\"src\\/Support\\/Iso3166Alpha2.php\":\"977a855bb9b105ca5419f3ec40218f1f\",\"src\\/Support\\/Iso6391Alpha2.php\":\"0d338792e3be972d4b04949a87e2825d\",\"src\\/Support\\/Iso6391Alpha3.php\":\"f7b12294d0754242083378b1ad781d13\",\"src\\/Support\\/Iso3166Alpha3.php\":\"e61f7a9197f01a97738c98cb45a810c4\",\"src\\/Rules\\/Uppercase.php\":\"f9c7d4e41b30a979704c09da1de352aa\",\"src\\/Rules\\/OddNumber.php\":\"127c80a2273da899dbfb40b5ee0f2f20\",\"src\\/Rules\\/WithoutWhitespace.php\":\"0452e02c5dbce7c62a60d54afc597c00\",\"src\\/Rules\\/LanguageCode.php\":\"811cca348dce882fe8103c320528fda7\",\"src\\/Rules\\/HexColor.php\":\"a3085f26f7515a70c455062373f95ffc\",\"src\\/Rules\\/EvenNumber.php\":\"8a7ede45e64335e094edc709f80f2363\",\"src\\/Rules\\/CountryCode.php\":\"d5988befd25a6f27723f13725f46c969\",\"src\\/Rules\\/MacAddress.php\":\"4b0f37bf8f01146a2f3ea44b047cc6e2\",\"src\\/Rules\\/Missing.php\":\"1b561aa4f9c28e118b35c0d306e27f85\",\"src\\/Rules\\/TelephoneNumber.php\":\"4477f8103bf10814c8f54464625c7703\",\"src\\/Rules\\/FileExists.php\":\"adac5de044852641e4ad22611c41656c\",\"src\\/Rules\\/DisposableEmail.php\":\"bf135848034f3ddfb129d3720233e5e5\",\"src\\/Rules\\/Lowercase.php\":\"5b629fe98b41c8b8b191ea01f4104f01\",\"src\\/Rules\\/MonetaryFigure.php\":\"83d45cbc19f3ce41550c827b7d5a9730\",\"src\\/Rules\\/EncodedImage.php\":\"e387707eb1db81eaeb498f291a93af08\",\"src\\/Rules\\/Domain.php\":\"e1357d4136b335e12a376d95729de996\",\"src\\/Rules\\/StrongPassword.php\":\"d414d601649e5600216aedce2db61e98\",\"src\\/Rules\\/RecordOwner.php\":\"c67fc6fbe3d8512f1e02ebbd77bfe9d8\",\"src\\/Rules\\/Decimal.php\":\"ce2d2a7a78a0a472b529420a33c2aeed\",\"src\\/Rules\\/CitizenIdentification.php\":\"650686d27727e1cd99342589d3fc7172\",\"src\\/Rules\\/MaxWords.php\":\"67471f9303a67921a9b7fe9ead48fc95\",\"src\\/Rules\\/Titlecase.php\":\"493e62b25b28952c5e7e08202e644bd1\",\"src\\/Rules\\/LocationCoordinates.php\":\"087a31db1e6d89256b9fccedc6fde831\",\"src\\/Rules\\/ISBN.php\":\"91fc0dd80d661e62572b5513d2cdafce\",\"tests\\/TitlecaseTest.php\":\"44818cd053258daaaa9c3fd8a24954e0\",\"tests\\/EncodedImageTest.php\":\"7e467b19ea98d9a30e90f15237f94666\",\"tests\\/TelephoneNumberTest.php\":\"b849a62d71b6b8d755fdfabc2b05efe4\",\"tests\\/StrongPasswordTest.php\":\"c625d322e42a24eec283c24082f15c92\",\"tests\\/MaxWordsTest.php\":\"3845fe73f45cc1ecf531b9d7d01969c6\",\"tests\\/LocationCoordinatesTest.php\":\"b0c195e0905872f82ea2053f7f842407\",\"tests\\/ISBNTest.php\":\"8f1e2b1bd3cb90a62a64e1c9e84e6e2a\",\"tests\\/DisposableEmailTest.php\":\"9e3eeeb2798b7cfbb5464263941cf593\",\"tests\\/UppercaseTest.php\":\"aa629098e7730edd79ffef17774457d6\",\"tests\\/MissingTest.php\":\"a73231ec3647e657e6647bc9f98049a9\",\"tests\\/EvenNumber.php\":\"62d66c4156664bea8e22eb9dc16e3f0b\",\"tests\\/CountryCodeTest.php\":\"c5931a09a59d1c4301bb395514176ab2\",\"tests\\/MonetaryFigureTest.php\":\"23b5d3a7e1a5ada65457ea83782bd215\",\"tests\\/MacAddress.php\":\"c5e0832ee35e456b1d2b782a798f7317\",\"tests\\/WithoutWhitespaceTest.php\":\"5e48e97dd571af93ce4c6f7e6e7667c4\",\"tests\\/FileExistsTest.php\":\"669c72bdce17d6e539ccb63c8d4f0e49\",\"tests\\/DecimalTest.php\":\"c69a10f7515876c7102509b7e8740b6a\",\"tests\\/LanguageCodeTest.php\":\"49d8063cf5ca0312791cab23a79eb208\",\"tests\\/RecordOwnerTest.php\":\"21cfdccbab1756768bbc6fac8594438e\",\"tests\\/DomainTest.php\":\"f239784278efaefdb1579d5bf507c78c\",\"tests\\/LowercaseTest.php\":\"374d9354b640d243422616627322a896\",\"tests\\/HexColorTest.php\":\"dfa9062e0e64db1c87c868be848b0762\",\"tests\\/OddNumberTest.php\":\"190eb439f5cd5949fe590cefa174fb78\",\"tests\\/CitizenIdentificationTest.php\":\"940fc4740f2686c1211d6a3a2ef53511\"}}"
  },
  {
    "path": "LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright © Caneara and contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Axiom\n\nThis package provides a library of reusable validation rules for your Laravel projects. Use them to augment the existing set provided by Laravel itself.\n\n## Installation\n\nPull in the package using composer\n\n```bash\ncomposer require caneara/axiom\n```\n\n## Upgrading\n\nAxiom includes several breaking changes from the original package, so you'll need to follow these steps if you were using the old version:\n\n1. Ensure that you are using PHP 7.4 or later.\n2. Remove `alphametric/laravel-validation-rules` from your `composer.json` file.\n3. Run `composer update` to remove the package from your `vendor` directory.\n4. Install Axiom by running `composer require caneara/axiom`.\n5. Replace all instances of `use Alphametric\\Validation` with `use Axiom`.\n6. The `EndsWith` rule has been removed as Laravel now natively supports this.\n7. The `Equals` rule has been removed. Instead, you should use Laravel's native `in` rule with a single option.\n8. The `DoesNotExist` rule has been renamed to `Missing`.\n\n## Usage\n\nAs per the Laravel [documentation](https://laravel.com/docs/master/validation#using-rule-objects), simply import the relevant validation class wherever you require it, and then include it within the rules for a particular field:\n\n```php\nuse Axiom\\Rules\\StrongPassword;\n\n// ...\n\n$request->validate([\n    'password' => ['bail', 'required', new StrongPassword],\n]);\n```\n\n**IMPORTANT**: As with all custom rules, you cannot use a pipe-delimited string. You must instead use an `array` e.g.\n\n```php\n'password' => ['bail', 'required', new StrongPassword] // correct\n'password' => 'bail|required|new StrongPassword'       // wrong\n```\n\nIf the validation fails, the package will attempt to respond with a localized error message (see message keys below). If the key does not exist, it will fall back to a hard-coded English language version.\n\n## Available rules\n\nThe following validation rules are currently available:\n\n| Rule                  | Message Key                       | Description                                                                                                           |\n| --------------------- | --------------------------------- | --------------------------------------------------------------------------------------------------------------------- |\n| StrongPassword        | validation.strong_password        | Requires the presence of a \"strong\" password - see class for details                                                  |\n| TelephoneNumber       | validation.telephone_number       | Requires the presence of a valid telephone number - see class for details                                             |\n| RecordOwner           | validation.record_owner           | Requires the authenticated user's id to match the user_id column on a given database record e.g. owner:posts,id       |\n| MonetaryFigure        | validation.monetary_figure        | Requires the presence of a monetary figure e.g $72.33 - see class for details                                         |\n| DisposableEmail       | validation.disposable_email       | Requires the presence of an email address which is not disposable                                                     |\n| Missing               | validation.missing                | Requires that the given value is not present in a given database table / column - see class for details               |\n| Decimal               | validation.decimal                | Requires that the given value is a decimal with an appropriate format - see class for details                         |\n| EncodedImage          | validation.encoded_image          | Requires that the given value is a base64-encoded image of a given mime types - see class for details                  |\n| LocationCoordinates   | validation.location_coordinates   | Requires that the given value is a comma-separated set of latitude and longitude coordinates                          |\n| FileExists            | validation.file_exists            | Requires that the given value is a path to an existing file - see class for details                                   |\n| MacAddress            | validation.mac_address            | Requires that the given value is a valid MAC address                                                                  |\n| ISBN                  | validation.isbn                   | Requires that the given value is a valid ISBN-10 or ISBN-13 number                                                    |\n| EvenNumber            | validation.even_number            | Requires that the given value is an even number (decimals are first converted using intval)                           |\n| OddNumber             | validation.odd_number             | Requires that the given value is an odd number (decimals are first converted using intval)                            |\n| Lowercase             | validation.lowercase              | Requires that the given value is a lower case string                                                                  |\n| Uppercase             | validation.uppercase              | Requires that the given value is a upper case string                                                                  |\n| Titlecase             | validation.titlecase              | Requires that the given value is a title case string                                                                  |\n| Domain                | validation.domain                 | Requires that the given value be a domain e.g. google.com, www.google.com                                             |\n| CitizenIdentification | validation.citizen_identification | Requires that the given value be a citizen identification number of USA, UK, France, Brazil or Vietnam (see class for details) |\n| WithoutWhitespace     | validation.without_whitespace     | Requires that the given value not include any whitespace characters                                                   |\n| MaxWords              | validation.max_words              | Requires that the given value cannot contain more words than specified                                                |\n| HexColor              | validation.hex_color              | Requires that the given value is a valid hex color eg. #fff, #0f0f0f, #00ff0080                                       |\n\n## Contributing\n\nThank you for considering a contribution to Axiom. You are welcome to submit a PR containing improvements, however if they are substantial in nature, please also be sure to include a test or tests.\n\n## License\n\nThe MIT License (MIT). Please see [License File](LICENSE.md) for more information.\n"
  },
  {
    "path": "composer.json",
    "content": "{\n    \"name\": \"caneara/axiom\",\n    \"description\": \"A package that provides a library of reusable Laravel validation rules.\",\n    \"keywords\": [\n        \"axiom\",\n        \"php\",\n        \"laravel\",\n        \"validation\",\n        \"rules\"\n    ],\n    \"type\": \"library\",\n    \"license\": \"MIT\",\n    \"homepage\": \"https://github.com/caneara/axiom\",\n    \"autoload\": {\n        \"psr-4\": {\n            \"Axiom\\\\\": \"src\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"Axiom\\\\Tests\\\\\": \"tests\"\n        }\n    },\n    \"require\": {\n        \"php\": \"^7.4|^8.0\"\n    },\n    \"require-dev\": {\n        \"orchestra/testbench\": \"^6.0\",\n        \"phpunit/phpunit\": \"^9.0\"\n    },\n    \"scripts\": {\n        \"test\": \"vendor/bin/phpunit\"\n    },\n    \"minimum-stability\": \"stable\"\n}\n"
  },
  {
    "path": "phpunit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" bootstrap=\"vendor/autoload.php\" backupGlobals=\"false\" backupStaticAttributes=\"false\" colors=\"true\" verbose=\"true\" convertErrorsToExceptions=\"true\" convertNoticesToExceptions=\"true\" convertWarningsToExceptions=\"true\" processIsolation=\"false\" stopOnFailure=\"false\" xsi:noNamespaceSchemaLocation=\"https://schema.phpunit.de/9.3/phpunit.xsd\">\n  <coverage>\n    <include>\n      <directory suffix=\".php\">src/</directory>\n    </include>\n  </coverage>\n  <testsuites>\n    <testsuite name=\"Test Suite\">\n      <directory>tests</directory>\n    </testsuite>\n  </testsuites>\n</phpunit>\n"
  },
  {
    "path": "src/Rules/CitizenIdentification.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\nuse Axiom\\Support\\Iso3166Alpha2;\nuse Axiom\\Support\\Iso3166Alpha3;\n\nclass CitizenIdentification extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     * The rule requires one parameter:\n     * 1. The identification type to use ('USA' or 'US, 'GBR' or 'GB', 'FRA' or 'FR', 'BRA' or 'BR').\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        $array = ($this->parameters[0] ?? 2) === 2 ? Iso3166Alpha2::$codes : Iso3166Alpha3::$codes;\n\n        switch (mb_strtoupper($this->parameters[0] ?? 'USA')) {\n            case 'US':\n            case 'USA':\n                return $this->verifyUnitedStates($value);\n\n            case 'GB':\n            case 'GBR':\n                return $this->verifyUnitedKingdom($value);\n\n            case 'FR':\n            case 'FRA':\n                return $this->verifyFrance($value);\n\n            case 'BR':\n            case 'BRA':\n                return $this->verifyBrazil($value);\n            \n            case 'VI':\n            case 'VN':\n                return $this->verifyVietnam($value);\n\n            default:\n                return false;\n        }\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'citizen_identification',\n            'The :attribute must be a valid form of identification'\n        );\n    }\n\n    /**\n     * Verify whether the given value is a valid French citizen number.\n     *\n     **/\n    protected function verifyFrance($value) : bool\n    {\n        return preg_match('/^[1,2][ ]?[0-9]{2}[ ]?[0,1,2,3,5][0-9][ ]?[0-9A-Z]{5}[ ]?[0-9]{3}[ ]?[0-9]{2}$/', $value) > 0;\n    }\n\n    /**\n     * Verify whether the given value is a valid United Kingdom citizen number.\n     *\n     **/\n    protected function verifyUnitedKingdom($value) : bool\n    {\n        return preg_match('/^[A-CEGHJ-PR-TW-Z]{1}[A-CEGHJ-NPR-TW-Z]{1}[0-9]{6}[A-DFM]{0,1}$/', $value) > 0;\n    }\n\n    /**\n     * Verify whether the given value is a valid United States citizen number.\n     *\n     **/\n    protected function verifyUnitedStates($value) : bool\n    {\n        return preg_match('/^(?!000|666)[0-8][0-9]{2}-(?!00)[0-9]{2}-(?!0000)[0-9]{4}$/', $value) > 0;\n    }\n\n    /**\n     * Verify whether the given value is a valid Brazil citizen number.\n     *\n     **/\n    protected function verifyBrazil($value) : bool\n    {\n        $value = preg_replace('/[^0-9]/is', '', $value);\n\n        if (strlen($value) !== 11 || preg_match('/(\\d)\\1{10}/', $value)) {\n            return false;\n        }\n\n        for ($t = 9; $t < 11; $t++) {\n            for ($d = 0, $c = 0; $c < $t; $c++) {\n                $d += $value[$c] * (($t + 1) - $c);\n            }\n\n            $d = ((10 * $d) % 11) % 10;\n\n            if ($value[$c] != $d) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * Verify whether the given value is a valid Vietnam citizen number.\n     *\n     **/\n    protected function verifyVietnam($value) : bool\n    {\n        $state        = '0\\d{2}'; // state code\n        $century      = ceil(date('Y') / 100); // current century\n        $minNumGender = 0; //century: 20, male: 0, female: 1\n        // 20: begin century\n        $maxNumGender = 1 + ($century - 20) * 2; //ex: century: 21, male: 2, female: 3. max: century: 25, male: 8, female: 9\n        $numBirth     = '\\d{2}'; // last 2 number of birth year\n        $numRand      = '\\d{6}'; // 6 random number\n\n        return preg_match('/^'.$state.'['.$minNumGender.'-'.$maxNumGender.']'.$numBirth.$numRand.'$/', $value) > 0;\n    }\n}\n"
  },
  {
    "path": "src/Rules/CountryCode.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\nuse Axiom\\Support\\Iso3166Alpha2;\nuse Axiom\\Support\\Iso3166Alpha3;\n\nclass CountryCode extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        $array = ($this->parameters[0] ?? 2) === 2 ? Iso3166Alpha2::$codes : Iso3166Alpha3::$codes;\n\n        return array_key_exists(strtoupper($value), $array);\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'country_code',\n            'The :attribute must be a valid ISO 3166-1 alpha-' . ($this->parameters[0] ?? 2) . ' country code'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/Decimal.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass Decimal extends Rule\n{\n    /**\n     * Generate an example value that satisifies the validation rule.\n     *\n     **/\n    public function example() : string\n    {\n        return mt_rand(1, (int) str_repeat('9', $this->parameters[0])) . '.' .\n               mt_rand(1, (int) str_repeat('9', $this->parameters[1]));\n    }\n\n    /**\n     * Determine if the validation rule passes.\n     *\n     * The rule has two parameters:\n     * 1. The maximum number of digits before the decimal point.\n     * 2. The maximum number of digits after the decimal point.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return preg_match(\n            \"/^[0-9]{1,{$this->parameters[0]}}(\\.[0-9]{1,{$this->parameters[1]}})$/\",\n            $value\n        ) > 0;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'decimal',\n            'The :attribute must be an appropriately formatted decimal e.g. ' . $this->example()\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/DisposableEmail.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Exception;\nuse Axiom\\Types\\Rule;\nuse Illuminate\\Support\\Str;\n\nclass DisposableEmail extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     * By default, if the API fails to load, the email will\n     * be accepted. However, you can override this by adding\n     * a boolean parameter e.g. new DisposableEmail(true).\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        $url = 'https://open.kickbox.com/v1/disposable/' . Str::after($value, '@');\n\n        try {\n            return ! json_decode(file_get_contents($url), true)['disposable'];\n        } catch (Exception $ex) {\n            return ($this->parameters[0] ?? false) ? false : true;\n        }\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'disposable_email',\n            'The :attribute must be a valid, non-disposable domain'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/Domain.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass Domain extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return preg_match('/^([\\w-]+\\.)*[\\w\\-]+\\.\\w{2,10}$/', $value) > 0;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'domain',\n            'The :attribute must be a valid domain without an http protocol e.g. google.com, www.google.com'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/EncodedImage.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\nuse Illuminate\\Support\\Str;\nuse Illuminate\\Http\\UploadedFile;\n\nclass EncodedImage extends Rule\n{\n    /**\n     * Pointer to the temporary file.\n     *\n     **/\n    protected $file;\n\n    /**\n     * Write the given data to a temporary file.\n     *\n     **/\n    protected function createTemporaryFile(string $data) : UploadedFile\n    {\n        $this->file = tmpfile();\n\n        fwrite($this->file, base64_decode(Str::after($data, 'base64,')));\n\n        return new UploadedFile(\n            stream_get_meta_data($this->file)['uri'],\n            'image',\n            'text/plain',\n            null,\n            true,\n            true\n        );\n    }\n\n    /**\n     * Determine if the validation rule passes.\n     *\n     * The rule requires at least a single parameter, which is\n     * the expected mime types of the file e.g. png, jpeg etc.\n     * You can also supply multiple mime types as an array.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        $valid_mime = false;\n\n        foreach ($this->parameters as $mime) {\n            if (Str::startsWith($value, \"data:image/$mime;base64,\")) {\n                $valid_mime = true;\n\n                break;\n            }\n        }\n\n        if ($valid_mime) {\n            $result = validator(['file' => $this->createTemporaryFile($value)], ['file' => 'image'])->passes();\n\n            fclose($this->file);\n\n            return $result;\n        }\n\n        return false;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        $mimes = $this->parameters;\n\n        if (count($mimes) === 1) {\n            return $this->getLocalizedErrorMessage(\n                'encoded_image',\n                'The :attribute must be a valid ' . $mimes[0] . ' image'\n            );\n        }\n\n        $mimes[count($mimes) - 1] = 'or ' . $mimes[count($mimes) - 1];\n\n        return $this->getLocalizedErrorMessage(\n            'encoded_image',\n            'The :attribute must be a valid ' . implode(', ', $mimes) . ' image'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/EvenNumber.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass EvenNumber extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return intval($value) % 2 === 0;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'even_number',\n            'The :attribute must be an even number'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/FileExists.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\nuse Illuminate\\Support\\Facades\\Storage;\n\nclass FileExists extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     * The rule has two parameters:\n     * 1. The disk defined in your config file.\n     * 2. The directory to search within.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        $path = rtrim($this->parameters[1] ?? '', '/');\n        $file = ltrim($value, '/');\n\n        return Storage::disk($this->parameters[0])->exists(\"$path/$file\");\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'file_exists',\n            'The file specified for :attribute does not exist'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/HexColor.php",
    "content": "<?php\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass HexColor extends Rule\n{\n    /**\n     * Hex color regex formats.\n     *\n     */\n    private array $formats = [\n        4 => '/^#([a-fA-F0-9]{3})$/i',\n        7 => '/^#([a-fA-F0-9]{6})$/i',\n        9 => '/^#([a-fA-F0-9]{6}[0-9]{2})$/i',\n    ];\n\n    /**\n     * Determines if the rule passes.\n     *\n     * @param string $attribute\n     *\n     * @return bool\n     */\n    public function passes($attribute, $value)\n    {\n        if (! is_string($value) || ! in_array(strlen($value), array_keys($this->formats))) {\n            return false;\n        }\n\n        $match = preg_match($this->formats[strlen($value)], $value);\n\n        return $match > 0;\n    }\n\n    /**\n     * Message returned on validation failure.\n     *\n     * @return array|string\n     */\n    public function message()\n    {\n        return $this->getLocalizedErrorMessage(\n            'hex_color',\n            'The :attribute has to be a valid hex color.'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/ISBN.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass ISBN extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return preg_match(\n            '/^(?:ISBN(-1(?:(0)|3))?:?\\ )?(?(1)(?(2)(?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$)[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]|(?=[0-9]{13}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)97[89][- ]?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9])|(?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X])$/',\n            $value\n        ) > 0;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'ISBN',\n            'The :attribute must be a valid ISBN 10 or ISBN 13 number'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/LanguageCode.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\nuse Axiom\\Support\\Iso6391Alpha2;\nuse Axiom\\Support\\Iso6391Alpha3;\n\nclass LanguageCode extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        $array = ($this->parameters[0] ?? 2) === 2 ? Iso6391Alpha2::$codes : Iso6391Alpha3::$codes;\n\n        return array_key_exists(strtoupper($value), $array);\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'language_code',\n            'The :attribute must be a valid ISO 639-1 alpha-' . ($this->parameters[0] ?? 2) . ' language code'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/LocationCoordinates.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass LocationCoordinates extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     * The latitude and longitude may have a maximum of\n     * eight digits after the decimal point. This provides\n     * an accuracy of up to ~1 millimeter.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return preg_match(\n            '/^[-]?((([0-8]?[0-9])(\\.(\\d{1,8}))?)|(90(\\.0+)?)),\\s?[-]?((((1[0-7][0-9])|([0-9]?[0-9]))(\\.(\\d{1,8}))?)|180(\\.0+)?)$/',\n            $value\n        ) > 0;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'location_coordinates',\n            'The :attribute must be a valid set of latitude and longitude coordinates, with a limit of 8 digits after a decimal point'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/Lowercase.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass Lowercase extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return mb_strtolower($value) === $value;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'lowercase',\n            'The :attribute must be entirely lowercase text'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/MacAddress.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass MacAddress extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return preg_match('/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/', $value) > 0;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'mac_address',\n            'The :attribute must be a valid MAC address'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/MaxWords.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass MaxWords extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return count(preg_split('~[^\\p{L}\\p{N}\\']+~u', $value)) <= $this->parameters[0];\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'max_words',\n            'The :attribute cannot be longer than ' . $this->parameters[0] . ' words.'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/Missing.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass Missing extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     * The rule requires two parameters:\n     * 1. The database table to use.\n     * 2. The column on the table to compare the value against.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return DB::table($this->parameters[0])\n            ->where($this->parameters[1], $value)\n            ->doesntExist();\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'missing',\n            'The :attribute already exists'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/MonetaryFigure.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass MonetaryFigure extends Rule\n{\n    /**\n     * Generate an example value that satisifies the validation rule.\n     *\n     **/\n    public function example() : string\n    {\n        return $this->parameters[0] .\n               mt_rand(1, (int) str_repeat('9', $this->parameters[1])) . '.' .\n               mt_rand(1, (int) str_repeat('9', $this->parameters[2]));\n    }\n\n    /**\n     * Determine if the validation rule passes.\n     *\n     * The monetary figure requires three parameters:\n     * 1. The currency symbol required e.g. '$', '£', '€'.\n     * 2. The maximum number of digits before the decimal point.\n     * 3. The maximum number of digits after the decimal point.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return preg_match(\n            \"/^\\\\{$this->parameters[0]}[0-9]{1,{$this->parameters[1]}}(\\.[0-9]{1,{$this->parameters[2]}})?$/\",\n            $value\n        ) > 0;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'monetary_figure',\n            'The :attribute must be a monetary figure e.g. ' . $this->example()\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/OddNumber.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass OddNumber extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return intval($value) % 2 !== 0;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'odd_number',\n            'The :attribute must be an odd number'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/RecordOwner.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Auth;\n\nclass RecordOwner extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     * The rule requires two parameters:\n     * 1. The database table to use.\n     * 2. The column on the table to compare the value against.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return DB::table($this->parameters[0])\n            ->where($this->parameters[1], $value)\n            ->where('user_id', Auth::id())\n            ->exists();\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'record_owner',\n            'You do not have permission to interact with this resource'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/StrongPassword.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass StrongPassword extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     * The password must be 12 - 30 characters in length,\n     * and include a number, a symbol, an upper case letter,\n     * and a lower case letter.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return preg_match(\n            '/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@()$%^&*=_{}[\\]:;\"\\'|\\\\<>,.\\/~`±§+-]).{12,30}$/',\n            $value\n        ) > 0;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'strong_password',\n            'The :attribute must be 12–30 characters, and include a number, a symbol, a lower and a upper case letter'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/TelephoneNumber.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass TelephoneNumber extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     * The telephone number must be 7 - 15 characters in length,\n     * and comprised entirely of integers.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return preg_match('/^[0-9]{7,15}$/', $value) > 0;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'telephone_number',\n            'The :attribute must be a valid telephone number (7 - 15 digits in length)'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/Titlecase.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass Titlecase extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return ucwords($value) === $value;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'titlecase',\n            'Each word in :attribute must begin with a capital letter'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/Uppercase.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass Uppercase extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return mb_strtoupper($value) === $value;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'uppercase',\n            'The :attribute must be entirely uppercase text'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Rules/WithoutWhitespace.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules;\n\nuse Axiom\\Types\\Rule;\n\nclass WithoutWhitespace extends Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     **/\n    public function passes($attribute, $value) : bool\n    {\n        return preg_match('/\\s/', $value) === 0;\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     **/\n    public function message() : string\n    {\n        return $this->getLocalizedErrorMessage(\n            'without_whitespace',\n            'The :attribute must be an unbroken string of text, it cannot include spaces'\n        );\n    }\n}\n"
  },
  {
    "path": "src/Support/Iso3166Alpha2.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Support;\n\nclass Iso3166Alpha2\n{\n    /**\n     * Array of countries with their ISO 3166-1 alpha-2 codes.\n     *\n     **/\n    public static array $codes = [\n        'AD' => 'Andorra',\n        'AE' => 'United Arab Emirates',\n        'AF' => 'Afghanistan',\n        'AG' => 'Antigua and Barbuda',\n        'AI' => 'Anguilla',\n        'AL' => 'Albania',\n        'AM' => 'Armenia',\n        'AO' => 'Angola',\n        'AQ' => 'Antarctica',\n        'AR' => 'Argentina',\n        'AS' => 'American Samoa',\n        'AT' => 'Austria',\n        'AU' => 'Australia',\n        'AW' => 'Aruba',\n        'AX' => 'Åland Islands',\n        'AZ' => 'Azerbaijan',\n        'BA' => 'Bosnia and Herzegovina',\n        'BB' => 'Barbados',\n        'BD' => 'Bangladesh',\n        'BE' => 'Belgium',\n        'BF' => 'Burkina Faso',\n        'BG' => 'Bulgaria',\n        'BH' => 'Bahrain',\n        'BI' => 'Burundi',\n        'BJ' => 'Benin',\n        'BL' => 'Saint Barthélemy',\n        'BM' => 'Bermuda',\n        'BN' => 'Brunei Darussalam',\n        'BO' => 'Bolivia, Plurinational State of',\n        'BQ' => 'Bonaire, Sint Eustatius and Saba',\n        'BR' => 'Brazil',\n        'BS' => 'Bahamas',\n        'BT' => 'Bhutan',\n        'BV' => 'Bouvet Island',\n        'BW' => 'Botswana',\n        'BY' => 'Belarus',\n        'BZ' => 'Belize',\n        'CA' => 'Canada',\n        'CC' => 'Cocos (Keeling) Islands',\n        'CD' => 'Congo, the Democratic Republic of the',\n        'CF' => 'Central African Republic',\n        'CG' => 'Congo',\n        'CH' => 'Switzerland',\n        'CI' => 'Côte d\\'Ivoire',\n        'CK' => 'Cook Islands',\n        'CL' => 'Chile',\n        'CM' => 'Cameroon',\n        'CN' => 'China',\n        'CO' => 'Colombia',\n        'CR' => 'Costa Rica',\n        'CU' => 'Cuba',\n        'CV' => 'Cabo Verde',\n        'CW' => 'Curaçao',\n        'CX' => 'Christmas Island',\n        'CY' => 'Cyprus',\n        'CZ' => 'Czechia',\n        'DE' => 'Germany',\n        'DJ' => 'Djibouti',\n        'DK' => 'Denmark',\n        'DM' => 'Dominica',\n        'DO' => 'Dominican Republic',\n        'DZ' => 'Algeria',\n        'EC' => 'Ecuador',\n        'EE' => 'Estonia',\n        'EG' => 'Egypt',\n        'EH' => 'Western Sahara',\n        'ER' => 'Eritrea',\n        'ES' => 'Spain',\n        'ET' => 'Ethiopia',\n        'FI' => 'Finland',\n        'FJ' => 'Fiji',\n        'FK' => 'Falkland Islands (Malvinas)',\n        'FM' => 'Micronesia, Federated States of',\n        'FO' => 'Faroe Islands',\n        'FR' => 'France',\n        'GA' => 'Gabon',\n        'GB' => 'United Kingdom of Great Britain and Northern Ireland',\n        'GD' => 'Grenada',\n        'GE' => 'Georgia',\n        'GF' => 'French Guiana',\n        'GG' => 'Guernsey',\n        'GH' => 'Ghana',\n        'GI' => 'Gibraltar',\n        'GL' => 'Greenland',\n        'GM' => 'Gambia',\n        'GN' => 'Guinea',\n        'GP' => 'Guadeloupe',\n        'GQ' => 'Equatorial Guinea',\n        'GR' => 'Greece',\n        'GS' => 'South Georgia and the South Sandwich Islands',\n        'GT' => 'Guatemala',\n        'GU' => 'Guam',\n        'GW' => 'Guinea-Bissau',\n        'GY' => 'Guyana',\n        'HK' => 'Hong Kong',\n        'HM' => 'Heard Island and McDonald Islands',\n        'HN' => 'Honduras',\n        'HR' => 'Croatia',\n        'HT' => 'Haiti',\n        'HU' => 'Hungary',\n        'ID' => 'Indonesia',\n        'IE' => 'Ireland',\n        'IL' => 'Israel',\n        'IM' => 'Isle of Man',\n        'IN' => 'India',\n        'IO' => 'British Indian Ocean Territory',\n        'IQ' => 'Iraq',\n        'IR' => 'Iran, Islamic Republic of',\n        'IS' => 'Iceland',\n        'IT' => 'Italy',\n        'JE' => 'Jersey',\n        'JM' => 'Jamaica',\n        'JO' => 'Jordan',\n        'JP' => 'Japan',\n        'KE' => 'Kenya',\n        'KG' => 'Kyrgyzstan',\n        'KH' => 'Cambodia',\n        'KI' => 'Kiribati',\n        'KM' => 'Comoros',\n        'KN' => 'Saint Kitts and Nevis',\n        'KP' => 'Korea, Democratic People\\'s Republic of',\n        'KR' => 'Korea, Republic of',\n        'KW' => 'Kuwait',\n        'KY' => 'Cayman Islands',\n        'KZ' => 'Kazakhstan',\n        'LA' => 'Lao People\\'s Democratic Republic',\n        'LB' => 'Lebanon',\n        'LC' => 'Saint Lucia',\n        'LI' => 'Liechtenstein',\n        'LK' => 'Sri Lanka',\n        'LR' => 'Liberia',\n        'LS' => 'Lesotho',\n        'LT' => 'Lithuania',\n        'LU' => 'Luxembourg',\n        'LV' => 'Latvia',\n        'LY' => 'Libya',\n        'MA' => 'Morocco',\n        'MC' => 'Monaco',\n        'MD' => 'Moldova, Republic of',\n        'ME' => 'Montenegro',\n        'MF' => 'Saint Martin (French part)',\n        'MG' => 'Madagascar',\n        'MH' => 'Marshall Islands',\n        'MK' => 'Macedonia, the former Yugoslav Republic of',\n        'ML' => 'Mali',\n        'MM' => 'Myanmar',\n        'MN' => 'Mongolia',\n        'MO' => 'Macao',\n        'MP' => 'Northern Mariana Islands',\n        'MQ' => 'Martinique',\n        'MR' => 'Mauritania',\n        'MS' => 'Montserrat',\n        'MT' => 'Malta',\n        'MU' => 'Mauritius',\n        'MV' => 'Maldives',\n        'MW' => 'Malawi',\n        'MX' => 'Mexico',\n        'MY' => 'Malaysia',\n        'MZ' => 'Mozambique',\n        'NA' => 'Namibia',\n        'NC' => 'New Caledonia',\n        'NE' => 'Niger',\n        'NF' => 'Norfolk Island',\n        'NG' => 'Nigeria',\n        'NI' => 'Nicaragua',\n        'NL' => 'Netherlands',\n        'NO' => 'Norway',\n        'NP' => 'Nepal',\n        'NR' => 'Nauru',\n        'NU' => 'Niue',\n        'NZ' => 'New Zealand',\n        'OM' => 'Oman',\n        'PA' => 'Panama',\n        'PE' => 'Peru',\n        'PF' => 'French Polynesia',\n        'PG' => 'Papua New Guinea',\n        'PH' => 'Philippines',\n        'PK' => 'Pakistan',\n        'PL' => 'Poland',\n        'PM' => 'Saint Pierre and Miquelon',\n        'PN' => 'Pitcairn',\n        'PR' => 'Puerto Rico',\n        'PS' => 'Palestine, State of',\n        'PT' => 'Portugal',\n        'PW' => 'Palau',\n        'PY' => 'Paraguay',\n        'QA' => 'Qatar',\n        'RE' => 'Réunion',\n        'RO' => 'Romania',\n        'RS' => 'Serbia',\n        'RU' => 'Russian Federation',\n        'RW' => 'Rwanda',\n        'SA' => 'Saudi Arabia',\n        'SB' => 'Solomon Islands',\n        'SC' => 'Seychelles',\n        'SD' => 'Sudan',\n        'SE' => 'Sweden',\n        'SG' => 'Singapore',\n        'SH' => 'Saint Helena, Ascension and Tristan da Cunha',\n        'SI' => 'Slovenia',\n        'SJ' => 'Svalbard and Jan Mayen',\n        'SK' => 'Slovakia',\n        'SL' => 'Sierra Leone',\n        'SM' => 'San Marino',\n        'SN' => 'Senegal',\n        'SO' => 'Somalia',\n        'SR' => 'Suriname',\n        'SS' => 'South Sudan',\n        'ST' => 'Sao Tome and Principe',\n        'SV' => 'El Salvador',\n        'SX' => 'Sint Maarten (Dutch part)',\n        'SY' => 'Syrian Arab Republic',\n        'SZ' => 'Eswatini',\n        'TC' => 'Turks and Caicos Islands',\n        'TD' => 'Chad',\n        'TF' => 'French Southern Territories',\n        'TG' => 'Togo',\n        'TH' => 'Thailand',\n        'TJ' => 'Tajikistan',\n        'TK' => 'Tokelau',\n        'TL' => 'Timor-Leste',\n        'TM' => 'Turkmenistan',\n        'TN' => 'Tunisia',\n        'TO' => 'Tonga',\n        'TR' => 'Turkey',\n        'TT' => 'Trinidad and Tobago',\n        'TV' => 'Tuvalu',\n        'TW' => 'Taiwan, Province of China',\n        'TZ' => 'Tanzania, United Republic of',\n        'UA' => 'Ukraine',\n        'UG' => 'Uganda',\n        'UM' => 'United States Minor Outlying Islands',\n        'US' => 'United States of America',\n        'UY' => 'Uruguay',\n        'UZ' => 'Uzbekistan',\n        'VA' => 'Holy See',\n        'VC' => 'Saint Vincent and the Grenadines',\n        'VE' => 'Venezuela, Bolivarian Republic of',\n        'VG' => 'Virgin Islands, British',\n        'VI' => 'Virgin Islands, U.S.',\n        'VN' => 'Viet Nam',\n        'VU' => 'Vanuatu',\n        'WF' => 'Wallis and Futuna',\n        'WS' => 'Samoa',\n        'YE' => 'Yemen',\n        'YT' => 'Mayotte',\n        'XK' => 'Republic of Kosovo',\n        'ZA' => 'South Africa',\n        'ZM' => 'Zambia',\n        'ZW' => 'Zimbabwe',\n    ];\n}\n"
  },
  {
    "path": "src/Support/Iso3166Alpha3.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Support;\n\nclass Iso3166Alpha3\n{\n    /**\n     * Array of countries with their ISO 3166-1 alpha-3 codes.\n     *\n     **/\n    public static array $codes = [\n        'ABW' => 'Aruba',\n        'AFG' => 'Afghanistan',\n        'AGO' => 'Angola',\n        'AIA' => 'Anguilla',\n        'ALA' => 'Åland Islands',\n        'ALB' => 'Albania',\n        'AND' => 'Andorra',\n        'ARE' => 'United Arab Emirates',\n        'ARG' => 'Argentina',\n        'ARM' => 'Armenia',\n        'ASM' => 'American Samoa',\n        'ATA' => 'Antarctica',\n        'ATF' => 'French Southern Territories',\n        'ATG' => 'Antigua and Barbuda',\n        'AUS' => 'Australia',\n        'AUT' => 'Austria',\n        'AZE' => 'Azerbaijan',\n        'BDI' => 'Burundi',\n        'BEL' => 'Belgium',\n        'BEN' => 'Benin',\n        'BES' => 'Bonaire, Sint Eustatius and Saba',\n        'BFA' => 'Burkina Faso',\n        'BGD' => 'Bangladesh',\n        'BGR' => 'Bulgaria',\n        'BHR' => 'Bahrain',\n        'BHS' => 'Bahamas',\n        'BIH' => 'Bosnia and Herzegovina',\n        'BLM' => 'Saint Barthélemy',\n        'BLR' => 'Belarus',\n        'BLZ' => 'Belize',\n        'BMU' => 'Bermuda',\n        'BOL' => 'Bolivia, Plurinational State of',\n        'BRA' => 'Brazil',\n        'BRB' => 'Barbados',\n        'BRN' => 'Brunei Darussalam',\n        'BTN' => 'Bhutan',\n        'BVT' => 'Bouvet Island',\n        'BWA' => 'Botswana',\n        'CAF' => 'Central African Republic',\n        'CAN' => 'Canada',\n        'CCK' => 'Cocos (Keeling) Islands',\n        'CHE' => 'Switzerland',\n        'CHL' => 'Chile',\n        'CHN' => 'China',\n        'CIV' => 'Côte d\\'Ivoire',\n        'CMR' => 'Cameroon',\n        'COD' => 'Congo, the Democratic Republic of the',\n        'COG' => 'Congo',\n        'COK' => 'Cook Islands',\n        'COL' => 'Colombia',\n        'COM' => 'Comoros',\n        'CPV' => 'Cabo Verde',\n        'CRI' => 'Costa Rica',\n        'CUB' => 'Cuba',\n        'CUW' => 'Curaçao',\n        'CXR' => 'Christmas Island',\n        'CYM' => 'Cayman Islands',\n        'CYP' => 'Cyprus',\n        'CZE' => 'Czech Republic',\n        'DEU' => 'Germany',\n        'DJI' => 'Djibouti',\n        'DMA' => 'Dominica',\n        'DNK' => 'Denmark',\n        'DOM' => 'Dominican Republic',\n        'DZA' => 'Algeria',\n        'ECU' => 'Ecuador',\n        'EGY' => 'Egypt',\n        'ERI' => 'Eritrea',\n        'ESH' => 'Western Sahara',\n        'ESP' => 'Spain',\n        'EST' => 'Estonia',\n        'ETH' => 'Ethiopia',\n        'FIN' => 'Finland',\n        'FJI' => 'Fiji',\n        'FLK' => 'Falkland Islands (Malvinas)',\n        'FRA' => 'France',\n        'FRO' => 'Faroe Islands',\n        'FSM' => 'Micronesia, Federated States of',\n        'GAB' => 'Gabon',\n        'GBR' => 'United Kingdom of Great Britain and Northern Ireland',\n        'GEO' => 'Georgia',\n        'GGY' => 'Guernsey',\n        'GHA' => 'Ghana',\n        'GIB' => 'Gibraltar',\n        'GIN' => 'Guinea',\n        'GLP' => 'Guadeloupe',\n        'GMB' => 'Gambia',\n        'GNB' => 'Guinea-Bissau',\n        'GNQ' => 'Equatorial Guinea',\n        'GRC' => 'Greece',\n        'GRD' => 'Grenada',\n        'GRL' => 'Greenland',\n        'GTM' => 'Guatemala',\n        'GUF' => 'French Guiana',\n        'GUM' => 'Guam',\n        'GUY' => 'Guyana',\n        'HKG' => 'Hong Kong',\n        'HMD' => 'Heard Island and McDonald Islands',\n        'HND' => 'Honduras',\n        'HRV' => 'Croatia',\n        'HTI' => 'Haiti',\n        'HUN' => 'Hungary',\n        'IDN' => 'Indonesia',\n        'IMN' => 'Isle of Man',\n        'IND' => 'India',\n        'IOT' => 'British Indian Ocean Territory',\n        'IRL' => 'Ireland',\n        'IRN' => 'Iran, Islamic Republic of',\n        'IRQ' => 'Iraq',\n        'ISL' => 'Iceland',\n        'ISR' => 'Israel',\n        'ITA' => 'Italy',\n        'JAM' => 'Jamaica',\n        'JEY' => 'Jersey',\n        'JOR' => 'Jordan',\n        'JPN' => 'Japan',\n        'KAZ' => 'Kazakhstan',\n        'KEN' => 'Kenya',\n        'KGZ' => 'Kyrgyzstan',\n        'KHM' => 'Cambodia',\n        'KIR' => 'Kiribati',\n        'KNA' => 'Saint Kitts and Nevis',\n        'KOR' => 'Korea, Republic of',\n        'KWT' => 'Kuwait',\n        'LAO' => 'Lao People\\'s Democratic Republic',\n        'LBN' => 'Lebanon',\n        'LBR' => 'Liberia',\n        'LBY' => 'Libya',\n        'LCA' => 'Saint Lucia',\n        'LIE' => 'Liechtenstein',\n        'LKA' => 'Sri Lanka',\n        'LSO' => 'Lesotho',\n        'LTU' => 'Lithuania',\n        'LUX' => 'Luxembourg',\n        'LVA' => 'Latvia',\n        'MAC' => 'Macao',\n        'MAF' => 'Saint Martin (French part)',\n        'MAR' => 'Morocco',\n        'MCO' => 'Monaco',\n        'MDA' => 'Moldova',\n        'MDG' => 'Madagascar',\n        'MDV' => 'Maldives',\n        'MEX' => 'Mexico',\n        'MHL' => 'Marshall Islands',\n        'MKD' => 'Macedonia, the former Yugoslav Republic of',\n        'MLI' => 'Mali',\n        'MLT' => 'Malta',\n        'MMR' => 'Myanmar',\n        'MNE' => 'Montenegro',\n        'MNG' => 'Mongolia',\n        'MNP' => 'Northern Mariana Islands',\n        'MOZ' => 'Mozambique',\n        'MRT' => 'Mauritania',\n        'MSR' => 'Montserrat',\n        'MTQ' => 'Martinique',\n        'MUS' => 'Mauritius',\n        'MWI' => 'Malawi',\n        'MYS' => 'Malaysia',\n        'MYT' => 'Mayotte',\n        'NAM' => 'Namibia',\n        'NCL' => 'New Caledonia',\n        'NER' => 'Niger',\n        'NFK' => 'Norfolk Island',\n        'NGA' => 'Nigeria',\n        'NIC' => 'Nicaragua',\n        'NIU' => 'Niue',\n        'NLD' => 'Netherlands',\n        'NOR' => 'Norway',\n        'NPL' => 'Nepal',\n        'NRU' => 'Nauru',\n        'NZL' => 'New Zealand',\n        'OMN' => 'Oman',\n        'PAK' => 'Pakistan',\n        'PAN' => 'Panama',\n        'PCN' => 'Pitcairn',\n        'PER' => 'Peru',\n        'PHL' => 'Philippines',\n        'PLW' => 'Palau',\n        'PNG' => 'Papua New Guinea',\n        'POL' => 'Poland',\n        'PRI' => 'Puerto Rico',\n        'PRK' => 'Korea, Democratic People\\'s Republic of',\n        'PRT' => 'Portugal',\n        'PRY' => 'Paraguay',\n        'PSE' => 'Palestine, State of',\n        'PYF' => 'French Polynesia',\n        'QAT' => 'Qatar',\n        'REU' => 'Réunion',\n        'ROU' => 'Romania',\n        'RUS' => 'Russian Federation',\n        'RWA' => 'Rwanda',\n        'SAU' => 'Saudi Arabia',\n        'SDN' => 'Sudan',\n        'SEN' => 'Senegal',\n        'SGP' => 'Singapore',\n        'SGS' => 'South Georgia and the South Sandwich Islands',\n        'SHN' => 'Saint Helena, Ascension and Tristan da Cunha',\n        'SJM' => 'Svalbard and Jan Mayen',\n        'SLB' => 'Solomon Islands',\n        'SLE' => 'Sierra Leone',\n        'SLV' => 'El Salvador',\n        'SMR' => 'San Marino',\n        'SOM' => 'Somalia',\n        'SPM' => 'Saint Pierre and Miquelon',\n        'SRB' => 'Serbia',\n        'SSD' => 'South Sudan',\n        'STP' => 'Sao Tome and Principe',\n        'SUR' => 'Suriname',\n        'SVK' => 'Slovakia',\n        'SVN' => 'Slovenia',\n        'SWE' => 'Sweden',\n        'SWZ' => 'Eswatini',\n        'SXM' => 'Sint Maarten (Dutch part)',\n        'SYC' => 'Seychelles',\n        'SYR' => 'Syrian Arab Republic',\n        'TCA' => 'Turks and Caicos Islands',\n        'TCD' => 'Chad',\n        'TGO' => 'Togo',\n        'THA' => 'Thailand',\n        'TJK' => 'Tajikistan',\n        'TKL' => 'Tokelau',\n        'TKM' => 'Turkmenistan',\n        'TLS' => 'Timor-Leste',\n        'TON' => 'Tonga',\n        'TTO' => 'Trinidad and Tobago',\n        'TUN' => 'Tunisia',\n        'TUR' => 'Turkey',\n        'TUV' => 'Tuvalu',\n        'TWN' => 'Taiwan, Province of China',\n        'TZA' => 'Tanzania, United Republic of',\n        'UGA' => 'Uganda',\n        'UKR' => 'Ukraine',\n        'UMI' => 'United States Minor Outlying Islands',\n        'URY' => 'Uruguay',\n        'USA' => 'United States of America',\n        'UZB' => 'Uzbekistan',\n        'VAT' => 'Holy See',\n        'VCT' => 'Saint Vincent and the Grenadines',\n        'VEN' => 'Venezuela, Bolivarian Republic of',\n        'VGB' => 'Virgin Islands, British',\n        'VIR' => 'Virgin Islands, U.S.',\n        'VNM' => 'Viet Nam',\n        'VUT' => 'Vanuatu',\n        'WLF' => 'Wallis and Futuna',\n        'WSM' => 'Samoa',\n        'YEM' => 'Yemen',\n        'ZAF' => 'South Africa',\n        'ZMB' => 'Zambia',\n        'ZWE' => 'Zimbabwe',\n    ];\n}\n"
  },
  {
    "path": "src/Support/Iso6391Alpha2.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Support;\n\nclass Iso6391Alpha2\n{\n    /**\n     * Array of countries with their ISO 639-1 alpha-2 codes.\n     *\n     **/\n    public static array $codes = [\n        'AB' => 'Abkhazian',\n        'AA' => 'Afar',\n        'AF' => 'Afrikaans',\n        'AK' => 'Akan',\n        'SQ' => 'Albanian',\n        'AM' => 'Amharic',\n        'AR' => 'Arabic',\n        'AN' => 'Aragonese',\n        'HY' => 'Armenian',\n        'AS' => 'Assamese',\n        'AV' => 'Avaric',\n        'AE' => 'Avestan',\n        'AY' => 'Aymara',\n        'AZ' => 'Azerbaijani',\n        'BM' => 'Bambara',\n        'BA' => 'Bashkir',\n        'EU' => 'Basque',\n        'BE' => 'Belarusian',\n        'BN' => 'Bengali',\n        'BH' => 'Bihari languages',\n        'BI' => 'Bislama',\n        'BS' => 'Bosnian',\n        'BR' => 'Breton',\n        'BG' => 'Bulgarian',\n        'MY' => 'Burmese',\n        'CA' => 'Catalan, Valencian',\n        'KM' => 'Central Khmer',\n        'CH' => 'Chamorro',\n        'CE' => 'Chechen',\n        'NY' => 'Chichewa, Chewa, Nyanja',\n        'ZH' => 'Chinese',\n        'CU' => 'Church Slavonic, Old Bulgarian, Old Church Slavonic',\n        'CV' => 'Chuvash',\n        'KW' => 'Cornish',\n        'CO' => 'Corsican',\n        'CR' => 'Cree',\n        'HR' => 'Croatian',\n        'CS' => 'Czech',\n        'DA' => 'Danish',\n        'DV' => 'Divehi, Dhivehi, Maldivian',\n        'NL' => 'Dutch, Flemish',\n        'DZ' => 'Dzongkha',\n        'EN' => 'English',\n        'EO' => 'Esperanto',\n        'ET' => 'Estonian',\n        'EE' => 'Ewe',\n        'FO' => 'Faroese',\n        'FJ' => 'Fijian',\n        'FI' => 'Finnish',\n        'FR' => 'French',\n        'FF' => 'Fulah',\n        'GD' => 'Gaelic, Scottish Gaelic',\n        'GL' => 'Galician',\n        'LG' => 'Ganda',\n        'KA' => 'Georgian',\n        'DE' => 'German',\n        'KI' => 'Gikuyu, Kikuyu',\n        'EL' => 'Greek (Modern)',\n        'KL' => 'Greenlandic, Kalaallisut',\n        'GN' => 'Guarani',\n        'GU' => 'Gujarati',\n        'HT' => 'Haitian, Haitian Creole',\n        'HA' => 'Hausa',\n        'HE' => 'Hebrew',\n        'HZ' => 'Herero',\n        'HI' => 'Hindi',\n        'HO' => 'Hiri Motu',\n        'HU' => 'Hungarian',\n        'IS' => 'Icelandic',\n        'IO' => 'Ido',\n        'IG' => 'Igbo',\n        'ID' => 'Indonesian',\n        'IA' => 'Interlingua (International Auxiliary Language Association)',\n        'IE' => 'Interlingue',\n        'IU' => 'Inuktitut',\n        'IK' => 'Inupiaq',\n        'GA' => 'Irish',\n        'IT' => 'Italian',\n        'JA' => 'Japanese',\n        'JV' => 'Javanese',\n        'KN' => 'Kannada',\n        'KR' => 'Kanuri',\n        'KS' => 'Kashmiri',\n        'KK' => 'Kazakh',\n        'RW' => 'Kinyarwanda',\n        'KV' => 'Komi',\n        'KG' => 'Kongo',\n        'KO' => 'Korean',\n        'KJ' => 'Kwanyama, Kuanyama',\n        'KU' => 'Kurdish',\n        'KY' => 'Kyrgyz',\n        'LO' => 'Lao',\n        'LA' => 'Latin',\n        'LV' => 'Latvian',\n        'LB' => 'Letzeburgesch, Luxembourgish',\n        'LI' => 'Limburgish, Limburgan, Limburger',\n        'LN' => 'Lingala',\n        'LT' => 'Lithuanian',\n        'LU' => 'Luba-Katanga',\n        'MK' => 'Macedonian',\n        'MG' => 'Malagasy',\n        'MS' => 'Malay',\n        'ML' => 'Malayalam',\n        'MT' => 'Maltese',\n        'GV' => 'Manx',\n        'MI' => 'Maori',\n        'MR' => 'Marathi',\n        'MH' => 'Marshallese',\n        'RO' => 'Moldovan, Moldavian, Romanian',\n        'MN' => 'Mongolian',\n        'NA' => 'Nauru',\n        'NV' => 'Navajo, Navaho',\n        'ND' => 'Northern Ndebele',\n        'NG' => 'Ndonga',\n        'NE' => 'Nepali',\n        'SE' => 'Northern Sami',\n        'NO' => 'Norwegian',\n        'NB' => 'Norwegian Bokmål',\n        'NN' => 'Norwegian Nynorsk',\n        'II' => 'Nuosu, Sichuan Yi',\n        'OC' => 'Occitan (post 1500)',\n        'OJ' => 'Ojibwa',\n        'OR' => 'Oriya',\n        'OM' => 'Oromo',\n        'OS' => 'Ossetian, Ossetic',\n        'PI' => 'Pali',\n        'PA' => 'Panjabi, Punjabi',\n        'PS' => 'Pashto, Pushto',\n        'FA' => 'Persian',\n        'PL' => 'Polish',\n        'PT' => 'Portuguese',\n        'QU' => 'Quechua',\n        'RM' => 'Romansh',\n        'RN' => 'Rundi',\n        'RU' => 'Russian',\n        'SM' => 'Samoan',\n        'SG' => 'Sango',\n        'SA' => 'Sanskrit',\n        'SC' => 'Sardinian',\n        'SR' => 'Serbian',\n        'SN' => 'Shona',\n        'SD' => 'Sindhi',\n        'SI' => 'Sinhala, Sinhalese',\n        'SK' => 'Slovak',\n        'SL' => 'Slovenian',\n        'SO' => 'Somali',\n        'ST' => 'Sotho, Southern',\n        'NR' => 'South Ndebele',\n        'ES' => 'Spanish, Castilian',\n        'SU' => 'Sundanese',\n        'SW' => 'Swahili',\n        'SS' => 'Swati',\n        'SV' => 'Swedish',\n        'TL' => 'Tagalog',\n        'TY' => 'Tahitian',\n        'TG' => 'Tajik',\n        'TA' => 'Tamil',\n        'TT' => 'Tatar',\n        'TE' => 'Telugu',\n        'TH' => 'Thai',\n        'BO' => 'Tibetan',\n        'TI' => 'Tigrinya',\n        'TO' => 'Tonga (Tonga Islands)',\n        'TS' => 'Tsonga',\n        'TN' => 'Tswana',\n        'TR' => 'Turkish',\n        'TK' => 'Turkmen',\n        'TW' => 'Twi',\n        'UG' => 'Uighur, Uyghur',\n        'UK' => 'Ukrainian',\n        'UR' => 'Urdu',\n        'UZ' => 'Uzbek',\n        'VE' => 'Venda',\n        'VI' => 'Vietnamese',\n        'VO' => 'Volap_k',\n        'WA' => 'Walloon',\n        'CY' => 'Welsh',\n        'FY' => 'Western Frisian',\n        'WO' => 'Wolof',\n        'XH' => 'Xhosa',\n        'YI' => 'Yiddish',\n        'YO' => 'Yoruba',\n        'ZA' => 'Zhuang, Chuang',\n        'ZU' => 'Zulu',\n    ];\n}\n"
  },
  {
    "path": "src/Support/Iso6391Alpha3.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Support;\n\nclass Iso6391Alpha3\n{\n    /**\n     * Array of countries with their ISO 639-1 alpha-3 codes.\n     *\n     **/\n    public static array $codes = [\n        'ABK' => 'Abkhazian',\n        'AAR' => 'Afar',\n        'AFR' => 'Afrikaans',\n        'ALB' => 'Albanian',\n        'SQI' => 'Albanian',\n        'AMH' => 'Amharic',\n        'ARA' => 'Arabic',\n        'ARG' => 'Aragonese',\n        'ARM' => 'Armenian',\n        'HYE' => 'Armenian',\n        'ASM' => 'Assamese',\n        'AVE' => 'Avestan',\n        'AYM' => 'Aymara',\n        'AZE' => 'Azerbaijani',\n        'BAK' => 'Bashkir',\n        'BAQ' => 'Basque',\n        'EUS' => 'Basque',\n        'BEL' => 'Belarusian',\n        'BEN' => 'Bengali',\n        'BIH' => 'Bihari',\n        'BIS' => 'Bislama',\n        'BOS' => 'Bosnian',\n        'BRE' => 'Breton',\n        'BUL' => 'Bulgarian',\n        'BUR' => 'Burmese',\n        'MYA' => 'Burmese',\n        'CAT' => 'Catalan',\n        'CHA' => 'Chamorro',\n        'CHE' => 'Chechen',\n        'CHI' => 'Chinese',\n        'ZHO' => 'Chinese',\n        'CHU' => 'Church Slavic, Slavonic, Old Bulgarian',\n        'CHV' => 'Chuvash',\n        'COR' => 'Cornish',\n        'COS' => 'Corsican',\n        'HRV' => 'Croatian',\n        'SCR' => 'Croatian',\n        'CZE' => 'Czech',\n        'CES' => 'Czech',\n        'DAN' => 'Danish',\n        'DIV' => 'Divehi, Dhivehi, Maldivian',\n        'DUT' => 'Dutch',\n        'NLD' => 'Dutch',\n        'DZO' => 'Dzongkha',\n        'ENG' => 'English',\n        'EPO' => 'Esperanto',\n        'EST' => 'Estonian',\n        'FAO' => 'Faroese',\n        'FIJ' => 'Fijian',\n        'FIN' => 'Finnish',\n        'FRE' => 'French',\n        'FRA' => 'French',\n        'GD'  => 'Gaelic, Scottish Gaelic',\n        'GLA' => 'Gaelic, Scottish Gaelic',\n        'GLG' => 'Galician',\n        'GEO' => 'Georgian',\n        'KAT' => 'Georgian',\n        'GER' => 'German',\n        'DEU' => 'German',\n        'GRE' => 'Greek, Modern',\n        'ELL' => 'Greek, Modern',\n        'GRN' => 'Guarani',\n        'GUJ' => 'Gujarati',\n        'HAT' => 'Haitian, Haitian Creole',\n        'HAU' => 'Hausa',\n        'HEB' => 'Hebrew',\n        'HER' => 'Herero',\n        'HIN' => 'Hindi',\n        'HMO' => 'Hiri Motu',\n        'HUN' => 'Hungarian',\n        'ICE' => 'Icelandic',\n        'ISL' => 'Icelandic',\n        'IDO' => 'Ido',\n        'IND' => 'Indonesian',\n        'INA' => 'Interlingua',\n        'ILE' => 'Interlingue',\n        'IKU' => 'Inuktitut',\n        'IPK' => 'Inupiaq',\n        'GLE' => 'Irish',\n        'ITA' => 'Italian',\n        'JPN' => 'Japanese',\n        'JAV' => 'Javanese',\n        'KAL' => 'Kalaallisut',\n        'KAN' => 'Kannada',\n        'KAS' => 'Kashmiri',\n        'KAZ' => 'Kazakh',\n        'KHM' => 'Khmer',\n        'KIK' => 'Kikuyu, Gikuyu',\n        'KIN' => 'Kinyarwanda',\n        'KIR' => 'Kirghiz',\n        'KOM' => 'Komi',\n        'KOR' => 'Korean',\n        'KUA' => 'Kuanyama, Kwanyama',\n        'KUR' => 'Kurdish',\n        'LAO' => 'Lao',\n        'LAT' => 'Latin',\n        'LAV' => 'Latvian',\n        'LIM' => 'Limburgan, Limburger, Limburgish',\n        'LIN' => 'Lingala',\n        'LIT' => 'Lithuanian',\n        'LTZ' => 'Luxembourgish, Letzeburgesch',\n        'MAC' => 'Macedonian',\n        'MKD' => 'Macedonian',\n        'MLG' => 'Malagasy',\n        'MAY' => 'Malay',\n        'MSA' => 'Malay',\n        'MAL' => 'Malayalam',\n        'MLT' => 'Maltese',\n        'GLV' => 'Manx',\n        'MAO' => 'Maori',\n        'MRI' => 'Maori',\n        'MAR' => 'Marathi',\n        'MAH' => 'Marshallese',\n        'MOL' => 'Moldavian',\n        'MON' => 'Mongolian',\n        'NAU' => 'Nauru',\n        'NAV' => 'Navaho, Navajo',\n        'NDE' => 'Ndebele, North',\n        'NBL' => 'Ndebele, South',\n        'NDO' => 'Ndonga',\n        'NEP' => 'Nepali',\n        'SME' => 'Northern Sami',\n        'NOR' => 'Norwegian',\n        'NOB' => 'Norwegian Bokmal',\n        'NNO' => 'Norwegian Nynorsk',\n        'NYA' => 'Nyanja, Chichewa, Chewa',\n        'OCI' => 'Occitan, Provencal',\n        'ORI' => 'Oriya',\n        'ORM' => 'Oromo',\n        'OSS' => 'Ossetian, Ossetic',\n        'PLI' => 'Pali',\n        'PAN' => 'Panjabi',\n        'PER' => 'Persian',\n        'FAS' => 'Persian',\n        'POL' => 'Polish',\n        'POR' => 'Portuguese',\n        'PUS' => 'Pushto',\n        'QUE' => 'Quechua',\n        'ROH' => 'Raeto-Romance',\n        'RUM' => 'Romanian',\n        'RON' => 'Romanian',\n        'RUN' => 'Rundi',\n        'RUS' => 'Russian',\n        'SMO' => 'Samoan',\n        'SAG' => 'Sango',\n        'SAN' => 'Sanskrit',\n        'SRD' => 'Sardinian',\n        'SCC' => 'Serbian',\n        'SRP' => 'Serbian',\n        'SNA' => 'Shona',\n        'III' => 'Sichuan Yi',\n        'SND' => 'Sindhi',\n        'SIN' => 'Sinhala, Sinhalese',\n        'SLO' => 'Slovak',\n        'SLK' => 'Slovak',\n        'SLV' => 'Slovenian',\n        'SOM' => 'Somali',\n        'SOT' => 'Sotho, Southern',\n        'SPA' => 'Spanish, Castilian',\n        'SUN' => 'Sundanese',\n        'SWA' => 'Swahili',\n        'SSW' => 'Swati',\n        'SWE' => 'Swedish',\n        'TGL' => 'Tagalog',\n        'TAH' => 'Tahitian',\n        'TGK' => 'Tajik',\n        'TAM' => 'Tamil',\n        'TAT' => 'Tatar',\n        'TEL' => 'Telugu',\n        'THA' => 'Thai',\n        'TIB' => 'Tibetan',\n        'BOD' => 'Tibetan',\n        'TIR' => 'Tigrinya',\n        'TON' => 'Tonga',\n        'TSO' => 'Tsonga',\n        'TSN' => 'Tswana',\n        'TUR' => 'Turkish',\n        'TUK' => 'Turkmen',\n        'TWI' => 'Twi',\n        'UIG' => 'Uighur',\n        'UKR' => 'Ukrainian',\n        'URD' => 'Urdu',\n        'UZB' => 'Uzbek',\n        'VIE' => 'Vietnamese',\n        'VOL' => 'Volapuk',\n        'WLN' => 'Walloon',\n        'WEL' => 'Welsh',\n        'CYM' => 'Welsh',\n        'FRY' => 'Western Frisian',\n        'WOL' => 'Wolof',\n        'XHO' => 'Xhosa',\n        'YID' => 'Yiddish',\n        'YOR' => 'Yoruba',\n        'ZHA' => 'Zhuang, Chuang',\n        'ZUL' => 'Zulu',\n    ];\n}\n"
  },
  {
    "path": "src/Types/Rule.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Types;\n\nuse Illuminate\\Contracts\\Validation\\Rule as BaseRule;\n\nabstract class Rule implements BaseRule\n{\n    /**\n     * Array of supporting parameters.\n     *\n     **/\n    protected array $parameters;\n\n    /**\n     * Constructor.\n     *\n     **/\n    public function __construct()\n    {\n        $this->parameters = func_get_args();\n    }\n\n    /**\n     * Retrieve the appropriate, localized validation message\n     * or fall back to the given default.\n     *\n     **/\n    public function getLocalizedErrorMessage(string $key, string $default) : string\n    {\n        return trans(\"validation.$key\") === \"validation.$key\" ? $default : trans(\"validation.$key\");\n    }\n}\n"
  },
  {
    "path": "support/migrations/2014_10_12_000000_create_users_table.php",
    "content": "<?php declare(strict_types = 1);\n\nuse Illuminate\\Support\\Facades\\Schema;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreateUsersTable extends Migration\n{\n\n    /**\n     * Run the migrations.\n     *\n     **/\n    public function up() : void\n    {\n        Schema::create('users', function(Blueprint $table) {\n            $table->bigIncrements('id');\n            $table->string('name');\n            $table->string('email')->unique();\n            $table->string('password');\n            $table->rememberToken();\n            $table->timestamps();\n        });\n    }\n\n\n\n    /**\n     * Reverse the migrations.\n     *\n     **/\n    public function down() : void\n    {\n        Schema::dropIfExists('users');\n    }\n\n}"
  },
  {
    "path": "support/migrations/2015_10_12_000001_create_posts_table.php",
    "content": "<?php declare(strict_types = 1);\n\nuse Illuminate\\Support\\Facades\\Schema;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Database\\Migrations\\Migration;\n\nclass CreatePostsTable extends Migration\n{\n\n    /**\n     * Run the migrations.\n     *\n     **/\n    public function up() : void\n    {\n        Schema::create('posts', function (Blueprint $table) {\n            $table->bigIncrements('id');\n            $table->unsignedBigInteger('user_id');\n            $table->string('title');\n            $table->timestamps();\n        });\n    }\n\n\n\n    /**\n     * Reverse the migrations.\n     *\n     **/\n    public function down() : void\n    {\n        Schema::dropIfExists('posts');\n    }\n\n}"
  },
  {
    "path": "tests/CitizenIdentificationTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Orchestra\\Testbench\\TestCase;\nuse Axiom\\Rules\\CitizenIdentification;\n\nclass CitizenIdentificationTest extends TestCase\n{\n    /** @test */\n    public function the_citizen_identification_rule_can_be_validated_for_usa()\n    {\n        $rule = ['id' => [new CitizenIdentification('usa')]];\n\n        $this->assertFalse(validator(['id' => 'XXX-XX-XXXX'], $rule)->passes());\n        $this->assertFalse(validator(['id' => '000-11-1111'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '401-60-1048'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '318-66-9044'], $rule)->passes());\n\n        $rule = ['id' => [new CitizenIdentification('us')]];\n\n        $this->assertFalse(validator(['id' => 'XXX-XX-XXXX'], $rule)->passes());\n        $this->assertFalse(validator(['id' => '000-11-1111'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '401-60-1048'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '318-66-9044'], $rule)->passes());\n    }\n\n    /** @test */\n    public function the_citizen_identification_rule_can_be_validated_for_gbr()\n    {\n        $rule = ['id' => [new CitizenIdentification('gbr')]];\n\n        $this->assertFalse(validator(['id' => 'DC135798A'], $rule)->passes());\n        $this->assertFalse(validator(['id' => 'FQ987654C'], $rule)->passes());\n        $this->assertTrue(validator(['id' => 'JG103759A'], $rule)->passes());\n        $this->assertTrue(validator(['id' => 'AP019283D'], $rule)->passes());\n\n        $rule = ['id' => [new CitizenIdentification('gb')]];\n\n        $this->assertFalse(validator(['id' => 'DC135798A'], $rule)->passes());\n        $this->assertFalse(validator(['id' => 'FQ987654C'], $rule)->passes());\n        $this->assertTrue(validator(['id' => 'JG103759A'], $rule)->passes());\n        $this->assertTrue(validator(['id' => 'AP019283D'], $rule)->passes());\n    }\n\n    /** @test */\n    public function the_citizen_identification_rule_can_be_validated_for_fra()\n    {\n        $rule = ['id' => [new CitizenIdentification('fra')]];\n\n        $this->assertFalse(validator(['id' => 'DC135798A'], $rule)->passes());\n        $this->assertFalse(validator(['id' => 'FQ987654C'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '1 51 02 46102 043 25'], $rule)->passes());\n\n        $rule = ['id' => [new CitizenIdentification('fr')]];\n\n        $this->assertFalse(validator(['id' => 'DC135798A'], $rule)->passes());\n        $this->assertFalse(validator(['id' => 'FQ987654C'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '1 51 02 46102 043 25'], $rule)->passes());\n    }\n\n    /** @test */\n    public function the_citizen_identification_rule_can_be_validated_for_bra()\n    {\n        $rule = ['id' => [new CitizenIdentification('bra')]];\n\n        $this->assertFalse(validator(['id' => '9876543218'], $rule)->passes());\n        $this->assertFalse(validator(['id' => '03464227362'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '166.525.300-23'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '16652530023'], $rule)->passes());\n\n        $rule = ['id' => [new CitizenIdentification('br')]];\n\n        $this->assertFalse(validator(['id' => '9876543218'], $rule)->passes());\n        $this->assertFalse(validator(['id' => '03464227362'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '166.525.300-23'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '16652530023'], $rule)->passes());\n    }\n\n    /** @test */\n    public function the_citizen_identification_rule_can_be_validated_for_vn()\n    {\n        $rule = ['id' => [new CitizenIdentification('vn')]];\n\n        $this->assertFalse(validator(['id' => '101597002120'], $rule)->passes());\n        $this->assertFalse(validator(['id' => '0501991234561'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '001097002120'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '050199123456'], $rule)->passes());\n\n        $rule = ['id' => [new CitizenIdentification('vi')]];\n\n        $this->assertFalse(validator(['id' => '101597002120'], $rule)->passes());\n        $this->assertFalse(validator(['id' => '0501991234561'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '001097002120'], $rule)->passes());\n        $this->assertTrue(validator(['id' => '050199123456'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/CountryCodeTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\CountryCode;\nuse Orchestra\\Testbench\\TestCase;\n\nclass CountryCodeTest extends TestCase\n{\n    /** @test */\n    public function the_two_letter_country_code_rule_can_be_validated()\n    {\n        $rule = ['code' => [new CountryCode(2)]];\n\n        $this->assertTrue(validator(['code' => 'US'], $rule)->passes());\n        $this->assertTrue(validator(['code' => 'GB'], $rule)->passes());\n        $this->assertTrue(validator(['code' => 'FR'], $rule)->passes());\n        $this->assertFalse(validator(['code' => 'xx'], $rule)->passes());\n    }\n\n    /** @test */\n    public function the_three_letter_country_code_rule_can_be_validated()\n    {\n        $rule = ['code' => [new CountryCode(3)]];\n\n        $this->assertTrue(validator(['code' => 'USA'], $rule)->passes());\n        $this->assertTrue(validator(['code' => 'GBR'], $rule)->passes());\n        $this->assertTrue(validator(['code' => 'FRA'], $rule)->passes());\n        $this->assertFalse(validator(['code' => 'xxx'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/DecimalTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\Decimal;\nuse Orchestra\\Testbench\\TestCase;\n\nclass DecimalTest extends TestCase\n{\n    /** @test */\n    public function the_decimal_rule_can_be_validated()\n    {\n        $rule = ['figure' => [new Decimal(4, 2)]];\n\n        $this->assertFalse(validator(['figure' => '1'], $rule)->passes());\n        $this->assertFalse(validator(['figure' => '123'], $rule)->passes());\n        $this->assertFalse(validator(['figure' => '1234'], $rule)->passes());\n        $this->assertFalse(validator(['figure' => '1234.'], $rule)->passes());\n        $this->assertTrue(validator(['figure' => '1234.5'], $rule)->passes());\n        $this->assertTrue(validator(['figure' => '1234.56'], $rule)->passes());\n        $this->assertFalse(validator(['figure' => '1234.567'], $rule)->passes());\n        $this->assertTrue(validator(['figure' => '1234.0'], $rule)->passes());\n        $this->assertTrue(validator(['figure' => '1234.00'], $rule)->passes());\n    }\n\n    /** @test */\n    public function the_decimal_rule_example_is_valid()\n    {\n        $rule = ['figure' => [$class = new Decimal(4, 2)]];\n\n        $this->assertTrue(validator(['figure' => $class->example()], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/DisposableEmailTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\DisposableEmail;\nuse Orchestra\\Testbench\\TestCase;\n\nclass DisposableEmailTest extends TestCase\n{\n    /** @test */\n    public function the_disposable_email_rule_can_be_validated()\n    {\n        $rule = ['email' => ['bail', 'email', new DisposableEmail()]];\n\n        $this->assertTrue(validator(['email' => 'john.doe@gmail.com'], $rule)->passes());\n        $this->assertFalse(validator(['email' => 'john.doe@mailinator.com'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/DomainTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\Domain;\nuse Orchestra\\Testbench\\TestCase;\n\nclass DomainTest extends TestCase\n{\n    /** @test */\n    public function the_domain_rule_can_be_validated()\n    {\n        $rule = ['domain' => [new Domain]];\n\n        $this->assertFalse(validator(['domain' => 'http://'], $rule)->passes());\n        $this->assertFalse(validator(['domain' => 'https://'], $rule)->passes());\n        $this->assertFalse(validator(['domain' => 'http://google.com'], $rule)->passes());\n        $this->assertFalse(validator(['domain' => 'https://google.com'], $rule)->passes());\n        $this->assertFalse(validator(['domain' => 'http://google'], $rule)->passes());\n        $this->assertFalse(validator(['domain' => 'https://google'], $rule)->passes());\n        $this->assertFalse(validator(['domain' => 'https://google.com/test'], $rule)->passes());\n        $this->assertFalse(validator(['domain' => 'google.com/test'], $rule)->passes());\n        $this->assertFalse(validator(['domain' => 'www.google.com/test'], $rule)->passes());\n        $this->assertFalse(validator(['domain' => 'www.google.com/test/test'], $rule)->passes());\n        $this->assertFalse(validator(['domain' => 'google'], $rule)->passes());\n        $this->assertFalse(validator(['domain' => '1'], $rule)->passes());\n        $this->assertTrue(validator(['domain' => 'google.com'], $rule)->passes());\n        $this->assertTrue(validator(['domain' => 'www.google.com'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/EncodedImageTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\EncodedImage;\nuse Orchestra\\Testbench\\TestCase;\n\nclass EncodedImageTest extends TestCase\n{\n    /**\n     * Retrieve the contents of a given file.\n     *\n     **/\n    protected function getFile(string $file_name) : string\n    {\n        $path = realpath(__DIR__ . '/..') . \"/support/assets/$file_name\";\n\n        $extension = pathinfo($path, PATHINFO_EXTENSION);\n\n        return \"data:image/{$extension};base64,\" . base64_encode(file_get_contents($path));\n    }\n\n    /**\n     * Generate an invalid image file with a given mime type.\n     *\n     **/\n    protected function invalidImage(string $mime = '') : string\n    {\n        return \"data:image/{$mime};base64,\" . base64_encode('not an image file');\n    }\n\n    /** @test */\n    public function the_encoded_jpeg_image_rule_can_be_validated()\n    {\n        $png_rule      = ['image' => [new EncodedImage('png')]];\n        $jpeg_rule     = ['image' => [new EncodedImage('jpeg')]];\n        $multiple_rule = ['image' => [new EncodedImage('jpeg', 'png')]];\n\n        $this->assertFalse(validator(['image' => $this->getFile('image.jpeg')], $png_rule)->passes());\n        $this->assertTrue(validator(['image' => $this->getFile('image.png')], $png_rule)->passes());\n        $this->assertTrue(validator(['image' => $this->getFile('image.jpeg')], $jpeg_rule)->passes());\n        $this->assertFalse(validator(['image' => $this->getFile('image.png')], $jpeg_rule)->passes());\n\n        $this->assertTrue(validator(['image' => $this->getFile('image.png')], $multiple_rule)->passes());\n        $this->assertTrue(validator(['image' => $this->getFile('image.jpeg')], $multiple_rule)->passes());\n        $this->assertFalse(validator(['image' => $this->getFile('image.tiff')], $multiple_rule)->passes());\n\n        $this->assertFalse(validator(['image' => $this->invalidImage('image.jpeg')], $jpeg_rule)->passes());\n        $this->assertFalse(validator(['image' => $this->invalidImage('image.png')], $jpeg_rule)->passes());\n        $this->assertFalse(validator(['image' => $this->invalidImage()], $jpeg_rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/EvenNumber.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\EvenNumber;\nuse Orchestra\\Testbench\\TestCase;\n\nclass EvenNumberTest extends TestCase\n{\n    /** @test */\n    public function the_even_number_rule_can_be_validated()\n    {\n        $rule = ['number' => [new EvenNumber]];\n\n        $this->assertFalse(validator(['number' => '1'], $rule)->passes());\n        $this->assertTrue(validator(['number' => '2'], $rule)->passes());\n        $this->assertFalse(validator(['number' => '3'], $rule)->passes());\n        $this->assertTrue(validator(['number' => '4'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/FileExistsTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\FileExists;\nuse Orchestra\\Testbench\\TestCase;\n\nclass FileExistsTest extends TestCase\n{\n    /**\n     * Define the application environment.\n     *\n     **/\n    protected function getEnvironmentSetUp($app) : void\n    {\n        $app['config']->set('filesystems.disks.local', [\n            'driver' => 'local',\n            'root'   => realpath(__DIR__ . '/..') . '/support/assets',\n        ]);\n    }\n\n    /** @test */\n    public function the_file_exists_rule_can_be_validated()\n    {\n        $rule = ['file' => [new FileExists('local', '/')]];\n\n        $this->assertTrue(validator(['file' => 'image.png'], $rule)->passes());\n        $this->assertTrue(validator(['file' => '/image.png'], $rule)->passes());\n        $this->assertFalse(validator(['file' => '/fake.png'], $rule)->passes());\n        $this->assertFalse(validator(['file' => 'fake.png'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/HexColorTest.php",
    "content": "<?php\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\HexColor;\nuse Orchestra\\Testbench\\TestCase;\n\nclass HexColorTest extends TestCase\n{\n    /** @test */\n    public function it_can_validate_hex_color()\n    {\n        $rule = ['hex_color' => [new HexColor()]];\n\n        $this->assertTrue(validator(['hex_color' => '#f0f0f0'], $rule)->passes());\n        $this->assertTrue(validator(['hex_color' => '#fff'], $rule)->passes());\n        $this->assertTrue(validator(['hex_color' => '#00ff0080'], $rule)->passes());\n        $this->assertFalse(validator(['hex_color' => '#00ff00ff'], $rule)->passes());\n        $this->assertFalse(validator(['hex_color' => 'f0f0f0'], $rule)->passes());\n        $this->assertFalse(validator(['hex_color' => 'rgb(0,0,255)'], $rule)->passes());\n        $this->assertTrue(validator(['hex_color' => '#000000'], $rule)->passes());\n        $this->assertFalse(validator(['hex_color' => '#0f0f'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/ISBNTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\ISBN;\nuse Orchestra\\Testbench\\TestCase;\n\nclass ISBNTest extends TestCase\n{\n    /** @test */\n    public function the_isbn_rule_can_be_validated()\n    {\n        $rule = ['book' => [new ISBN]];\n\n        $this->assertFalse(validator(['book' => '1'], $rule)->passes());\n        $this->assertFalse(validator(['book' => '1#'], $rule)->passes());\n        $this->assertFalse(validator(['book' => 'a1#'], $rule)->passes());\n        $this->assertTrue(validator(['book' => 'ISBN 978-0-596-52068-7'], $rule)->passes());\n        $this->assertTrue(validator(['book' => 'ISBN-13: 978-0-596-52068-7'], $rule)->passes());\n        $this->assertTrue(validator(['book' => '978 0 596 52068 7'], $rule)->passes());\n        $this->assertTrue(validator(['book' => '9780596520687'], $rule)->passes());\n        $this->assertTrue(validator(['book' => 'ISBN-10 0-596-52068-9'], $rule)->passes());\n        $this->assertTrue(validator(['book' => '0-596-52068-9'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/LanguageCodeTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\LanguageCode;\nuse Orchestra\\Testbench\\TestCase;\n\nclass LanguageCodeTest extends TestCase\n{\n    /** @test */\n    public function the_two_letter_language_code_rule_can_be_validated()\n    {\n        $rule = ['code' => [new LanguageCode(2)]];\n\n        $this->assertTrue(validator(['code' => 'EL'], $rule)->passes());\n        $this->assertTrue(validator(['code' => 'KL'], $rule)->passes());\n        $this->assertFalse(validator(['code' => 'xx'], $rule)->passes());\n    }\n\n    /** @test */\n    public function the_three_letter_language_code_rule_can_be_validated()\n    {\n        $rule = ['code' => [new LanguageCode(3)]];\n\n        $this->assertTrue(validator(['code' => 'RUN'], $rule)->passes());\n        $this->assertTrue(validator(['code' => 'RUS'], $rule)->passes());\n        $this->assertFalse(validator(['code' => 'xxx'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/LocationCoordinatesTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Orchestra\\Testbench\\TestCase;\nuse Axiom\\Rules\\LocationCoordinates;\n\nclass LocationCoordinatesTest extends TestCase\n{\n    /** @test */\n    public function the_location_coordinates_rule_can_be_validated()\n    {\n        $rule = ['location' => [new LocationCoordinates]];\n\n        $this->assertFalse(validator(['location' => '1'], $rule)->passes());\n        $this->assertTrue(validator(['location' => '1, 1'], $rule)->passes());\n        $this->assertTrue(validator(['location' => '1.0,1.0'], $rule)->passes());\n        $this->assertTrue(validator(['location' => '90.0,180.0'], $rule)->passes());\n        $this->assertFalse(validator(['location' => '90.0,181.0'], $rule)->passes());\n        $this->assertFalse(validator(['location' => '91.0,180.0'], $rule)->passes());\n        $this->assertTrue(validator(['location' => '-77.0364335, 38.8951555'], $rule)->passes());\n        $this->assertTrue(validator(['location' => '-77.03643357, 38.8951555'], $rule)->passes());\n        $this->assertTrue(validator(['location' => '-77.0364335, 38.89515557'], $rule)->passes());\n        $this->assertFalse(validator(['location' => '-77.036433576, 38.8951555'], $rule)->passes());\n        $this->assertFalse(validator(['location' => '-77.0364335, 38.895155576'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/LowercaseTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\Lowercase;\nuse Orchestra\\Testbench\\TestCase;\n\nclass LowercaseTest extends TestCase\n{\n    /** @test */\n    public function the_lowercase_rule_can_be_validated()\n    {\n        $rule = ['text' => [new Lowercase]];\n\n        $this->assertTrue(validator(['text' => 'hello'], $rule)->passes());\n        $this->assertFalse(validator(['text' => 'HELLO'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/MacAddress.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\MacAddress;\nuse Orchestra\\Testbench\\TestCase;\n\nclass MacAddressTest extends TestCase\n{\n    /** @test */\n    public function the_mac_address_rule_can_be_validated()\n    {\n        $rule = ['address' => [new MacAddress]];\n\n        $this->assertTrue(validator(['address' => '3D:F2:C9:A6:B3:4F'], $rule)->passes());\n        $this->assertTrue(validator(['address' => '3D-F2-C9-A6-B3-4F'], $rule)->passes());\n        $this->assertFalse(validator(['address' => '00:00:00:00:00:00:00'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/MaxWordsTest.php",
    "content": "<?php declare(strict_types=1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\MaxWords;\nuse Orchestra\\Testbench\\TestCase;\n\nclass MaxWordsTest extends TestCase\n{\n    /**\n     * @test\n     * @dataProvider provideSentences\n     */\n    public function the_max_words_rule_can_be_validated($data)\n    {\n        $rule = ['text' => [new MaxWords($data['max_words'])]];\n        $this->assertEquals($data['passes'], validator(['text' => $data['text']], $rule)->passes());\n    }\n\n    /**\n     * Retrieve the seed data for the test.\n     *\n     */\n    public function provideSentences() : array\n    {\n        return [\n            [\n                ['text' => 'hello world', 'max_words' => 2, 'passes' => true],\n            ], [\n                ['text' => 'مرحبا بالعالم', 'max_words' => 2, 'passes' => true],\n            ], [\n                ['text' => 'This sentence contains more than 2 words', 'max_words' => 2, 'passes' => false],\n            ], [\n                ['text' => 'Three words sentence', 'max_words' => 3, 'passes' => true],\n            ],[\n                ['text' => 'مرحبا بالعالم من التحقق', 'max_words' => 3, 'passes' => false],\n            ],\n        ];\n    }\n}\n"
  },
  {
    "path": "tests/MissingTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\Missing;\nuse Orchestra\\Testbench\\TestCase;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass MissingTest extends TestCase\n{\n    /**\n     * The user id.\n     *\n     **/\n    protected int $user;\n\n    /**\n     * Define the application environment.\n     *\n     **/\n    protected function getEnvironmentSetUp($app) : void\n    {\n        $app['config']->set('auth.providers.users.driver', 'database');\n        $app['config']->set('auth.providers.users.table', 'users');\n\n        $app['config']->set('database.default', 'sqlite');\n        $app['config']->set('database.connections.sqlite', [\n            'driver'                  => 'sqlite',\n            'database'                => ':memory:',\n            'prefix'                  => '',\n            'foreign_key_constraints' => true,\n        ]);\n    }\n\n    /**\n     * Insert database records for testing purposes.\n     *\n     **/\n    protected function seedDatabase() : void\n    {\n        $this->loadMigrationsFrom(realpath(__DIR__ . '/..') . '/support/migrations');\n\n        $this->user = DB::table('users')->insertGetId([\n            'name'     => 'John Doe',\n            'email'    => 'john@example.com',\n            'password' => bcrypt('password'),\n        ]);\n    }\n\n    /** @test */\n    public function the_does_not_exist_rule_can_be_validated()\n    {\n        $this->seedDatabase();\n\n        $rule = ['user_id' => [new Missing('users', 'id')]];\n\n        $this->assertTrue(validator(['user_id' => 'non_existent_user'], $rule)->passes());\n        $this->assertFalse(validator(['user_id' => $this->user], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/MonetaryFigureTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\MonetaryFigure;\nuse Orchestra\\Testbench\\TestCase;\n\nclass MonetaryFigureTest extends TestCase\n{\n    /** @test */\n    public function the_monetary_figure_rule_can_be_validated()\n    {\n        $rule = ['deposit' => [new MonetaryFigure('$', 4, 4)]];\n\n        $this->assertFalse(validator(['deposit' => '$'], $rule)->passes());\n        $this->assertTrue(validator(['deposit' => '$1'], $rule)->passes());\n        $this->assertTrue(validator(['deposit' => '$123'], $rule)->passes());\n        $this->assertTrue(validator(['deposit' => '$1234'], $rule)->passes());\n        $this->assertFalse(validator(['deposit' => '$12345'], $rule)->passes());\n        $this->assertFalse(validator(['deposit' => '$1234.'], $rule)->passes());\n        $this->assertTrue(validator(['deposit' => '$1234.1'], $rule)->passes());\n        $this->assertTrue(validator(['deposit' => '$1234.12'], $rule)->passes());\n        $this->assertTrue(validator(['deposit' => '$1234.123'], $rule)->passes());\n        $this->assertTrue(validator(['deposit' => '$1234.1234'], $rule)->passes());\n        $this->assertFalse(validator(['deposit' => '$1234.12345'], $rule)->passes());\n        $this->assertFalse(validator(['deposit' => '$12345.1234'], $rule)->passes());\n        $this->assertFalse(validator(['deposit' => '$abcd.efgh'], $rule)->passes());\n        $this->assertFalse(validator(['deposit' => '£1234.1234'], $rule)->passes());\n    }\n\n    /** @test */\n    public function the_monetary_figure_rule_example_is_valid()\n    {\n        $rule = ['deposit' => [$class = new MonetaryFigure('$', 4, 2)]];\n\n        $this->assertTrue(validator(['deposit' => $class->example()], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/OddNumberTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\OddNumber;\nuse Orchestra\\Testbench\\TestCase;\n\nclass OddNumberTest extends TestCase\n{\n    /** @test */\n    public function the_odd_number_rule_can_be_validated()\n    {\n        $rule = ['number' => [new OddNumber]];\n\n        $this->assertFalse(validator(['number' => '0'], $rule)->passes());\n        $this->assertTrue(validator(['number' => '1'], $rule)->passes());\n        $this->assertFalse(validator(['number' => '2'], $rule)->passes());\n        $this->assertTrue(validator(['number' => '3'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/RecordOwnerTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\RecordOwner;\nuse Orchestra\\Testbench\\TestCase;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Auth;\n\nclass RecordOwnerTest extends TestCase\n{\n    /**\n     * The other user id.\n     *\n     **/\n    protected int $other;\n\n    /**\n     * The owner user id.\n     *\n     **/\n    protected int $owner;\n\n    /**\n     * The post id.\n     *\n     **/\n    protected int $post;\n\n    /**\n     * Define the application environment.\n     *\n     **/\n    protected function getEnvironmentSetUp($app) : void\n    {\n        $app['config']->set('auth.providers.users.driver', 'database');\n        $app['config']->set('auth.providers.users.table', 'users');\n\n        $app['config']->set('database.default', 'sqlite');\n        $app['config']->set('database.connections.sqlite', [\n            'driver'                  => 'sqlite',\n            'database'                => ':memory:',\n            'prefix'                  => '',\n            'foreign_key_constraints' => true,\n        ]);\n    }\n\n    /**\n     * Insert database records for testing purposes.\n     *\n     **/\n    protected function seedDatabase() : void\n    {\n        $this->loadMigrationsFrom(realpath(__DIR__ . '/..') . '/support/migrations');\n\n        $this->owner = DB::table('users')->insertGetId([\n            'name'     => 'John Doe',\n            'email'    => 'john@example.com',\n            'password' => bcrypt('password'),\n        ]);\n\n        $this->other = DB::table('users')->insertGetId([\n            'name'     => 'Jane Doe',\n            'email'    => 'jane@example.com',\n            'password' => bcrypt('password'),\n        ]);\n\n        $this->post = DB::table('posts')->insertGetId([\n            'title'   => 'Post #1',\n            'user_id' => $this->owner,\n        ]);\n    }\n\n    /** @test */\n    public function the_record_owner_rule_can_be_validated()\n    {\n        $this->seedDatabase();\n\n        $rule = ['post_id' => [new RecordOwner('posts', 'id')]];\n\n        $this->assertFalse(validator(['post_id' => $this->post], $rule)->passes());\n\n        Auth::loginUsingId($this->other);\n        $this->assertFalse(validator(['post_id' => $this->post], $rule)->passes());\n\n        Auth::loginUsingId($this->owner);\n        $this->assertTrue(validator(['post_id' => $this->post], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/StrongPasswordTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\StrongPassword;\nuse Orchestra\\Testbench\\TestCase;\n\nclass StrongPasswordTest extends TestCase\n{\n    /** @test */\n    public function the_strong_password_rule_can_be_validated()\n    {\n        $rule = ['password' => [new StrongPassword]];\n\n        $this->assertFalse(validator(['password' => '1'], $rule)->passes());\n        $this->assertFalse(validator(['password' => '1#'], $rule)->passes());\n        $this->assertFalse(validator(['password' => 'a1#'], $rule)->passes());\n        $this->assertFalse(validator(['password' => 'aB1#'], $rule)->passes());\n        $this->assertFalse(validator(['password' => 'Ertbyrt123#'], $rule)->passes());\n        $this->assertTrue(validator(['password' => 'Ertbyrt1234#'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/TelephoneNumberTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\TelephoneNumber;\nuse Orchestra\\Testbench\\TestCase;\n\nclass TelephoneNumberTest extends TestCase\n{\n    /** @test */\n    public function the_telephone_number_rule_can_be_validated()\n    {\n        $rule = ['phone' => [new TelephoneNumber]];\n\n        $this->assertFalse(validator(['phone' => '1'], $rule)->passes());\n        $this->assertFalse(validator(['phone' => '1#'], $rule)->passes());\n        $this->assertFalse(validator(['phone' => 'a1#'], $rule)->passes());\n        $this->assertFalse(validator(['phone' => 'aB1#'], $rule)->passes());\n        $this->assertFalse(validator(['phone' => '123456'], $rule)->passes());\n        $this->assertFalse(validator(['phone' => '1234567890123456'], $rule)->passes());\n        $this->assertTrue(validator(['phone' => '123456789'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/TitlecaseTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\Titlecase;\nuse Orchestra\\Testbench\\TestCase;\n\nclass TitlecaseTest extends TestCase\n{\n    /** @test */\n    public function the_titlecase_rule_can_be_validated()\n    {\n        $rule = ['text' => [new Titlecase]];\n\n        $this->assertFalse(validator(['text' => 'hello world'], $rule)->passes());\n        $this->assertFalse(validator(['text' => 'Hello world'], $rule)->passes());\n        $this->assertFalse(validator(['text' => 'hello World'], $rule)->passes());\n        $this->assertTrue(validator(['text' => 'Hello World'], $rule)->passes());\n        $this->assertTrue(validator(['text' => 'HELLO WORLD'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/UppercaseTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Axiom\\Rules\\Uppercase;\nuse Orchestra\\Testbench\\TestCase;\n\nclass UppercaseTest extends TestCase\n{\n    /** @test */\n    public function the_uppercase_rule_can_be_validated()\n    {\n        $rule = ['text' => [new Uppercase]];\n\n        $this->assertFalse(validator(['text' => 'hello'], $rule)->passes());\n        $this->assertTrue(validator(['text' => 'HELLO'], $rule)->passes());\n    }\n}\n"
  },
  {
    "path": "tests/WithoutWhitespaceTest.php",
    "content": "<?php declare(strict_types = 1);\n\nnamespace Axiom\\Rules\\Tests;\n\nuse Orchestra\\Testbench\\TestCase;\nuse Axiom\\Rules\\WithoutWhitespace;\n\nclass WithoutWhitespaceTest extends TestCase\n{\n    /** @test */\n    public function the_without_whitespace_rule_can_be_validated()\n    {\n        $rule = ['text' => [new WithoutWhitespace]];\n\n        $this->assertFalse(validator(['text' => 'hello  '], $rule)->passes());\n        $this->assertFalse(validator(['text' => '  hello'], $rule)->passes());\n        $this->assertFalse(validator(['text' => 'hello world'], $rule)->passes());\n        $this->assertTrue(validator(['text' => 'hello'], $rule)->passes());\n    }\n}\n"
  }
]