From 98401f20a20a103fc919b41ff9fa45cb10c425ca Mon Sep 17 00:00:00 2001
From: Attila Jozsef Kerekes
+
+## Modifiers
+
+Faker provides three special providers, `unique()`, `optional()`, and `valid()`, to be called before any provider.
```php
// unique() forces providers to return unique values
$values = array();
-for ($i=0; $i < 10; $i++) {
+for ($i = 0; $i < 10; $i++) {
// get a random digit, but always a new one, to avoid duplicates
$values []= $faker->unique()->randomDigit;
}
@@ -274,7 +343,7 @@ print_r($values); // [4, 1, 8, 5, 0, 2, 6, 9, 7, 3]
// providers with a limited range will throw an exception when no new unique value can be generated
$values = array();
try {
- for ($i=0; $i < 10; $i++) {
+ for ($i = 0; $i < 10; $i++) {
$values []= $faker->unique()->randomDigitNotNull;
}
} catch (\OverflowException $e) {
@@ -287,14 +356,14 @@ $faker->unique($reset = true)->randomDigitNotNull; // will not throw OverflowExc
// optional() sometimes bypasses the provider to return a default value instead (which defaults to NULL)
$values = array();
-for ($i=0; $i < 10; $i++) {
+for ($i = 0; $i < 10; $i++) {
// get a random digit, but also null sometimes
$values []= $faker->optional()->randomDigit;
}
print_r($values); // [1, 4, null, 9, 5, null, null, 4, 6, null]
// optional() accepts a weight argument to specify the probability of receiving the default value.
-// 0 will always return the default value; 1 will always return the provider. Default weight is 0.5.
+// 0 will always return the default value; 1 will always return the provider. Default weight is 0.5 (50% chance).
$faker->optional($weight = 0.1)->randomDigit; // 90% chance of NULL
$faker->optional($weight = 0.9)->randomDigit; // 10% chance of NULL
@@ -302,16 +371,40 @@ $faker->optional($weight = 0.9)->randomDigit; // 10% chance of NULL
// Defaults to NULL.
$faker->optional($weight = 0.5, $default = false)->randomDigit; // 50% chance of FALSE
$faker->optional($weight = 0.9, $default = 'abc')->word; // 10% chance of 'abc'
+
+// valid() only accepts valid values according to the passed validator functions
+$values = array();
+$evenValidator = function($digit) {
+ return $digit % 2 === 0;
+};
+for ($i = 0; $i < 10; $i++) {
+ $values []= $faker->valid($evenValidator)->randomDigit;
+}
+print_r($values); // [0, 4, 8, 4, 2, 6, 0, 8, 8, 6]
+
+// just like unique(), valid() throws an overflow exception when it can't generate a valid value
+$values = array();
+try {
+ $faker->valid($evenValidator)->randomElement(1, 3, 5, 7, 9);
+} catch (\OverflowException $e) {
+ echo "Can't pick an even number in that set!";
+}
+```
+
+If you would like to use a modifier with a value not generated by Faker, use the `passthrough()` method. `passthrough()` simply returns whatever value it was given.
+
+```php
+$faker->optional()->passthrough(mt_rand(5, 15));
```
## Localization
-`Faker\Factory` can take a locale as an argument, to return localized data. If no localized provider is found, the factory fallbacks to the default locale (en_EN).
+`Faker\Factory` can take a locale as an argument, to return localized data. If no localized provider is found, the factory fallbacks to the default locale (en_US).
```php
name, "\n";
}
// Luce du Coulon
@@ -330,16 +423,19 @@ You can check available Faker locales in the source code, [under the `Provider`
## Populating Entities Using an ORM or an ODM
-Faker provides adapters for Object-Relational and Object-Document Mappers (currently, [Propel](http://www.propelorm.org), [Doctrine2](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/), [CakePHP](http://cakephp.org) and [Mandango](https://github.com/mandango/mandango) are supported). These adapters ease the population of databases through the Entity classes provided by an ORM library (or the population of document stores using Document classes provided by an ODM library).
+Faker provides adapters for Object-Relational and Object-Document Mappers (currently, [Propel](http://www.propelorm.org), [Doctrine2](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/), [CakePHP](http://cakephp.org), [Spot2](https://github.com/vlucas/spot2), [Mandango](https://github.com/mandango/mandango) and [Eloquent](https://laravel.com/docs/master/eloquent) are supported). These adapters ease the population of databases through the Entity classes provided by an ORM library (or the population of document stores using Document classes provided by an ODM library).
To populate entities, create a new populator class (using a generator instance as parameter), then list the class and number of all the entities that must be generated. To launch the actual data population, call the `execute()` method.
+Note that some of the `populators` could require additional parameters. As example the `doctrine` populator has an option to specify
+its batchSize on how often it will flush the UnitOfWork to the database.
+
Here is an example showing how to populate 5 `Author` and 10 `Book` objects:
```php
addEntity('Author', 5);
$populator->addEntity('Book', 10);
$insertedPKs = $populator->execute();
@@ -377,6 +473,8 @@ print_r($insertedPKs);
// )
```
+**Note:** Due to the fact that `Faker` returns all the primary keys inserted, the memory consumption will go up drastically when you do batch inserts due to the big list of data.
+
In the previous example, the `Book` and `Author` models share a relationship. Since `Author` entities are populated first, Faker is smart enough to relate the populated `Book` entities to one of the populated `Author` entities.
Lastly, if you want to execute an arbitrary function on an entity before insertion, use the fourth argument of the `addEntity()` method:
@@ -494,8 +592,8 @@ $faker = Faker\Factory::create();
?>
Non consequatur. Incidunt est. Aut voluptatem. Officia voluptas rerum quo. Asperiores similique. Sapiente dolorum dolorem sint laboriosam commodi qui. Commodi nihil nesciunt eveniet quo repudiandae. Voluptates explicabo numquam distinctio necessitatibus repellat. Provident ut doloremque nam eum modi aspernatur. Iusto inventore. Animi nihil ratione id mollitia libero ipsa quia tempore. Velit est officia et aut tenetur dolorem sed mollitia expedita. Modi modi repudiandae pariatur voluptas rerum ea incidunt non molestiae eligendi eos deleniti. Exercitationem voluptatibus dolor est iste quod molestiae. Quia reiciendis. Inventore impedit exercitationem voluptatibus rerum cupiditate. Qui. Aliquam. Autem nihil aut et. Dolor ut quia error. Enim facilis iusto earum et minus rerum assumenda quis quia. Reprehenderit ut sapiente occaecati voluptatum dolor voluptatem vitae qui velit. Quod fugiat non. Sunt nobis totam mollitia sed nesciunt est deleniti cumque. Repudiandae quo. Modi dicta libero quisquam doloremque qui autem. Voluptatem aliquid saepe laudantium facere eos sunt dolor. Est eos quis laboriosam officia expedita repellendus quia natus. Et neque delectus quod fugit enim repudiandae qui. Fugit soluta sit facilis facere repellat culpa magni voluptatem maiores tempora. Enim dolores doloremque. Assumenda voluptatem eum perferendis exercitationem. Quasi in fugit deserunt ea perferendis sunt nemo consequatur dolorum soluta. Maxime repellat qui numquam voluptatem est modi. Alias rerum rerum hic hic eveniet. Tempore voluptatem. Eaque. Et sit quas fugit iusto. Nemo nihil rerum dignissimos et esse. Repudiandae ipsum numquam. Nemo sunt quia. Sint tempore est neque ducimus harum sed. Dicta placeat atque libero nihil. Et qui aperiam temporibus facilis eum. Ut dolores qui enim et maiores nesciunt. Dolorum totam sint debitis saepe laborum. Quidem corrupti ea. Cum voluptas quod. Possimus consequatur quasi dolorem ut et. Et velit non hic labore repudiandae quis.
+ * $values = array();
+ * $evenValidator = function ($digit) {
+ * return $digit % 2 === 0;
+ * };
+ * for ($i=0; $i < 10; $i++) {
+ * $values []= $faker->valid($evenValidator)->randomDigit;
+ * }
+ * print_r($values); // [0, 4, 8, 4, 2, 6, 0, 8, 8, 6]
+ *
+ *
+ * @param Closure $validator A function returning true for valid values
+ * @param integer $maxRetries Maximum number of retries to find a unique value,
+ * After which an OverflowException is thrown.
+ * @throws \OverflowException When no valid value can be found by iterating $maxRetries times
+ *
+ * @return ValidGenerator A proxy class returning only valid values
+ */
+ public function valid($validator = null, $maxRetries = 10000)
+ {
+ return new ValidGenerator($this->generator, $validator, $maxRetries);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Biased.php b/vendor/fzaninotto/faker/src/Faker/Provider/Biased.php
index c9ebb41e..d37dceff 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/Biased.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/Biased.php
@@ -2,7 +2,7 @@
namespace Faker\Provider;
-class Biased extends \Faker\Provider\Base
+class Biased extends Base
{
/**
* Returns a biased integer between $min and $max (both inclusive).
@@ -25,8 +25,8 @@ class Biased extends \Faker\Provider\Base
$x = mt_rand() / mt_getrandmax();
$y = mt_rand() / (mt_getrandmax() + 1);
} while (call_user_func($function, $x) < $y);
-
- return floor($x * ($max - $min + 1) + $min);
+
+ return (int) floor($x * ($max - $min + 1) + $min);
}
/**
@@ -35,7 +35,7 @@ class Biased extends \Faker\Provider\Base
*
* @return integer
*/
- protected static function unbiased($x)
+ protected static function unbiased()
{
return 1;
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Color.php b/vendor/fzaninotto/faker/src/Faker/Provider/Color.php
index 16aa9934..209d7228 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/Color.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/Color.php
@@ -26,7 +26,7 @@ class Color extends Base
'DeepSkyBlue', 'DimGray', 'DimGrey', 'DodgerBlue', 'FireBrick',
'FloralWhite', 'ForestGreen', 'Fuchsia', 'Gainsboro', 'GhostWhite',
'Gold', 'GoldenRod', 'Gray', 'Green', 'GreenYellow', 'HoneyDew',
- 'HotPink', 'IndianRed ', 'Indigo ', 'Ivory', 'Khaki', 'Lavender',
+ 'HotPink', 'IndianRed', 'Indigo', 'Ivory', 'Khaki', 'Lavender',
'LavenderBlush', 'LawnGreen', 'LemonChiffon', 'LightBlue', 'LightCoral',
'LightCyan', 'LightGoldenRodYellow', 'LightGray', 'LightGreen', 'LightPink',
'LightSalmon', 'LightSeaGreen', 'LightSkyBlue', 'LightSlateGray', 'LightSteelBlue',
@@ -90,6 +90,14 @@ class Color extends Base
return 'rgb(' . static::rgbColor() . ')';
}
+ /**
+ * @example 'rgba(0,255,122,0.8)'
+ */
+ public static function rgbaCssColor()
+ {
+ return 'rgba(' . static::rgbColor() . ',' . static::randomFloat(1, 0, 1) . ')';
+ }
+
/**
* @example 'blue'
*/
@@ -105,4 +113,31 @@ class Color extends Base
{
return static::randomElement(static::$allColorNames);
}
+
+ /**
+ * @example '340,50,20'
+ * @return string
+ */
+ public static function hslColor()
+ {
+ return sprintf(
+ '%s,%s,%s',
+ static::numberBetween(0, 360),
+ static::numberBetween(0, 100),
+ static::numberBetween(0, 100)
+ );
+ }
+
+ /**
+ * @example array(340, 50, 20)
+ * @return array
+ */
+ public static function hslColorAsArray()
+ {
+ return array(
+ static::numberBetween(0, 360),
+ static::numberBetween(0, 100),
+ static::numberBetween(0, 100)
+ );
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/Company.php
index 208d9ce5..d536d48e 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/Company.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/Company.php
@@ -2,7 +2,7 @@
namespace Faker\Provider;
-class Company extends \Faker\Provider\Base
+class Company extends Base
{
protected static $formats = array(
'{{lastName}} {{companySuffix}}',
@@ -10,8 +10,14 @@ class Company extends \Faker\Provider\Base
protected static $companySuffix = array('Ltd');
+ protected static $jobTitleFormat = array(
+ '{{word}}',
+ );
+
/**
* @example 'Acme Ltd'
+ *
+ * @return string
*/
public function company()
{
@@ -22,9 +28,23 @@ class Company extends \Faker\Provider\Base
/**
* @example 'Ltd'
+ *
+ * @return string
*/
public static function companySuffix()
{
return static::randomElement(static::$companySuffix);
}
+
+ /**
+ * @example 'Job'
+ *
+ * @return string
+ */
+ public function jobTitle()
+ {
+ $format = static::randomElement(static::$jobTitleFormat);
+
+ return $this->generator->parse($format);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/DateTime.php b/vendor/fzaninotto/faker/src/Faker/Provider/DateTime.php
index 776a8411..bde7f251 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/DateTime.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/DateTime.php
@@ -2,10 +2,16 @@
namespace Faker\Provider;
-class DateTime extends \Faker\Provider\Base
+class DateTime extends Base
{
protected static $century = array('I','II','III','IV','V','VI','VII','VIII','IX','X','XI','XII','XIII','XIV','XV','XVI','XVII','XVIII','XIX','XX','XXI');
+ protected static $defaultTimezone = null;
+
+ /**
+ * @param \DateTime|string|float|int $max
+ * @return int|false
+ */
protected static function getMaxTimestamp($max = 'now')
{
if (is_numeric($max)) {
@@ -36,24 +42,37 @@ class DateTime extends \Faker\Provider\Base
* Get a datetime object for a date between January 1, 1970 and now
*
* @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
+ * @param string $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get`
* @example DateTime('2005-08-16 20:39:21')
* @return \DateTime
+ * @see http://php.net/manual/en/timezones.php
+ * @see http://php.net/manual/en/function.date-default-timezone-get.php
*/
- public static function dateTime($max = 'now')
+ public static function dateTime($max = 'now', $timezone = null)
{
- return new \DateTime('@' . static::unixTime($max));
+ return static::setTimezone(
+ new \DateTime('@' . static::unixTime($max)),
+ $timezone
+ );
}
/**
* Get a datetime object for a date between January 1, 001 and now
*
* @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
+ * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get`
* @example DateTime('1265-03-22 21:15:52')
* @return \DateTime
+ * @see http://php.net/manual/en/timezones.php
+ * @see http://php.net/manual/en/function.date-default-timezone-get.php
*/
- public static function dateTimeAD($max = 'now')
+ public static function dateTimeAD($max = 'now', $timezone = null)
{
- return new \DateTime('@' . mt_rand(-62135597361, static::getMaxTimestamp($max)));
+ $min = (PHP_INT_SIZE>4 ? -62135597361 : -PHP_INT_MAX);
+ return static::setTimezone(
+ new \DateTime('@' . mt_rand($min, static::getMaxTimestamp($max))),
+ $timezone
+ );
}
/**
@@ -98,12 +117,15 @@ class DateTime extends \Faker\Provider\Base
* Get a DateTime object based on a random date between two given dates.
* Accepts date strings that can be recognized by strtotime().
*
- * @param string $startDate Defaults to 30 years ago
- * @param string $endDate Defaults to "now"
+ * @param \DateTime|string $startDate Defaults to 30 years ago
+ * @param \DateTime|string $endDate Defaults to "now"
+ * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get`
* @example DateTime('1999-02-02 11:42:52')
* @return \DateTime
+ * @see http://php.net/manual/en/timezones.php
+ * @see http://php.net/manual/en/function.date-default-timezone-get.php
*/
- public static function dateTimeBetween($startDate = '-30 years', $endDate = 'now')
+ public static function dateTimeBetween($startDate = '-30 years', $endDate = 'now', $timezone = null)
{
$startTimestamp = $startDate instanceof \DateTime ? $startDate->getTimestamp() : strtotime($startDate);
$endTimestamp = static::getMaxTimestamp($endDate);
@@ -114,50 +136,84 @@ class DateTime extends \Faker\Provider\Base
$timestamp = mt_rand($startTimestamp, $endTimestamp);
- $ts = new \DateTime('@' . $timestamp);
- $ts->setTimezone(new \DateTimeZone(date_default_timezone_get()));
+ return static::setTimezone(
+ new \DateTime('@' . $timestamp),
+ $timezone
+ );
+ }
- return $ts;
+ /**
+ * Get a DateTime object based on a random date between one given date and
+ * an interval
+ * Accepts date string that can be recognized by strtotime().
+ *
+ * @param \DateTime|string $date Defaults to 30 years ago
+ * @param string $interval Defaults to 5 days after
+ * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get`
+ * @example dateTimeInInterval('1999-02-02 11:42:52', '+ 5 days')
+ * @return \DateTime
+ * @see http://php.net/manual/en/timezones.php
+ * @see http://php.net/manual/en/function.date-default-timezone-get.php
+ */
+ public static function dateTimeInInterval($date = '-30 years', $interval = '+5 days', $timezone = null)
+ {
+ $intervalObject = \DateInterval::createFromDateString($interval);
+ $datetime = $date instanceof \DateTime ? $date : new \DateTime($date);
+ $otherDatetime = clone $datetime;
+ $otherDatetime->add($intervalObject);
+
+ $begin = $datetime > $otherDatetime ? $otherDatetime : $datetime;
+ $end = $datetime===$begin ? $otherDatetime : $datetime;
+
+ return static::dateTimeBetween(
+ $begin,
+ $end,
+ $timezone
+ );
}
/**
* @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
+ * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get`
* @example DateTime('1964-04-04 11:02:02')
* @return \DateTime
*/
- public static function dateTimeThisCentury($max = 'now')
+ public static function dateTimeThisCentury($max = 'now', $timezone = null)
{
- return static::dateTimeBetween('-100 year', $max);
+ return static::dateTimeBetween('-100 year', $max, $timezone);
}
/**
* @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
+ * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get`
* @example DateTime('2010-03-10 05:18:58')
* @return \DateTime
*/
- public static function dateTimeThisDecade($max = 'now')
+ public static function dateTimeThisDecade($max = 'now', $timezone = null)
{
- return static::dateTimeBetween('-10 year', $max);
+ return static::dateTimeBetween('-10 year', $max, $timezone);
}
/**
* @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
+ * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get`
* @example DateTime('2011-09-19 09:24:37')
* @return \DateTime
*/
- public static function dateTimeThisYear($max = 'now')
+ public static function dateTimeThisYear($max = 'now', $timezone = null)
{
- return static::dateTimeBetween('-1 year', $max);
+ return static::dateTimeBetween('-1 year', $max, $timezone);
}
/**
* @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
+ * @param string|null $timezone time zone in which the date time should be set, default to DateTime::$defaultTimezone, if set, otherwise the result of `date_default_timezone_get`
* @example DateTime('2011-10-05 12:51:46')
* @return \DateTime
*/
- public static function dateTimeThisMonth($max = 'now')
+ public static function dateTimeThisMonth($max = 'now', $timezone = null)
{
- return static::dateTimeBetween('-1 month', $max);
+ return static::dateTimeBetween('-1 month', $max, $timezone);
}
/**
@@ -212,8 +268,8 @@ class DateTime extends \Faker\Provider\Base
/**
* @param \DateTime|int|string $max maximum timestamp used as random end limit, default to "now"
- * @return int
- * @example 1673
+ * @return string
+ * @example '1673'
*/
public static function year($max = 'now')
{
@@ -237,4 +293,48 @@ class DateTime extends \Faker\Provider\Base
{
return static::randomElement(\DateTimeZone::listIdentifiers());
}
+
+ /**
+ * Internal method to set the time zone on a DateTime.
+ *
+ * @param \DateTime $dt
+ * @param string|null $timezone
+ *
+ * @return \DateTime
+ */
+ private static function setTimezone(\DateTime $dt, $timezone)
+ {
+ return $dt->setTimezone(new \DateTimeZone(static::resolveTimezone($timezone)));
+ }
+
+ /**
+ * Sets default time zone.
+ *
+ * @param string $timezone
+ *
+ * @return void
+ */
+ public static function setDefaultTimezone($timezone = null)
+ {
+ static::$defaultTimezone = $timezone;
+ }
+
+ /**
+ * Gets default time zone.
+ *
+ * @return string|null
+ */
+ public static function getDefaultTimezone()
+ {
+ return static::$defaultTimezone;
+ }
+
+ /**
+ * @param string|null $timezone
+ * @return null|string
+ */
+ private static function resolveTimezone($timezone)
+ {
+ return ((null === $timezone) ? ((null === static::$defaultTimezone) ? date_default_timezone_get() : static::$defaultTimezone) : $timezone);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/File.php b/vendor/fzaninotto/faker/src/Faker/Provider/File.php
index 3897c272..ba015946 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/File.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/File.php
@@ -1,7 +1,7 @@
addProvider(new Lorem($generator));
+ $generator->addProvider(new Internet($generator));
+ }
+
+ /**
+ * @param integer $maxDepth
+ * @param integer $maxWidth
+ *
+ * @return string
+ */
+ public function randomHtml($maxDepth = 4, $maxWidth = 4)
+ {
+ $document = new \DOMDocument();
+ $this->idGenerator = new UniqueGenerator($this->generator);
+
+ $head = $document->createElement("head");
+ $this->addRandomTitle($head);
+
+ $body = $document->createElement("body");
+ $this->addLoginForm($body);
+ $this->addRandomSubTree($body, $maxDepth, $maxWidth);
+
+ $html = $document->createElement("html");
+ $html->appendChild($head);
+ $html->appendChild($body);
+
+ $document->appendChild($html);
+ return $document->saveHTML();
+ }
+
+ private function addRandomSubTree(\DOMElement $root, $maxDepth, $maxWidth)
+ {
+ $maxDepth--;
+ if ($maxDepth <= 0) {
+ return $root;
+ }
+
+ $siblings = mt_rand(1, $maxWidth);
+ for ($i = 0; $i < $siblings; $i++) {
+ if ($maxDepth == 1) {
+ $this->addRandomLeaf($root);
+ } else {
+ $sibling = $root->ownerDocument->createElement("div");
+ $root->appendChild($sibling);
+ $this->addRandomAttribute($sibling);
+ $this->addRandomSubTree($sibling, mt_rand(0, $maxDepth), $maxWidth);
+ }
+ }
+ return $root;
+ }
+
+ private function addRandomLeaf(\DOMElement $node)
+ {
+ $rand = mt_rand(1, 10);
+ switch ($rand) {
+ case 1:
+ $this->addRandomP($node);
+ break;
+ case 2:
+ $this->addRandomA($node);
+ break;
+ case 3:
+ $this->addRandomSpan($node);
+ break;
+ case 4:
+ $this->addRandomUL($node);
+ break;
+ case 5:
+ $this->addRandomH($node);
+ break;
+ case 6:
+ $this->addRandomB($node);
+ break;
+ case 7:
+ $this->addRandomI($node);
+ break;
+ case 8:
+ $this->addRandomTable($node);
+ break;
+ default:
+ $this->addRandomText($node);
+ break;
+ }
+ }
+
+ private function addRandomAttribute(\DOMElement $node)
+ {
+ $rand = mt_rand(1, 2);
+ switch ($rand) {
+ case 1:
+ $node->setAttribute("class", $this->generator->word);
+ break;
+ case 2:
+ $node->setAttribute("id", (string)$this->idGenerator->randomNumber(5));
+ break;
+ }
+ }
+
+ private function addRandomP(\DOMElement $element, $maxLength = 10)
+ {
+
+ $node = $element->ownerDocument->createElement(static::P_TAG);
+ $node->textContent = $this->generator->sentence(mt_rand(1, $maxLength));
+ $element->appendChild($node);
+ }
+
+ private function addRandomText(\DOMElement $element, $maxLength = 10)
+ {
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
+ $element->appendChild($text);
+ }
+
+ private function addRandomA(\DOMElement $element, $maxLength = 10)
+ {
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
+ $node = $element->ownerDocument->createElement(static::A_TAG);
+ $node->setAttribute("href", $this->generator->safeEmailDomain);
+ $node->appendChild($text);
+ $element->appendChild($node);
+ }
+
+ private function addRandomTitle(\DOMElement $element, $maxLength = 10)
+ {
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
+ $node = $element->ownerDocument->createElement(static::TITLE_TAG);
+ $node->appendChild($text);
+ $element->appendChild($node);
+ }
+
+ private function addRandomH(\DOMElement $element, $maxLength = 10)
+ {
+ $h = static::H_TAG . (string)mt_rand(1, 3);
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
+ $node = $element->ownerDocument->createElement($h);
+ $node->appendChild($text);
+ $element->appendChild($node);
+ }
+
+ private function addRandomB(\DOMElement $element, $maxLength = 10)
+ {
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
+ $node = $element->ownerDocument->createElement(static::B_TAG);
+ $node->appendChild($text);
+ $element->appendChild($node);
+ }
+
+ private function addRandomI(\DOMElement $element, $maxLength = 10)
+ {
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
+ $node = $element->ownerDocument->createElement(static::I_TAG);
+ $node->appendChild($text);
+ $element->appendChild($node);
+ }
+
+ private function addRandomSpan(\DOMElement $element, $maxLength = 10)
+ {
+ $text = $element->ownerDocument->createTextNode($this->generator->sentence(mt_rand(1, $maxLength)));
+ $node = $element->ownerDocument->createElement(static::SPAN_TAG);
+ $node->appendChild($text);
+ $element->appendChild($node);
+ }
+
+ private function addLoginForm(\DOMElement $element)
+ {
+
+ $textInput = $element->ownerDocument->createElement(static::INPUT_TAG);
+ $textInput->setAttribute("type", "text");
+ $textInput->setAttribute("id", "username");
+
+ $textLabel = $element->ownerDocument->createElement(static::LABEL_TAG);
+ $textLabel->setAttribute("for", "username");
+ $textLabel->textContent = $this->generator->word;
+
+ $passwordInput = $element->ownerDocument->createElement(static::INPUT_TAG);
+ $passwordInput->setAttribute("type", "password");
+ $passwordInput->setAttribute("id", "password");
+
+ $passwordLabel = $element->ownerDocument->createElement(static::LABEL_TAG);
+ $passwordLabel->setAttribute("for", "password");
+ $passwordLabel->textContent = $this->generator->word;
+
+ $submit = $element->ownerDocument->createElement(static::INPUT_TAG);
+ $submit->setAttribute("type", "submit");
+ $submit->setAttribute("value", $this->generator->word);
+
+ $submit = $element->ownerDocument->createElement(static::FORM_TAG);
+ $submit->setAttribute("action", $this->generator->safeEmailDomain);
+ $submit->setAttribute("method", "POST");
+ $submit->appendChild($textLabel);
+ $submit->appendChild($textInput);
+ $submit->appendChild($passwordLabel);
+ $submit->appendChild($passwordInput);
+ $element->appendChild($submit);
+ }
+
+ private function addRandomTable(\DOMElement $element, $maxRows = 10, $maxCols = 6, $maxTitle = 4, $maxLength = 10)
+ {
+ $rows = mt_rand(1, $maxRows);
+ $cols = mt_rand(1, $maxCols);
+
+ $table = $element->ownerDocument->createElement(static::TABLE_TAG);
+ $thead = $element->ownerDocument->createElement(static::THEAD_TAG);
+ $tbody = $element->ownerDocument->createElement(static::TBODY_TAG);
+
+ $table->appendChild($thead);
+ $table->appendChild($tbody);
+
+ $tr = $element->ownerDocument->createElement(static::TR_TAG);
+ $thead->appendChild($tr);
+ for ($i = 0; $i < $cols; $i++) {
+ $th = $element->ownerDocument->createElement(static::TH_TAG);
+ $th->textContent = $this->generator->sentence(mt_rand(1, $maxTitle));
+ $tr->appendChild($th);
+ }
+ for ($i = 0; $i < $rows; $i++) {
+ $tr = $element->ownerDocument->createElement(static::TR_TAG);
+ $tbody->appendChild($tr);
+ for ($j = 0; $j < $cols; $j++) {
+ $th = $element->ownerDocument->createElement(static::TD_TAG);
+ $th->textContent = $this->generator->sentence(mt_rand(1, $maxLength));
+ $tr->appendChild($th);
+ }
+ }
+ $element->appendChild($table);
+ }
+
+ private function addRandomUL(\DOMElement $element, $maxItems = 11, $maxLength = 4)
+ {
+ $num = mt_rand(1, $maxItems);
+ $ul = $element->ownerDocument->createElement(static::UL_TAG);
+ for ($i = 0; $i < $num; $i++) {
+ $li = $element->ownerDocument->createElement(static::LI_TAG);
+ $li->textContent = $this->generator->sentence(mt_rand(1, $maxLength));
+ $ul->appendChild($li);
+ }
+ $element->appendChild($ul);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Image.php b/vendor/fzaninotto/faker/src/Faker/Provider/Image.php
index 40aeac53..14f1b397 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/Image.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/Image.php
@@ -18,13 +18,28 @@ class Image extends Base
* Set randomize to false to remove the random GET parameter at the end of the url.
*
* @example 'http://lorempixel.com/640/480/?12345'
+ *
+ * @param integer $width
+ * @param integer $height
+ * @param string|null $category
+ * @param bool $randomize
+ * @param string|null $word
+ * @param bool $gray
+ *
+ * @return string
*/
- public static function imageUrl($width = 640, $height = 480, $category = null, $randomize = true, $word = null)
+ public static function imageUrl($width = 640, $height = 480, $category = null, $randomize = true, $word = null, $gray = false)
{
- $url = "http://lorempixel.com/{$width}/{$height}/";
+ $baseUrl = "https://lorempixel.com/";
+ $url = "{$width}/{$height}/";
+
+ if ($gray) {
+ $url = "gray/" . $url;
+ }
+
if ($category) {
if (!in_array($category, static::$categories)) {
- throw new \InvalidArgumentException(sprintf('Unkown image category "%s"', $category));
+ throw new \InvalidArgumentException(sprintf('Unknown image category "%s"', $category));
}
$url .= "{$category}/";
if ($word) {
@@ -36,7 +51,7 @@ class Image extends Base
$url .= '?' . static::randomNumber(5, true);
}
- return $url;
+ return $baseUrl . $url;
}
/**
@@ -46,7 +61,7 @@ class Image extends Base
*
* @example '/path/to/dir/13b73edae8443990be1aa8f1a483bc27.jpg'
*/
- public static function image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = true, $word = null)
+ public static function image($dir = null, $width = 640, $height = 480, $category = null, $fullPath = true, $randomize = true, $word = null, $gray = false)
{
$dir = is_null($dir) ? sys_get_temp_dir() : $dir; // GNU/Linux / OS X / Windows compatible
// Validate directory path
@@ -60,7 +75,7 @@ class Image extends Base
$filename = $name .'.jpg';
$filepath = $dir . DIRECTORY_SEPARATOR . $filename;
- $url = static::imageUrl($width, $height, $category, $randomize, $word);
+ $url = static::imageUrl($width, $height, $category, $randomize, $word, $gray);
// save file
if (function_exists('curl_exec')) {
@@ -68,9 +83,16 @@ class Image extends Base
$fp = fopen($filepath, 'w');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);
- $success = curl_exec($ch);
- curl_close($ch);
+ $success = curl_exec($ch) && curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200;
fclose($fp);
+ curl_close($ch);
+
+ if (!$success) {
+ unlink($filepath);
+
+ // could not contact the distant URL or HTTP error - fail silently.
+ return false;
+ }
} elseif (ini_get('allow_url_fopen')) {
// use remote fopen() via copy()
$success = copy($url, $filepath);
@@ -78,11 +100,6 @@ class Image extends Base
return new \RuntimeException('The image formatter downloads an image from a remote HTTP server. Therefore, it requires that PHP can request remote hosts, either via cURL or fopen()');
}
- if (!$success) {
- // could not contact the distant URL or HTTP error - fail silently.
- return false;
- }
-
return $fullPath ? $filepath : $filename;
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/Internet.php
index 9e92f146..2eaa2f6a 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/Internet.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/Internet.php
@@ -2,7 +2,7 @@
namespace Faker\Provider;
-class Internet extends \Faker\Provider\Base
+class Internet extends Base
{
protected static $freeEmailDomain = array('gmail.com', 'yahoo.com', 'hotmail.com');
protected static $tld = array('com', 'com', 'com', 'com', 'com', 'com', 'biz', 'info', 'net', 'org');
@@ -29,140 +29,14 @@ class Internet extends \Faker\Provider\Base
'http://{{domainName}}/{{slug}}.html',
'https://{{domainName}}/{{slug}}.html',
);
-
- public static function toAscii($string)
- {
- $transliterationTable = array(
- 'IJ' => 'I','Ö' => 'O','Œ' => 'O','Ü' => 'U','ä' => 'a','æ' => 'a',
- 'ij' => 'i','ö' => 'o','œ' => 'o','ü' => 'u','ß' => 's','ſ' => 's',
- 'À' => 'A','Á' => 'A','Â' => 'A','Ã' => 'A','Ä' => 'A','Å' => 'A',
- 'Æ' => 'A','Ā' => 'A','Ą' => 'A','Ă' => 'A','Ç' => 'C','Ć' => 'C',
- 'Č' => 'C','Ĉ' => 'C','Ċ' => 'C','Ď' => 'D','Đ' => 'D','È' => 'E',
- 'É' => 'E','Ê' => 'E','Ë' => 'E','Ē' => 'E','Ę' => 'E','Ě' => 'E',
- 'Ĕ' => 'E','Ė' => 'E','Ĝ' => 'G','Ğ' => 'G','Ġ' => 'G','Ģ' => 'G',
- 'Ĥ' => 'H','Ħ' => 'H','Ì' => 'I','Í' => 'I','Î' => 'I','Ï' => 'I',
- 'Ī' => 'I','Ĩ' => 'I','Ĭ' => 'I','Į' => 'I','İ' => 'I','Ĵ' => 'J',
- 'Ķ' => 'K','Ľ' => 'K','Ĺ' => 'K','Ļ' => 'K','Ŀ' => 'K','Ł' => 'L',
- 'Ñ' => 'N','Ń' => 'N','Ň' => 'N','Ņ' => 'N','Ŋ' => 'N','Ò' => 'O',
- 'Ó' => 'O','Ô' => 'O','Õ' => 'O','Ø' => 'O','Ō' => 'O','Ő' => 'O',
- 'Ŏ' => 'O','Ŕ' => 'R','Ř' => 'R','Ŗ' => 'R','Ś' => 'S','Ş' => 'S',
- 'Ŝ' => 'S','Ș' => 'S','Š' => 'S','Ť' => 'T','Ţ' => 'T','Ŧ' => 'T',
- 'Ț' => 'T','Ù' => 'U','Ú' => 'U','Û' => 'U','Ū' => 'U','Ů' => 'U',
- 'Ű' => 'U','Ŭ' => 'U','Ũ' => 'U','Ų' => 'U','Ŵ' => 'W','Ŷ' => 'Y',
- 'Ÿ' => 'Y','Ý' => 'Y','Ź' => 'Z','Ż' => 'Z','Ž' => 'Z','à' => 'a',
- 'á' => 'a','â' => 'a','ã' => 'a','ā' => 'a','ą' => 'a','ă' => 'a',
- 'å' => 'a','ç' => 'c','ć' => 'c','č' => 'c','ĉ' => 'c','ċ' => 'c',
- 'ď' => 'd','đ' => 'd','è' => 'e','é' => 'e','ê' => 'e','ë' => 'e',
- 'ē' => 'e','ę' => 'e','ě' => 'e','ĕ' => 'e','ė' => 'e','ƒ' => 'f',
- 'ĝ' => 'g','ğ' => 'g','ġ' => 'g','ģ' => 'g','ĥ' => 'h','ħ' => 'h',
- 'ì' => 'i','í' => 'i','î' => 'i','ï' => 'i','ī' => 'i','ĩ' => 'i',
- 'ĭ' => 'i','į' => 'i','ı' => 'i','ĵ' => 'j','ķ' => 'k','ĸ' => 'k',
- 'ł' => 'l','ľ' => 'l','ĺ' => 'l','ļ' => 'l','ŀ' => 'l','ñ' => 'n',
- 'ń' => 'n','ň' => 'n','ņ' => 'n','ʼn' => 'n','ŋ' => 'n','ò' => 'o',
- 'ó' => 'o','ô' => 'o','õ' => 'o','ø' => 'o','ō' => 'o','ő' => 'o',
- 'ŏ' => 'o','ŕ' => 'r','ř' => 'r','ŗ' => 'r','ś' => 's','š' => 's',
- 'ť' => 't','ù' => 'u','ú' => 'u','û' => 'u','ū' => 'u','ů' => 'u',
- 'ű' => 'u','ŭ' => 'u','ũ' => 'u','ų' => 'u','ŵ' => 'w','ÿ' => 'y',
- 'ý' => 'y','ŷ' => 'y','ż' => 'z','ź' => 'z','ž' => 'z','Α' => 'A',
- 'Ά' => 'A','Ἀ' => 'A','Ἁ' => 'A','Ἂ' => 'A','Ἃ' => 'A','Ἄ' => 'A',
- 'Ἅ' => 'A','Ἆ' => 'A','Ἇ' => 'A','ᾈ' => 'A','ᾉ' => 'A','ᾊ' => 'A',
- 'ᾋ' => 'A','ᾌ' => 'A','ᾍ' => 'A','ᾎ' => 'A','ᾏ' => 'A','Ᾰ' => 'A',
- 'Ᾱ' => 'A','Ὰ' => 'A','ᾼ' => 'A','Β' => 'B','Γ' => 'G','Δ' => 'D',
- 'Ε' => 'E','Έ' => 'E','Ἐ' => 'E','Ἑ' => 'E','Ἒ' => 'E','Ἓ' => 'E',
- 'Ἔ' => 'E','Ἕ' => 'E','Ὲ' => 'E','Ζ' => 'Z','Η' => 'I','Ή' => 'I',
- 'Ἠ' => 'I','Ἡ' => 'I','Ἢ' => 'I','Ἣ' => 'I','Ἤ' => 'I','Ἥ' => 'I',
- 'Ἦ' => 'I','Ἧ' => 'I','ᾘ' => 'I','ᾙ' => 'I','ᾚ' => 'I','ᾛ' => 'I',
- 'ᾜ' => 'I','ᾝ' => 'I','ᾞ' => 'I','ᾟ' => 'I','Ὴ' => 'I','ῌ' => 'I',
- 'Θ' => 'T','Ι' => 'I','Ί' => 'I','Ϊ' => 'I','Ἰ' => 'I','Ἱ' => 'I',
- 'Ἲ' => 'I','Ἳ' => 'I','Ἴ' => 'I','Ἵ' => 'I','Ἶ' => 'I','Ἷ' => 'I',
- 'Ῐ' => 'I','Ῑ' => 'I','Ὶ' => 'I','Κ' => 'K','Λ' => 'L','Μ' => 'M',
- 'Ν' => 'N','Ξ' => 'K','Ο' => 'O','Ό' => 'O','Ὀ' => 'O','Ὁ' => 'O',
- 'Ὂ' => 'O','Ὃ' => 'O','Ὄ' => 'O','Ὅ' => 'O','Ὸ' => 'O','Π' => 'P',
- 'Ρ' => 'R','Ῥ' => 'R','Σ' => 'S','Τ' => 'T','Υ' => 'Y','Ύ' => 'Y',
- 'Ϋ' => 'Y','Ὑ' => 'Y','Ὓ' => 'Y','Ὕ' => 'Y','Ὗ' => 'Y','Ῠ' => 'Y',
- 'Ῡ' => 'Y','Ὺ' => 'Y','Φ' => 'F','Χ' => 'X','Ψ' => 'P','Ω' => 'O',
- 'Ώ' => 'O','Ὠ' => 'O','Ὡ' => 'O','Ὢ' => 'O','Ὣ' => 'O','Ὤ' => 'O',
- 'Ὥ' => 'O','Ὦ' => 'O','Ὧ' => 'O','ᾨ' => 'O','ᾩ' => 'O','ᾪ' => 'O',
- 'ᾫ' => 'O','ᾬ' => 'O','ᾭ' => 'O','ᾮ' => 'O','ᾯ' => 'O','Ὼ' => 'O',
- 'ῼ' => 'O','α' => 'a','ά' => 'a','ἀ' => 'a','ἁ' => 'a','ἂ' => 'a',
- 'ἃ' => 'a','ἄ' => 'a','ἅ' => 'a','ἆ' => 'a','ἇ' => 'a','ᾀ' => 'a',
- 'ᾁ' => 'a','ᾂ' => 'a','ᾃ' => 'a','ᾄ' => 'a','ᾅ' => 'a','ᾆ' => 'a',
- 'ᾇ' => 'a','ὰ' => 'a','ᾰ' => 'a','ᾱ' => 'a','ᾲ' => 'a','ᾳ' => 'a',
- 'ᾴ' => 'a','ᾶ' => 'a','ᾷ' => 'a','β' => 'b','γ' => 'g','δ' => 'd',
- 'ε' => 'e','έ' => 'e','ἐ' => 'e','ἑ' => 'e','ἒ' => 'e','ἓ' => 'e',
- 'ἔ' => 'e','ἕ' => 'e','ὲ' => 'e','ζ' => 'z','η' => 'i','ή' => 'i',
- 'ἠ' => 'i','ἡ' => 'i','ἢ' => 'i','ἣ' => 'i','ἤ' => 'i','ἥ' => 'i',
- 'ἦ' => 'i','ἧ' => 'i','ᾐ' => 'i','ᾑ' => 'i','ᾒ' => 'i','ᾓ' => 'i',
- 'ᾔ' => 'i','ᾕ' => 'i','ᾖ' => 'i','ᾗ' => 'i','ὴ' => 'i','ῂ' => 'i',
- 'ῃ' => 'i','ῄ' => 'i','ῆ' => 'i','ῇ' => 'i','θ' => 't','ι' => 'i',
- 'ί' => 'i','ϊ' => 'i','ΐ' => 'i','ἰ' => 'i','ἱ' => 'i','ἲ' => 'i',
- 'ἳ' => 'i','ἴ' => 'i','ἵ' => 'i','ἶ' => 'i','ἷ' => 'i','ὶ' => 'i',
- 'ῐ' => 'i','ῑ' => 'i','ῒ' => 'i','ῖ' => 'i','ῗ' => 'i','κ' => 'k',
- 'λ' => 'l','μ' => 'm','ν' => 'n','ξ' => 'k','ο' => 'o','ό' => 'o',
- 'ὀ' => 'o','ὁ' => 'o','ὂ' => 'o','ὃ' => 'o','ὄ' => 'o','ὅ' => 'o',
- 'ὸ' => 'o','π' => 'p','ρ' => 'r','ῤ' => 'r','ῥ' => 'r','σ' => 's',
- 'ς' => 's','τ' => 't','υ' => 'y','ύ' => 'y','ϋ' => 'y','ΰ' => 'y',
- 'ὐ' => 'y','ὑ' => 'y','ὒ' => 'y','ὓ' => 'y','ὔ' => 'y','ὕ' => 'y',
- 'ὖ' => 'y','ὗ' => 'y','ὺ' => 'y','ῠ' => 'y','ῡ' => 'y','ῢ' => 'y',
- 'ῦ' => 'y','ῧ' => 'y','φ' => 'f','χ' => 'x','ψ' => 'p','ω' => 'o',
- 'ώ' => 'o','ὠ' => 'o','ὡ' => 'o','ὢ' => 'o','ὣ' => 'o','ὤ' => 'o',
- 'ὥ' => 'o','ὦ' => 'o','ὧ' => 'o','ᾠ' => 'o','ᾡ' => 'o','ᾢ' => 'o',
- 'ᾣ' => 'o','ᾤ' => 'o','ᾥ' => 'o','ᾦ' => 'o','ᾧ' => 'o','ὼ' => 'o',
- 'ῲ' => 'o','ῳ' => 'o','ῴ' => 'o','ῶ' => 'o','ῷ' => 'o','А' => 'A',
- 'Б' => 'B','В' => 'V','Г' => 'G','Д' => 'D','Е' => 'E','Ё' => 'E',
- 'Ж' => 'Z','З' => 'Z','И' => 'I','Й' => 'I','К' => 'K','Л' => 'L',
- 'М' => 'M','Н' => 'N','О' => 'O','П' => 'P','Р' => 'R','С' => 'S',
- 'Т' => 'T','У' => 'U','Ф' => 'F','Х' => 'K','Ц' => 'T','Ч' => 'C',
- 'Ш' => 'S','Щ' => 'S','Ы' => 'Y','Э' => 'E','Ю' => 'Y','Я' => 'Y',
- 'а' => 'A','б' => 'B','в' => 'V','г' => 'G','д' => 'D','е' => 'E',
- 'ё' => 'E','ж' => 'Z','з' => 'Z','и' => 'I','й' => 'I','к' => 'K',
- 'л' => 'L','м' => 'M','н' => 'N','о' => 'O','п' => 'P','р' => 'R',
- 'с' => 'S','т' => 'T','у' => 'U','ф' => 'F','х' => 'K','ц' => 'T',
- 'ч' => 'C','ш' => 'S','щ' => 'S','ы' => 'Y','э' => 'E','ю' => 'Y',
- 'я' => 'Y','ð' => 'd','Ð' => 'D','þ' => 't','Þ' => 'T','ა' => 'a',
- 'ბ' => 'b','გ' => 'g','დ' => 'd','ე' => 'e','ვ' => 'v','ზ' => 'z',
- 'თ' => 't','ი' => 'i','კ' => 'k','ლ' => 'l','მ' => 'm','ნ' => 'n',
- 'ო' => 'o','პ' => 'p','ჟ' => 'z','რ' => 'r','ს' => 's','ტ' => 't',
- 'უ' => 'u','ფ' => 'p','ქ' => 'k','ღ' => 'g','ყ' => 'q','შ' => 's',
- 'ჩ' => 'c','ც' => 't','ძ' => 'd','წ' => 't','ჭ' => 'c','ხ' => 'k',
- 'ჯ' => 'j','ჰ' => 'h','ā' => 'a','ţ' => 't','ʼ' => "'", '̧' => '',
- 'ḩ' => 'h','ʼ' => "'",'‘' => "'",'’' => "'",'ừ' => 'u','/' => '',
- 'ế' => 'e','ả' => 'a','ị' => 'i','ậ' => 'a','ệ' => 'e','ỉ' => 'i',
- 'ồ' => 'o','ề' => 'e','ơ' => 'o','ạ' => 'a','ẵ' => 'a','ư' => 'u',
- 'ằ' => 'a','ầ' => 'a','ḑ' => 'd','Ḩ' => 'H','Ḑ' => 'D','ḑ' => 'd',
- 'Ģ' => 'G','Š' => 'S','ļ' => 'l','ž' => 'z','Ē' => 'E','ņ' => 'n',
- 'Č' => 'C','ș' => 's','ț' => 't', 'ộ' => 'o','ắ' => 'a','ş' => 's',
- "'" => '', 'ու' => 'u','ա' => 'a','բ' => 'b','գ' => 'g','դ' => 'd',
- 'ե' => 'e','զ' => 'z','է' => 'e','ը' => 'y','թ' => 't','ժ' => 'zh',
- 'ի' => 'i','լ' => 'l','խ' => 'kh','ծ' => 'ts','կ' => 'k','հ' => 'h',
- 'ձ' => 'dz','ղ' => 'gh','ճ' => 'ch','մ' => 'm','յ' => 'y','ն' => 'n',
- 'շ' => 'sh','ո' => 'o','չ' => 'ch','պ' => 'p','ջ' => 'j','ռ' => 'r',
- 'ս' => 's','վ' => 'v','տ' => 't','ր' => 'r','ց' => 'ts','փ' => 'p',
- 'ք' => 'q','և' => 'ev','օ' => 'o','ֆ' => 'f',
- );
- return str_replace(array_keys($transliterationTable), array_values($transliterationTable), $string);
- }
-
- private static function transliterate($string)
- {
- $transId = 'Any-Latin; Latin-ASCII; NFD; [:Nonspacing Mark:] Remove; NFC; Lower();';
- if (function_exists('transliterator_transliterate') && $transliterator = \Transliterator::create($transId)) {
- $transString = $transliterator->transliterate($string);
- } else {
- $transString = static::toAscii($string);
- }
-
- return preg_replace('/[^A-Za-z0-9_.]/u', '', $transString);
- }
-
/**
* @example 'jdoe@acme.biz'
*/
public function email()
{
$format = static::randomElement(static::$emailFormats);
-
+
return $this->generator->parse($format);
}
@@ -219,7 +93,18 @@ class Internet extends \Faker\Provider\Base
$format = static::randomElement(static::$userNameFormats);
$username = static::bothify($this->generator->parse($format));
- return static::transliterate($username);
+ $username = strtolower(static::transliterate($username));
+
+ // check if transliterate() didn't support the language and removed all letters
+ if (trim($username, '._') === '') {
+ throw new \Exception('userName failed with the selected locale. Try a different locale or activate the "intl" PHP extension.');
+ }
+
+ // clean possible trailing dots from first/last names
+ $username = str_replace('..', '.', $username);
+ $username = rtrim($username, '.');
+
+ return $username;
}
/**
* @example 'fY4èHdZv68'
@@ -246,7 +131,17 @@ class Internet extends \Faker\Provider\Base
{
$lastName = $this->generator->format('lastName');
- return static::transliterate($lastName);
+ $lastName = strtolower(static::transliterate($lastName));
+
+ // check if transliterate() didn't support the language and removed all letters
+ if (trim($lastName, '._') === '') {
+ throw new \Exception('domainWord failed with the selected locale. Try a different locale or activate the "intl" PHP extension.');
+ }
+
+ // clean possible trailing dot from last name
+ $lastName = rtrim($lastName, '.');
+
+ return $lastName;
}
/**
@@ -280,7 +175,7 @@ class Internet extends \Faker\Provider\Base
}
$words = $this->generator->words($nbWords);
- return join($words, '-');
+ return join('-', $words);
}
/**
@@ -288,7 +183,7 @@ class Internet extends \Faker\Provider\Base
*/
public function ipv4()
{
- return long2ip(mt_rand(0, 1) == 0 ? mt_rand(-2147483648, 0) : mt_rand(1, 2147483647));
+ return long2ip(mt_rand(0, 1) == 0 ? mt_rand(-2147483648, -2) : mt_rand(16777216, 2147483647));
}
/**
@@ -311,13 +206,11 @@ class Internet extends \Faker\Provider\Base
{
if (static::numberBetween(0, 1) === 0) {
// 10.x.x.x range
- $ip = long2ip(static::numberBetween(167772160, 184549375));
- } else {
- // 192.168.x.x range
- $ip = long2ip(static::numberBetween(3232235520, 3232301055));
+ return long2ip(static::numberBetween(ip2long("10.0.0.0"), ip2long("10.255.255.255")));
}
- return $ip;
+ // 192.168.x.x range
+ return long2ip(static::numberBetween(ip2long("192.168.0.0"), ip2long("192.168.255.255")));
}
/**
@@ -332,4 +225,138 @@ class Internet extends \Faker\Provider\Base
return $mac;
}
+
+ protected static function transliterate($string)
+ {
+ if (0 === preg_match('/[^A-Za-z0-9_.]/', $string)) {
+ return $string;
+ }
+
+ $transId = 'Any-Latin; Latin-ASCII; NFD; [:Nonspacing Mark:] Remove; NFC;';
+ if (class_exists('Transliterator', false) && $transliterator = \Transliterator::create($transId)) {
+ $transString = $transliterator->transliterate($string);
+ } else {
+ $transString = static::toAscii($string);
+ }
+
+ return preg_replace('/[^A-Za-z0-9_.]/u', '', $transString);
+ }
+
+ protected static function toAscii($string)
+ {
+ static $arrayFrom, $arrayTo;
+
+ if (empty($arrayFrom)) {
+ $transliterationTable = array(
+ 'IJ'=>'I', 'Ö'=>'O', 'Œ'=>'O', 'Ü'=>'U', 'ä'=>'a', 'æ'=>'a',
+ 'ij'=>'i', 'ö'=>'o', 'œ'=>'o', 'ü'=>'u', 'ß'=>'s', 'ſ'=>'s',
+ 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A',
+ 'Æ'=>'A', 'Ā'=>'A', 'Ą'=>'A', 'Ă'=>'A', 'Ç'=>'C', 'Ć'=>'C',
+ 'Č'=>'C', 'Ĉ'=>'C', 'Ċ'=>'C', 'Ď'=>'D', 'Đ'=>'D', 'È'=>'E',
+ 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ē'=>'E', 'Ę'=>'E', 'Ě'=>'E',
+ 'Ĕ'=>'E', 'Ė'=>'E', 'Ĝ'=>'G', 'Ğ'=>'G', 'Ġ'=>'G', 'Ģ'=>'G',
+ 'Ĥ'=>'H', 'Ħ'=>'H', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I',
+ 'Ī'=>'I', 'Ĩ'=>'I', 'Ĭ'=>'I', 'Į'=>'I', 'İ'=>'I', 'Ĵ'=>'J',
+ 'Ķ'=>'K', 'Ľ'=>'K', 'Ĺ'=>'K', 'Ļ'=>'K', 'Ŀ'=>'K', 'Ł'=>'L',
+ 'Ñ'=>'N', 'Ń'=>'N', 'Ň'=>'N', 'Ņ'=>'N', 'Ŋ'=>'N', 'Ò'=>'O',
+ 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ø'=>'O', 'Ō'=>'O', 'Ő'=>'O',
+ 'Ŏ'=>'O', 'Ŕ'=>'R', 'Ř'=>'R', 'Ŗ'=>'R', 'Ś'=>'S', 'Ş'=>'S',
+ 'Ŝ'=>'S', 'Ș'=>'S', 'Š'=>'S', 'Ť'=>'T', 'Ţ'=>'T', 'Ŧ'=>'T',
+ 'Ț'=>'T', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ū'=>'U', 'Ů'=>'U',
+ 'Ű'=>'U', 'Ŭ'=>'U', 'Ũ'=>'U', 'Ų'=>'U', 'Ŵ'=>'W', 'Ŷ'=>'Y',
+ 'Ÿ'=>'Y', 'Ý'=>'Y', 'Ź'=>'Z', 'Ż'=>'Z', 'Ž'=>'Z', 'à'=>'a',
+ 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ā'=>'a', 'ą'=>'a', 'ă'=>'a',
+ 'å'=>'a', 'ç'=>'c', 'ć'=>'c', 'č'=>'c', 'ĉ'=>'c', 'ċ'=>'c',
+ 'ď'=>'d', 'đ'=>'d', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e',
+ 'ē'=>'e', 'ę'=>'e', 'ě'=>'e', 'ĕ'=>'e', 'ė'=>'e', 'ƒ'=>'f',
+ 'ĝ'=>'g', 'ğ'=>'g', 'ġ'=>'g', 'ģ'=>'g', 'ĥ'=>'h', 'ħ'=>'h',
+ 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ī'=>'i', 'ĩ'=>'i',
+ 'ĭ'=>'i', 'į'=>'i', 'ı'=>'i', 'ĵ'=>'j', 'ķ'=>'k', 'ĸ'=>'k',
+ 'ł'=>'l', 'ľ'=>'l', 'ĺ'=>'l', 'ļ'=>'l', 'ŀ'=>'l', 'ñ'=>'n',
+ 'ń'=>'n', 'ň'=>'n', 'ņ'=>'n', 'ʼn'=>'n', 'ŋ'=>'n', 'ò'=>'o',
+ 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ø'=>'o', 'ō'=>'o', 'ő'=>'o',
+ 'ŏ'=>'o', 'ŕ'=>'r', 'ř'=>'r', 'ŗ'=>'r', 'ś'=>'s', 'š'=>'s',
+ 'ť'=>'t', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ū'=>'u', 'ů'=>'u',
+ 'ű'=>'u', 'ŭ'=>'u', 'ũ'=>'u', 'ų'=>'u', 'ŵ'=>'w', 'ÿ'=>'y',
+ 'ý'=>'y', 'ŷ'=>'y', 'ż'=>'z', 'ź'=>'z', 'ž'=>'z', 'Α'=>'A',
+ 'Ά'=>'A', 'Ἀ'=>'A', 'Ἁ'=>'A', 'Ἂ'=>'A', 'Ἃ'=>'A', 'Ἄ'=>'A',
+ 'Ἅ'=>'A', 'Ἆ'=>'A', 'Ἇ'=>'A', 'ᾈ'=>'A', 'ᾉ'=>'A', 'ᾊ'=>'A',
+ 'ᾋ'=>'A', 'ᾌ'=>'A', 'ᾍ'=>'A', 'ᾎ'=>'A', 'ᾏ'=>'A', 'Ᾰ'=>'A',
+ 'Ᾱ'=>'A', 'Ὰ'=>'A', 'ᾼ'=>'A', 'Β'=>'B', 'Γ'=>'G', 'Δ'=>'D',
+ 'Ε'=>'E', 'Έ'=>'E', 'Ἐ'=>'E', 'Ἑ'=>'E', 'Ἒ'=>'E', 'Ἓ'=>'E',
+ 'Ἔ'=>'E', 'Ἕ'=>'E', 'Ὲ'=>'E', 'Ζ'=>'Z', 'Η'=>'I', 'Ή'=>'I',
+ 'Ἠ'=>'I', 'Ἡ'=>'I', 'Ἢ'=>'I', 'Ἣ'=>'I', 'Ἤ'=>'I', 'Ἥ'=>'I',
+ 'Ἦ'=>'I', 'Ἧ'=>'I', 'ᾘ'=>'I', 'ᾙ'=>'I', 'ᾚ'=>'I', 'ᾛ'=>'I',
+ 'ᾜ'=>'I', 'ᾝ'=>'I', 'ᾞ'=>'I', 'ᾟ'=>'I', 'Ὴ'=>'I', 'ῌ'=>'I',
+ 'Θ'=>'T', 'Ι'=>'I', 'Ί'=>'I', 'Ϊ'=>'I', 'Ἰ'=>'I', 'Ἱ'=>'I',
+ 'Ἲ'=>'I', 'Ἳ'=>'I', 'Ἴ'=>'I', 'Ἵ'=>'I', 'Ἶ'=>'I', 'Ἷ'=>'I',
+ 'Ῐ'=>'I', 'Ῑ'=>'I', 'Ὶ'=>'I', 'Κ'=>'K', 'Λ'=>'L', 'Μ'=>'M',
+ 'Ν'=>'N', 'Ξ'=>'K', 'Ο'=>'O', 'Ό'=>'O', 'Ὀ'=>'O', 'Ὁ'=>'O',
+ 'Ὂ'=>'O', 'Ὃ'=>'O', 'Ὄ'=>'O', 'Ὅ'=>'O', 'Ὸ'=>'O', 'Π'=>'P',
+ 'Ρ'=>'R', 'Ῥ'=>'R', 'Σ'=>'S', 'Τ'=>'T', 'Υ'=>'Y', 'Ύ'=>'Y',
+ 'Ϋ'=>'Y', 'Ὑ'=>'Y', 'Ὓ'=>'Y', 'Ὕ'=>'Y', 'Ὗ'=>'Y', 'Ῠ'=>'Y',
+ 'Ῡ'=>'Y', 'Ὺ'=>'Y', 'Φ'=>'F', 'Χ'=>'X', 'Ψ'=>'P', 'Ω'=>'O',
+ 'Ώ'=>'O', 'Ὠ'=>'O', 'Ὡ'=>'O', 'Ὢ'=>'O', 'Ὣ'=>'O', 'Ὤ'=>'O',
+ 'Ὥ'=>'O', 'Ὦ'=>'O', 'Ὧ'=>'O', 'ᾨ'=>'O', 'ᾩ'=>'O', 'ᾪ'=>'O',
+ 'ᾫ'=>'O', 'ᾬ'=>'O', 'ᾭ'=>'O', 'ᾮ'=>'O', 'ᾯ'=>'O', 'Ὼ'=>'O',
+ 'ῼ'=>'O', 'α'=>'a', 'ά'=>'a', 'ἀ'=>'a', 'ἁ'=>'a', 'ἂ'=>'a',
+ 'ἃ'=>'a', 'ἄ'=>'a', 'ἅ'=>'a', 'ἆ'=>'a', 'ἇ'=>'a', 'ᾀ'=>'a',
+ 'ᾁ'=>'a', 'ᾂ'=>'a', 'ᾃ'=>'a', 'ᾄ'=>'a', 'ᾅ'=>'a', 'ᾆ'=>'a',
+ 'ᾇ'=>'a', 'ὰ'=>'a', 'ᾰ'=>'a', 'ᾱ'=>'a', 'ᾲ'=>'a', 'ᾳ'=>'a',
+ 'ᾴ'=>'a', 'ᾶ'=>'a', 'ᾷ'=>'a', 'β'=>'b', 'γ'=>'g', 'δ'=>'d',
+ 'ε'=>'e', 'έ'=>'e', 'ἐ'=>'e', 'ἑ'=>'e', 'ἒ'=>'e', 'ἓ'=>'e',
+ 'ἔ'=>'e', 'ἕ'=>'e', 'ὲ'=>'e', 'ζ'=>'z', 'η'=>'i', 'ή'=>'i',
+ 'ἠ'=>'i', 'ἡ'=>'i', 'ἢ'=>'i', 'ἣ'=>'i', 'ἤ'=>'i', 'ἥ'=>'i',
+ 'ἦ'=>'i', 'ἧ'=>'i', 'ᾐ'=>'i', 'ᾑ'=>'i', 'ᾒ'=>'i', 'ᾓ'=>'i',
+ 'ᾔ'=>'i', 'ᾕ'=>'i', 'ᾖ'=>'i', 'ᾗ'=>'i', 'ὴ'=>'i', 'ῂ'=>'i',
+ 'ῃ'=>'i', 'ῄ'=>'i', 'ῆ'=>'i', 'ῇ'=>'i', 'θ'=>'t', 'ι'=>'i',
+ 'ί'=>'i', 'ϊ'=>'i', 'ΐ'=>'i', 'ἰ'=>'i', 'ἱ'=>'i', 'ἲ'=>'i',
+ 'ἳ'=>'i', 'ἴ'=>'i', 'ἵ'=>'i', 'ἶ'=>'i', 'ἷ'=>'i', 'ὶ'=>'i',
+ 'ῐ'=>'i', 'ῑ'=>'i', 'ῒ'=>'i', 'ῖ'=>'i', 'ῗ'=>'i', 'κ'=>'k',
+ 'λ'=>'l', 'μ'=>'m', 'ν'=>'n', 'ξ'=>'k', 'ο'=>'o', 'ό'=>'o',
+ 'ὀ'=>'o', 'ὁ'=>'o', 'ὂ'=>'o', 'ὃ'=>'o', 'ὄ'=>'o', 'ὅ'=>'o',
+ 'ὸ'=>'o', 'π'=>'p', 'ρ'=>'r', 'ῤ'=>'r', 'ῥ'=>'r', 'σ'=>'s',
+ 'ς'=>'s', 'τ'=>'t', 'υ'=>'y', 'ύ'=>'y', 'ϋ'=>'y', 'ΰ'=>'y',
+ 'ὐ'=>'y', 'ὑ'=>'y', 'ὒ'=>'y', 'ὓ'=>'y', 'ὔ'=>'y', 'ὕ'=>'y',
+ 'ὖ'=>'y', 'ὗ'=>'y', 'ὺ'=>'y', 'ῠ'=>'y', 'ῡ'=>'y', 'ῢ'=>'y',
+ 'ῦ'=>'y', 'ῧ'=>'y', 'φ'=>'f', 'χ'=>'x', 'ψ'=>'p', 'ω'=>'o',
+ 'ώ'=>'o', 'ὠ'=>'o', 'ὡ'=>'o', 'ὢ'=>'o', 'ὣ'=>'o', 'ὤ'=>'o',
+ 'ὥ'=>'o', 'ὦ'=>'o', 'ὧ'=>'o', 'ᾠ'=>'o', 'ᾡ'=>'o', 'ᾢ'=>'o',
+ 'ᾣ'=>'o', 'ᾤ'=>'o', 'ᾥ'=>'o', 'ᾦ'=>'o', 'ᾧ'=>'o', 'ὼ'=>'o',
+ 'ῲ'=>'o', 'ῳ'=>'o', 'ῴ'=>'o', 'ῶ'=>'o', 'ῷ'=>'o', 'А'=>'A',
+ 'Б'=>'B', 'В'=>'V', 'Г'=>'G', 'Д'=>'D', 'Е'=>'E', 'Ё'=>'E',
+ 'Ж'=>'Z', 'З'=>'Z', 'И'=>'I', 'Й'=>'I', 'К'=>'K', 'Л'=>'L',
+ 'М'=>'M', 'Н'=>'N', 'О'=>'O', 'П'=>'P', 'Р'=>'R', 'С'=>'S',
+ 'Т'=>'T', 'У'=>'U', 'Ф'=>'F', 'Х'=>'K', 'Ц'=>'T', 'Ч'=>'C',
+ 'Ш'=>'S', 'Щ'=>'S', 'Ы'=>'Y', 'Э'=>'E', 'Ю'=>'Y', 'Я'=>'Y',
+ 'а'=>'A', 'б'=>'B', 'в'=>'V', 'г'=>'G', 'д'=>'D', 'е'=>'E',
+ 'ё'=>'E', 'ж'=>'Z', 'з'=>'Z', 'и'=>'I', 'й'=>'I', 'к'=>'K',
+ 'л'=>'L', 'м'=>'M', 'н'=>'N', 'о'=>'O', 'п'=>'P', 'р'=>'R',
+ 'с'=>'S', 'т'=>'T', 'у'=>'U', 'ф'=>'F', 'х'=>'K', 'ц'=>'T',
+ 'ч'=>'C', 'ш'=>'S', 'щ'=>'S', 'ы'=>'Y', 'э'=>'E', 'ю'=>'Y',
+ 'я'=>'Y', 'ð'=>'d', 'Ð'=>'D', 'þ'=>'t', 'Þ'=>'T', 'ა'=>'a',
+ 'ბ'=>'b', 'გ'=>'g', 'დ'=>'d', 'ე'=>'e', 'ვ'=>'v', 'ზ'=>'z',
+ 'თ'=>'t', 'ი'=>'i', 'კ'=>'k', 'ლ'=>'l', 'მ'=>'m', 'ნ'=>'n',
+ 'ო'=>'o', 'პ'=>'p', 'ჟ'=>'z', 'რ'=>'r', 'ს'=>'s', 'ტ'=>'t',
+ 'უ'=>'u', 'ფ'=>'p', 'ქ'=>'k', 'ღ'=>'g', 'ყ'=>'q', 'შ'=>'s',
+ 'ჩ'=>'c', 'ც'=>'t', 'ძ'=>'d', 'წ'=>'t', 'ჭ'=>'c', 'ხ'=>'k',
+ 'ჯ'=>'j', 'ჰ'=>'h', 'ţ'=>'t', 'ʼ'=>"'", '̧'=>'', 'ḩ'=>'h',
+ '‘'=>"'", '’'=>"'", 'ừ'=>'u', '/'=>'', 'ế'=>'e', 'ả'=>'a',
+ 'ị'=>'i', 'ậ'=>'a', 'ệ'=>'e', 'ỉ'=>'i', 'ồ'=>'o', 'ề'=>'e',
+ 'ơ'=>'o', 'ạ'=>'a', 'ẵ'=>'a', 'ư'=>'u', 'ằ'=>'a', 'ầ'=>'a',
+ 'ḑ'=>'d', 'Ḩ'=>'H', 'Ḑ'=>'D', 'ș'=>'s', 'ț'=>'t', 'ộ'=>'o',
+ 'ắ'=>'a', 'ş'=>'s', "'"=>'', 'ու'=>'u', 'ա'=>'a', 'բ'=>'b',
+ 'գ'=>'g', 'դ'=>'d', 'ե'=>'e', 'զ'=>'z', 'է'=>'e', 'ը'=>'y',
+ 'թ'=>'t', 'ժ'=>'zh', 'ի'=>'i', 'լ'=>'l', 'խ'=>'kh', 'ծ'=>'ts',
+ 'կ'=>'k', 'հ'=>'h', 'ձ'=>'dz', 'ղ'=>'gh', 'ճ'=>'ch', 'մ'=>'m',
+ 'յ'=>'y', 'ն'=>'n', 'շ'=>'sh', 'ո'=>'o', 'չ'=>'ch', 'պ'=>'p',
+ 'ջ'=>'j', 'ռ'=>'r', 'ս'=>'s', 'վ'=>'v', 'տ'=>'t', 'ր'=>'r',
+ 'ց'=>'ts', 'փ'=>'p', 'ք'=>'q', 'և'=>'ev', 'օ'=>'o', 'ֆ'=>'f',
+ );
+ $arrayFrom = array_keys($transliterationTable);
+ $arrayTo = array_values($transliterationTable);
+ }
+
+ return str_replace($arrayFrom, $arrayTo, $string);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Lorem.php b/vendor/fzaninotto/faker/src/Faker/Provider/Lorem.php
index 7ba0ced5..b8c6dac2 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/Lorem.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/Lorem.php
@@ -2,7 +2,7 @@
namespace Faker\Provider;
-class Lorem extends \Faker\Provider\Base
+class Lorem extends Base
{
protected static $wordList = array(
'alias', 'consequatur', 'aut', 'perferendis', 'sit', 'voluptatem',
@@ -68,7 +68,7 @@ class Lorem extends \Faker\Provider\Base
$words []= static::word();
}
- return $asText ? join(' ', $words) : $words;
+ return $asText ? implode(' ', $words) : $words;
}
/**
@@ -92,7 +92,7 @@ class Lorem extends \Faker\Provider\Base
$words = static::words($nbWords);
$words[0] = ucwords($words[0]);
- return join($words, ' ') . '.';
+ return implode(' ', $words) . '.';
}
/**
@@ -110,7 +110,7 @@ class Lorem extends \Faker\Provider\Base
$sentences []= static::sentence();
}
- return $asText ? join(' ', $sentences) : $sentences;
+ return $asText ? implode(' ', $sentences) : $sentences;
}
/**
@@ -131,7 +131,7 @@ class Lorem extends \Faker\Provider\Base
$nbSentences = self::randomizeNbElements($nbSentences);
}
- return join(static::sentences($nbSentences), ' ');
+ return implode(' ', static::sentences($nbSentences));
}
/**
@@ -149,63 +149,51 @@ class Lorem extends \Faker\Provider\Base
$paragraphs []= static::paragraph();
}
- return $asText ? join("\n\n", $paragraphs) : $paragraphs;
+ return $asText ? implode("\n\n", $paragraphs) : $paragraphs;
}
/**
* Generate a text string.
* Depending on the $maxNbChars, returns a string made of words, sentences, or paragraphs.
*
- * @example 'Sapiente sunt omnis. Ut pariatur ad autem ducimus et. Voluptas rem voluptas sint modi dolorem amet.'
+ * @example 'Sapiente sunt omnis. Ut pariatur ad autem ducimus et. Voluptas rem voluptas sint modi dolorem amet.'
+ *
* @param integer $maxNbChars Maximum number of characters the text should contain (minimum 5)
+ *
* @return string
*/
public static function text($maxNbChars = 200)
{
- $text = array();
if ($maxNbChars < 5) {
throw new \InvalidArgumentException('text() can only generate text of at least 5 characters');
- } elseif ($maxNbChars < 25) {
- // join words
- while (empty($text)) {
- $size = 0;
- // determine how many words are needed to reach the $maxNbChars once;
- while ($size < $maxNbChars) {
- $word = ($size ? ' ' : '') . static::word();
- $text []= $word;
- $size += strlen($word);
- }
- array_pop($text);
- }
- $text[0][0] = static::toUpper($text[0][0]);
- $text[count($text) - 1] .= '.';
- } elseif ($maxNbChars < 100) {
- // join sentences
- while (empty($text)) {
- $size = 0;
- // determine how many sentences are needed to reach the $maxNbChars once;
- while ($size < $maxNbChars) {
- $sentence = ($size ? ' ' : '') . static::sentence();
- $text []= $sentence;
- $size += strlen($sentence);
- }
- array_pop($text);
- }
- } else {
- // join paragraphs
- while (empty($text)) {
- $size = 0;
- // determine how many paragraphs are needed to reach the $maxNbChars once;
- while ($size < $maxNbChars) {
- $paragraph = ($size ? "\n" : '') . static::paragraph();
- $text []= $paragraph;
- $size += strlen($paragraph);
- }
- array_pop($text);
- }
}
- return join($text, '');
+ $type = ($maxNbChars < 25) ? 'word' : (($maxNbChars < 100) ? 'sentence' : 'paragraph');
+
+ $text = array();
+ while (empty($text)) {
+ $size = 0;
+
+ // until $maxNbChars is reached
+ while ($size < $maxNbChars) {
+ $word = ($size ? ' ' : '') . static::$type();
+ $text[] = $word;
+
+ $size += strlen($word);
+ }
+
+ array_pop($text);
+ }
+
+ if ($type === 'word') {
+ // capitalize first letter
+ $text[0] = ucwords($text[0]);
+
+ // end sentence with full stop
+ $text[count($text) - 1] .= '.';
+ }
+
+ return implode('', $text);
}
protected static function randomizeNbElements($nbElements)
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Miscellaneous.php b/vendor/fzaninotto/faker/src/Faker/Provider/Miscellaneous.php
index 4557a58e..4f669c92 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/Miscellaneous.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/Miscellaneous.php
@@ -2,9 +2,56 @@
namespace Faker\Provider;
-class Miscellaneous extends \Faker\Provider\Base
+class Miscellaneous extends Base
{
- protected static $languageCode = array('cn', 'de', 'en', 'es', 'fr', 'it', 'pt', 'ru');
+ /**
+ * @link https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
+ * On date of 2017-03-26
+ *
+ * U+1F600 - U+1F637 as their UTF-8 Pairings
+ */
+ protected static $emoji = array(
+ '\uD83D\uDE00', '\uD83D\uDE01', '\uD83D\uDE02', '\uD83D\uDE03',
+ '\uD83D\uDE04', '\uD83D\uDE05', '\uD83D\uDE06', '\uD83D\uDE07',
+ '\uD83D\uDE08', '\uD83D\uDE09', '\uD83D\uDE0A', '\uD83D\uDE0B',
+ '\uD83D\uDE0C', '\uD83D\uDE0D', '\uD83D\uDE0E', '\uD83D\uDE0F',
+ '\uD83D\uDE10', '\uD83D\uDE11', '\uD83D\uDE12', '\uD83D\uDE13',
+ '\uD83D\uDE14', '\uD83D\uDE15', '\uD83D\uDE16', '\uD83D\uDE17',
+ '\uD83D\uDE18', '\uD83D\uDE19', '\uD83D\uDE1A', '\uD83D\uDE1B',
+ '\uD83D\uDE1C', '\uD83D\uDE1D', '\uD83D\uDE1E', '\uD83D\uDE1F',
+ '\uD83D\uDE20', '\uD83D\uDE21', '\uD83D\uDE22', '\uD83D\uDE23',
+ '\uD83D\uDE24', '\uD83D\uDE25', '\uD83D\uDE26', '\uD83D\uDE27',
+ '\uD83D\uDE28', '\uD83D\uDE29', '\uD83D\uDE2A', '\uD83D\uDE2B',
+ '\uD83D\uDE2C', '\uD83D\uDE2D', '\uD83D\uDE2E', '\uD83D\uDE2F',
+ '\uD83D\uDE30', '\uD83D\uDE31', '\uD83D\uDE32', '\uD83D\uDE33',
+ '\uD83D\uDE34', '\uD83D\uDE35', '\uD83D\uDE36', '\uD83D\uDE37',
+ );
+
+ /**
+ * @link https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
+ * On date of 2016-04-22
+ */
+ protected static $languageCode = array(
+ 'aa', 'ab', 'ae', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av',
+ 'ay', 'az', 'ba', 'be', 'bg', 'bh', 'bi', 'bm', 'bn', 'bo',
+ 'br', 'bs', 'ca', 'ce', 'ch', 'co', 'cr', 'cs', 'cu', 'cv',
+ 'cy', 'da', 'de', 'dv', 'dz', 'ee', 'el', 'en', 'eo', 'es',
+ 'et', 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr', 'fy', 'ga',
+ 'gd', 'gl', 'gn', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hr',
+ 'ht', 'hu', 'hy', 'hz', 'ia', 'id', 'ie', 'ig', 'ii', 'ik',
+ 'io', 'is', 'it', 'iu', 'ja', 'jv', 'ka', 'kg', 'ki', 'kj',
+ 'kk', 'kl', 'km', 'kn', 'ko', 'kr', 'ks', 'ku', 'kv', 'kw',
+ 'ky', 'la', 'lb', 'lg', 'li', 'ln', 'lo', 'lt', 'lu', 'lv',
+ 'mg', 'mh', 'mi', 'mk', 'ml', 'mn', 'mr', 'ms', 'mt', 'my',
+ 'na', 'nb', 'nd', 'ne', 'ng', 'nl', 'nn', 'no', 'nr', 'nv',
+ 'ny', 'oc', 'oj', 'om', 'or', 'os', 'pa', 'pi', 'pl', 'ps',
+ 'pt', 'qu', 'rm', 'rn', 'ro', 'ru', 'rw', 'sa', 'sc', 'sd',
+ 'se', 'sg', 'si', 'sk', 'sl', 'sm', 'sn', 'so', 'sq', 'sr',
+ 'ss', 'st', 'su', 'sv', 'sw', 'ta', 'te', 'tg', 'th', 'ti',
+ 'tk', 'tl', 'tn', 'to', 'tr', 'ts', 'tt', 'tw', 'ty', 'ug',
+ 'uk', 'ur', 'uz', 've', 'vi', 'vo', 'wa', 'wo', 'xh', 'yi',
+ 'yo', 'za', 'zh', 'zu',
+ );
/**
* @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
@@ -14,28 +61,28 @@ class Miscellaneous extends \Faker\Provider\Base
'AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR',
'AS', 'AT', 'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE',
'BF', 'BG', 'BH', 'BI', 'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ',
- 'BR', 'BS', 'BT', 'BV', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD',
- 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR',
- 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM',
- 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI',
- 'FJ', 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF',
- 'GG', 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS',
- 'GT', 'GU', 'GW', 'GY', 'HK', 'HM', 'HN', 'HR', 'HT', 'HU',
- 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT',
- 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN',
- 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK',
- 'LR', 'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME',
- 'MF', 'MG', 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ',
- 'MR', 'MS', 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA',
- 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU',
- 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM',
- 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS',
- 'RU', 'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI',
- 'SJ', 'SK', 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV',
- 'SX', 'SY', 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK',
- 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA',
- 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI',
- 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW',
+ 'BR', 'BS', 'BT', 'BW', 'BY', 'BZ', 'CA', 'CC', 'CD', 'CF',
+ 'CG', 'CH', 'CI', 'CK', 'CL', 'CM', 'CN', 'CO', 'CR', 'CU',
+ 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK', 'DM', 'DO',
+ 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ',
+ 'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG',
+ 'GH', 'GI', 'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT',
+ 'GU', 'GW', 'GY', 'HK', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE',
+ 'IL', 'IM', 'IN', 'IO', 'IQ', 'IR', 'IS', 'IT', 'JE', 'JM',
+ 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM', 'KN', 'KP', 'KR',
+ 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR', 'LS',
+ 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG',
+ 'MH', 'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS',
+ 'MT', 'MU', 'MV', 'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE',
+ 'NF', 'NG', 'NI', 'NL', 'NO', 'NP', 'NR', 'NU', 'NZ', 'OM',
+ 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL', 'PM', 'PN', 'PR',
+ 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU', 'RW',
+ 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK',
+ 'SL', 'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY',
+ 'SZ', 'TC', 'TD', 'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM',
+ 'TN', 'TO', 'TR', 'TT', 'TV', 'TW', 'TZ', 'UA', 'UG', 'UM',
+ 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG', 'VI', 'VN', 'VU',
+ 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW',
);
/**
@@ -154,39 +201,44 @@ class Miscellaneous extends \Faker\Provider\Base
);
/**
- * @link http://en.wikipedia.org/wiki/ISO_4217
- * On date of 2015-01-10
+ * @link https://en.wikipedia.org/wiki/ISO_4217
+ * On date of 2019-09-27
+ *
+ * With the following exceptions:
+ * SVC has been replaced by the USD in 2001: https://en.wikipedia.org/wiki/Salvadoran_col%C3%B3n
+ * ZWL has been suspended since 2009: https://en.wikipedia.org/wiki/Zimbabwean_dollar
*/
protected static $currencyCode = array(
'AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AWG', 'AZN',
'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BRL',
- 'BSD', 'BTC', 'BTN', 'BWP', 'BYR', 'BZD', 'CAD', 'CDF', 'CHF', 'CLF',
- 'CLP', 'CNY', 'COP', 'CRC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP',
- 'DZD', 'EEK', 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL',
- 'GGP', 'GHS', 'GIP', 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK',
- 'HTG', 'HUF', 'IDR', 'ILS', 'IMP', 'INR', 'IQD', 'IRR', 'ISK', 'JEP',
- 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF', 'KPW', 'KRW', 'KWD',
- 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LTL', 'LVL', 'LYD',
- 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRO', 'MTL', 'MUR',
- 'MVR', 'MWK', 'MXN', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR',
- 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN', 'PYG', 'QAR',
- 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG', 'SEK', 'SGD',
- 'SHP', 'SLL', 'SOS', 'SRD', 'STD', 'SVC', 'SYP', 'SZL', 'THB', 'TJS',
- 'TMT', 'TND', 'TOP', 'TRY', 'TTD', 'TWD', 'TZS', 'UAH', 'UGX', 'USD',
- 'UYU', 'UZS', 'VEF', 'VND', 'VUV', 'WST', 'XAF', 'XAG', 'XAU', 'XCD',
- 'XDR', 'XOF', 'XPF', 'YER', 'ZAR', 'ZMK', 'ZMW', 'ZWL'
+ 'BSD', 'BTN', 'BWP', 'BYN', 'BZD', 'CAD', 'CDF', 'CHF', 'CLP', 'CNY',
+ 'COP', 'CRC', 'CUC', 'CUP', 'CVE', 'CZK', 'DJF', 'DKK', 'DOP', 'DZD',
+ 'EGP', 'ERN', 'ETB', 'EUR', 'FJD', 'FKP', 'GBP', 'GEL', 'GHS', 'GIP',
+ 'GMD', 'GNF', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF', 'IDR',
+ 'ILS', 'INR', 'IQD', 'IRR', 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS',
+ 'KHR', 'KMF', 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR',
+ 'LRD', 'LSL', 'LYD', 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP',
+ 'MRU', 'MUR', 'MVR', 'MWK', 'MXN', 'MYR', 'MZN', 'NAD', 'NGN', 'NIO',
+ 'NOK', 'NPR', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP', 'PKR', 'PLN',
+ 'PYG', 'QAR', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SBD', 'SCR', 'SDG',
+ 'SEK', 'SGD', 'SHP', 'SLL', 'SOS', 'SRD', 'SSP', 'STN', 'SYP', 'SZL',
+ 'THB', 'TJS', 'TMT', 'TND', 'TOP', 'TRY', 'TTD', 'TWD', 'TZS', 'UAH',
+ 'UGX', 'USD', 'UYU', 'UZS', 'VES', 'VND', 'VUV', 'WST', 'XAF', 'XCD',
+ 'XOF', 'XPF', 'YER', 'ZAR', 'ZMW',
);
/**
- * Return a boolean, true or false
+ * Return a boolean, true or false.
+ *
+ * @param int $chanceOfGettingTrue Between 0 (always get false) and 100 (always get true)
*
- * @param integer $chanceOfGettingTrue Between 0 (always get false) and 100 (always get true).
* @return bool
+ *
* @example true
*/
public static function boolean($chanceOfGettingTrue = 50)
{
- return mt_rand(1, 100) <= $chanceOfGettingTrue ? true : false;
+ return mt_rand(1, 100) <= $chanceOfGettingTrue;
}
/**
@@ -223,6 +275,7 @@ class Miscellaneous extends \Faker\Provider\Base
/**
* @example 'FR'
+ *
* @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
*/
public static function countryCode()
@@ -232,6 +285,7 @@ class Miscellaneous extends \Faker\Provider\Base
/**
* @example 'FRA'
+ *
* @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3
*/
public static function countryISOAlpha3()
@@ -249,10 +303,21 @@ class Miscellaneous extends \Faker\Provider\Base
/**
* @example 'EUR'
+ *
* @link https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
*/
public static function currencyCode()
{
return static::randomElement(static::$currencyCode);
}
+
+ /**
+ * Returns an encoded Unicode Character between U+1F600 and U+1F637.
+ *
+ * @link https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
+ */
+ public static function emoji()
+ {
+ return json_decode('"' . static::randomElement(static::$emoji) . '"');
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/Payment.php
index cadbc48d..c4c08581 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/Payment.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/Payment.php
@@ -2,6 +2,7 @@
namespace Faker\Provider;
+use Faker\Calculator\Iban;
use Faker\Calculator\Luhn;
class Payment extends Base
@@ -11,32 +12,44 @@ class Payment extends Base
protected static $cardVendors = array(
'Visa', 'Visa', 'Visa', 'Visa', 'Visa',
'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard',
- 'American Express', 'Discover Card'
+ 'American Express', 'Discover Card', 'Visa Retired'
);
- // see http://en.wikipedia.org/wiki/Bank_card_number for a reference of existing prefixes
+ /**
+ * @var array List of card brand masks for generating valid credit card numbers
+ * @see https://en.wikipedia.org/wiki/Payment_card_number Reference for existing prefixes
+ * @see https://www.mastercard.us/en-us/issuers/get-support/2-series-bin-expansion.html MasterCard 2017 2-Series BIN Expansion
+ */
protected static $cardParams = array(
'Visa' => array(
- "4539########",
"4539###########",
- "4556########",
"4556###########",
- "4916########",
"4916###########",
- "4532########",
"4532###########",
- "4929########",
"4929###########",
- "40240071####",
"40240071#######",
- "4485########",
"4485###########",
- "4716########",
"4716###########",
- "4###########",
"4##############"
),
+ 'Visa Retired' => array(
+ "4539########",
+ "4556########",
+ "4916########",
+ "4532########",
+ "4929########",
+ "40240071####",
+ "4485########",
+ "4716########",
+ "4###########",
+ ),
'MasterCard' => array(
+ "2221###########",
+ "23#############",
+ "24#############",
+ "25#############",
+ "26#############",
+ "2720###########",
"51#############",
"52#############",
"53#############",
@@ -53,7 +66,7 @@ class Payment extends Base
);
/**
- * @var array list of IBAN formats, source: @link http://www.swift.com/dsp/resources/documents/IBAN_Registry.txt
+ * @var array list of IBAN formats, source: @link https://www.swift.com/standards/data-standards/iban
*/
protected static $ibanFormats = array(
'AD' => array(array('n', 4), array('n', 4), array('c', 12)),
@@ -75,6 +88,7 @@ class Payment extends Base
'DO' => array(array('c', 4), array('n', 20)),
'EE' => array(array('n', 2), array('n', 2), array('n', 11), array('n', 1)),
'ES' => array(array('n', 4), array('n', 4), array('n', 1), array('n', 1), array('n', 10)),
+ 'FI' => array(array('n', 6), array('n', 7), array('n', 1)),
'FR' => array(array('n', 5), array('n', 5), array('c', 11), array('n', 2)),
'GB' => array(array('a', 4), array('n', 6), array('n', 8)),
'GE' => array(array('a', 2), array('n', 16)),
@@ -87,7 +101,7 @@ class Payment extends Base
'IL' => array(array('n', 3), array('n', 3), array('n', 13)),
'IS' => array(array('n', 4), array('n', 2), array('n', 6), array('n', 10)),
'IT' => array(array('a', 1), array('n', 5), array('n', 5), array('c', 12)),
- 'KW' => array(array('a', 4), array('c', 22)),
+ 'KW' => array(array('a', 4), array('n', 22)),
'KZ' => array(array('n', 3), array('c', 13)),
'LB' => array(array('n', 4), array('c', 20)),
'LI' => array(array('n', 5), array('c', 12)),
@@ -115,7 +129,7 @@ class Payment extends Base
'SK' => array(array('n', 4), array('n', 6), array('n', 10)),
'SM' => array(array('a', 1), array('n', 5), array('n', 5), array('c', 12)),
'TN' => array(array('n', 2), array('n', 3), array('n', 13), array('n', 2)),
- 'TR' => array(array('n', 5), array('c', 1), array('c', 16)),
+ 'TR' => array(array('n', 5), array('n', 1), array('c', 16)),
'VG' => array(array('a', 4), array('n', 16)),
);
@@ -132,7 +146,7 @@ class Payment extends Base
/**
* Returns the String of a credit card number.
*
- * @param string $type Supporting any of 'Visa', 'MasterCard', 'Amercian Express', and 'Discover'
+ * @param string $type Supporting any of 'Visa', 'MasterCard', 'American Express', and 'Discover'
* @param boolean $formatted Set to true if the output string should contain one separator every 4 digits
* @param string $separator Separator string for formatting card number. Defaults to dash (-).
* @return string
@@ -210,10 +224,11 @@ class Payment extends Base
* @param integer $length total length without country code and 2 check digits
* @return string
*/
- protected static function iban($countryCode, $prefix = '', $length = null)
+ public static function iban($countryCode = null, $prefix = '', $length = null)
{
- $countryCode = strtoupper($countryCode);
- $format = !isset(static::$ibanFormats[$countryCode]) ? array() : static::$ibanFormats[$countryCode];
+ $countryCode = is_null($countryCode) ? self::randomKey(self::$ibanFormats) : strtoupper($countryCode);
+
+ $format = !isset(static::$ibanFormats[$countryCode]) ? null : static::$ibanFormats[$countryCode];
if ($length === null) {
if ($format === null) {
$length = 24;
@@ -225,22 +240,19 @@ class Payment extends Base
}
}
}
+ if ($format === null) {
+ $format = array(array('n', $length));
+ }
+
+ $expandedFormat = '';
+ foreach ($format as $item) {
+ list($class, $length) = $item;
+ $expandedFormat .= str_repeat($class, $length);
+ }
$result = $prefix;
- $length -= strlen($prefix);
- $nextPart = array_shift($format);
- if ($nextPart !== false) {
- list($class, $groupCount) = $nextPart;
- } else {
- $class = 'n';
- $groupCount = 0;
- }
- $groupCount = $nextPart === false ? 0 : $nextPart[1];
- for ($i = 0; $i < $length; $i++) {
- if ($nextPart !== false && $groupCount-- < 1) {
- $nextPart = array_shift($format);
- list($class, $groupCount) = $nextPart;
- }
+ $expandedFormat = substr($expandedFormat, strlen($result));
+ foreach (str_split($expandedFormat) as $class) {
switch ($class) {
default:
case 'c':
@@ -255,35 +267,11 @@ class Payment extends Base
}
}
- $result = static::addBankCodeChecksum($result, $countryCode);
-
- $countryNumber = 100 * (ord($countryCode[0])-55) + (ord($countryCode[1])-55);
- $tempResult = $result . $countryNumber . '00';
- // perform MOD97-10 checksum calculation
- $checksum = (int) $tempResult[0];
- for ($i = 1, $size = strlen($tempResult); $i < $size; $i++) {
- $checksum = (10 * $checksum + (int) $tempResult[$i]) % 97;
- }
- $checksum = 98 - $checksum;
- if ($checksum < 10) {
- $checksum = '0'.$checksum;
- }
+ $checksum = Iban::checksum($countryCode . '00' . $result);
return $countryCode . $checksum . $result;
}
- /**
- * Calculates a checksum for the national bank and branch code part in the IBAN.
- *
- * @param string $iban randomly generated $iban
- * @param string $countryCode ISO 3166-1 alpha-2 country code
- * @return string IBAN with one character altered to a proper checksum
- */
- protected static function addBankCodeChecksum($iban, $countryCode = '')
- {
- return $iban;
- }
-
/**
* Return the String of a SWIFT/BIC number
*
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/Person.php
index bd7cd45a..9d875b66 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/Person.php
@@ -2,7 +2,7 @@
namespace Faker\Provider;
-class Person extends \Faker\Provider\Base
+class Person extends Base
{
const GENDER_MALE = 'male';
const GENDER_FEMALE = 'female';
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/PhoneNumber.php
index 65b24fc2..d9d1f6bb 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/PhoneNumber.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/PhoneNumber.php
@@ -2,15 +2,42 @@
namespace Faker\Provider;
-class PhoneNumber extends \Faker\Provider\Base
+use Faker\Calculator\Luhn;
+
+class PhoneNumber extends Base
{
protected static $formats = array('###-###-###');
/**
* @example '555-123-546'
*/
- public static function phoneNumber()
+ public function phoneNumber()
{
- return static::numerify(static::randomElement(static::$formats));
+ return static::numerify($this->generator->parse(static::randomElement(static::$formats)));
+ }
+
+ /**
+ * @example +27113456789
+ * @return string
+ */
+ public function e164PhoneNumber()
+ {
+ $formats = array('+%############');
+ return static::numerify($this->generator->parse(static::randomElement($formats)));
+ }
+
+ /**
+ * International Mobile Equipment Identity (IMEI)
+ *
+ * @link http://en.wikipedia.org/wiki/International_Mobile_Station_Equipment_Identity
+ * @link http://imei-number.com/imei-validation-check/
+ * @example '720084494799532'
+ * @return int $imei
+ */
+ public function imei()
+ {
+ $imei = (string) static::numerify('##############');
+ $imei .= Luhn::computeCheckDigit($imei);
+ return $imei;
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/Text.php
index 675ad851..80aa02fc 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/Text.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/Text.php
@@ -2,13 +2,14 @@
namespace Faker\Provider;
-abstract class Text extends \Faker\Provider\Base
+abstract class Text extends Base
{
protected static $baseText = '';
protected static $separator = ' ';
protected static $separatorLen = 1;
- protected $explodedText = null;
+ protected $explodedText;
protected $consecutiveWords = array();
+ protected static $textStartsWithUppercase = true;
/**
* Generate a text string by the Markov chain algorithm.
@@ -20,7 +21,7 @@ abstract class Text extends \Faker\Provider\Base
* @example 'Alice, swallowing down her flamingo, and began by taking the little golden key'
* @param integer $maxNbChars Maximum number of characters the text should contain (minimum: 10)
* @param integer $indexSize Determines how many words are considered for the generation of the next word.
- * The minimum is 1, and it produces the higher level of randomness, although the
+ * The minimum is 1, and it produces a higher level of randomness, although the
* generated text usually doesn't make sense. Higher index sizes (up to 5)
* produce more correct text, at the price of less randomness.
* @return string
@@ -39,7 +40,6 @@ abstract class Text extends \Faker\Provider\Base
throw new \InvalidArgumentException('indexSize must be at most 5');
}
-
$words = $this->getConsecutiveWords($indexSize);
$result = array();
$resultLength = 0;
@@ -127,11 +127,15 @@ abstract class Text extends \Faker\Provider\Base
protected static function validStart($word)
{
- return preg_match('/^\p{Lu}/u', $word);
+ $isValid = true;
+ if (static::$textStartsWithUppercase) {
+ $isValid = preg_match('/^\p{Lu}/u', $word);
+ }
+ return $isValid;
}
protected static function appendEnd($text)
{
- return $text.'.';
+ return preg_replace("/([ ,-:;\x{2013}\x{2014}]+$)/us", '', $text).'.';
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php b/vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php
index 132b480f..d659f4bb 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php
@@ -2,11 +2,15 @@
namespace Faker\Provider;
-class UserAgent extends \Faker\Provider\Base
+class UserAgent extends Base
{
protected static $userAgents = array('firefox', 'chrome', 'internetExplorer', 'opera', 'safari');
- protected static $windowsPlatformTokens = array('Windows NT 6.2', 'Windows NT 6.1', 'Windows NT 6.0', 'Windows NT 5.2', 'Windows NT 5.1', 'Windows NT 5.01', 'Windows NT 5.0', 'Windows NT 4.0', 'Windows 98; Win 9x 4.90', 'Windows 98', 'Windows 95', 'Windows CE');
+ protected static $windowsPlatformTokens = array(
+ 'Windows NT 6.2', 'Windows NT 6.1', 'Windows NT 6.0', 'Windows NT 5.2', 'Windows NT 5.1',
+ 'Windows NT 5.01', 'Windows NT 5.0', 'Windows NT 4.0', 'Windows 98; Win 9x 4.90', 'Windows 98',
+ 'Windows 95', 'Windows CE'
+ );
/**
* Possible processors on Linux
@@ -104,7 +108,7 @@ class UserAgent extends \Faker\Provider\Base
} else {
$ver = mt_rand(4, 5) . '.0.' . mt_rand(1, 5);
}
-
+
$mobileDevices = array(
'iPhone; CPU iPhone OS',
'iPad; CPU OS'
@@ -118,7 +122,6 @@ class UserAgent extends \Faker\Provider\Base
return "Mozilla/5.0 " . static::randomElement($platforms);
}
-
/**
* Generate Opera user agent
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/Uuid.php b/vendor/fzaninotto/faker/src/Faker/Provider/Uuid.php
index 7240dfc5..ae5fc86d 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/Uuid.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/Uuid.php
@@ -2,7 +2,7 @@
namespace Faker\Provider;
-class Uuid extends \Faker\Provider\Base
+class Uuid extends Base
{
/**
* Generate name based md5 UUID (version 3).
@@ -10,7 +10,8 @@ class Uuid extends \Faker\Provider\Base
*/
public static function uuid()
{
- // fix for compatibility with 32bit architecture; seed range restricted to 62bit
+ // fix for compatibility with 32bit architecture; each mt_rand call is restricted to 32bit
+ // two such calls will cause 64bits of randomness regardless of architecture
$seed = mt_rand(0, 2147483647) . '#' . mt_rand(0, 2147483647);
// Hash the seed and convert to a byte array
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Company.php
index fc10726a..34a1e17b 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Company.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Company.php
@@ -45,7 +45,7 @@ class Company extends \Faker\Provider\Company
$result[] = static::randomElement($word);
}
- return join($result, ' ');
+ return join(' ', $result);
}
/**
@@ -58,6 +58,6 @@ class Company extends \Faker\Provider\Company
$result[] = static::randomElement($word);
}
- return join($result, ' ');
+ return join(' ', $result);
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php
index dbdbdddc..1d161387 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ar_JO/Text.php
@@ -4,61 +4,9 @@ namespace Faker\Provider\ar_JO;
class Text extends \Faker\Provider\Text
{
-
- /**
- * generates text string in arabic
- *
- * @example ' ولا النوم ولا القرار وكان يقال: لا يجد المريض لذة الطعام والشراب'
- * @param integer $maxNbChars
- * @param integer $indexSize
- * @return string
- * @throws \InvalidArgumentException
- */
- public function realText($maxNbChars = 200, $indexSize = 2)
+ protected static function validStart($word)
{
- if ($maxNbChars < 10) {
- throw new \InvalidArgumentException('maxNbChars must be at least 10');
- }
-
- if ($indexSize < 1) {
- throw new \InvalidArgumentException('indexSize must be at least 1');
- }
-
- if ($indexSize > 5) {
- throw new \InvalidArgumentException('indexSize must be at most 5');
- }
-
- $words = $this->getConsecutiveWords($indexSize);
- $result = array();
- $resultLength = 0;
- // take a random starting point
- $next = static::randomKey($words);
- while ($resultLength < $maxNbChars && isset($words[$next])) {
- // fetch a random word to append
- $word = static::randomElement($words[$next]);
-
- // calculate next index
- $currentWords = explode(' ', $next);
-
- $currentWords[] = $word;
- array_shift($currentWords);
- $next = implode(' ', $currentWords);
-
- if ($resultLength == 0 && !preg_match('/^\p{Arabic}/u', $word)) {
- continue;
- }
- // append the element
- $result[] = $word;
- $resultLength += strlen($word) + 1;
- }
-
- // remove the element that caused the text to overflow
- array_pop($result);
-
- // build result
- $result = implode(' ', $result);
-
- return $result.'.';
+ return preg_match('/^\p{Arabic}/u', $word);
}
/**
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Address.php
new file mode 100644
index 00000000..408ab901
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Address.php
@@ -0,0 +1,146 @@
+generator->parse($format));
+ }
+
+ /**
+ * @example 'wewebit.jo'
+ */
+ public function domainName()
+ {
+ return static::randomElement(static::$lastNameAscii) . '.' . $this->tld();
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Payment.php
new file mode 100644
index 00000000..d69b5d62
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ar_SA/Payment.php
@@ -0,0 +1,19 @@
+generator->boolean() ? static::GENDER_MALE : static::GENDER_FEMALE;
+ }
+
+ $startTimestamp = strtotime("-${maxAge} year");
+ $endTimestamp = strtotime("-${minAge} year");
+ $randTimestamp = static::numberBetween($startTimestamp, $endTimestamp);
+
+ $year = intval(date('Y', $randTimestamp));
+ $month = intval(date('n', $randTimestamp));
+ $day = intval(date('j', $randTimestamp));
+ $suffix = static::numberBetween(0, 999);
+
+ // women has +50 to month
+ if ($gender == static::GENDER_FEMALE) {
+ $month += 50;
+ }
+ // from year 2004 everyone has +20 to month when birth numbers in one day are exhausted
+ if ($year >= 2004 && $this->generator->boolean(10)) {
+ $month += 20;
+ }
+
+ $birthNumber = sprintf('%02d%02d%02d%03d', $year % 100, $month, $day, $suffix);
+
+ // from year 1954 birth number includes CRC
+ if ($year >= 1954) {
+ $crc = intval($birthNumber, 10) % 11;
+ if ($crc == 10) {
+ $crc = 0;
+ }
+ $birthNumber .= sprintf('%d', $crc);
+ }
+
+ // add slash
+ if ($this->generator->boolean($slashProbability)) {
+ $birthNumber = substr($birthNumber, 0, 6) . '/' . substr($birthNumber, 6);
+ }
+
+ return $birthNumber;
+ }
+
+ public static function birthNumberMale()
+ {
+ return static::birthNumber(static::GENDER_MALE);
+ }
+
+ public static function birthNumberFemale()
+ {
+ return static::birthNumber(static::GENDER_FEMALE);
+ }
+
public function title($gender = null)
{
return static::titleMale();
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php
index 90495df9..49ab429e 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/cs_CZ/PhoneNumber.php
@@ -5,10 +5,10 @@ namespace Faker\Provider\cs_CZ;
class PhoneNumber extends \Faker\Provider\PhoneNumber
{
protected static $formats = array(
- '+420 ### ### ###',
- '### ### ###',
- '00420#########',
- '+420#########',
- '#########',
+ '+420 %## ### ###',
+ '%## ### ###',
+ '00420%########',
+ '+420%########',
+ '%########',
);
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Address.php
index 22bcf125..4a2272ca 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Address.php
@@ -4,7 +4,7 @@ namespace Faker\Provider\de_AT;
class Address extends \Faker\Provider\Address
{
- protected static $buildingNumber = array('###', '##', '#');
+ protected static $buildingNumber = array('###', '##', '#', '##[abc]', '#[abc]');
protected static $streetSuffixLong = array(
'Gasse', 'Platz', 'Ring', 'Straße', 'Weg',
@@ -13,7 +13,18 @@ class Address extends \Faker\Provider\Address
'gasse', 'platz', 'ring', 'straße', 'weg',
);
- protected static $postcode = array('####');
+ // As per https://en.wikipedia.org/wiki/List_of_postal_codes_in_Austria (@todo implement more strict postal code values according to wikipedia)
+ protected static $postcode = array(
+ '1###',
+ '2###',
+ '3###',
+ '4###',
+ '5###',
+ '6###',
+ '7###',
+ '8###',
+ '9###',
+ );
protected static $cityNames = array(
'Allentsteig', 'Altheim', 'Althofen', 'Amstetten', 'Ansfelden', 'Attnang-Puchheim',
@@ -40,6 +51,10 @@ class Address extends \Faker\Provider\Address
'Zell am See', 'Zeltweg', 'Zistersdorf', 'Zwettl',
);
+ protected static $state = array(
+ 'Burgenland', 'Kärnten', 'Niederösterreich', 'Oberösterreich', 'Salzburg', 'Steiermark', 'Tirol', 'Vorarlberg', 'Wien'
+ );
+
protected static $country = array(
'Afghanistan', 'Alandinseln', 'Albanien', 'Algerien', 'Amerikanisch-Ozeanien', 'Amerikanisch-Samoa', 'Amerikanische Jungferninseln', 'Andorra', 'Angola', 'Anguilla', 'Antarktis', 'Antigua und Barbuda', 'Argentinien', 'Armenien', 'Aruba', 'Aserbaidschan', 'Australien', 'Ägypten', 'Äquatorialguinea', 'Äthiopien', 'Äußeres Ozeanien',
'Bahamas', 'Bahrain', 'Bangladesch', 'Barbados', 'Belarus', 'Belgien', 'Belize', 'Benin', 'Bermuda', 'Bhutan', 'Bolivien', 'Bosnien und Herzegowina', 'Botsuana', 'Bouvetinsel', 'Brasilien', 'Britische Jungferninseln', 'Britisches Territorium im Indischen Ozean', 'Brunei Darussalam', 'Bulgarien', 'Burkina Faso', 'Burundi',
@@ -96,4 +111,17 @@ class Address extends \Faker\Provider\Address
{
return static::randomElement(static::$streetSuffixLong);
}
+
+ /**
+ * @example 'Wien'
+ */
+ public static function state()
+ {
+ return static::randomElement(static::$state);
+ }
+
+ public static function buildingNumber()
+ {
+ return static::regexify(self::numerify(static::randomElement(static::$buildingNumber)));
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php
index be26cedf..6901e538 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Person.php
@@ -24,81 +24,85 @@ class Person extends \Faker\Provider\Person
'{{titleFemale}} {{firstNameFemale}} {{lastName}} {{suffix}}',
);
+ /**
+ * 60 most popular names in 1985, 1995, 2005 and 2015
+ * {@link} http://www.statistik.at/wcm/idc/idcplg?IdcService=GET_PDF_FILE&RevisionSelectionMethod=LatestReleased&dDocName=021130
+ **/
protected static $firstNameMale = array(
- 'Abel', 'Abraham', 'Adalbero', 'Adam', 'Adamo', 'Adolfo', 'Adrian', 'Adriano', 'Adrianus', 'Adrien', 'Alain', 'Alajos', 'Alan', 'Albain', 'Alban', 'Albano', 'Alberto', 'Albin', 'Alec', 'Alejandro', 'Alessandro', 'Alessio', 'Alex', 'Alexander', 'Alexandre', 'Alexandros', 'Alexej', 'Alexis', 'Alfons', 'Alfonso', 'Aljoscha', 'Allan', 'Allen', 'Alois', 'Alon', 'Alonzo', 'Alphonse', 'Alwin', 'Amadeo', 'Amadeus', 'Amandus', 'Amos', 'Anatol', 'Anatole', 'Anatolij', 'Anders', 'Andi', 'Andor', 'Andre', 'Andreas', 'Andrej', 'Andrew', 'Andrijan', 'Andy', 'Angelus', 'Ansgar', 'Anthony', 'Antoine', 'Anton', 'Antonio', 'Araldo', 'Aram', 'Argus', 'Arjan', 'Armin', 'Arminio', 'Arnaldo', 'Arnault', 'Arndt', 'Arne', 'Arno', 'Arnold', 'Arrigo', 'Art', 'Arthur', 'Artur', 'Arturo', 'August', 'Auguste', 'Augustin', 'Aurelius', 'Axel',
- 'Balduin', 'Balthasar', 'Bardo', 'Barnabas', 'Barnard', 'Barney', 'Baruch', 'Basil', 'Basilius', 'Bastian', 'Bastien', 'Battista', 'Beatus', 'Beltrame', 'Beltran', 'Ben', 'Benedetto', 'Benedict', 'Benedikt', 'Bengt', 'Beniamino', 'Benignus', 'Benito', 'Benjamin', 'Benjy', 'Bennett', 'Benno', 'Benny', 'Benoit', 'Beppe', 'Bernard', 'Bernardo', 'Bernd', 'Bernhard', 'Bernie', 'Bert', 'Berthold', 'Bertoldo', 'Bertram', 'Bertrame', 'Bill', 'Billy', 'Birger', 'Bjarne', 'Björn', 'Bob', 'Bobby', 'Bodo', 'Bonifatius', 'Boris', 'Bosco', 'Brendan', 'Brian', 'Bruno', 'Bryan', 'Burkhard',
- 'Camillo', 'Camilo', 'Carl', 'Carlo', 'Carlos', 'Carol', 'Carsten', 'Cäsar', 'Casimir', 'Caspar', 'Cecil', 'Ceddric', 'Cedric', 'Celestino', 'Charles', 'Charlie', 'Chico', 'Chip', 'Chris', 'Christian', 'Christoph', 'Christophe', 'Christopher', 'Christy', 'Chuck', 'Cian', 'Cillian', 'Clarence', 'Clark', 'Clas', 'Claude', 'Claudio', 'Claudius', 'Claus', 'Clayton', 'Clemens', 'Cliff', 'Clifford', 'Clint', 'Clinton', 'Cody', 'Colin', 'Collin', 'Conan', 'Connor', 'Conny', 'Conor', 'Conrad', 'Constantine', 'Cooper', 'Cordell', 'Cornelius', 'Corvinus', 'Cristobal', 'Curd', 'Curt', 'Curtis', 'Curtiz', 'Cyril', 'Cyrill',
- 'Damian', 'Damon', 'Dan', 'Daniel', 'Daniele', 'Danilo', 'Danny', 'Dario', 'Darius', 'Dave', 'David', 'Davide', 'Dawson', 'Dean', 'Demetrius', 'Denis', 'Deniz', 'Dennis', 'Derek', 'Desiderius', 'Detlef', 'Detlev', 'Dick', 'Diego', 'Dieter', 'Dimitrij', 'Dirk', 'Dolf', 'Domenico', 'Domingo', 'Dominic', 'Dominik', 'Dominikus', 'Dominique', 'Donald', 'Donatello', 'Donato', 'Donatus', 'Dorian', 'Douglas', 'Dragan', 'Duarte', 'Duncan', 'Dylan',
- 'Earnest', 'Earvin', 'Eike', 'Eleasar', 'Elia', 'Elian', 'Elias', 'Elijah', 'Ellison', 'Elmar', 'Elroy', 'Emanuel', 'Emanuele', 'Emil', 'Emile', 'Emilian', 'Emiliano', 'Emilio', 'Emmanuel', 'Endrik', 'Enrico', 'Enrique', 'Enzo', 'Ephraim', 'Erasmus', 'Eric', 'Erik', 'Ermanno', 'Ernest', 'Ernestin', 'Ernesto', 'Eros', 'Errol', 'Etienne', 'Eugen', 'Eugene', 'Eugenio', 'Eusebius', 'Everett', 'Ezra',
- 'Fabiano', 'Fabien', 'Fabio', 'Fabius', 'Fabrice', 'Fabricius', 'Fabrizio', 'Falco', 'Falk', 'Falko', 'Faruk', 'Faustus', 'Favian', 'Federico', 'Federigo', 'Fedor', 'Felice', 'Feliciano', 'Felicien', 'Felipe', 'Felix', 'Felton', 'Feodor', 'Ferdinand', 'Fergus', 'Fernand', 'Fernando', 'Ferrante', 'Ferris', 'Fidel', 'Fidelio', 'Fidelis', 'Fidelius', 'Filippo', 'Finan', 'Finn', 'Fiore', 'Fjodor', 'Flavian', 'Flemming', 'Fletcher', 'Flint', 'Florens', 'Florentin', 'Florian', 'Florin', 'Florus', 'Floyd', 'Forrest', 'Forrester', 'Forster', 'Foster', 'Fox', 'Francesco', 'Francis', 'Francisco', 'Franco', 'Francois', 'Franek', 'Frank', 'Frankie', 'Franklin', 'Franziskus', 'Frasier', 'Frayne', 'Fred', 'Freddy', 'Frederic', 'Frederick', 'Frederik', 'Freeman', 'Fremont', 'Fridericus', 'Fridolin', 'Friedel', 'Frye',
- 'Gabriel', 'Gaetan', 'Gaetano', 'Gallus', 'Garcia', 'Garfield', 'Garin', 'Garnier', 'Garrick', 'Garrison', 'Garron', 'Garry', 'Garson', 'Gaspar', 'Gaspard', 'Gaspare', 'Gaston', 'Gastonne', 'Gates', 'Gauthier', 'Gavin', 'Gene', 'Geoffrey', 'Geoffroy', 'Geordi', 'Georg', 'George', 'Georges', 'Gerald', 'Geraldo', 'Gerard', 'Geraud', 'Gerd', 'Gereon', 'Germain', 'German', 'Germano', 'Gernot', 'Gerold', 'Geronimo', 'Gerrit', 'Gerry', 'Gert', 'Gerulf', 'Gerwin', 'Giacomo', 'Gian', 'Giancarlo', 'Gianni', 'Gibson', 'Gideon', 'Gil', 'Gilbert', 'Gilberto', 'Gilles', 'Gillian', 'Gino', 'Gioacchino', 'Giorgio', 'Giovanni', 'Giraldo', 'Gisbert', 'Gitano', 'Giuliano', 'Giulio', 'Giuseppe', 'Giusto', 'Glen', 'Glenn', 'Goliath', 'Goran', 'Gordon', 'Gordy', 'Goswin', 'Götz', 'Graciano', 'Graham', 'Grayson', 'Greg', 'Gregg', 'Gregoire', 'Gregor', 'Gregory', 'Griffin', 'Grover', 'Gualtier', 'Gualtiero', 'Guglielmo', 'Guido', 'Guillaume', 'Guillermo', 'Gunnar', 'Gunter', 'Günter', 'Gunther', 'Günther', 'Gus', 'Gustavo', 'Gustl', 'Gutierre', 'Guy',
- 'Hajo', 'Hamilton', 'Hamlet', 'Hampton', 'Hanley', 'Hannes', 'Hans', 'Harald', 'Hardy', 'Harley', 'Harlow', 'Harold', 'Haroun', 'Harrison', 'Harry', 'Harvey', 'Hasso', 'Hauke', 'Havel', 'Hector', 'Heiko', 'Heiner', 'Heino', 'Hektor', 'Helge', 'Helmut', 'Helmuth', 'Hendrick', 'Hendrik', 'Hennes', 'Henning', 'Henri', 'Henrick', 'Henrik', 'Henry', 'Herald', 'Herbie', 'Hercules', 'Herold', 'Herwig', 'Hieronymus', 'Hilarius', 'Holger', 'Holm', 'Homer', 'Horace', 'Horatio', 'Horaz', 'Howard', 'Howie', 'Hugh', 'Hugo', 'Humphrey', 'Hunter',
- 'Ignatius', 'Ignaz', 'Ignazio', 'Igor', 'Ilian', 'Ilja', 'Immanuel', 'Ingo', 'Ingolf', 'Ingvar', 'Irenäus', 'Irvin', 'Irving', 'Irwin', 'Isaac', 'Isaak', 'Isai', 'Isaiah', 'Isidor', 'Istvan', 'Ivan', 'Ivo',
- 'Jackson', 'Jacky', 'Jacob', 'Jacques', 'Jacquin', 'Jadon', 'Jago', 'Jaime', 'Jake', 'Jakob', 'Jamal', 'James', 'Jan', 'Janis', 'Jannes', 'Jannik', 'Janning', 'Janos', 'Janosch', 'Jaques', 'Jared', 'Jarik', 'Jarl', 'Jarno', 'Jaro', 'Jaromir', 'Jarrett', 'Jascha', 'Jason', 'Jasper', 'Jay', 'Jean', 'Jeff', 'Jefferson', 'Jeffrey', 'Jendrick', 'Jens', 'Jered', 'Jeremiah', 'Jeremias', 'Jeremie', 'Jeremy', 'Jerold', 'Jerom', 'Jerome', 'Jerrick', 'Jerry', 'Jesaja', 'Jesko', 'Jesse', 'Jim', 'Jimmy', 'Jirko', 'Jo', 'Joakim', 'Joao', 'Joaquin', 'Joe', 'Joel', 'Joey', 'John', 'Johnny', 'Jokim', 'Jonah', 'Jonas', 'Jonathan', 'Jonny', 'Jordan', 'Jordano', 'Jörg', 'Jorge', 'Jose', 'Josef', 'Joseph', 'Josh', 'Joshua', 'Josias', 'Jost', 'Josua', 'Josue', 'Jourdain', 'Juan', 'Juanito', 'Jud', 'Jules', 'Julien', 'Julio', 'Julius', 'Jürgen', 'Jurij', 'Justin', 'Justinian', 'Justus',
- 'Kain', 'Kaj', 'Kajetan', 'Kallistus', 'Karsten', 'Kasimir', 'Kaspar', 'Keamon', 'Keith', 'Ken', 'Kenan', 'Kenneth', 'Keno', 'Kersten', 'Kerwin', 'Kevin', 'Kian', 'Kilian', 'Kim', 'Kiran', 'Klaas', 'Klaus', 'Klemens', 'Kleopas', 'Knud', 'Knut', 'Kolja', 'Konrad', 'Konstantin', 'Korbin', 'Korbinian', 'Kordt', 'Kristian', 'Kristof', 'Kristoffer', 'Kuno', 'Kurt', 'Kyros', 'Lajos',
- 'Lambert', 'Lamberto', 'Larry', 'Lars', 'Laslo', 'Lasse', 'Laurent', 'Laurente', 'Laurentius', 'Laurenz', 'Laurenzo', 'Lawrence', 'Lazarus', 'Lazlo', 'Leander', 'Lee', 'Leif', 'Leigh', 'Lennart', 'Lenny', 'Lenz', 'Leo', 'Leon', 'Leonard', 'Leonardo', 'Leonce', 'Leone', 'Leonello', 'Leonhard', 'Leopold', 'Leopoldo', 'Leroy', 'Lesley', 'Lester', 'Leverett', 'Levi', 'Lew', 'Lewis', 'Lex', 'Liborius', 'Lienhard', 'Linus', 'Lion', 'Lionel', 'LLoyd', 'Lobo', 'Loic', 'Lorenz', 'Lorenzo', 'Loris', 'Lothaire', 'Lou', 'Louie', 'Louis', 'Lovis', 'Luc', 'Luca', 'Lucan', 'Lucas', 'Luciano', 'Lucien', 'Lucius', 'Ludovico', 'Ludwig', 'Luigi', 'Luis', 'Lukas', 'Luke', 'Lutger', 'Luther', 'Lutz', 'Lyonel',
- 'Maik', 'Malte', 'Malwin', 'Manolito', 'Manolo', 'Manuel', 'Marc', 'Marcel', 'Marcello', 'Marcellus', 'Marco', 'Marcus', 'Marek', 'Marian', 'Marin', 'Marino', 'Marinus', 'Mario', 'Marius', 'Mark', 'Markus', 'Marlon', 'Maro', 'Marten', 'Martin', 'Marvin', 'Massimo', 'Mathias', 'Mathieu', 'Mathis', 'Matt', 'Matteo', 'Matthäus', 'Matthes', 'Matthew', 'Matthias', 'Matthieu', 'Maurice', 'Mauritius', 'Mauritz', 'Maurizio', 'Mauro', 'Maurus', 'Max', 'Maxence', 'Maxi', 'Maxime', 'Maximilian', 'Maximilien', 'Melchior', 'Merlin', 'Michael', 'Michail', 'Michel', 'Michele', 'Mick', 'Mickey', 'Miguel', 'Mika', 'Mikael', 'Mike', 'Mikel', 'Miklos', 'Milan', 'Milo', 'Mirko', 'Miro', 'Miroslav', 'Mischa', 'Mitja', 'Morgan', 'Moritz', 'Morris', 'Morten',
- 'Nat', 'Nathan', 'Nathanael', 'Nathaniel', 'Nepomuk', 'Nero', 'Neron', 'Newton', 'Niccolo', 'Nicholas', 'Nick', 'Nicki', 'Nico', 'Nicola', 'Nicolai', 'Nicolaj', 'Nicolas', 'Niels', 'Nigel', 'Nikita', 'Niklas', 'Niklaus', 'Niko', 'Nikodemus', 'Nikolai', 'Nikolaus', 'Nils', 'Noah', 'Noel', 'Norbert', 'Norberto', 'Norman',
- 'Odin', 'Odo', 'Odysseus', 'Olaf', 'Oleg', 'Oliver', 'Olivier', 'Oliviero', 'Olof', 'Oluf', 'Omar', 'Omer', 'Orlando', 'Orson', 'Oskar', 'Osvaldo', 'Oswin', 'Otello', 'Othello', 'Otto', 'Ove', 'Owain', 'Owen',
- 'Paco', 'Paddy', 'Palmiro', 'Pancho', 'Paolo', 'Pascal', 'Pat', 'Patrice', 'Patricio', 'Patricius', 'Patrick', 'Patrizio', 'Patrizius', 'Paul', 'Paulin', 'Paulus', 'Pawel', 'Pedro', 'Peer', 'Pepe', 'Pepito', 'Peppone', 'Per', 'Percy', 'Perez', 'Pete', 'Peter', 'Phil', 'Philip', 'Philipp', 'Philippe', 'Philo', 'Piedro', 'Pier', 'Piero', 'Pierre', 'Piet', 'Pieter', 'Pietro', 'Pinkus', 'Pippin', 'Pitt', 'Pius', 'Placide', 'Placido', 'Placidus', 'Poldi',
- 'Quint', 'Quintin', 'Quintinus', 'Quintus', 'Quirin', 'Quirino',
- 'Raffaele', 'Raffaello', 'Raffaelo', 'Raimondo', 'Raimund', 'Raimundo', 'Rainer', 'Rainier', 'Ralf', 'Ralph', 'Ramon', 'Randolf', 'Randolph', 'Randy', 'Raoul', 'Raphael', 'Rasmus', 'Rasul', 'Raul', 'Ray', 'Raymond', 'Regnier', 'Reik', 'Reiner', 'Remo', 'Renato', 'Renatus', 'Renaud', 'Rene', 'Renja', 'Reto', 'Reynold', 'Ricardo', 'Riccardo', 'Rick', 'Ricky', 'Rico', 'Rinaldo', 'Robby', 'Robert', 'Roberto', 'Robin', 'Rocco', 'Rock', 'Rocky', 'Rod', 'Rodolfo', 'Rodolphe', 'Rodrigo', 'Rodrigue', 'Rodrique', 'Roger', 'Roland', 'Rolando', 'Rolf', 'Romain', 'Roman', 'Romano', 'Romeo', 'Romero', 'Ronald', 'Ronan', 'Ronny', 'Rory', 'Ross', 'Rowan', 'Rowland', 'Roy', 'Ruben', 'Rudolf', 'Rudolph', 'Ruggero', 'Rupert', 'Ryan',
- 'Salomon', 'Salomone', 'Salvador', 'Salvator', 'Salvatore', 'Sam', 'Sammy', 'Samuel', 'Samuele', 'Sander', 'Sandor', 'Sandro', 'Sandy', 'Sascha', 'Sauveur', 'Schorsch', 'Scipio', 'Scott', 'Sean', 'Sebastian', 'Sebastiano', 'Sebastien', 'Selim', 'Semjon', 'Sepp', 'Serenus', 'Serge', 'Sergej', 'Sergio', 'Sergius', 'Servatius', 'Severiano', 'Severin', 'Severo', 'Sidney', 'Sidonius', 'Silas', 'Silvain', 'Silvan', 'Silvano', 'Silvanus', 'Silverio', 'Silverius', 'Silvester', 'Silvestro', 'Silvio', 'Silvius', 'Simjon', 'Simon', 'Simone', 'Sinclair', 'Sixt', 'Sixtus', 'Slade', 'Solomon', 'Söncke', 'Sören', 'Spencer', 'Stan', 'Stanislaus', 'Stanislaw', 'Stanley', 'Stefan', 'Stefano', 'Steffen', 'Sten', 'Stephan', 'Stephen', 'Steve', 'Steven', 'Stewart', 'Stig', 'Stuart', 'Sven', 'Sylvain', 'Sylvester',
- 'Tam', 'Tarek', 'Tassilo', 'Tasso', 'Ted', 'Teddy', 'Teobaldo', 'Thaddäus', 'Theo', 'Theodor', 'Theodore', 'Thierry', 'Thimotheus', 'Thomas', 'Thommy', 'Thoralf', 'Thorben', 'Thore', 'Thorsten', 'Tiberio', 'Tiberius', 'Tibor', 'Till', 'Tim', 'Timmy', 'Timo', 'Timofej', 'Timon', 'Timoteo', 'Timothee', 'Timotheus', 'Timothy', 'Tin', 'Tito', 'Titus', 'Tizian', 'Tiziano', 'Tjade', 'Tjark', 'Tobi', 'Tobia', 'Tobiah', 'Tobias', 'Tobie', 'Tobis', 'Toby', 'Tom', 'Tommaso', 'Tommy', 'Toni', 'Tonio', 'Tony', 'Torben', 'Torin', 'Torsten', 'Tristan', 'Tycho', 'Tyler', 'Tyson',
- 'Udo', 'Ugo', 'Ugolino', 'Ulf', 'Uli', 'Ulli', 'Ulric', 'Ulrich', 'Ulrico', 'Umberto', 'Urbain', 'Urban', 'Urbano', 'Urias', 'Uriel', 'Ursus', 'Uwe',
- 'Valentiano', 'Valentin', 'Valentino', 'Valerian', 'Valerio', 'Valerius', 'Valery', 'Vasco', 'Veit', 'Veltin', 'Vernon', 'Vicente', 'Vico', 'Victor', 'Viktor', 'Vincent', 'Vincenzo', 'Vinzenez', 'Vinzenz', 'Virgil', 'Vitalis', 'Vito', 'Vittore', 'Vittoriano', 'Vittorio', 'Volker',
- 'Wallace', 'Walt', 'Warner', 'Warren', 'Wido', 'Wigand', 'Wilbur', 'Willi', 'William', 'Wilpert', 'Winston', 'Wolf', 'Wolfgang', 'Woodrow', 'Woody',
- 'Xaver',
+ 'Adrian', 'Alexander', 'Andreas', 'Anton',
+ 'Ben', 'Benedikt', 'Benjamin', 'Bernd', 'Bernhard',
+ 'Christian', 'Christoph', 'Christopher', 'Clemens',
+ 'Daniel', 'David', 'Dominik',
+ 'Elias', 'Emil', 'Erik',
+ 'Fabian', 'Fabio', 'Felix', 'Finn', 'Florian', 'Franz',
+ 'Gabriel', 'Georg', 'Gerald', 'Gerhard', 'Gernot', 'Gregor', 'Günther',
+ 'Hannes', 'Harald', 'Helmut', 'Herbert',
+ 'Jakob', 'Jan', 'Johann', 'Johannes', 'Jonas', 'Jonathan', 'Josef', 'Joseph', 'Julian', 'Justin', 'Jürgen',
+ 'Karl', 'Kevin', 'Kilian', 'Klaus', 'Konstantin',
+ 'Leo', 'Leon', 'Lorenz', 'Luca', 'Luis', 'Lukas',
+ 'Manfred', 'Manuel', 'Marc', 'Marcel', 'Marco', 'Mario', 'Markus', 'Martin', 'Marvin', 'Matteo', 'Matthias', 'Max', 'Maximilian', 'Michael', 'Moritz',
+ 'Nico', 'Nicolas', 'Niklas', 'Noah',
+ 'Oliver', 'Oskar',
+ 'Pascal', 'Patrick', 'Patrik', 'Paul', 'Peter', 'Philipp',
+ 'Ralph', 'Raphael', 'Reinhard', 'René', 'Richard', 'Robert', 'Roland', 'Roman',
+ 'Samuel', 'Sandro', 'Sascha', 'Sebastian', 'Simon', 'Stefan',
+ 'Theo', 'Theodor', 'Thomas', 'Tim', 'Tobias',
+ 'Valentin', 'Vincent',
+ 'Werner', 'Wolfgang',
);
+ /**
+ * 60 most popular names in 1985, 1995, 2005 and 2015
+ * {@link} http://www.statistik.at/wcm/idc/idcplg?IdcService=GET_PDF_FILE&RevisionSelectionMethod=LatestReleased&dDocName=021130
+ **/
protected static $firstNameFemale = array(
- 'Abby', 'Abelina', 'Abigail', 'Adelaide', 'Adeline', 'Adina', 'Adriana', 'Adrienne', 'Afra', 'Agatha', 'Agnes', 'Aida', 'Aimee', 'Aischa', 'Albertine', 'Alea', 'Aleksandra', 'Alena', 'Alessa', 'Alessandra', 'Alessia', 'Alexa', 'Alexandra', 'Alexia', 'Alexis', 'Alice', 'Alicia', 'Alida', 'Alina', 'Aline', 'Alisa', 'Alissa', 'Alisson', 'Amabella', 'Amadea', 'Amanda', 'Amelia', 'Amelie', 'Amina', 'Amy', 'Ana', 'Anastasia', 'Andrea', 'Andrina', 'Anette', 'Angela', 'Angelika', 'Angelina', 'Angelique', 'Anina', 'Anine', 'Anita', 'Anja', 'Anjalie', 'Anke', 'Ann', 'Anna', 'Annabel', 'Annabell', 'Annabella', 'Annabelle', 'Anne', 'Annett', 'Annette', 'Annika', 'Annina', 'Antje', 'Antoinette', 'Antonella', 'Antonia', 'Arabella', 'Ariadne', 'Ariana', 'Ariane', 'Arianna', 'Ariella', 'Arielle', 'Arlene', 'Arlette', 'Arwenna', 'Ashley', 'Asta', 'Astrid', 'Audrey', 'Aurelia',
- 'Barbara', 'Bärbel', 'Bastiane', 'Bea', 'Beata', 'Beatrice', 'Beatrix', 'Becky', 'Belinda', 'Bella', 'Bellana', 'Belle', 'Benedikta', 'Benita', 'Bente', 'Beppina', 'Berenike', 'Berit', 'Bernadett', 'Bernadette', 'Bernadine', 'Betina', 'Betsy', 'Bettina', 'Betty', 'Bianca', 'Bianka', 'Bibiana', 'Bibiane', 'Birgit', 'Birgitt', 'Bodil', 'Bridget', 'Brigitta', 'Brigitte', 'Britta',
- 'Caitlin', 'Cameron', 'Camilla', 'Camille', 'Cammy', 'Cara', 'Carin', 'Carina', 'Carinna', 'Carla', 'Carmela', 'Carmelia', 'Carmen', 'Carol', 'Carola', 'Carole', 'Carolin', 'Carolina', 'Caroline', 'Carolyn', 'Carolyne', 'Cassandra', 'Cassie', 'Catalin', 'Caterina', 'Catharina', 'Catherine', 'Cathrin', 'Cathrine', 'Cathy', 'Catina', 'Catrin', 'Catriona', 'Cecile', 'Cecilia', 'Cecilie', 'Celeste', 'Celestine', 'Celina', 'Celine', 'Chantal', 'Charleen', 'Charlotte', 'Chatrina', 'Chelsea', 'Chiara', 'Chloe', 'Chrissy', 'Christa', 'Christiana', 'Christiane', 'Christin', 'Christina', 'Christine', 'Chyna', 'Ciara', 'Cinderella', 'Cindy', 'Cinja', 'Cira', 'Claire', 'Clara', 'Clarissa', 'Claudette', 'Claudia', 'Claudine', 'Clea', 'Cleannis', 'Clementia', 'Clementine', 'Cleo', 'Clio', 'Cliona', 'Clodia', 'Cloris', 'Coletta', 'Colette', 'Connie', 'Conny', 'Constance', 'Constanze', 'Cora', 'Coral', 'Coralie', 'Cordelia', 'Cordula', 'Corin', 'Corina', 'Corinna', 'Corinne', 'Cornelia', 'Cosette', 'Cosima', 'Cynthia',
- 'Daisy', 'Dajana', 'Daliah', 'Damaris', 'Damia', 'Damiana', 'Dana', 'Dania', 'Danica', 'Daniela', 'Daniele', 'Daniella', 'Danielle', 'Danja', 'Daphne', 'Darcie', 'Daria', 'Darina', 'Dawn', 'Dayna', 'Debbie', 'Debby', 'Debora', 'Deborah', 'Deetya', 'Delia', 'Delphine', 'Dena', 'Denise', 'Desdemona', 'Desideria', 'Desiree', 'Diana', 'Diane', 'Didina', 'Dina', 'Dinah', 'Dolly', 'Dolores', 'Domenica', 'Dominika', 'Dominique', 'Donna', 'Dora', 'Doreen', 'Dorina', 'Doris', 'Dorit', 'Doro', 'Dorothea', 'Dorothee', 'Dorothy', 'Dunja',
- 'Ebony', 'Edda', 'Edita', 'Edvige', 'Edwina', 'Eike', 'Eila', 'Eileen', 'Ela', 'Elaine', 'Eleanor', 'Elektra', 'Elena', 'Eleonora', 'Eleonore', 'Eliane', 'Elisa', 'Elisabeth', 'Elise', 'Elizabeth', 'Elke', 'Ella', 'Ellen', 'Elly', 'Eloise', 'Elsa', 'Elsbeth', 'Elvira', 'Elvire', 'Emanuela', 'Emanuelle', 'Emilia', 'Emilie', 'Emily', 'Emma', 'Enrica', 'Enya', 'Erika', 'Erin', 'Ernesta', 'Ernestina', 'Ernestine', 'Esmerelda', 'Esra', 'Estella', 'Estelle', 'Ester', 'Esther', 'Etiennette', 'Eudoxia', 'Eugenia', 'Eunike', 'Euphemia', 'Euphrasia', 'Eusebia', 'Eva', 'Evangelina', 'Evania', 'Eve', 'Evelien', 'Evelin', 'Eveline', 'Evelyn', 'Evelyne', 'Evette', 'Evi', 'Evita',
- 'Fabiane', 'Fabienne', 'Fabiola', 'Faith', 'Fanny', 'Farrah', 'Fatima', 'Faustina', 'Faustine', 'Fay', 'Faye', 'Faylinn', 'Federica', 'Fedora', 'Fee', 'Feli', 'Felice', 'Felicia', 'Felicitas', 'Felicity', 'Felizitas', 'Feodora', 'Fergie', 'Fidelia', 'Filia', 'Filiz', 'Finetta', 'Finja', 'Fiona', 'Fjodora', 'Flavia', 'Fleur', 'Fleur', 'Flo', 'Flora', 'Florence', 'Florentina', 'Florentine', 'Floria', 'Floriane', 'Florida', 'Florinda', 'Floris', 'Fortuna', 'Frances', 'Francesca', 'Francisca', 'Franka', 'Franzi', 'Franziska', 'Frauke', 'Freya', 'Friederike',
- 'Gabriela', 'Gabriele', 'Gabriella', 'Gabrielle', 'Gaby', 'Gail', 'Galatea', 'Galina', 'Gazelle', 'Gela', 'Geneva', 'Genoveva', 'Georgette', 'Georgia', 'Georgina', 'Geraldene', 'Geraldine', 'Germain', 'Germaine', 'Germana', 'Ghita', 'Gianna', 'Gigi', 'Gill', 'Gillian', 'Gina', 'Ginevra', 'Ginger', 'Ginny', 'Giovanna', 'Gisela', 'Gisele', 'Gisella', 'Giselle', 'Gitta', 'Giulia', 'Giuliana', 'Giulietta', 'Giuseppa', 'Giuseppina', 'Giustina', 'Gladys', 'Gloria', 'Glory', 'Goldie', 'Goldy', 'Grace', 'Gratia', 'Gratiana', 'Grazia', 'Greta', 'Gretel', 'Gunda', 'Gwen', 'Gwenda', 'Gwendolin', 'Gwendolyn', 'Gypsy',
- 'Hannah', 'Hanne', 'Harmony', 'Harriet', 'Hazel', 'Hedi', 'Hedy', 'Heide', 'Heidi', 'Heike', 'Helen', 'Helena', 'Helene', 'Helin', 'Hella', 'Hemma', 'Henrietta', 'Henriette', 'Henrike', 'Hera', 'Hetty', 'Hilary', 'Hilda', 'Hilde', 'Holiday', 'Holli', 'Holly', 'Hope',
- 'Ilana', 'Ilaria', 'Iliana', 'Iljana', 'Ilka', 'Ilona', 'Ilse', 'Ilyssa', 'Imke', 'Ina', 'India', 'Indira', 'Indra', 'Ines', 'Inga', 'Inge', 'Ingrid', 'Inka', 'Inken', 'Innozentia', 'Iona', 'Ira', 'Irena', 'Irene', 'Irina', 'Iris', 'Irisa', 'Irma', 'Isabel', 'Isabell', 'Isabella', 'Isabelle', 'Isis', 'Iva', 'Ivana', 'Ivona', 'Ivonne',
- 'Jaclyn', 'Jacqueline', 'Jacqui', 'Jael', 'Jamari', 'Jan', 'Jana', 'Jane', 'Janet', 'Janette', 'Janin', 'Janina', 'Janine', 'Janique', 'Janna', 'Jannine', 'Jarla', 'Jasmin', 'Jasmina', 'Jasmine', 'Jeanette', 'Jeanine', 'Jeanne', 'Jeannette', 'Jeannine', 'Jekaterina', 'Jelena', 'Jenifer', 'Jenna', 'Jennelle', 'Jennessa', 'Jennie', 'Jennifer', 'Jenny', 'Jennyfer', 'Jess', 'Jessica', 'Jessie', 'Jessika', 'Jill', 'Joan', 'Joana', 'Joann', 'Joanna', 'Joelle', 'Johanna', 'Jolanda', 'Jona', 'Jordana', 'Jördis', 'Josee', 'Josefa', 'Josefina', 'Josefine', 'Josepha', 'Josephine', 'Josiane', 'Josie', 'Jovita', 'Joy', 'Joyce', 'Juana', 'Juanita', 'Judith', 'Judy', 'Julia', 'Juliana', 'Juliane', 'Julianne', 'Julie', 'Juliet', 'Juliette', 'July', 'June', 'Justina', 'Justine', 'Justise', 'Jutta',
- 'Kamilia', 'Kamilla', 'Karen', 'Karima', 'Karin', 'Karina', 'Karla', 'Karola', 'Karolin', 'Karolina', 'Karoline', 'Kassandra', 'Katalin', 'Katarina', 'Kate', 'Katharina', 'Katharine', 'Käthe', 'Katherina', 'Katherine', 'Kathleen', 'Kathrin', 'Kathrina', 'Kathryn', 'Kathy', 'Katinka', 'Katja', 'Katjana', 'Katrin', 'Katrina', 'Katrine', 'Kayla', 'Keala', 'Keelin', 'Kendra', 'Kerstin', 'Kiana', 'Kiara', 'Kim', 'Kira', 'Kirsten', 'Kirstin', 'Kita', 'Klara', 'Klarissa', 'Klaudia', 'Kleopatra', 'Kolina', 'Konstanze', 'Kora', 'Kordula', 'Kori', 'Kornelia', 'Krista', 'Kristiane', 'Kristin', 'Kristina', 'Kristine', 'Kyra',
- 'Laila', 'Lana', 'Lara', 'Laria', 'Larissa', 'Lätizia', 'Laurel', 'Lauren', 'Laurence', 'Laurentia', 'Lauretta', 'Lavina', 'Laya', 'Lea', 'Leah', 'Leandra', 'Lee', 'Leigh', 'Leila', 'Lena', 'Leona', 'Leonie', 'Leontine', 'Leopoldine', 'Lesley', 'Leslie', 'Levana', 'Levia', 'Lia', 'Liane', 'Libusa', 'Licia', 'Lidia', 'Liesa', 'Liesbeth', 'Liese', 'Liesel', 'Lilian', 'Liliane', 'Lilith', 'Lilli', 'Lillian', 'Lilo', 'Lily', 'Lina', 'Linda', 'Lioba', 'Lisa', 'Lisbeth', 'Lise', 'Lisette', 'Liv', 'Livana', 'Livia', 'Liz', 'Liza', 'Lizzie', 'Lola', 'Lora', 'Lorena', 'Loretta', 'Lori', 'Lorraine', 'Lotte', 'Lotus', 'Louise', 'Luana', 'Luca', 'Lucia', 'Luciana', 'Lucie', 'Lucy', 'Luigia', 'Luisa', 'Luise', 'Luna', 'Luzia', 'Lydia', 'Lydie', 'Lynette', 'Lynn',
- 'Maddalena', 'Madelaine', 'Madeleine', 'Madeline', 'Madison', 'Madita', 'Madleine', 'Madlen', 'Madlene', 'Mae', 'Magda', 'Magdalena', 'Maggy', 'Magret', 'Maia', 'Maike', 'Maiken', 'Mailin', 'Maja', 'Malea', 'Malee', 'Malin', 'Malina', 'Mandy', 'Manja', 'Manon', 'Manuela', 'Mara', 'Maraike', 'Marcella', 'Marcelle', 'Marcia', 'Mareike', 'Maren', 'Margaret', 'Margareta', 'Margarete', 'Margaretha', 'Margarita', 'Margaritha', 'Margherita', 'Margit', 'Margitta', 'Margot', 'Margret', 'Margreth', 'Marguerite', 'Maria', 'Mariam', 'Marian', 'Mariana', 'Marianna', 'Marianne', 'Marie', 'Marieke', 'Mariella', 'Marielle', 'Marietta', 'Marija', 'Marika', 'Marilies', 'Marilyn', 'Marina', 'Marion', 'Marisa', 'Marissa', 'Marita', 'Maritta', 'Marjorie', 'Marla', 'Marleen', 'Marlen', 'Marlena', 'Marlene', 'Marlies', 'Marlis', 'Marsha', 'Martha', 'Marthe', 'Martina', 'Mary', 'Maryse', 'Mascha', 'Mathilda', 'Mathilde', 'Matilde', 'Mattea', 'Maude', 'Maura', 'Maureen', 'Maximiliane', 'May', 'Maya', 'Meg', 'Megan', 'Meike', 'Melanie', 'Melia', 'Melina', 'Melinda', 'Melissa', 'Melitta', 'Melodie', 'Meloney', 'Mercedes', 'Meret', 'Meri', 'Merle', 'Merline', 'Meryem', 'Mia', 'Micaela', 'Michaela', 'Michele', 'Michelle', 'Milena', 'Milla', 'Milva', 'Mimi', 'Minerva', 'Minna', 'Mira', 'Mirabella', 'Mireille', 'Mirella', 'Mireya', 'Miriam', 'Mirijam', 'Mirjam', 'Moesha', 'Moira', 'Mona', 'Moni', 'Monica', 'Monika', 'Monique', 'Monja', 'Morgane', 'Muriel', 'Myriam',
- 'Nadin', 'Nadine', 'Nadja', 'Nadjana', 'Naemi', 'Nancy', 'Nanette', 'Nani', 'Naomi', 'Nastasja', 'Natalia', 'Natalie', 'Natanja', 'Natascha', 'Nathalie', 'Neeja', 'Nena', 'Neria', 'Nerine', 'Nicol', 'Nicola', 'Nicole', 'Nicoletta', 'Nicolette', 'Nike', 'Nikola', 'Nina', 'Ninja', 'Ninon', 'Noa', 'Noelle', 'Noemi', 'Noemie', 'Nora', 'Norma', 'Nuala',
- 'Olga', 'Olivia', 'Ophelia', 'Orania', 'Orla', 'Ornella', 'Orsola', 'Ottilie',
- 'Paloma', 'Pam', 'Pamela', 'Pandora', 'Paola', 'Paolina', 'Pascale', 'Pat', 'Patrice', 'Patricia', 'Patrizia', 'Patsy', 'Patty', 'Paula', 'Paulette', 'Paulina', 'Pauline', 'Penelope', 'Pepita', 'Petra', 'Philine', 'Philippa', 'Philomele', 'Philomena', 'Phoebe', 'Phyllis', 'Pia', 'Pier', 'Prica', 'Prisca', 'Priscilla', 'Priscille', 'Priska',
- 'Rachel', 'Rachel', 'Rachelle', 'Radomila', 'Rafaela', 'Raffaela', 'Raffaella', 'Ragna', 'Rahel', 'Raja', 'Ramona', 'Raphaela', 'Raquel', 'Rebecca', 'Rebekka', 'Regina', 'Regine', 'Reisha', 'Renata', 'Renate', 'Renee', 'Resi', 'Rhea', 'Rhoda', 'Rhonda', 'Ricarda', 'Riccarda', 'Rike', 'Rita', 'Roberta', 'Romana', 'Romina', 'Romy', 'Ronja', 'Rosa', 'Rosalia', 'Rosalie', 'Rosalinda', 'Rosalinde', 'Rosaline', 'Rose', 'Roseline', 'Rosetta', 'Rosette', 'Rosi', 'Rosina', 'Rosine', 'Rossana', 'Roswitha', 'Roxana', 'Roxane', 'Roxanne', 'Roxy', 'Rubina', 'Ruth',
- 'Sabine', 'Sabrina', 'Sahra', 'Sally', 'Salome', 'Salvina', 'Samanta', 'Samantha', 'Samira', 'Sandra', 'Sandrina', 'Sandrine', 'Sandy', 'Sanne', 'Sanya', 'Saphira', 'Sara', 'Sarah', 'Sarina', 'Sascha', 'Saskia', 'Scarlet', 'Scarlett', 'Schirin', 'Selina', 'Selma', 'Serafina', 'Seraina', 'Seraphin', 'Seraphina', 'Seraphine', 'Serena', 'Severina', 'Severine', 'Shana', 'Shanaya', 'Shantala', 'Shari', 'Sharlene', 'Sharon', 'Sheena', 'Sheila', 'Sheryl', 'Shirin', 'Shirley', 'Shirlyn', 'Sibilla', 'Sibyl', 'Sibylle', 'Siegrid', 'Sigrid', 'Sigrun', 'Silja', 'Silke', 'Silvana', 'Silvia', 'Silviane', 'Simona', 'Simone', 'Simonette', 'Simonne', 'Sina', 'Sindy', 'Sinja', 'Sissy', 'Skyla', 'Smarula', 'Smilla', 'Sofia', 'Sofie', 'Sonia', 'Sonja', 'Sonnele', 'Sonya', 'Sophia', 'Sophie', 'Soraya', 'Stefanie', 'Steffi', 'Stella', 'Stephanie', 'Sumehra', 'Summer', 'Susan', 'Susanna', 'Susanne', 'Susi', 'Suzan', 'Suzanne', 'Suzette', 'Svea', 'Svenja', 'Swane', 'Sybilla', 'Sybille', 'Sydney', 'Sylvana', 'Sylvia', 'Sylvie',
- 'Tabitha', 'Taissa', 'Tamara', 'Tamina', 'Tania', 'Tanita', 'Tanja', 'Tara', 'Tatiana', 'Tatjana', 'Taya', 'Tecla', 'Telka', 'Teodora', 'Teona', 'Teresa', 'Terry', 'Tess', 'Tessa', 'Tessie', 'Thea', 'Thekla', 'Theodora', 'Theres', 'Theresa', 'Therese', 'Theresia', 'Tiana', 'Tiffany', 'Tilly', 'Timna', 'Tina', 'Tiziana', 'Tonja', 'Toril', 'Tosca', 'Tracey', 'Traudl', 'Trixi', 'Tycho', 'Tyra',
- 'Ulla', 'Ulli', 'Ulrica', 'Ulrike', 'Undine', 'Urania', 'Ursel', 'Ursina', 'Ursula', 'Ursule', 'Uschi', 'Uta', 'Ute',
- 'Valentina', 'Valentine', 'Valeria', 'Valerie', 'Valeska', 'Vanadis', 'Vanessa', 'Vanja', 'Varinka', 'Venetia', 'Vera', 'Verena', 'Verona', 'Veronica', 'Veronika', 'Veronique', 'Vesla', 'Vicky', 'Victoire', 'Victoria', 'Viki', 'Viktoria', 'Vilja', 'Viola', 'Violet', 'Violetta', 'Violette', 'Virginia', 'Virginie', 'Vittoria', 'Viviana', 'Viviane', 'Vivien', 'Vivienne', 'Vreneli', 'Vreni', 'Vroni',
- 'Wencke', 'Weneke', 'Wibke', 'Wilja', 'Willow', 'Wilma',
+ 'Alexandra', 'Alexandrea', 'Algelika', 'Alina', 'Amelie', 'Andrea', 'Angelina', 'Anita', 'Anja', 'Anna', 'Anna-Lena', 'Annika', 'Astrid',
+ 'Barbara', 'Bettina', 'Bianca', 'Birgit',
+ 'Carina', 'Caroline', 'Celina', 'Chiara', 'Christina', 'Christine', 'Clara', 'Claudia', 'Cornelia',
+ 'Daniela', 'Denise', 'Doris',
+ 'Elena', 'Elisa', 'Elisabeth', 'Ella', 'Emely', 'Emilia', 'Emily', 'Emma', 'Eva', 'Eva-Maria',
+ 'Franziska',
+ 'Hanna', 'Hannah', 'Helena',
+ 'Ines', 'Iris', 'Isabel', 'Isabella',
+ 'Jacqueline', 'Jacquline', 'Jana', 'Janine', 'Jasmin', 'Jennifer', 'Jessica', 'Johanna', 'Julia',
+ 'Karin', 'Katharina', 'Katrin', 'Kerstin',
+ 'Lara', 'Larissa', 'Laura', 'Lea', 'Lena', 'Leonie', 'Lilly', 'Lina', 'Lisa', 'Livia', 'Luisa',
+ 'Magdalena', 'Maja', 'Manuela', 'Maria', 'Marie', 'Marion', 'Marlene', 'Martina', 'Melanie', 'Melina', 'Mia', 'Michaela', 'Michelle', 'Miriam', 'Mona', 'Monika',
+ 'Nadine', 'Natalie', 'Nicole', 'Nina', 'Nora',
+ 'Patricia', 'Paula', 'Petra', 'Pia',
+ 'Rebecca', 'Rosa',
+ 'Sabine', 'Sabrina', 'Sandra', 'Sarah', 'Selina', 'Silvia', 'Simone', 'Sonja', 'Sophia', 'Sophie', 'Stefanie', 'Susanne',
+ 'Tamara', 'Tanja', 'Theresa',
+ 'Valentina', 'Valerie', 'Vanessa', 'Verena', 'Viktoria',
+ 'Yvonne',
);
+ /**
+ * Top 500 Names from a phone directory (February 2004)
+ * {@link} https://de.wiktionary.org/wiki/Verzeichnis:Deutsch/Liste_der_h%C3%A4ufigsten_Nachnamen_Deutschlands
+ **/
protected static $lastName = array(
- 'Ackermann', 'Adler', 'Adolph', 'Albers', 'Anders', 'Atzler', 'Aumann', 'Austermühle',
- 'Bachmann', 'Bähr', 'Bärer', 'Barkholz', 'Barth', 'Bauer', 'Baum', 'Becker', 'Beckmann', 'Beer', 'Beier', 'Bender', 'Benthin', 'Berger', 'Beyer', 'Bien', 'Biggen', 'Binner', 'Birnbaum', 'Bloch', 'Blümel', 'Bohlander', 'Bonbach', 'Bolander', 'Bolnbach', 'Bolzmann', 'Börner', 'Bohnbach', 'Boucsein', 'Briemer', 'Bruder', 'Buchholz', 'Budig', 'Butte',
- 'Carsten', 'Caspar', 'Christoph', 'Cichorius', 'Conradi',
- 'Davids', 'Dehmel', 'Dickhard', 'Dietz', 'Dippel', 'Ditschlerin', 'Dobes', 'Döhn', 'Döring', 'Dörr', 'Dörschner', 'Dowerg', 'Drewes', 'Drub', 'Drubin', 'Dussen van',
- 'Eberhardt', 'Ebert', 'Eberth', 'Eckbauer', 'Ehlert', 'Eigenwillig', 'Eimer', 'Ernst', 'Etzler', 'Etzold',
- 'Faust', 'Fechner', 'Fiebig', 'Finke', 'Fischer', 'Flantz', 'Fliegner', 'Förster', 'Franke', 'Freudenberger', 'Fritsch', 'Fröhlich',
- 'Gehringer', 'Geisel', 'Geisler', 'Geißler', 'Gerlach', 'Gertz', 'Gierschner', 'Gieß', 'Girschner', 'Gnatz', 'Gorlitz', 'Gotthard', 'Graf', 'Grein Groth', 'Gröttner', 'Gude', 'Gunpf', 'Gumprich', 'Gute', 'Gutknecht',
- 'Haase', 'Haering', 'Hänel', 'Häring', 'Hahn', 'Hamann', 'Hande', 'Harloff', 'Hartmann', 'Hartung', 'Hauffer', 'Hecker', 'Heidrich', 'Hein', 'Heinrich', 'Heintze', 'Heinz', 'Hellwig', 'Henck', 'Hendriks', 'Henk', 'Henschel', 'Hentschel', 'Hering', 'Hermann', 'Herrmann', 'Hermighausen', 'Hertrampf', 'Heser', 'Heß', 'Hesse', 'Hettner', 'Hethur', 'Heuser', 'Hiller', 'Heydrich', 'Höfig', 'Hofmann', 'Holsten', 'Holt', 'Holzapfel', 'Hölzenbecher', 'Hörle', 'Hövel', 'Hoffmann', 'Hornich', 'Hornig', 'Hübel', 'Huhn',
- 'Jacob', 'Jacobi Jäckel', 'Jähn', 'Jäkel', 'Jäntsch', 'Jessel', 'Jockel', 'Johann', 'Jopich', 'Junck', 'Juncken', 'Jungfer', 'Junitz', 'Junk', 'Junken', 'Jüttner',
- 'Kabus', 'Kade', 'Käster', 'Kallert', 'Kambs', 'Karge', 'Karz', 'Kaul', 'Kensy', 'Keudel', 'Killer', 'Kitzmann', 'Klapp', 'Klemm', 'Klemt', 'Klingelhöfer', 'Klotz', 'Knappe', 'Kobelt', 'Koch', 'Koch II', 'Köhler', 'Köster', 'Kohl', 'Kostolzin', 'Kramer', 'Kranz', 'Krause', 'Kraushaar', 'Krebs', 'Krein', 'Kreusel', 'Kroker', 'Kruschwitz', 'Kuhl', 'Kühnert', 'Kusch',
- 'Lachmann', 'Ladeck', 'Lange', 'Langern', 'Lehmann', 'Liebelt', 'Lindau', 'Lindner', 'Linke', 'Löchel', 'Löffler', 'Loos', 'Lorch', 'Losekann', 'Löwer', 'Lübs',
- 'Mälzer', 'Mangold', 'Mans', 'Margraf', 'Martin', 'Matthäi', 'Meister', 'Mende', 'Mentzel', 'Metz', 'Meyer', 'Mielcarek', 'Mies', 'Misicher', 'Mitschke', 'Mohaupt', 'Mosemann', 'Möchlichen', 'Mude', 'Mühle', 'Mülichen', 'Müller',
- 'Naser', 'Nerger', 'Nette', 'Neureuther', 'Neuschäfer', 'Niemeier', 'Noack', 'Nohlmans',
- 'Oderwald', 'Oestrovsky', 'Ortmann', 'Otto',
- 'Paffrath', 'Pärtzelt', 'Patberg', 'Pechel', 'Pergande', 'Peukert', 'Pieper', 'Plath', 'Pohl', 'Pölitz', 'Preiß', 'Pruschke', 'Putz',
- 'Rädel', 'Radisch', 'Reichmann', 'Reinhardt', 'Reising', 'Renner', 'Reuter', 'Riehl', 'Ring', 'Ritter', 'Rogge', 'Rogner', 'Rohleder', 'Röhrdanz', 'Röhricht', 'Roht', 'Römer', 'Rörricht', 'Rose', 'Rosemann', 'Rosenow', 'Roskoth', 'Rudolph', 'Ruppersberger', 'Ruppert', 'Rust',
- 'Sager', 'Salz', 'Säuberlich', 'Sauer', 'Schaaf', 'Schacht', 'Schäfer', 'Scheel', 'Scheibe', 'Schenk', 'Scheuermann', 'Schinke', 'Schleich', 'Schleich', 'auch Schlauchin', 'Schlosser', 'Schmidt', 'Schmidtke', 'Schmiedecke', 'Schmiedt', 'Schönland', 'Scholl', 'Scholtz', 'Scholz', 'Schomber', 'Schottin', 'Schuchhardt', 'Schüler', 'Schulz', 'Schuster', 'Schweitzer', 'Schwital', 'Segebahn', 'Seifert', 'Seidel', 'Seifert', 'Seip', 'Siering', 'Söding', 'Sölzer', 'Sontag', 'Sorgatz', 'Speer', 'Spieß', 'Stadelmann', 'Stahr', 'Staude', 'Steckel', 'Steinberg', 'Stey', 'Stiebitz', 'Stiffel', 'Stoll', 'Stolze', 'Striebitz', 'Stroh', 'Stumpf', 'Sucker', 'Süßebier',
- 'Täsche', 'Textor', 'Thanel', 'Thies', 'Tintzmann', 'Tlustek', 'Trapp', 'Trommler', 'Tröst', 'Trub', 'Trüb', 'Trubin', 'Trupp', 'Tschentscher',
- 'Ullmann', 'Ullrich',
- 'van der Dussen', 'Vogt', 'Vollbrecht',
- 'Wagenknecht', 'Wagner', 'Wähner', 'Walter', 'Warmer', 'Weihmann', 'Weimer', 'Weinhage', 'Weinhold', 'Weiß', 'Weitzel', 'Weller', 'Wende', 'Wernecke', 'Werner', 'Wesack', 'Wiek', 'Wieloch', 'Wilms', 'Wilmsen', 'Winkler', 'Wirth', 'Wohlgemut', 'Wulf', 'Wulff',
- 'Zahn', 'Zänker', 'Ziegert', 'Zimmer', 'Zirme', 'Zobel', 'Zorbach',
+ 'Abraham', 'Achleitner', 'Adam', 'Aichinger', 'Aigner', 'Albrecht', 'Altmann', 'Amann', 'Amon', 'Angerer', 'Arnold', 'Artner', 'Aschauer', 'Auer', 'Augustin', 'Auinger',
+ 'Bacher', 'Bachler', 'Bachmann', 'Bader', 'Baier', 'Barth', 'Bartl', 'Bauer', 'Baumann', 'Baumgartner', 'Bayer', 'Beck', 'Beer', 'Berger', 'Bergmann', 'Bernhard', 'Bichler', 'Binder', 'Bischof', 'Bock', 'Bogner', 'Brandl', 'Brandner', 'Brandstetter', 'Brandstätter', 'Braun', 'Brenner', 'Bruckner', 'Brugger', 'Brunner', 'Buchberger', 'Buchegger', 'Bucher', 'Buchinger', 'Buchner', 'Burger', 'Burgstaller', 'Burtscher', 'Böck', 'Böhm', 'Bösch',
+ 'Danner', 'Denk', 'Deutsch', 'Dietrich', 'Dobler', 'Doppler', 'Dorner', 'Draxler',
+ 'Eberharter', 'Eberl', 'Ebner', 'Ecker', 'Eder', 'Edlinger', 'Egger', 'Eibl', 'Eichberger', 'Eichinger', 'Eigner', 'Erhart', 'Ernst', 'Ertl',
+ 'Falkner', 'Fasching', 'Feichtinger', 'Fellner', 'Fiala', 'Fichtinger', 'Fiedler', 'Fink', 'Fischer', 'Fleischhacker', 'Forster', 'Forstner', 'Frank', 'Franz', 'Friedl', 'Friedrich', 'Fritsch', 'Fritz', 'Fröhlich', 'Frühwirth', 'Fuchs', 'Führer', 'Fürst',
+ 'Gabriel', 'Gangl', 'Gartner', 'Gasser', 'Gassner', 'Geiger', 'Geisler', 'Geyer', 'Glaser', 'Glatz', 'Gmeiner', 'Grabner', 'Graf', 'Gratzer', 'Greiner', 'Grill', 'Gritsch', 'Gross', 'Groß', 'Gruber', 'Grünwald', 'Gschwandtner', 'Gutmann',
+ 'Haas', 'Haberl', 'Hackl', 'Hafner', 'Hagen', 'Hager', 'Hahn', 'Haider', 'Haidinger', 'Haller', 'Hammer', 'Hammerl', 'Handl', 'Handler', 'Harrer', 'Hartl', 'Hartmann', 'Haslinger', 'Hauer', 'Hauser', 'Heindl', 'Heinrich', 'Hemetsberger', 'Herbst', 'Hermann', 'Herzog', 'Hinterberger', 'Hinteregger', 'Hinterleitner', 'Hirsch', 'Hochreiter', 'Hofbauer', 'Hofer', 'Hoffmann', 'Hofmann', 'Hofstätter', 'Holzer', 'Holzinger', 'Holzmann', 'Horvath', 'Huber', 'Huemer', 'Hufnagl', 'Humer', 'Hummer', 'Hutter', 'Hämmerle', 'Hödl', 'Höfler', 'Höller', 'Hölzl', 'Hörmann', 'Hütter',
+ 'Jahn', 'Jandl', 'Janisch', 'Jovanovic', 'Jung', 'Jungwirth', 'Jäger',
+ 'Kainz', 'Kaiser', 'Kaltenbrunner', 'Kapeller', 'Kargl', 'Karl', 'Karner', 'Kastner', 'Kaufmann', 'Kellner', 'Kern', 'Kerschbaumer', 'Kirchmair', 'Kirchner', 'Klammer', 'Klein', 'Klinger', 'Klug', 'Knapp', 'Knoll', 'Koch', 'Kofler', 'Kogler', 'Kohl', 'Koller', 'Kollmann', 'Konrad', 'Kopp', 'Kovacs', 'Kraft', 'Krainer', 'Kramer', 'Krammer', 'Kraus', 'Kremser', 'Krenn', 'Kreuzer', 'Kronberger', 'Kröll', 'Kugler', 'Kummer', 'Kurz', 'Köberl', 'Köck', 'Köhler', 'König',
+ 'Lackner', 'Lamprecht', 'Lang', 'Langer', 'Lechner', 'Lederer', 'Leeb', 'Lehner', 'Leitgeb', 'Leitner', 'Lengauer', 'Lenz', 'Lettner', 'Lindner', 'List', 'Loidl', 'Lorenz', 'Ludwig', 'Luger', 'Lukas', 'Lutz', 'Löffler',
+ 'Mader', 'Maier', 'Maierhofer', 'Mair', 'Mairhofer', 'Mandl', 'Markovic', 'Martin', 'Maurer', 'Mayer', 'Mayerhofer', 'Mayr', 'Mayrhofer', 'Meier', 'Meixner', 'Messner', 'Meyer', 'Mitterer', 'Moosbrugger', 'Moser', 'Muhr', 'Mühlbacher', 'Müller', 'Müllner',
+ 'Nagl', 'Nemeth', 'Neubauer', 'Neuhauser', 'Neuhold', 'Neumann', 'Neumayer', 'Neuner', 'Neuwirth', 'Nikolic', 'Novak', 'Nowak', 'Nussbaumer', 'Nußbaumer',
+ 'Ofner', 'Ortner', 'Oswald', 'Ott',
+ 'Paar', 'Pacher', 'Pammer', 'Paul', 'Payer', 'Peer', 'Penz', 'Peter', 'Petrovic', 'Petz', 'Pfeffer', 'Pfeifer', 'Pfeiffer', 'Pfister', 'Pfleger', 'Pichler', 'Pilz', 'Pinter', 'Pirker', 'Plank', 'Plattner', 'Platzer', 'Pointner', 'Pokorny', 'Pollak', 'Posch', 'Prem', 'Prinz', 'Probst', 'Pucher', 'Putz', 'Pöll', 'Pölzl', 'Pöschl', 'Pühringer',
+ 'Raab', 'Rabl', 'Rainer', 'Rath', 'Rauch', 'Rausch', 'Rauscher', 'Rauter', 'Rechberger', 'Redl', 'Reich', 'Reichl', 'Reindl', 'Reiner', 'Reinisch', 'Reischl', 'Reisinger', 'Reiter', 'Reiterer', 'Renner', 'Resch', 'Richter', 'Rieder', 'Riedl', 'Riedler', 'Rieger', 'Riegler', 'Rieser', 'Ritter', 'Rosenberger', 'Roth', 'Rupp',
+ 'Sailer', 'Sattler', 'Sauer', 'Schachinger', 'Schachner', 'Schaffer', 'Schaller', 'Scharf', 'Schatz', 'Schauer', 'Scheiber', 'Schenk', 'Scheucher', 'Schiefer', 'Schiller', 'Schindler', 'Schlager', 'Schlögl', 'Schmid', 'Schmidt', 'Schmied', 'Schnabl', 'Schneeberger', 'Schneider', 'Schober', 'Scholz', 'Schranz', 'Schreiber', 'Schreiner', 'Schubert', 'Schuh', 'Schuller', 'Schulz', 'Schuster', 'Schwab', 'Schwaiger', 'Schwaighofer', 'Schwarz', 'Schweiger', 'Schweighofer', 'Schön', 'Schöpf', 'Schütz', 'Seebacher', 'Seidl', 'Siegl', 'Simon', 'Singer', 'Sommer', 'Sonnleitner', 'Spitzer', 'Springer', 'Stadler', 'Stangl', 'Stark', 'Staudinger', 'Steger', 'Steinbauer', 'Steinberger', 'Steindl', 'Steiner', 'Steininger', 'Steinkellner', 'Steinlechner', 'Steinwender', 'Stelzer', 'Stern', 'Steurer', 'Stocker', 'Stockinger', 'Strasser', 'Strauss', 'Strauß', 'Strobl', 'Stummer', 'Sturm', 'Stöckl', 'Stöger', 'Suppan', 'Swoboda', 'Szabo',
+ 'Thaler', 'Thaller', 'Thurner', 'Tischler', 'Toth', 'Traxler', 'Trimmel', 'Trummer',
+ 'Ulrich', 'Unger', 'Unterberger', 'Unterweger', 'Urban',
+ 'Varga', 'Vogel', 'Vogl',
+ 'Wachter', 'Wagner', 'Walch', 'Walcher', 'Wallner', 'Walter', 'Weber', 'Wechselberger', 'Wegscheider', 'Weidinger', 'Weigl', 'Weinberger', 'Weiss', 'Weiß', 'Weninger', 'Werner', 'Wieland', 'Wieser', 'Wiesinger', 'Wild', 'Wilhelm', 'Wimmer', 'Windisch', 'Winkler', 'Winter', 'Wirth', 'Wittmann', 'Wolf', 'Wurm', 'Wurzer',
+ 'Zach', 'Zangerl', 'Zauner', 'Zechner', 'Zehetner', 'Zeilinger', 'Zeller', 'Zenz', 'Ziegler', 'Zimmermann', 'Zöhrer',
);
protected static $titleMale = array('Herr', 'Dr.', 'Mag.', 'Ing.', 'Dipl.-Ing.', 'Prof.', 'Univ.Prof.');
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Text.php
new file mode 100644
index 00000000..2efd43f3
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/de_AT/Text.php
@@ -0,0 +1,7 @@
+ 'Aargau'),
+ array('AI' => 'Appenzell Innerrhoden'),
+ array('AR' => 'Appenzell Ausserrhoden'),
+ array('BE' => 'Bern'),
+ array('BL' => 'Basel-Landschaft'),
+ array('BS' => 'Basel-Stadt'),
+ array('FR' => 'Freiburg'),
+ array('GE' => 'Genf'),
+ array('GL' => 'Glarus'),
+ array('GR' => 'Graubünden'),
+ array('JU' => 'Jura',),
+ array('LU' => 'Luzern'),
+ array('NE' => 'Neuenburg'),
+ array('NW' => 'Nidwalden'),
+ array('OW' => 'Obwalden'),
+ array('SG' => 'St. Gallen'),
+ array('SH' => 'Schaffhausen'),
+ array('SO' => 'Solothurn'),
+ array('SZ' => 'Schwyz'),
+ array('TG' => 'Thurgau'),
+ array('TI' => 'Tessin'),
+ array('UR' => 'Uri'),
+ array('VD' => 'Waadt'),
+ array('VS' => 'Wallis'),
+ array('ZG' => 'Zug'),
+ array('ZH' => 'Zürich')
+ );
+
+ protected static $country = array(
+ 'Afghanistan', 'Alandinseln', 'Albanien', 'Algerien', 'Amerikanisch-Ozeanien', 'Amerikanisch-Samoa', 'Amerikanische Jungferninseln', 'Andorra', 'Angola', 'Anguilla', 'Antarktis', 'Antigua und Barbuda', 'Argentinien', 'Armenien', 'Aruba', 'Aserbaidschan', 'Australien', 'Ägypten', 'Äquatorialguinea', 'Äthiopien', 'Äusseres Ozeanien',
+ 'Bahamas', 'Bahrain', 'Bangladesch', 'Barbados', 'Belarus', 'Belgien', 'Belize', 'Benin', 'Bermuda', 'Bhutan', 'Bolivien', 'Bosnien und Herzegowina', 'Botsuana', 'Bouvetinsel', 'Brasilien', 'Britische Jungferninseln', 'Britisches Territorium im Indischen Ozean', 'Brunei Darussalam', 'Bulgarien', 'Burkina Faso', 'Burundi',
+ 'Chile', 'China', 'Cookinseln', 'Costa Rica', 'Côte d’Ivoire',
+ 'Demokratische Republik Kongo', 'Demokratische Volksrepublik Korea', 'Deutschland', 'Dominica', 'Dominikanische Republik', 'Dschibuti', 'Dänemark',
+ 'Ecuador', 'El Salvador', 'Eritrea', 'Estland', 'Europäische Union',
+ 'Falklandinseln', 'Fidschi', 'Finnland', 'Frankreich', 'Französisch-Guayana', 'Französisch-Polynesien', 'Französische Süd- und Antarktisgebiete', 'Färöer',
+ 'Gabun', 'Gambia', 'Georgien', 'Ghana', 'Gibraltar', 'Grenada', 'Griechenland', 'Grönland', 'Guadeloupe', 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana',
+ 'Haiti', 'Heard- und McDonald-Inseln', 'Honduras',
+ 'Indien', 'Indonesien', 'Irak', 'Iran', 'Irland', 'Island', 'Isle of Man', 'Israel', 'Italien',
+ 'Jamaika', 'Japan', 'Jemen', 'Jersey', 'Jordanien',
+ 'Kaimaninseln', 'Kambodscha', 'Kamerun', 'Kanada', 'Kap Verde', 'Kasachstan', 'Katar', 'Kenia', 'Kirgisistan', 'Kiribati', 'Kokosinseln', 'Kolumbien', 'Komoren', 'Kongo', 'Kroatien', 'Kuba', 'Kuwait',
+ 'Laos', 'Lesotho', 'Lettland', 'Libanon', 'Liberia', 'Libyen', 'Liechtenstein', 'Litauen', 'Luxemburg',
+ 'Madagaskar', 'Malawi', 'Malaysia', 'Malediven', 'Mali', 'Malta', 'Marokko', 'Marshallinseln', 'Martinique', 'Mauretanien', 'Mauritius', 'Mayotte', 'Mazedonien', 'Mexiko', 'Mikronesien', 'Monaco', 'Mongolei', 'Montenegro', 'Montserrat', 'Mosambik', 'Myanmar',
+ 'Namibia', 'Nauru', 'Nepal', 'Neukaledonien', 'Neuseeland', 'Nicaragua', 'Niederlande', 'Niederländische Antillen', 'Niger', 'Nigeria', 'Niue', 'Norfolkinsel', 'Norwegen', 'Nördliche Marianen',
+ 'Oman', 'Osttimor', 'Österreich',
+ 'Pakistan', 'Palau', 'Palästinensische Gebiete', 'Panama', 'Papua-Neuguinea', 'Paraguay', 'Peru', 'Philippinen', 'Pitcairn', 'Polen', 'Portugal', 'Puerto Rico',
+ 'Republik Korea', 'Republik Moldau', 'Ruanda', 'Rumänien', 'Russische Föderation', 'Réunion',
+ 'Salomonen', 'Sambia', 'Samoa', 'San Marino', 'Saudi-Arabien', 'Schweden', 'Schweiz', 'Senegal', 'Serbien', 'Serbien und Montenegro', 'Seychellen', 'Sierra Leone', 'Simbabwe', 'Singapur', 'Slowakei', 'Slowenien', 'Somalia', 'Sonderverwaltungszone Hongkong', 'Sonderverwaltungszone Macao', 'Spanien', 'Sri Lanka', 'St. Barthélemy', 'St. Helena', 'St. Kitts und Nevis', 'St. Lucia', 'St. Martin', 'St. Pierre und Miquelon', 'St. Vincent und die Grenadinen', 'Sudan', 'Suriname', 'Svalbard und Jan Mayen', 'Swasiland', 'Syrien', 'São Tomé und Príncipe', 'Südafrika', 'Südgeorgien und die Südlichen Sandwichinseln',
+ 'Tadschikistan', 'Taiwan', 'Tansania', 'Thailand', 'Togo', 'Tokelau', 'Tonga', 'Trinidad und Tobago', 'Tschad', 'Tschechische Republik', 'Tunesien', 'Turkmenistan', 'Turks- und Caicosinseln', 'Tuvalu', 'Türkei',
+ 'Uganda', 'Ukraine', 'Unbekannte oder ungültige Region', 'Ungarn', 'Uruguay', 'Usbekistan',
+ 'Vanuatu', 'Vatikanstadt', 'Venezuela', 'Vereinigte Arabische Emirate', 'Vereinigte Staaten', 'Vereinigtes Königreich', 'Vietnam',
+ 'Wallis und Futuna', 'Weihnachtsinsel', 'Westsahara',
+ 'Zentralafrikanische Republik', 'Zypern',
+ );
+
+ protected static $cityFormats = array(
+ '{{cityName}}',
+ );
+
+ protected static $streetNameFormats = array(
+ '{{lastName}}{{streetSuffixShort}}',
+ '{{cityName}}{{streetSuffixShort}}',
+ '{{firstName}}-{{lastName}}-{{streetSuffixLong}}'
+ );
+
+ protected static $streetAddressFormats = array(
+ '{{streetName}} {{buildingNumber}}',
+ );
+ protected static $addressFormats = array(
+ "{{streetAddress}}\n{{postcode}} {{city}}",
+ );
+
+ /**
+ * Returns a random city name.
+ * @example Luzern
+ * @return string
+ */
+ public function cityName()
+ {
+ return static::randomElement(static::$cityNames);
+ }
+
+ /**
+ * Returns a random street suffix.
+ * @example str.
+ * @return string
+ */
+ public function streetSuffixShort()
+ {
+ return static::randomElement(static::$streetSuffixShort);
+ }
+
+ /**
+ * Returns a random street suffix.
+ * @example Strasse
+ * @return string
+ */
+ public function streetSuffixLong()
+ {
+ return static::randomElement(static::$streetSuffixLong);
+ }
+
+ /**
+ * Returns a canton
+ * @example array('BE' => 'Bern')
+ * @return array
+ */
+ public static function canton()
+ {
+ return static::randomElement(static::$canton);
+ }
+
+ /**
+ * Returns the abbreviation of a canton.
+ * @return string
+ */
+ public static function cantonShort()
+ {
+ $canton = static::canton();
+ return key($canton);
+ }
+
+ /**
+ * Returns the name of canton.
+ * @return string
+ */
+ public static function cantonName()
+ {
+ $canton = static::canton();
+ return current($canton);
+ }
+
+ public static function buildingNumber()
+ {
+ return static::regexify(self::numerify(static::randomElement(static::$buildingNumber)));
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/de_CH/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/de_CH/Company.php
new file mode 100644
index 00000000..604ec5ae
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/de_CH/Company.php
@@ -0,0 +1,15 @@
+generator->parse(static::randomElement(static::$towns));
+ }
+
+ public function syllable()
+ {
+ return static::randomElement(static::$syllables);
+ }
+
+ public function direction()
+ {
+ return static::randomElement(static::$directions);
+ }
+
+ public function englishStreetName()
+ {
+ return static::randomElement(static::$englishStreetNames);
+ }
+
+ public function villageSuffix()
+ {
+ return static::randomElement(static::$villageSuffixes);
+ }
+
+ public function estateSuffix()
+ {
+ return static::randomElement(static::$estateSuffixes);
+ }
+
+ public function village()
+ {
+ return $this->generator->parse(static::randomElement(static::$villageNameFormats));
+ }
+
+ public function estate()
+ {
+ return $this->generator->parse(static::randomElement(static::$estateNameFormats));
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_HK/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_HK/Internet.php
new file mode 100644
index 00000000..4d82d93a
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_HK/Internet.php
@@ -0,0 +1,14 @@
+generator->parse(static::randomElement(static::$societyNameFormat));
+ }
+ /**
+ * @example Mumbai
+ */
+ public function city()
+ {
+ return static::randomElement(static::$city);
+ }
+ /**
+ * @example Vaishali Nagar
+ */
+ public function locality()
+ {
+ return $this->generator->parse(static::randomElement(static::$localityFormats));
+ }
+ /*
+ * @example Kharadi
+ */
+ public function localityName()
+ {
+ return $this->generator->parse(static::randomElement(static::$localityName));
+ }
+ /**
+ * @example Nagar
+ */
+ public function areaSuffix()
+ {
+ return static::randomElement(static::$areaSuffix);
+ }
+
+ /**
+ * @example 'Delhi'
+ */
+ public static function state()
+ {
+ return static::randomElement(static::$state);
+ }
+
+ /**
+ * @example 'DL'
+ */
+ public static function stateAbbr()
+ {
+ return static::randomElement(static::$stateAbbr);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_IN/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_IN/Internet.php
new file mode 100644
index 00000000..6ec16710
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_IN/Internet.php
@@ -0,0 +1,9 @@
+generator->parse($format));
+ }
+
+ public function fixedLineNumber()
+ {
+ $format = static::randomElement(static::$fixedLineNumberFormats);
+
+ return static::numerify($this->generator->parse($format));
+ }
+
+ public function voipNumber()
+ {
+ $format = static::randomElement(static::$voipNumber);
+
+ return $this->generator->parse($format);
+ }
+
+ public function internationalCodePrefix()
+ {
+ $format = static::randomElement(static::$internationalCodePrefix);
+
+ return $this->generator->parse($format);
+ }
+
+ public function zeroToEight()
+ {
+ return static::randomElement(static::$zeroToEight);
+ }
+
+ public function oneToEight()
+ {
+ return static::randomElement(static::$oneToEight);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php
index 4f876bfc..eb817e3a 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php
@@ -2,12 +2,12 @@
namespace Faker\Provider\en_UG;
-class Address extends \Faker\Provider\Address
+class Address extends \Faker\Provider\en_US\Address
{
protected static $cityFormats = array(
'{{cityName}}'
);
-
+
/**
* @link http://en.wikipedia.org/wiki/List_of_cities_and_towns_in_Uganda
*/
@@ -40,34 +40,6 @@ class Address extends \Faker\Provider\Address
'Yumbe'
);
- protected static $country = array(
- 'Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra', 'Angola', 'Anguilla', 'Antarctica (the territory South of 60 deg S)', 'Antigua and Barbuda', 'Argentina', 'Armenia', 'Aruba', 'Australia', 'Austria', 'Azerbaijan',
- 'Bahamas', 'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', 'Bermuda', 'Bhutan', 'Bolivia', 'Bosnia and Herzegovina', 'Botswana', 'Bouvet Island (Bouvetoya)', 'Brazil', 'British Indian Ocean Territory (Chagos Archipelago)', 'British Virgin Islands', 'Brunei Darussalam', 'Bulgaria', 'Burkina Faso', 'Burundi',
- 'Cambodia', 'Cameroon', 'Canada', 'Cape Verde', 'Cayman Islands', 'Central African Republic', 'Chad', 'Chile', 'China', 'Christmas Island', 'Cocos (Keeling) Islands', 'Colombia', 'Comoros', 'Congo', 'Cook Islands', 'Costa Rica', 'Cote d\'Ivoire', 'Croatia', 'Cuba', 'Cyprus', 'Czech Republic',
- 'Denmark', 'Djibouti', 'Dominica', 'Dominican Republic',
- 'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia',
- 'Faroe Islands', 'Falkland Islands (Malvinas)', 'Fiji', 'Finland', 'France', 'French Guiana', 'French Polynesia', 'French Southern Territories',
- 'Gabon', 'Gambia', 'Georgia', 'Germany', 'Ghana', 'Gibraltar', 'Greece', 'Greenland', 'Grenada', 'Guadeloupe', 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana',
- 'Haiti', 'Heard Island and McDonald Islands', 'Holy See (Vatican City State)', 'Honduras', 'Hong Kong', 'Hungary',
- 'Iceland', 'India', 'Indonesia', 'Iran', 'Iraq', 'Ireland', 'Isle of Man', 'Israel', 'Italy',
- 'Jamaica', 'Japan', 'Jersey', 'Jordan',
- 'Kazakhstan', 'Kenya', 'Kiribati', 'Korea', 'Korea', 'Kuwait', 'Kyrgyz Republic',
- 'Lao People\'s Democratic Republic', 'Latvia', 'Lebanon', 'Lesotho', 'Liberia', 'Libyan Arab Jamahiriya', 'Liechtenstein', 'Lithuania', 'Luxembourg',
- 'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar',
- 'Namibia', 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Mariana Islands', 'Norway',
- 'Oman',
- 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico',
- 'Qatar',
- 'Reunion', 'Romania', 'Russian Federation', 'Rwanda',
- 'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia (Slovak Republic)', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Georgia and the South Sandwich Islands', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Sweden', 'Switzerland', 'Syrian Arab Republic',
- 'Taiwan', 'Tajikistan', 'Tanzania', 'Thailand', 'Timor-Leste', 'Togo', 'Tokelau', 'Tonga', 'Trinidad and Tobago', 'Tunisia', 'Turkey', 'Turkmenistan', 'Turks and Caicos Islands', 'Tuvalu',
- 'Uganda', 'Ukraine', 'United Arab Emirates', 'United Kingdom', 'United States of America', 'United States Minor Outlying Islands', 'United States Virgin Islands', 'Uruguay', 'Uzbekistan',
- 'Vanuatu', 'Venezuela', 'Vietnam',
- 'Wallis and Futuna', 'Western Sahara',
- 'Yemen',
- 'Zambia', 'Zimbabwe'
- );
-
/**
* @link http://en.wikipedia.org/wiki/Category:Districts_of_Uganda
*/
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Address.php
index e4c7ce0d..b3c72f40 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Address.php
@@ -6,7 +6,7 @@ class Address extends \Faker\Provider\Address
{
protected static $cityPrefix = array('North', 'East', 'West', 'South', 'New', 'Lake', 'Port');
protected static $citySuffix = array('town', 'ton', 'land', 'ville', 'berg', 'burgh', 'borough', 'bury', 'view', 'port', 'mouth', 'stad', 'furt', 'chester', 'mouth', 'fort', 'haven', 'side', 'shire');
- protected static $buildingNumber = array('#####', '####', '###');
+ protected static $buildingNumber = array('%####', '%###', '%##');
protected static $streetSuffix = array(
'Alley', 'Avenue', 'Branch', 'Bridge', 'Brook', 'Brooks', 'Burg', 'Burgs', 'Bypass', 'Camp', 'Canyon', 'Cape', 'Causeway', 'Center', 'Centers', 'Circle', 'Circles', 'Cliff', 'Cliffs', 'Club', 'Common', 'Corner', 'Corners', 'Course', 'Court', 'Courts', 'Cove', 'Coves', 'Creek', 'Crescent', 'Crest', 'Crossing', 'Crossroad', 'Curve', 'Dale', 'Dam', 'Divide', 'Drive', 'Drive', 'Drives', 'Estate', 'Estates', 'Expressway', 'Extension', 'Extensions', 'Fall', 'Falls', 'Ferry', 'Field', 'Fields', 'Flat', 'Flats', 'Ford', 'Fords', 'Forest', 'Forge', 'Forges', 'Fork', 'Forks', 'Fort', 'Freeway', 'Garden', 'Gardens', 'Gateway', 'Glen', 'Glens', 'Green', 'Greens', 'Grove', 'Groves', 'Harbor', 'Harbors', 'Haven', 'Heights', 'Highway', 'Hill', 'Hills', 'Hollow', 'Inlet', 'Inlet', 'Island', 'Island', 'Islands', 'Islands', 'Isle', 'Isle', 'Junction', 'Junctions', 'Key', 'Keys', 'Knoll', 'Knolls', 'Lake', 'Lakes', 'Land', 'Landing', 'Lane', 'Light', 'Lights', 'Loaf', 'Lock', 'Locks', 'Locks', 'Lodge', 'Lodge', 'Loop', 'Mall', 'Manor', 'Manors', 'Meadow', 'Meadows', 'Mews', 'Mill', 'Mills', 'Mission', 'Mission', 'Motorway', 'Mount', 'Mountain', 'Mountain', 'Mountains', 'Mountains', 'Neck', 'Orchard', 'Oval', 'Overpass', 'Park', 'Parks', 'Parkway', 'Parkways', 'Pass', 'Passage', 'Path', 'Pike', 'Pine', 'Pines', 'Place', 'Plain', 'Plains', 'Plains', 'Plaza', 'Plaza', 'Point', 'Points', 'Port', 'Port', 'Ports', 'Ports', 'Prairie', 'Prairie', 'Radial', 'Ramp', 'Ranch', 'Rapid', 'Rapids', 'Rest', 'Ridge', 'Ridges', 'River', 'Road', 'Road', 'Roads', 'Roads', 'Route', 'Row', 'Rue', 'Run', 'Shoal', 'Shoals', 'Shore', 'Shores', 'Skyway', 'Spring', 'Springs', 'Springs', 'Spur', 'Spurs', 'Square', 'Square', 'Squares', 'Squares', 'Station', 'Station', 'Stravenue', 'Stravenue', 'Stream', 'Stream', 'Street', 'Street', 'Streets', 'Summit', 'Summit', 'Terrace', 'Throughway', 'Trace', 'Track', 'Trafficway', 'Trail', 'Trail', 'Tunnel', 'Tunnel', 'Turnpike', 'Turnpike', 'Underpass', 'Union', 'Unions', 'Valley', 'Valleys', 'Via', 'Viaduct', 'View', 'Views', 'Village', 'Village', 'Villages', 'Ville', 'Vista', 'Vista', 'Walk', 'Walks', 'Wall', 'Way', 'Ways', 'Well', 'Wells'
);
@@ -33,7 +33,7 @@ class Address extends \Faker\Provider\Address
'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar',
'Namibia', 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Mariana Islands', 'Norway',
'Oman',
- 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico',
+ 'Pakistan', 'Palau', 'Palestinian Territories', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico',
'Qatar',
'Reunion', 'Romania', 'Russian Federation', 'Rwanda',
'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia (Slovak Republic)', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Georgia and the South Sandwich Islands', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Sweden', 'Switzerland', 'Syrian Arab Republic',
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Company.php
index 464589f7..f46adaaf 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Company.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Company.php
@@ -7,35 +7,73 @@ class Company extends \Faker\Provider\Company
protected static $formats = array(
'{{lastName}} {{companySuffix}}',
'{{lastName}}-{{lastName}}',
- '{{lastName}}, {{lastName}} and {{lastName}}'
+ '{{lastName}}, {{lastName}} and {{lastName}}',
);
protected static $catchPhraseWords = array(
array(
- 'Adaptive', 'Advanced', 'Ameliorated', 'Assimilated', 'Automated', 'Balanced', 'Business-focused', 'Centralized', 'Cloned', 'Compatible', 'Configurable', 'Cross-group', 'Cross-platform', 'Customer-focused', 'Customizable', 'Decentralized', 'De-engineered', 'Devolved', 'Digitized', 'Distributed', 'Diverse', 'Down-sized', 'Enhanced', 'Enterprise-wide', 'Ergonomic', 'Exclusive', 'Expanded', 'Extended', 'Facetoface', 'Focused', 'Front-line', 'Fully-configurable', 'Function-based', 'Fundamental', 'Future-proofed', 'Grass-roots', 'Horizontal', 'Implemented', 'Innovative', 'Integrated', 'Intuitive', 'Inverse', 'Managed', 'Mandatory', 'Monitored', 'Multi-channelled', 'Multi-lateral', 'Multi-layered', 'Multi-tiered', 'Networked', 'Object-based', 'Open-architected', 'Open-source', 'Operative', 'Optimized', 'Optional', 'Organic', 'Organized', 'Persevering', 'Persistent', 'Phased', 'Polarised', 'Pre-emptive', 'Proactive', 'Profit-focused', 'Profound', 'Programmable', 'Progressive', 'Public-key', 'Quality-focused', 'Reactive', 'Realigned', 'Re-contextualized', 'Re-engineered', 'Reduced', 'Reverse-engineered', 'Right-sized', 'Robust', 'Seamless', 'Secured', 'Self-enabling', 'Sharable', 'Stand-alone', 'Streamlined', 'Switchable', 'Synchronised', 'Synergistic', 'Synergized', 'Team-oriented', 'Total', 'Triple-buffered', 'Universal', 'Up-sized', 'Upgradable', 'User-centric', 'User-friendly', 'Versatile', 'Virtual', 'Visionary', 'Vision-oriented'
+ 'Adaptive', 'Advanced', 'Ameliorated', 'Assimilated', 'Automated', 'Balanced', 'Business-focused', 'Centralized', 'Cloned', 'Compatible', 'Configurable', 'Cross-group', 'Cross-platform', 'Customer-focused', 'Customizable', 'Decentralized', 'De-engineered', 'Devolved', 'Digitized', 'Distributed', 'Diverse', 'Down-sized', 'Enhanced', 'Enterprise-wide', 'Ergonomic', 'Exclusive', 'Expanded', 'Extended', 'Facetoface', 'Focused', 'Front-line', 'Fully-configurable', 'Function-based', 'Fundamental', 'Future-proofed', 'Grass-roots', 'Horizontal', 'Implemented', 'Innovative', 'Integrated', 'Intuitive', 'Inverse', 'Managed', 'Mandatory', 'Monitored', 'Multi-channelled', 'Multi-lateral', 'Multi-layered', 'Multi-tiered', 'Networked', 'Object-based', 'Open-architected', 'Open-source', 'Operative', 'Optimized', 'Optional', 'Organic', 'Organized', 'Persevering', 'Persistent', 'Phased', 'Polarised', 'Pre-emptive', 'Proactive', 'Profit-focused', 'Profound', 'Programmable', 'Progressive', 'Public-key', 'Quality-focused', 'Reactive', 'Realigned', 'Re-contextualized', 'Re-engineered', 'Reduced', 'Reverse-engineered', 'Right-sized', 'Robust', 'Seamless', 'Secured', 'Self-enabling', 'Sharable', 'Stand-alone', 'Streamlined', 'Switchable', 'Synchronised', 'Synergistic', 'Synergized', 'Team-oriented', 'Total', 'Triple-buffered', 'Universal', 'Up-sized', 'Upgradable', 'User-centric', 'User-friendly', 'Versatile', 'Virtual', 'Visionary', 'Vision-oriented',
),
array(
- '24hour', '24/7', '3rdgeneration', '4thgeneration', '5thgeneration', '6thgeneration', 'actuating', 'analyzing', 'assymetric', 'asynchronous', 'attitude-oriented', 'background', 'bandwidth-monitored', 'bi-directional', 'bifurcated', 'bottom-line', 'clear-thinking', 'client-driven', 'client-server', 'coherent', 'cohesive', 'composite', 'context-sensitive', 'contextually-based', 'content-based', 'dedicated', 'demand-driven', 'didactic', 'directional', 'discrete', 'disintermediate', 'dynamic', 'eco-centric', 'empowering', 'encompassing', 'even-keeled', 'executive', 'explicit', 'exuding', 'fault-tolerant', 'foreground', 'fresh-thinking', 'full-range', 'global', 'grid-enabled', 'heuristic', 'high-level', 'holistic', 'homogeneous', 'human-resource', 'hybrid', 'impactful', 'incremental', 'intangible', 'interactive', 'intermediate', 'leadingedge', 'local', 'logistical', 'maximized', 'methodical', 'mission-critical', 'mobile', 'modular', 'motivating', 'multimedia', 'multi-state', 'multi-tasking', 'national', 'needs-based', 'neutral', 'nextgeneration', 'non-volatile', 'object-oriented', 'optimal', 'optimizing', 'radical', 'real-time', 'reciprocal', 'regional', 'responsive', 'scalable', 'secondary', 'solution-oriented', 'stable', 'static', 'systematic', 'systemic', 'system-worthy', 'tangible', 'tertiary', 'transitional', 'uniform', 'upward-trending', 'user-facing', 'value-added', 'web-enabled', 'well-modulated', 'zeroadministration', 'zerodefect', 'zerotolerance'
+ '24hour', '24/7', '3rdgeneration', '4thgeneration', '5thgeneration', '6thgeneration', 'actuating', 'analyzing', 'assymetric', 'asynchronous', 'attitude-oriented', 'background', 'bandwidth-monitored', 'bi-directional', 'bifurcated', 'bottom-line', 'clear-thinking', 'client-driven', 'client-server', 'coherent', 'cohesive', 'composite', 'context-sensitive', 'contextually-based', 'content-based', 'dedicated', 'demand-driven', 'didactic', 'directional', 'discrete', 'disintermediate', 'dynamic', 'eco-centric', 'empowering', 'encompassing', 'even-keeled', 'executive', 'explicit', 'exuding', 'fault-tolerant', 'foreground', 'fresh-thinking', 'full-range', 'global', 'grid-enabled', 'heuristic', 'high-level', 'holistic', 'homogeneous', 'human-resource', 'hybrid', 'impactful', 'incremental', 'intangible', 'interactive', 'intermediate', 'leadingedge', 'local', 'logistical', 'maximized', 'methodical', 'mission-critical', 'mobile', 'modular', 'motivating', 'multimedia', 'multi-state', 'multi-tasking', 'national', 'needs-based', 'neutral', 'nextgeneration', 'non-volatile', 'object-oriented', 'optimal', 'optimizing', 'radical', 'real-time', 'reciprocal', 'regional', 'responsive', 'scalable', 'secondary', 'solution-oriented', 'stable', 'static', 'systematic', 'systemic', 'system-worthy', 'tangible', 'tertiary', 'transitional', 'uniform', 'upward-trending', 'user-facing', 'value-added', 'web-enabled', 'well-modulated', 'zeroadministration', 'zerodefect', 'zerotolerance',
),
array(
- 'ability', 'access', 'adapter', 'algorithm', 'alliance', 'analyzer', 'application', 'approach', 'architecture', 'archive', 'artificialintelligence', 'array', 'attitude', 'benchmark', 'budgetarymanagement', 'capability', 'capacity', 'challenge', 'circuit', 'collaboration', 'complexity', 'concept', 'conglomeration', 'contingency', 'core', 'customerloyalty', 'database', 'data-warehouse', 'definition', 'emulation', 'encoding', 'encryption', 'extranet', 'firmware', 'flexibility', 'focusgroup', 'forecast', 'frame', 'framework', 'function', 'functionalities', 'GraphicInterface', 'groupware', 'GraphicalUserInterface', 'hardware', 'help-desk', 'hierarchy', 'hub', 'implementation', 'info-mediaries', 'infrastructure', 'initiative', 'installation', 'instructionset', 'interface', 'internetsolution', 'intranet', 'knowledgeuser', 'knowledgebase', 'localareanetwork', 'leverage', 'matrices', 'matrix', 'methodology', 'middleware', 'migration', 'model', 'moderator', 'monitoring', 'moratorium', 'neural-net', 'openarchitecture', 'opensystem', 'orchestration', 'paradigm', 'parallelism', 'policy', 'portal', 'pricingstructure', 'processimprovement', 'product', 'productivity', 'project', 'projection', 'protocol', 'securedline', 'service-desk', 'software', 'solution', 'standardization', 'strategy', 'structure', 'success', 'superstructure', 'support', 'synergy', 'systemengine', 'task-force', 'throughput', 'time-frame', 'toolset', 'utilisation', 'website', 'workforce'
- )
+ 'ability', 'access', 'adapter', 'algorithm', 'alliance', 'analyzer', 'application', 'approach', 'architecture', 'archive', 'artificialintelligence', 'array', 'attitude', 'benchmark', 'blockchain', 'budgetarymanagement', 'capability', 'capacity', 'challenge', 'circuit', 'collaboration', 'complexity', 'concept', 'conglomeration', 'contingency', 'core', 'customerloyalty', 'database', 'data-warehouse', 'definition', 'emulation', 'encoding', 'encryption', 'extranet', 'firmware', 'flexibility', 'focusgroup', 'forecast', 'frame', 'framework', 'function', 'functionalities', 'GraphicInterface', 'groupware', 'GraphicalUserInterface', 'hardware', 'help-desk', 'hierarchy', 'hub', 'implementation', 'info-mediaries', 'infrastructure', 'initiative', 'installation', 'instructionset', 'interface', 'internetsolution', 'intranet', 'knowledgeuser', 'knowledgebase', 'localareanetwork', 'leverage', 'matrices', 'matrix', 'methodology', 'middleware', 'migration', 'model', 'moderator', 'monitoring', 'moratorium', 'neural-net', 'openarchitecture', 'opensystem', 'orchestration', 'paradigm', 'parallelism', 'policy', 'portal', 'pricingstructure', 'processimprovement', 'product', 'productivity', 'project', 'projection', 'protocol', 'securedline', 'service-desk', 'software', 'solution', 'standardization', 'strategy', 'structure', 'success', 'superstructure', 'support', 'synergy', 'systemengine', 'task-force', 'throughput', 'time-frame', 'toolset', 'utilisation', 'website', 'workforce',
+ ),
);
protected static $bsWords = array(
array(
- 'implement', 'utilize', 'integrate', 'streamline', 'optimize', 'evolve', 'transform', 'embrace', 'enable', 'orchestrate', 'leverage', 'reinvent', 'aggregate', 'architect', 'enhance', 'incentivize', 'morph', 'empower', 'envisioneer', 'monetize', 'harness', 'facilitate', 'seize', 'disintermediate', 'synergize', 'strategize', 'deploy', 'brand', 'grow', 'target', 'syndicate', 'synthesize', 'deliver', 'mesh', 'incubate', 'engage', 'maximize', 'benchmark', 'expedite', 'reintermediate', 'whiteboard', 'visualize', 'repurpose', 'innovate', 'scale', 'unleash', 'drive', 'extend', 'engineer', 'revolutionize', 'generate', 'exploit', 'transition', 'e-enable', 'iterate', 'cultivate', 'matrix', 'productize', 'redefine', 'recontextualize'
+ 'implement', 'utilize', 'integrate', 'streamline', 'optimize', 'evolve', 'transform', 'embrace', 'enable', 'orchestrate', 'leverage', 'reinvent', 'aggregate', 'architect', 'enhance', 'incentivize', 'morph', 'empower', 'envisioneer', 'monetize', 'harness', 'facilitate', 'seize', 'disintermediate', 'synergize', 'strategize', 'deploy', 'brand', 'grow', 'target', 'syndicate', 'synthesize', 'deliver', 'mesh', 'incubate', 'engage', 'maximize', 'benchmark', 'expedite', 'reintermediate', 'whiteboard', 'visualize', 'repurpose', 'innovate', 'scale', 'unleash', 'drive', 'extend', 'engineer', 'revolutionize', 'generate', 'exploit', 'transition', 'e-enable', 'iterate', 'cultivate', 'matrix', 'productize', 'redefine', 'recontextualize',
),
array(
- 'clicks-and-mortar', 'value-added', 'vertical', 'proactive', 'robust', 'revolutionary', 'scalable', 'leading-edge', 'innovative', 'intuitive', 'strategic', 'e-business', 'mission-critical', 'sticky', 'one-to-one', '24/7', 'end-to-end', 'global', 'B2B', 'B2C', 'granular', 'frictionless', 'virtual', 'viral', 'dynamic', '24/365', 'best-of-breed', 'killer', 'magnetic', 'bleeding-edge', 'web-enabled', 'interactive', 'dot-com', 'sexy', 'back-end', 'real-time', 'efficient', 'front-end', 'distributed', 'seamless', 'extensible', 'turn-key', 'world-class', 'open-source', 'cross-platform', 'cross-media', 'synergistic', 'bricks-and-clicks', 'out-of-the-box', 'enterprise', 'integrated', 'impactful', 'wireless', 'transparent', 'next-generation', 'cutting-edge', 'user-centric', 'visionary', 'customized', 'ubiquitous', 'plug-and-play', 'collaborative', 'compelling', 'holistic', 'rich'
+ 'clicks-and-mortar', 'value-added', 'vertical', 'proactive', 'robust', 'revolutionary', 'scalable', 'leading-edge', 'innovative', 'intuitive', 'strategic', 'e-business', 'mission-critical', 'sticky', 'one-to-one', '24/7', 'end-to-end', 'global', 'B2B', 'B2C', 'granular', 'frictionless', 'virtual', 'viral', 'dynamic', '24/365', 'best-of-breed', 'killer', 'magnetic', 'bleeding-edge', 'web-enabled', 'interactive', 'dot-com', 'sexy', 'back-end', 'real-time', 'efficient', 'front-end', 'distributed', 'seamless', 'extensible', 'turn-key', 'world-class', 'open-source', 'cross-platform', 'cross-media', 'synergistic', 'bricks-and-clicks', 'out-of-the-box', 'enterprise', 'integrated', 'impactful', 'wireless', 'transparent', 'next-generation', 'cutting-edge', 'user-centric', 'visionary', 'customized', 'ubiquitous', 'plug-and-play', 'collaborative', 'compelling', 'holistic', 'rich',
),
array(
- 'synergies', 'web-readiness', 'paradigms', 'markets', 'partnerships', 'infrastructures', 'platforms', 'initiatives', 'channels', 'eyeballs', 'communities', 'ROI', 'solutions', 'e-tailers', 'e-services', 'action-items', 'portals', 'niches', 'technologies', 'content', 'vortals', 'supply-chains', 'convergence', 'relationships', 'architectures', 'interfaces', 'e-markets', 'e-commerce', 'systems', 'bandwidth', 'infomediaries', 'models', 'mindshare', 'deliverables', 'users', 'schemas', 'networks', 'applications', 'metrics', 'e-business', 'functionalities', 'experiences', 'webservices', 'methodologies'
- )
+ 'synergies', 'web-readiness', 'paradigms', 'markets', 'partnerships', 'infrastructures', 'platforms', 'initiatives', 'channels', 'eyeballs', 'communities', 'ROI', 'solutions', 'e-tailers', 'e-services', 'action-items', 'portals', 'niches', 'technologies', 'content', 'vortals', 'supply-chains', 'convergence', 'relationships', 'architectures', 'interfaces', 'e-markets', 'e-commerce', 'systems', 'bandwidth', 'infomediaries', 'models', 'mindshare', 'deliverables', 'users', 'schemas', 'networks', 'applications', 'metrics', 'e-business', 'functionalities', 'experiences', 'webservices', 'methodologies',
+ ),
+ );
+
+ /**
+ * Source - http://www.careerplanner.com/ListOfJobs.cfm
+ */
+ protected static $jobTitleFormat = array(
+ 'Able Seamen', 'Account Manager', 'Accountant', 'Actor', 'Actuary', 'Adjustment Clerk', 'Admin', 'Administrative Law Judge', 'Administrative Services Manager', 'Administrative Support Supervisors', 'Advertising Manager OR Promotions Manager', 'Advertising Sales Agent', 'Aerospace Engineer', 'Agricultural Crop Farm Manager', 'Agricultural Crop Worker', 'Agricultural Engineer', 'Agricultural Equipment Operator', 'Agricultural Inspector', 'Agricultural Manager', 'Agricultural Product Grader Sorter', 'Agricultural Sales Representative', 'Agricultural Science Technician', 'Agricultural Sciences Teacher', 'Agricultural Technician', 'Agricultural Worker', 'Air Crew Member', 'Air Crew Officer', 'Air Traffic Controller', 'Aircraft Assembler', 'Aircraft Body Repairer', 'Aircraft Cargo Handling Supervisor', 'Aircraft Engine Specialist', 'Aircraft Launch and Recovery Officer', 'Aircraft Launch Specialist', 'Aircraft Mechanics OR Aircraft Service Technician', 'Aircraft Rigging Assembler', 'Aircraft Structure Assemblers', 'Airfield Operations Specialist', 'Airframe Mechanic', 'Airline Pilot OR Copilot OR Flight Engineer', 'Algorithm Developer', 'Alteration Tailor', 'Ambulance Driver', 'Amusement Attendant', 'Anesthesiologist', 'Animal Breeder', 'Animal Care Workers', 'Animal Control Worker', 'Animal Husbandry Worker', 'Animal Scientist', 'Animal Trainer', 'Annealing Machine Operator', 'Announcer', 'Answering Service', 'Anthropologist', 'Anthropologist OR Archeologist', 'Anthropology Teacher', 'Appliance Repairer', 'Arbitrator', 'Archeologist', 'Architect', 'Architectural Drafter', 'Architectural Drafter OR Civil Drafter', 'Architecture Teacher', 'Archivist', 'Armored Assault Vehicle Crew Member', 'Armored Assault Vehicle Officer', 'Art Director', 'Art Teacher', 'Artillery Officer', 'Artillery Crew Member', 'Artist', 'Assembler', 'Assessor', 'Astronomer', 'Athletes and Sports Competitor', 'Athletic Trainer', 'Atmospheric and Space Scientist', 'Audio and Video Equipment Technician', 'Audiologist', 'Audio-Visual Collections Specialist', 'Auditor', 'Auditor', 'Automatic Teller Machine Servicer', 'Automotive Body Repairer', 'Automotive Glass Installers', 'Automotive Master Mechanic', 'Automotive Mechanic', 'Automotive Specialty Technician', 'Automotive Technician', 'Auxiliary Equipment Operator', 'Aviation Inspector', 'Avionics Technician',
+ 'Bailiff', 'Baker', 'Barber', 'Bartender', 'Bartender Helper', 'Battery Repairer', 'Bellhop', 'Bench Jeweler', 'Benefits Specialist', 'Bicycle Repairer', 'Bill and Account Collector', 'Bindery Machine Operator', 'Bindery Worker', 'Biochemist', 'Biochemist or Biophysicist', 'Biological Science Teacher', 'Biological Scientist', 'Biological Technician', 'Biologist', 'Biomedical Engineer', 'Biophysicist', 'Board Of Directors', 'Boat Builder and Shipwright', 'Boiler Operator', 'Boilermaker', 'Bookbinder', 'Bookkeeper', 'Brake Machine Setter', 'Brattice Builder', 'Brazer', 'Brazing Machine Operator', 'Brickmason', 'Bridge Tender OR Lock Tender', 'Broadcast News Analyst', 'Broadcast Technician', 'Brokerage Clerk', 'Budget Analyst', 'Buffing and Polishing Operator', 'Building Cleaning Worker', 'Building Inspector', 'Bulldozer Operator', 'Bus Driver', 'Business Development Manager', 'Business Manager', 'Business Operations Specialist', 'Business Teacher', 'Butcher', 'Buyer',
+ 'Cabinetmaker', 'Cafeteria Cook', 'Calibration Technician OR Instrumentation Technician', 'Camera Operator', 'Camera Repairer', 'Captain', 'Caption Writer', 'Cardiovascular Technologist', 'Career Counselor', 'Carpenter', 'Carpenter Assembler and Repairer', 'Carpet Installer', 'Cartographer', 'Cartoonist', 'Carver', 'Cashier', 'Casting Machine Operator', 'Casting Machine Set-Up Operator', 'ccc', 'Ceiling Tile Installer', 'Cement Mason and Concrete Finisher', 'Central Office', 'Central Office and PBX Installers', 'Central Office Operator', 'CEO', 'CFO', 'Chef', 'Chemical Engineer', 'Chemical Equipment Controller', 'Chemical Equipment Operator', 'Chemical Equipment Tender', 'Chemical Plant Operator', 'Chemical Technician', 'Chemist', 'Chemistry Teacher', 'Child Care', 'Child Care Worker', 'Chiropractor', 'Choreographer', 'City', 'City Planning Aide', 'Civil Drafter', 'Civil Engineer', 'Civil Engineering Technician', 'Claims Adjuster', 'Claims Examiner', 'Claims Taker', 'Cleaners of Vehicles', 'Clergy', 'Clerk', 'Clinical Laboratory Technician', 'Clinical Psychologist', 'Clinical School Psychologist', 'Coaches and Scout', 'Coating Machine Operator', 'Coil Winders', 'Command Control Center Officer', 'Command Control Center Specialist', 'Commercial and Industrial Designer', 'Commercial Diver', 'Commercial Pilot', 'Communication Equipment Repairer', 'Communication Equipment Worker', 'Communications Equipment Operator', 'Communications Teacher', 'Community Service Manager', 'Compacting Machine Operator', 'Compensation and Benefits Manager', 'Compliance Officers', 'Composer', 'Computer', 'Computer Hardware Engineer', 'Computer Operator', 'Computer Programmer', 'Computer Repairer', 'Computer Science Teacher', 'Computer Scientist', 'Computer Security Specialist', 'Computer Software Engineer', 'Computer Specialist', 'Computer Support Specialist', 'Computer Systems Analyst', 'Computer-Controlled Machine Tool Operator', 'Concierge', 'Conservation Scientist', 'Construction', 'Construction Carpenter', 'Construction Driller', 'Construction Equipment Operator', 'Construction Laborer', 'Construction Manager', 'Continuous Mining Machine Operator', 'Control Valve Installer', 'Conveyor Operator', 'Cook', 'Cooling and Freezing Equipment Operator', 'Copy Machine Operator', 'Copy Writer', 'Coremaking Machine Operator', 'Coroner', 'Corporate Trainer', 'Correctional Officer', 'Correspondence Clerk', 'Cost Estimator', 'Costume Attendant', 'Counseling Psychologist', 'Counselor', 'Counsil', 'Courier', 'Court Clerk', 'Court Reporter', 'Craft Artist', 'Crane and Tower Operator', 'Creative Writer', 'Credit Checkers Clerk', 'Credit Analyst', 'Credit Authorizer', 'Credit Checker', 'Criminal Investigator', 'Crossing Guard', 'Crushing Grinding Machine Operator', 'CSI', 'CTO', 'Cultural Studies Teacher', 'Curator', 'Custom Tailor', 'Customer Service Representative', 'Cutting Machine Operator', 'Cutting Machine Operator',
+ 'Dancer', 'Data Entry Operator', 'Data Processing Equipment Repairer', 'Database Administrator', 'Database Manager', 'Deburring Machine Operator', 'Decorator', 'Dental Assistant', 'Dental Hygienist', 'Dental Laboratory Technician', 'Dentist', 'Designer', 'Desktop Publisher', 'Detective', 'Diagnostic Medical Sonographer', 'Diamond Worker', 'Diesel Engine Specialist', 'Dietetic Technician', 'Director Of Business Development', 'Director Of Marketing', 'Director Of Social Media Marketing', 'Director Of Talent Acquisition', 'Director Religious Activities', 'Directory Assistance Operator', 'Dishwasher', 'Dispatcher', 'Distribution Manager', 'Door To Door Sales', 'Dot Etcher', 'Drafter', 'Dragline Operator', 'Dredge Operator', 'Drilling and Boring Machine Tool Setter', 'Driver-Sales Worker', 'Drycleaning Machine Operator', 'Drywall Ceiling Tile Installer', 'Drywall Installer',
+ 'Earth Driller', 'Economics Teacher', 'Economist', 'Editor', 'Education Administrator', 'Education Teacher', 'Educational Counselor OR Vocationall Counselor', 'Educational Psychologist', 'Electric Meter Installer', 'Electric Motor Repairer', 'Electrical and Electronic Inspector and Tester', 'Electrical and Electronics Drafter', 'Electrical Drafter', 'Electrical Engineer', 'Electrical Engineering Technician', 'Electrical Parts Reconditioner', 'Electrical Power-Line Installer', 'Electrical Sales Representative', 'Electrician', 'Electrician', 'Electrolytic Plating Machine Operator', 'Electromechanical Equipment Assembler', 'Electro-Mechanical Technician', 'Electronic Drafter', 'Electronic Engineering Technician', 'Electronic Equipment Assembler', 'Electronic Masking System Operator', 'Electronics Engineer', 'Electronics Engineering Technician', 'Electrotyper', 'Elementary and Secondary School Administrators', 'Elementary School Teacher', 'Elevator Installer and Repairer', 'Eligibility Interviewer', 'Embalmer', 'Embossing Machine Operator', 'Emergency Management Specialist', 'Emergency Medical Technician and Paramedic', 'Employment Interviewer', 'Engine Assembler', 'Engineer', 'Engineering', 'Engineering Manager', 'Engineering Teacher', 'Engineering Technician', 'English Language Teacher', 'Engraver', 'Entertainer and Performer', 'Entertainment Attendant', 'Environmental Compliance Inspector', 'Environmental Engineer', 'Environmental Engineering Technician', 'Environmental Science Teacher', 'Environmental Science Technician', 'Environmental Scientist', 'Epidemiologist', 'Equal Opportunity Representative', 'Etcher', 'Etcher and Engraver', 'Event Planner', 'Excavating Machine Operator', 'Executive Secretary', 'Exhibit Designer', 'Explosives Expert', 'Extraction Worker', 'Extruding and Drawing Machine Operator', 'Extruding Machine Operator',
+ 'Fabric Mender', 'Fabric Pressers', 'Farm and Home Management Advisor', 'Farm Equipment Mechanic', 'Farm Labor Contractor', 'Farmer', 'Farmworker', 'Fashion Designer', 'Fashion Model', 'Fast Food Cook', 'Fence Erector', 'Fiber Product Cutting Machine Operator', 'Fiberglass Laminator and Fabricator', 'File Clerk', 'Film Laboratory Technician', 'Financial Analyst', 'Financial Examiner', 'Financial Manager', 'Financial Services Sales Agent', 'Financial Specialist', 'Fire Fighter', 'Fire Inspector', 'Fire Investigator', 'Fire-Prevention Engineer', 'First-Line Supervisor-Manager of Landscaping, Lawn Service, and Groundskeeping Worker', 'Fish Game Warden', 'Fish Hatchery Manager', 'Fishery Worker', 'Fishing OR Forestry Supervisor', 'Fitness Trainer', 'Fitter', 'Flight Attendant', 'Floor Finisher', 'Floor Layer', 'Floral Designer', 'Food Batchmaker', 'Food Cooking Machine Operators', 'Food Preparation', 'Food Preparation and Serving Worker', 'Food Preparation Worker', 'Food Science Technician', 'Food Scientists and Technologist', 'Food Servers', 'Food Service Manager', 'Food Tobacco Roasting', 'Foreign Language Teacher', 'Forensic Investigator', 'Forensic Science Technician', 'Forest and Conservation Technician', 'Forest and Conservation Worker', 'Forest Fire Fighter', 'Forest Fire Fighting Supervisor', 'Forest Fire Inspector', 'Forester', 'Forestry Conservation Science Teacher', 'Forging Machine Setter', 'Forming Machine Operator', 'Forming Machine Operator', 'Foundry Mold and Coremaker', 'Fraud Investigator', 'Freight Agent', 'Freight and Material Mover', 'Freight Inspector', 'Funeral Attendant', 'Funeral Director', 'Furnace Operator', 'Furniture Finisher',
+ 'Gaming Cage Worker', 'Gaming Dealer', 'Gaming Manager', 'Gaming Service Worker', 'Gaming Supervisor', 'Gaming Surveillance Officer', 'Garment', 'Gas Appliance Repairer', 'Gas Compressor Operator', 'Gas Distribution Plant Operator', 'Gas Plant Operator', 'Gas Processing Plant Operator', 'Gas Pumping Station Operator', 'Gas Pumping Station Operator', 'Gauger', 'GED Teacher', 'General Farmworker', 'General Manager', 'General Practitioner', 'Geographer', 'Geography Teacher', 'Geological Data Technician', 'Geological Sample Test Technician', 'Geologist', 'Geoscientists', 'Glass Blower', 'Glass Cutting Machine Operator', 'Glazier', 'Gluing Machine Operator', 'Government', 'Government Property Inspector', 'Government Service Executive', 'Graduate Teaching Assistant', 'Graphic Designer', 'Grinder OR Polisher', 'Grinding Machine Operator', 'Grips', 'Grounds Maintenance Worker',
+ 'Hairdresser OR Cosmetologist', 'Hand Trimmer', 'Hand Presser', 'Hand Sewer', 'Hazardous Materials Removal Worker', 'Head Nurse', 'Health Educator', 'Health Practitioner', 'Health Services Manager', 'Health Specialties Teacher', 'Health Technologist', 'Healthcare', 'Healthcare Practitioner', 'Healthcare Support Worker', 'Heat Treating Equipment Operator', 'Heaters', 'Heating and Air Conditioning Mechanic', 'Heating Equipment Operator', 'Heavy Equipment Mechanic', 'Highway Maintenance Worker', 'Highway Patrol Pilot', 'Historian', 'History Teacher', 'Hoist and Winch Operator', 'Home', 'Home Appliance Installer', 'Home Appliance Repairer', 'Home Economics Teacher', 'Home Entertainment Equipment Installer', 'Home Health Aide', 'Homeland Security', 'Horticultural Worker', 'Host and Hostess', 'Hotel Desk Clerk', 'House Cleaner', 'Housekeeper', 'Housekeeping Supervisor', 'HR Manager', 'HR Specialist', 'Human Resource Director', 'Human Resource Manager', 'Human Resources Assistant', 'Human Resources Manager', 'Human Resources Specialist', 'Hunter and Trapper', 'HVAC Mechanic', 'Hydrologist',
+ 'Illustrator', 'Immigration Inspector OR Customs Inspector', 'Industrial Engineer', 'Industrial Engineering Technician', 'Industrial Equipment Maintenance', 'Industrial Machinery Mechanic', 'Industrial Production Manager', 'Industrial Safety Engineer', 'Industrial-Organizational Psychologist', 'Infantry', 'Infantry Officer', 'Information Systems Manager', 'Inspector', 'Installation and Repair Technician', 'Instructional Coordinator', 'Instrument Sales Representative', 'Insulation Installer', 'Insulation Worker', 'Insurance Investigator', 'Insurance Appraiser', 'Insurance Claims Clerk', 'Insurance Policy Processing Clerk', 'Insurance Sales Agent', 'Insurance Underwriter', 'Interaction Designer', 'Interior Designer', 'Internist', 'Interpreter OR Translator', 'Interviewer', 'Irradiated-Fuel Handler',
+ 'Janitor', 'Janitorial Supervisor', 'Jeweler', 'Jewelry Model OR Mold Makers', 'Job Printer', 'Judge',
+ 'Keyboard Instrument Repairer and Tuner', 'Kindergarten Teacher',
+ 'Landscape Architect', 'Landscape Artist', 'Landscaper', 'Landscaping', 'Lathe Operator', 'Laundry OR Dry-Cleaning Worker', 'Law Clerk', 'Law Enforcement Teacher', 'Law Teacher', 'Lawn Service Manager', 'Lawyer', 'Lay-Out Worker', 'Legal Secretary', 'Legal Support Worker', 'Legislator', 'Letterpress Setters Operator', 'Librarian', 'Library Assistant', 'Library Science Teacher', 'Library Technician', 'Library Worker', 'License Clerk', 'Licensed Practical Nurse', 'Licensing Examiner and Inspector', 'Life Science Technician', 'Life Scientists', 'Lifeguard', 'Loading Machine Operator', 'Loan Counselor', 'Loan Interviewer', 'Loan Officer', 'Locker Room Attendant', 'Locksmith', 'Locomotive Engineer', 'Locomotive Firer', 'Lodging Manager', 'Log Grader and Scaler', 'Logging Equipment Operator', 'Logging Supervisor', 'Logging Tractor Operator', 'Logging Worker', 'Logistician',
+ 'Machine Feeder', 'Machine Operator', 'Machine Tool Operator', 'Machinery Maintenance', 'Machinist', 'Maid', 'Mail Clerk', 'Mail Machine Operator', 'Maintenance and Repair Worker', 'Maintenance Equipment Operator', 'Maintenance Supervisor', 'Maintenance Worker', 'Makeup Artists', 'Management Analyst', 'Manager', 'Manager of Air Crew', 'Manager of Food Preparation', 'Manager of Weapons Specialists', 'Manager Tactical Operations', 'Manicurists', 'Manufactured Building Installer', 'Manufacturing Sales Representative', 'Mapping Technician', 'MARCOM Director', 'MARCOM Manager', 'Marine Architect', 'Marine Cargo Inspector', 'Marine Engineer', 'Marine Oiler', 'Market Research Analyst', 'Marketing Manager', 'Marketing VP', 'Marking Clerk', 'Marking Machine Operator', 'Marriage and Family Therapist', 'Massage Therapist', 'Material Movers', 'Material Moving Worker', 'Materials Engineer', 'Materials Inspector', 'Materials Scientist', 'Mathematical Science Teacher', 'Mathematical Scientist', 'Mathematical Technician', 'Mathematician', 'Meat Packer', 'Mechanical Door Repairer', 'Mechanical Drafter', 'Mechanical Engineer', 'Mechanical Engineering Technician', 'Mechanical Equipment Sales Representative', 'Mechanical Inspector', 'Media and Communication Worker', 'Medical Appliance Technician', 'Medical Assistant', 'Medical Equipment Preparer', 'Medical Equipment Repairer', 'Medical Laboratory Technologist', 'Medical Records Technician', 'Medical Sales Representative', 'Medical Scientists', 'Medical Secretary', 'Medical Technician', 'Medical Transcriptionist', 'Mental Health Counselor', 'Merchandise Displayer OR Window Trimmer', 'Metal Fabricator', 'Metal Molding Operator', 'Metal Pourer and Caster', 'Metal Worker', 'Metal-Refining Furnace Operator', 'Meter Mechanic', 'Microbiologist', 'Middle School Teacher', 'Military Officer', 'Milling Machine Operator', 'Millwright', 'Mine Cutting Machine Operator', 'Mining Engineer OR Geological Engineer', 'Mining Machine Operator', 'Mixing and Blending Machine Operator', 'Model Maker', 'Mold Maker', 'Molder', 'Molding and Casting Worker', 'Molding Machine Operator', 'Motion Picture Projectionist', 'Motor Vehicle Inspector', 'Motor Vehicle Operator', 'Motorboat Mechanic', 'Motorboat Operator', 'Motorcycle Mechanic', 'Movers', 'Movie Director oR Theatre Director', 'Multi-Media Artist', 'Multiple Machine Tool Setter', 'Municipal Clerk', 'Municipal Court Clerk', 'Municipal Fire Fighter', 'Municipal Fire Fighting Supervisor', 'Museum Conservator', 'Music Arranger and Orchestrator', 'Music Composer', 'Music Director', 'Musical Instrument Tuner', 'Musician', 'Musician OR Singer',
+ 'Natural Sciences Manager', 'Naval Architects', 'Network Admin OR Computer Systems Administrator', 'Network Systems Analyst', 'New Accounts Clerk', 'Night Security Guard', 'Night Shift', 'Nonfarm Animal Caretaker', 'Nuclear Engineer', 'Nuclear Equipment Operation Technician', 'Nuclear Medicine Technologist', 'Nuclear Monitoring Technician', 'Nuclear Power Reactor Operator', 'Nuclear Technician', 'Numerical Control Machine Tool Operator', 'Numerical Tool Programmer OR Process Control Programmer', 'Nursery Manager', 'Nursery Worker', 'Nursing Aide', 'Nursing Instructor', 'Nutritionist',
+ 'Obstetrician', 'Occupational Health Safety Specialist', 'Occupational Health Safety Technician', 'Occupational Therapist', 'Occupational Therapist Aide', 'Occupational Therapist Assistant', 'Office and Administrative Support Worker', 'Office Clerk', 'Office Machine and Cash Register Servicer', 'Office Machine Operator', 'Offset Lithographic Press Operator', 'Oil and gas Operator', 'Oil Service Unit Operator', 'Online Marketing Analyst', 'Operating Engineer', 'Operations Research Analyst', 'Ophthalmic Laboratory Technician', 'Optical Instrument Assembler', 'Opticians', 'Optometrist', 'Oral Surgeon', 'Order Clerk', 'Order Filler', 'Order Filler OR Stock Clerk', 'Organizational Development Manager', 'Orthodontist', 'Orthotist OR Prosthetist', 'Outdoor Power Equipment Mechanic',
+ 'Packaging Machine Operator', 'Packer and Packager', 'Painter', 'Painter and Illustrator', 'Painting Machine Operator', 'Pantograph Engraver', 'Paper Goods Machine Operator', 'Paperhanger', 'Paralegal', 'Park Naturalist', 'Parking Enforcement Worker', 'Parking Lot Attendant', 'Parts Salesperson', 'Paste-Up Worker', 'Pastry Chef', 'Patrol Officer', 'Patternmaker', 'Paving Equipment Operator', 'Payroll Clerk', 'Pediatricians', 'Percussion Instrument Repairer', 'Personal Care Worker', 'Personal Financial Advisor', 'Personal Home Care Aide', 'Personal Service Worker', 'Personal Trainer', 'Personnel Recruiter', 'Pest Control Worker', 'Pesticide Sprayer', 'Petroleum Engineer', 'Petroleum Pump Operator', 'Petroleum Pump System Operator', 'Petroleum Technician', 'Pewter Caster', 'Pharmaceutical Sales Representative', 'Pharmacist', 'Pharmacy Aide', 'Pharmacy Technician', 'Philosophy and Religion Teacher', 'Photoengraver', 'Photoengraving Machine Operator', 'Photographer', 'Photographic Restorer', 'Photographic Developer', 'Photographic Process Worker', 'Photographic Processing Machine Operator', 'Photographic Reproduction Technician', 'Physical Scientist', 'Physical Therapist', 'Physical Therapist Aide', 'Physical Therapist Assistant', 'Physician', 'Physician Assistant', 'Physicist', 'Physics Teacher', 'Pile-Driver Operator', 'Pipe Fitter', 'Pipefitter', 'Pipelayer', 'Pipelaying Fitter', 'Plant and System Operator', 'Plant Scientist', 'Plasterer OR Stucco Mason', 'Plastic Molding Machine Operator', 'Plate Finisher', 'Platemaker', 'Plating Machine Operator', 'Plating Operator', 'Plating Operator OR Coating Machine Operator', 'Plumber', 'Plumber OR Pipefitter OR Steamfitter', 'Podiatrist', 'Poet OR Lyricist', 'Police and Sheriffs Patrol Officer', 'Police Detective', 'Police Identification OR Records Officer', 'Political Science Teacher', 'Political Scientist', 'Portable Power Tool Repairer', 'Postal Clerk', 'Postal Service Clerk', 'Postal Service Mail Carrier', 'Postal Service Mail Sorter', 'Postmasters', 'Postsecondary Education Administrators', 'Postsecondary Teacher', 'Potter', 'Poultry Cutter', 'Power Distributors OR Dispatcher', 'Power Generating Plant Operator', 'Power Plant Operator', 'PR Manager', 'Precious Stone Worker', 'Precision Aircraft Systems Assemblers', 'Precision Devices Inspector', 'Precision Dyer', 'Precision Etcher and Engraver', 'Precision Instrument Repairer', 'Precision Lens Grinders and Polisher', 'Precision Mold and Pattern Caster', 'Precision Pattern and Die Caster', 'Precision Printing Worker', 'Prepress Technician', 'Preschool Education Administrators', 'Preschool Teacher', 'Press Machine Setter, Operator', 'Pressing Machine Operator', 'Pressure Vessel Inspector', 'Printing Machine Operator', 'Printing Press Machine Operator', 'Private Detective and Investigator', 'Private Household Cook', 'Private Sector Executive', 'Probation Officers and Correctional Treatment Specialist', 'Procurement Clerk', 'Producer', 'Producers and Director', 'Product Management Leader', 'Product Promoter', 'Product Safety Engineer', 'Product Specialist', 'Production Control Manager', 'Production Helper', 'Production Inspector', 'Production Laborer', 'Production Manager', 'Production Planner', 'Production Planning', 'Production Worker', 'Professional Photographer', 'Professor', 'Program Director', 'Project Manager', 'Proofreaders and Copy Marker', 'Prosthodontist', 'Protective Service Worker', 'Protective Service Worker', 'Psychiatric Aide', 'Psychiatric Technician', 'Psychiatrist', 'Psychologist', 'Psychology Teacher', 'Public Health Social Worker', 'Public Relations Manager', 'Public Relations Specialist', 'Public Transportation Inspector', 'Pump Operators', 'Punching Machine Setters', 'Purchasing Agent', 'Purchasing Manager',
+ 'Radar Technician', 'Radiation Therapist', 'Radio and Television Announcer', 'Radio Mechanic', 'Radio Operator', 'Radiologic Technician', 'Radiologic Technologist', 'Radiologic Technologist and Technician', 'Rail Car Repairer', 'Rail Transportation Worker', 'Rail Yard Engineer', 'Railroad Conductors', 'Railroad Inspector', 'Railroad Switch Operator', 'Railroad Yard Worker', 'Range Manager', 'Real Estate Appraiser', 'Real Estate Association Manager', 'Real Estate Broker', 'Real Estate Sales Agent', 'Receptionist and Information Clerk', 'Record Clerk', 'Recordkeeping Clerk', 'Recreation and Fitness Studies Teacher', 'Recreation Worker', 'Recreational Therapist', 'Recreational Vehicle Service Technician', 'Recruiter', 'Recyclable Material Collector', 'Refinery Operator', 'Refractory Materials Repairer', 'Refrigeration Mechanic', 'Registered Nurse', 'Rehabilitation Counselor', 'Religious Worker', 'Rental Clerk', 'Reporters OR Correspondent', 'Reservation Agent OR Transportation Ticket Agent', 'Residential Advisor', 'Respiratory Therapist', 'Respiratory Therapy Technician', 'Restaurant Cook', 'Retail Sales person', 'Retail Salesperson', 'Rigger', 'RN', 'Rock Splitter', 'Rolling Machine Setter', 'Roof Bolters Mining', 'Roofer', 'Rotary Drill Operator', 'Rough Carpenter', 'Roustabouts',
+ 'Safety Engineer', 'Sailor', 'Sales and Related Workers', 'Sales Engineer', 'Sales Manager', 'Sales Person', 'Sales Representative', 'Sawing Machine Operator', 'Sawing Machine Setter', 'Sawing Machine Tool Setter', 'Scanner Operator', 'School Bus Driver', 'School Social Worker', 'Scientific Photographer', 'Screen Printing Machine Operator', 'Sculptor', 'Secondary School Teacher', 'Secretary', 'Securities Sales Agent', 'Security Guard', 'Security Systems Installer OR Fire Alarm Systems Installer', 'Segmental Paver', 'Self-Enrichment Education Teacher', 'Semiconductor Processor', 'Separating Machine Operators', 'Septic Tank Servicer', 'Service Station Attendant', 'Set and Exhibit Designer', 'Set Designer', 'Sewing Machine Operator', 'Shampooer', 'Shear Machine Set-Up Operator', 'Sheet Metal Worker', 'Sheriff', 'Ship Captain', 'Ship Carpenter and Joiner', 'Ship Engineer', 'Ship Mates', 'Ship Pilot', 'Shipping and Receiving Clerk', 'Shoe and Leather Repairer', 'Shoe Machine Operators', 'Short Order Cook', 'Shuttle Car Operator', 'Signal Repairer OR Track Switch Repairer', 'Silversmith', 'Singer', 'Sketch Artist', 'Skin Care Specialist', 'Slot Key Person', 'Social and Human Service Assistant', 'Social Media Marketing Manager', 'Social Science Research Assistant', 'Social Sciences Teacher', 'Social Scientists', 'Social Service Specialists', 'Social Work Teacher', 'Social Worker', 'Sociologist', 'Sociology Teacher', 'Software Engineer', 'Soil Conservationist', 'Soil Scientist', 'Soil Scientist OR Plant Scientist', 'Solderer', 'Soldering Machine Setter', 'Sound Engineering Technician', 'Space Sciences Teacher', 'Special Education Teacher', 'Special Force', 'Special Forces Officer', 'Speech-Language Pathologist', 'Sports Book Writer', 'Spotters', 'Spraying Machine Operator', 'Staff Psychologist', 'State', 'Statement Clerk', 'Stationary Engineer', 'Stationary Engineer OR Boiler Operator', 'Statistical Assistant', 'Statistician', 'Steel Worker', 'Stevedore', 'Stock Broker', 'Stock Clerk', 'Stone Cutter', 'Stone Sawyer', 'Stonemason', 'Stonemason', 'Storage Manager OR Distribution Manager', 'Streetcar Operator', 'Stringed Instrument Repairer and Tuner', 'Structural Iron and Steel Worker', 'Structural Metal Fabricator', 'Substance Abuse Counselor', 'Substance Abuse Social Worker', 'Substation Maintenance', 'Supervisor Correctional Officer', 'Supervisor Fire Fighting Worker', 'Supervisor of Customer Service', 'Supervisor of Police', 'Surgeon', 'Surgical Technologist', 'Survey Researcher', 'Surveying and Mapping Technician', 'Surveying Technician', 'Surveyor', 'Sys Admin', 'System Administrator',
+ 'Tailor', 'Talent Acquisition Manager', 'Talent Director', 'Tank Car', 'Taper', 'Tax Examiner', 'Tax Preparer', 'Taxi Drivers and Chauffeur', 'Teacher', 'Teacher Assistant', 'Team Assembler', 'Technical Director', 'Technical Program Manager', 'Technical Specialist', 'Technical Writer', 'Telecommunications Equipment Installer', 'Telecommunications Facility Examiner', 'Telecommunications Line Installer', 'Telemarketer', 'Telephone Operator', 'Telephone Station Installer and Repairer', 'Teller', 'Terrazzo Workes and Finisher', 'Textile Cutting Machine Operator', 'Textile Dyeing Machine Operator', 'Textile Knitting Machine Operator', 'Textile Machine Operator', 'Textile Worker', 'Therapist', 'Ticket Agent', 'Tile Setter OR Marble Setter', 'Timing Device Assemblers', 'Tire Builder', 'Tire Changer', 'Title Abstractor', 'Title Examiner', 'Title Searcher', 'Tool and Die Maker', 'Tool Set-Up Operator', 'Tool Sharpener', 'Tour Guide', 'Tractor Operator', 'Tractor-Trailer Truck Driver', 'Traffic Technician', 'Train Crew', 'Trainer', 'Training Manager OR Development Manager', 'Transformer Repairer', 'Transit Police OR Railroad Police', 'Transportation and Material-Moving', 'Transportation Attendant', 'Transportation Equipment Maintenance', 'Transportation Equipment Painters', 'Transportation Inspector', 'Transportation Manager', 'Transportation Worker', 'Travel Agent', 'Travel Clerk', 'Travel Guide', 'Tree Trimmer', 'Truck Driver', 'TSA', 'Typesetter', 'Typesetting Machine Operator',
+ 'Umpire and Referee', 'Underground Mining', 'University', 'Upholsterer', 'Urban Planner', 'User Experience Manager', 'User Experience Researcher', 'Usher', 'Utility Meter Reader',
+ 'Valve Repairer OR Regulator Repairer', 'Vending Machine Servicer', 'Veterinarian', 'Veterinary Assistant OR Laboratory Animal Caretaker', 'Veterinary Technician', 'Vice President Of Human Resources', 'Vice President Of Marketing', 'Video Editor', 'Visual Designer', 'Vocational Education Teacher',
+ 'Waiter', 'Waitress', 'Warehouse', 'Washing Equipment Operator', 'Waste Treatment Plant Operator', 'Watch Repairer', 'Weapons Specialists', 'Web Developer', 'Webmaster', 'Welder', 'Welder', 'Welder and Cutter', 'Welder-Fitter', 'Welding Machine Tender', 'Welding Machine Operator', 'Welding Machine Setter', 'Welfare Eligibility Clerk', 'Well and Core Drill Operator', 'Wellhead Pumper', 'Wholesale Buyer', 'Wind Instrument Repairer', 'Woodworker', 'Woodworking Machine Operator', 'Woodworking Machine Setter', 'Word Processors and Typist', 'Writer OR Author',
+ 'Zoologists OR Wildlife Biologist',
);
protected static $companySuffix = array('Inc', 'and Sons', 'LLC', 'Group', 'PLC', 'Ltd');
+ /**
+ * @link https://www.irs.gov/businesses/small-businesses-self-employed/how-eins-are-assigned-and-valid-ein-prefixes
+ */
+ protected static $einPrefixes = array(
+ 01, 02, 03, 04, 05, 06, 10, 11, 12, 13, 14, 15, 16, 20, 21, 22, 23, 24, 25, 26, 27, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
+ 66, 67, 68, 71, 72, 73, 74, 75, 76, 77, 80, 81, 82, 83, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 98, 99
+ );
+
/**
* @example 'Robust full-range hub'
*/
@@ -46,7 +84,7 @@ class Company extends \Faker\Provider\Company
$result[] = static::randomElement($word);
}
- return join($result, ' ');
+ return join(' ', $result);
}
/**
@@ -59,6 +97,20 @@ class Company extends \Faker\Provider\Company
$result[] = static::randomElement($word);
}
- return join($result, ' ');
+ return join(' ', $result);
+ }
+
+ /**
+ * Employer Identification Number (EIN)
+ *
+ * @link https://en.wikipedia.org/wiki/Employer_Identification_Number
+ * @example '12-3456789'
+ */
+ public static function ein()
+ {
+ $prefix = static::randomElement(static::$einPrefixes);
+ $suffix = static::numberBetween(0, 9999999);
+
+ return sprintf("%02d-%07d", $prefix, $suffix);
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Payment.php
new file mode 100644
index 00000000..a9248ad8
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_US/Payment.php
@@ -0,0 +1,37 @@
+generator->parse($format));
+ }
+
+ /**
+ * NPA-format area code
+ *
+ * @see https://en.wikipedia.org/wiki/North_American_Numbering_Plan#Numbering_system
+ *
+ * @return string
+ */
+ public static function areaCode()
+ {
+ $digits[] = self::numberBetween(2, 9);
+ $digits[] = self::randomDigit();
+ $digits[] = self::randomDigitNot($digits[1]);
+
+ return join('', $digits);
+ }
+
+ /**
+ * NXX-format central office exchange code
+ *
+ * @see https://en.wikipedia.org/wiki/North_American_Numbering_Plan#Numbering_system
+ *
+ * @return string
+ */
+ public static function exchangeCode()
+ {
+ $digits[] = self::numberBetween(2, 9);
+ $digits[] = self::randomDigit();
+
+ if ($digits[1] === 1) {
+ $digits[] = self::randomDigitNot(1);
+ } else {
+ $digits[] = self::randomDigit();
+ }
+
+ return join('', $digits);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php
index aa73b98e..783bff43 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Address.php
@@ -2,47 +2,20 @@
namespace Faker\Provider\en_ZA;
-class Address extends \Faker\Provider\Address
+class Address extends \Faker\Provider\en_US\Address
{
protected static $cityPrefix = array('North', 'East', 'West', 'South', 'New', 'Lake', 'Port');
protected static $citySuffix = array('fontein','town', 'ton', 'land', 'ville', 'berg', 'burgh', 'borough', 'bury', 'view', 'port', 'mouth', 'stad', 'furt', 'chester', 'mouth', 'fort', 'haven', 'side', 'shire');
protected static $buildingNumber = array('#####', '####', '###');
protected static $streetSuffix = array(
- 'Alley', 'Avenue', 'Branch', 'Bridge', 'Brook', 'Brooks', 'Burg', 'Burgs', 'Bypass', 'Camp', 'Canyon', 'Cape', 'Causeway', 'Center', 'Centers', 'Circle', 'Circles', 'Cliff', 'Cliffs', 'Club', 'Common', 'Corner', 'Corners', 'Course', 'Court', 'Courts', 'Cove', 'Coves', 'Creek', 'Crescent', 'Crest', 'Crossing', 'Crossroad', 'Curve', 'Dale', 'Dam', 'Divide', 'Drive', 'Drive', 'Drives', 'Estate', 'Estates', 'Expressway', 'Extension', 'Extensions', 'Fall', 'Falls', 'Ferry', 'Field', 'Fields', 'Flat', 'Flats', 'Ford', 'Fords', 'Forest', 'Forge', 'Forges', 'Fork', 'Forks', 'Fort', 'Freeway', 'Garden', 'Gardens', 'Gateway', 'Glen', 'Glens', 'Green', 'Greens', 'Grove', 'Groves', 'Harbor', 'Harbors', 'Haven', 'Heights', 'Highway', 'Hill', 'Hills', 'Hollow', 'Inlet', 'Inlet', 'Island', 'Island', 'Islands', 'Islands', 'Isle', 'Isle', 'Junction', 'Junctions', 'Key', 'Keys', 'Knoll', 'Knolls', 'Lake', 'Lakes', 'Land', 'Landing', 'Lane', 'Light', 'Lights', 'Loaf', 'Lock', 'Locks', 'Locks', 'Lodge', 'Lodge', 'Loop', 'Mall', 'Manor', 'Manors', 'Meadow', 'Meadows', 'Mews', 'Mill', 'Mills', 'Mission', 'Mission', 'Motorway', 'Mount', 'Mountain', 'Mountain', 'Mountains', 'Mountains', 'Neck', 'Orchard', 'Oval', 'Overpass', 'Park', 'Parks', 'Parkway', 'Parkways', 'Pass', 'Passage', 'Path', 'Pike', 'Pine', 'Pines', 'Place', 'Plain', 'Plains', 'Plains', 'Plaza', 'Plaza', 'Point', 'Points', 'Port', 'Port', 'Ports', 'Ports', 'Prairie', 'Prairie', 'Radial', 'Ramp', 'Ranch', 'Rapid', 'Rapids', 'Rest', 'Ridge', 'Ridges', 'River', 'Road', 'Road', 'Roads', 'Roads', 'Route', 'Row', 'Rue', 'Run', 'Shoal', 'Shoals', 'Shore', 'Shores', 'Skyway', 'Spring', 'Springs', 'Springs', 'Spur', 'Spurs', 'Square', 'Square', 'Squares', 'Squares', 'Station', 'Station', 'Stravenue', 'Stravenue', 'Stream', 'Stream', 'Street', 'Street', 'Streets', 'Summit', 'Summit', 'Terrace', 'Throughway', 'Trace', 'Track', 'Trafficway', 'Trail', 'Trail', 'Tunnel', 'Tunnel', 'Turnpike', 'Turnpike', 'Underpass', 'Union', 'Unions', 'Valley', 'Valleys', 'Via', 'Viaduct', 'View', 'Views', 'Village', 'Village', 'Villages', 'Ville', 'Vista', 'Vista', 'Walk', 'Walks', 'Wall', 'Way', 'Ways', 'Well', 'Wells'
+ 'Alley', 'Avenue', 'Branch', 'Bridge', 'Brook', 'Brooks', 'Burg', 'Burgs', 'Bypass', 'Camp', 'Canyon', 'Cape', 'Causeway', 'Center', 'Centers', 'Circle', 'Circles', 'Cliff', 'Cliffs', 'Club', 'Common', 'Corner', 'Corners', 'Course', 'Court', 'Courts', 'Cove', 'Coves', 'Creek', 'Crescent', 'Crest', 'Crossing', 'Crossroad', 'Curve', 'Dale', 'Dam', 'Divide', 'Drive', 'Drive', 'Drives', 'Estate', 'Estates', 'Expressway', 'Extension', 'Extensions', 'Fall', 'Falls', 'Ferry', 'Field', 'Fields', 'Flat', 'Flats', 'Ford', 'Fords', 'Forest', 'Forge', 'Forges', 'Fork', 'Forks', 'Fort', 'Freeway', 'Garden', 'Gardens', 'Gateway', 'Glen', 'Glens', 'Green', 'Greens', 'Grove', 'Groves', 'Harbor', 'Harbors', 'Haven', 'Heights', 'Highway', 'Hill', 'Hills', 'Hollow', 'Inlet', 'Inlet', 'Island', 'Island', 'Islands', 'Islands', 'Isle', 'Isle', 'Junction', 'Junctions', 'Key', 'Keys', 'Knoll', 'Knolls', 'Lake', 'Lakes', 'Land', 'Landing', 'Lane', 'Light', 'Lights', 'Loaf', 'Lock', 'Locks', 'Locks', 'Lodge', 'Lodge', 'Loop', 'Mall', 'Manor', 'Manors', 'Meadow', 'Meadows', 'Mews', 'Mill', 'Mills', 'Mission', 'Mission', 'Motorway', 'Mount', 'Mountain', 'Mountain', 'Mountains', 'Mountains', 'Neck', 'Orchard', 'Oval', 'Overpass', 'Park', 'Parks', 'Parkway', 'Parkways', 'Pass', 'Passage', 'Path', 'Pike', 'Pine', 'Pines', 'Place', 'Plain', 'Plains', 'Plains', 'Plaza', 'Plaza', 'Point', 'Points', 'Port', 'Port', 'Ports', 'Ports', 'Prairie', 'Prairie', 'Radial', 'Ramp', 'Ranch', 'Rapid', 'Rapids', 'Rest', 'Ridge', 'Ridges', 'River', 'Road', 'Road', 'Roads', 'Roads', 'Route', 'Row', 'Rue', 'Run', 'Shoal', 'Shoals', 'Shore', 'Shores', 'Skyway', 'Spring', 'Springs', 'Springs', 'Spur', 'Spurs', 'Square', 'Square', 'Squares', 'Squares', 'Station', 'Station', 'Stravenue', 'Stravenue', 'Stream', 'Stream', 'Street', 'Street', 'Streets', 'Summit', 'Summit', 'Terrace', 'Throughway', 'Trace', 'Track', 'Trafficway', 'Trail', 'Trail', 'Tunnel', 'Tunnel', 'Turnpike', 'Turnpike', 'Underpass', 'Union', 'Unions', 'Valley', 'Valleys', 'Via', 'Viaduct', 'View', 'Views', 'Village', 'Village', 'Villages', 'Ville', 'Vista', 'Vista', 'Walk', 'Walks', 'Wall', 'Way', 'Ways', 'Well', 'Wells',
);
protected static $postcode = array('####');
protected static $province = array(
- 'Eastern Cape', 'Free State', 'Gauteng', 'KwaZulu-Natal', 'Limpopo', 'Mpumalanga', 'North-West', 'Northern Cape', 'Western Cape'
+ 'Eastern Cape', 'Free State', 'Gauteng', 'KwaZulu-Natal', 'Limpopo', 'Mpumalanga', 'North-West', 'Northern Cape', 'Western Cape',
);
protected static $provinceAbbr = array(
- 'EC', 'FS', 'GP', 'KZN', 'LP', 'MP', 'NW', 'NC', 'WC'
- );
- protected static $country = array(
- 'Afghanistan', 'Albania', 'Algeria', 'American Samoa', 'Andorra', 'Angola', 'Anguilla', 'Antarctica (the territory South of 60 deg S)', 'Antigua and Barbuda', 'Argentina', 'Armenia', 'Aruba', 'Australia', 'Austria', 'Azerbaijan',
- 'Bahamas', 'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', 'Bermuda', 'Bhutan', 'Bolivia', 'Bosnia and Herzegovina', 'Botswana', 'Bouvet Island (Bouvetoya)', 'Brazil', 'British Indian Ocean Territory (Chagos Archipelago)', 'British Virgin Islands', 'Brunei Darussalam', 'Bulgaria', 'Burkina Faso', 'Burundi',
- 'Cambodia', 'Cameroon', 'Canada', 'Cape Verde', 'Cayman Islands', 'Central African Republic', 'Chad', 'Chile', 'China', 'Christmas Island', 'Cocos (Keeling) Islands', 'Colombia', 'Comoros', 'Congo', 'Cook Islands', 'Costa Rica', 'Cote d\'Ivoire', 'Croatia', 'Cuba', 'Cyprus', 'Czech Republic',
- 'Denmark', 'Djibouti', 'Dominica', 'Dominican Republic',
- 'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia',
- 'Faroe Islands', 'Falkland Islands (Malvinas)', 'Fiji', 'Finland', 'France', 'French Guiana', 'French Polynesia', 'French Southern Territories',
- 'Gabon', 'Gambia', 'Georgia', 'Germany', 'Ghana', 'Gibraltar', 'Greece', 'Greenland', 'Grenada', 'Guadeloupe', 'Guam', 'Guatemala', 'Guernsey', 'Guinea', 'Guinea-Bissau', 'Guyana',
- 'Haiti', 'Heard Island and McDonald Islands', 'Holy See (Vatican City State)', 'Honduras', 'Hong Kong', 'Hungary',
- 'Iceland', 'India', 'Indonesia', 'Iran', 'Iraq', 'Ireland', 'Isle of Man', 'Israel', 'Italy',
- 'Jamaica', 'Japan', 'Jersey', 'Jordan',
- 'Kazakhstan', 'Kenya', 'Kiribati', 'Korea', 'Korea', 'Kuwait', 'Kyrgyz Republic',
- 'Lao People\'s Democratic Republic', 'Latvia', 'Lebanon', 'Lesotho', 'Liberia', 'Libyan Arab Jamahiriya', 'Liechtenstein', 'Lithuania', 'Luxembourg',
- 'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar',
- 'Namibia', 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Mariana Islands', 'Norway',
- 'Oman',
- 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico',
- 'Qatar',
- 'Reunion', 'Romania', 'Russian Federation', 'Rwanda',
- 'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia (Slovak Republic)', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Georgia and the South Sandwich Islands', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Sweden', 'Switzerland', 'Syrian Arab Republic',
- 'Taiwan', 'Tajikistan', 'Tanzania', 'Thailand', 'Timor-Leste', 'Togo', 'Tokelau', 'Tonga', 'Trinidad and Tobago', 'Tunisia', 'Turkey', 'Turkmenistan', 'Turks and Caicos Islands', 'Tuvalu',
- 'Uganda', 'Ukraine', 'United Arab Emirates', 'United Kingdom', 'United States of America', 'United States Minor Outlying Islands', 'United States Virgin Islands', 'Uruguay', 'Uzbekistan',
- 'Vanuatu', 'Venezuela', 'Vietnam',
- 'Wallis and Futuna', 'Western Sahara',
- 'Yemen',
- 'Zambia', 'Zimbabwe'
+ 'EC', 'FS', 'GP', 'KZN', 'LP', 'MP', 'NW', 'NC', 'WC',
);
protected static $cityFormats = array(
'{{cityPrefix}} {{firstName}}{{citySuffix}}',
@@ -52,7 +25,7 @@ class Address extends \Faker\Provider\Address
);
protected static $streetNameFormats = array(
'{{firstName}} {{streetSuffix}}',
- '{{lastName}} {{streetSuffix}}'
+ '{{lastName}} {{streetSuffix}}',
);
protected static $streetAddressFormats = array(
'{{buildingNumber}} {{streetName}}',
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Company.php
new file mode 100644
index 00000000..ddb987aa
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Company.php
@@ -0,0 +1,29 @@
+format('Y'),
+ static::randomNumber(6, true),
+ static::randomElement(static::$legalEntities)
+ );
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php
index 83f2a4eb..0c5c5f40 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Internet.php
@@ -5,5 +5,14 @@ namespace Faker\Provider\en_ZA;
class Internet extends \Faker\Provider\Internet
{
protected static $freeEmailDomain = array('gmail.com', 'yahoo.com', 'hotmail.com', 'webmail.co.za', 'vodamail.co.za');
- protected static $tld = array('co.za', 'co.za', 'co.za', 'co.za', 'com', 'com', 'net');
+
+ /**
+ * @see https://en.wikipedia.org/wiki/.za
+ */
+ protected static $tld = array(
+ 'co.za', 'co.za', 'co.za', 'co.za', 'com', 'com', 'net', 'gov.za', 'ac.za', 'edu.za', 'law.za', 'mil.za',
+ 'net.za', 'nom.za', 'org.za', 'school.za', 'ecape.school.za', 'fs.school.za', 'gp.school.za', 'kzn.school.za',
+ 'mpm.za', 'ncape.school.za', 'lp.school.za', 'nw.school.za', 'wcape.school.za', 'web.za', 'agric.za', 'nis.za',
+ 'grondar.za',
+ );
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php
index 1750b3b0..d44d4731 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/Person.php
@@ -2,6 +2,8 @@
namespace Faker\Provider\en_ZA;
+use Faker\Calculator\Luhn;
+
class Person extends \Faker\Provider\Person
{
protected static $maleNameFormats = array(
@@ -15,10 +17,10 @@ class Person extends \Faker\Provider\Person
'{{firstNameFemale}} {{lastName}}',
'{{firstNameFemale}} {{lastName}}',
'{{firstNameFemale}} {{lastName}}',
- '{{titleFemale}} {{$firstNameFemale}} {{lastName}}',
+ '{{titleFemale}} {{firstNameFemale}} {{lastName}}',
);
- protected static $firstNameMale =array(
+ protected static $firstNameMale = array(
'Abraham', 'Adriaan', 'Adrian', 'Ahmed', 'Alan', 'Albert', 'Alex', 'Alexander', 'Alfred', 'Allan', 'Andile', 'Andre', 'Andrew',
'André', 'Anthony', 'Anton', 'Arnold', 'Arthur', 'Ayanda', 'Barry', 'Ben', 'Benjamin', 'Bernard', 'Bongani', 'Bradley',
'Brandon', 'Brent', 'Brett', 'Brian', 'Bruce', 'Bryan', 'Carel', 'Carl', 'Charl', 'Charles', 'Chris', 'Christiaan',
@@ -121,6 +123,56 @@ class Person extends \Faker\Provider\Person
'Mulder', 'Enslin', 'Truter', 'Khuzwayo', 'Makhanya', 'Harmse', 'Loubser', 'Kleynhans', 'Paul', 'Nieuwoudt', 'Horn',
'Vosloo', 'Wentzel', 'Munyai', 'Kelly', 'Walters', 'Nzimande', 'Hoosen', 'Mkhabela', 'Madlala', 'Saunders', 'Palmer',
'Hughes', 'Hanekom', 'Ally', 'Schmidt', 'Butler', 'Mtsweni', 'Maphumulo', 'Manamela', 'Hoffman', 'Wolmarans', 'Duma',
- 'Pule', 'Hlophe', 'Miya', 'Moagi'
+ 'Pule', 'Hlophe', 'Miya', 'Moagi',
);
+
+ protected static $titleMale = array('Mr.', 'Dr.', 'Prof.', 'Rev.', 'Hon.');
+
+ protected static $titleFemale = array('Mrs.', 'Ms.', 'Miss', 'Dr.', 'Prof.', 'Rev.', 'Hon.');
+
+ protected static $licenceCodes = array('A', 'A1', 'B', 'C', 'C1', 'C2', 'EB', 'EC', 'EC1', 'I', 'L', 'L1');
+
+ /**
+ * @link https://en.wikipedia.org/wiki/National_identification_number#South_Africa
+ *
+ * @param \DateTime $birthdate
+ * @param bool $citizen
+ * @param string $gender
+ *
+ * @return string
+ */
+ public function idNumber(\DateTime $birthdate = null, $citizen = true, $gender = null)
+ {
+ if (!$birthdate) {
+ $birthdate = $this->generator->dateTimeThisCentury();
+ }
+ $birthDateString = $birthdate->format('ymd');
+ switch (strtolower($gender)) {
+ case static::GENDER_FEMALE:
+ $genderDigit = self::numberBetween(0, 4);
+ break;
+ case static::GENDER_MALE:
+ $genderDigit = self::numberBetween(5, 9);
+ break;
+ default:
+ $genderDigit = self::numberBetween(0, 9);
+ }
+ $sequenceDigits = str_pad(self::randomNumber(3), 3, 0, STR_PAD_BOTH);
+ $citizenDigit = ($citizen === true) ? '0' : '1';
+ $raceDigit = self::numberBetween(8, 9);
+
+ $partialIdNumber = $birthDateString . $genderDigit . $sequenceDigits . $citizenDigit . $raceDigit;
+
+ return $partialIdNumber . Luhn::computeCheckDigit($partialIdNumber);
+ }
+
+ /**
+ * @see https://en.wikipedia.org/wiki/Driving_licence_in_South_Africa
+ *
+ * @return string
+ */
+ public function licenceCode()
+ {
+ return static::randomElement(static::$licenceCodes);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php
index 9de202d2..02a364d1 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/en_ZA/PhoneNumber.php
@@ -5,13 +5,96 @@ namespace Faker\Provider\en_ZA;
class PhoneNumber extends \Faker\Provider\PhoneNumber
{
protected static $formats = array(
- '+27(##)##########',
- '+(#)##########',
- '08#########',
- '07########',
- '0##-###-####',
- '(0##)###-####',
- '0-800-###-####',
- '### ####'
+ '+27({{areaCode}})#######',
+ '+27{{areaCode}}#######',
+ '0{{areaCode}}#######',
+ '0{{areaCode}} ### ####',
+ '0{{areaCode}}-###-####',
);
+
+ protected static $cellphoneFormats = array(
+ '+27{{cellphoneCode}}#######',
+ '0{{cellphoneCode}}#######',
+ '0{{cellphoneCode}} ### ####',
+ '0{{cellphoneCode}}-###-####',
+ );
+
+ protected static $specialFormats = array(
+ '{{specialCode}}#######',
+ '{{specialCode}} ### ####',
+ '{{specialCode}}-###-####',
+ '({{specialCode}})###-####',
+ );
+
+ protected static $tollFreeAreaCodes = array(
+ '0800', '0860', '0861', '0862',
+ );
+
+ /**
+ * @see https://en.wikipedia.org/wiki/Telephone_numbers_in_South_Africa
+ */
+ public static function areaCode()
+ {
+ $digits[] = self::numberBetween(1, 5);
+ switch ($digits[0]) {
+ case 1:
+ $digits[] = self::numberBetween(1, 8);
+ break;
+ case 2:
+ $number = self::numberBetween(1, 8);
+ $digits[] = in_array($number, array(5, 6)) ? $number + 2 : $number;
+ break;
+ case 3:
+ $number = self::numberBetween(1, 8);
+ $digits[] = in_array($number, array(7, 8)) ? $number - 2 : $number;
+ break;
+ case 4:
+ $digits[] = self::numberBetween(1, 9);
+ break;
+ case 5:
+ $number = self::numberBetween(1, 8);
+ $digits[] = in_array($number, array(2, 5)) ? $number + 2 : $number;
+ break;
+ }
+
+ return implode('', $digits);
+ }
+
+ public static function cellphoneCode()
+ {
+ $digits[] = self::numberBetween(6, 8);
+ switch ($digits[0]) {
+ case 6:
+ $digits[] = self::numberBetween(0, 2);
+ break;
+ case 7:
+ $number = self::numberBetween(1, 9);
+ $digits[] = in_array($number, array(5, 7)) ? $number + 1 : $number;
+ break;
+ case 8:
+ $digits[] = self::numberBetween(1, 9);
+ break;
+ }
+
+ return implode('', $digits);
+ }
+
+ public static function specialCode()
+ {
+ return static::randomElement(static::$tollFreeAreaCodes);
+ }
+
+ public function mobileNumber()
+ {
+ $format = static::randomElement(static::$cellphoneFormats);
+
+ return self::numerify($this->generator->parse($format));
+ }
+
+ public function tollFreeNumber()
+ {
+ $format = static::randomElement(static::$specialFormats);
+
+ return self::numerify($this->generator->parse($format));
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Address.php
index 7510a268..70f503f0 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Address.php
@@ -2,14 +2,12 @@
namespace Faker\Provider\es_AR;
-class Address extends \Faker\Provider\Address
+class Address extends \Faker\Provider\es_ES\Address
{
protected static $cityPrefix = array('San', 'Puerto', 'Villa', 'Gral.', 'Don');
protected static $citySuffix = array('del Mar', 'del Norte', 'del Este', 'del Sur', 'del Oeste', 'del Mirador');
protected static $buildingNumber = array('#####', '####', '###', '##', '#');
- protected static $streetSuffix = array(
- ''
- );
+ protected static $streetSuffix = array('');
protected static $postcode = array('####', '#####');
protected static $state = array(
'Buenos Aires', 'Catamarca', 'Chaco', 'Chubut', 'Córdoba', 'Corrientes', 'Entre Ríos', 'Formosa', 'Jujuy', 'La Pampa', 'La Rioja', 'Mendoza', 'Misiones', 'Neuquén', 'Río Negro', 'Salta', 'San Juan', 'San Luis', 'Santa Cruz', 'Santa Fe', 'Santiago del Estero', 'Tierra del Fuego, Antártida e Islas del Atlántico Sur', 'Tucumán'
@@ -17,31 +15,6 @@ class Address extends \Faker\Provider\Address
protected static $stateAbbr = array(
'AR-B', 'AR-K', 'AR-H', 'AR-U', 'AR-X', 'AR-W', 'AR-E', 'AR-P', 'AR-Y', 'AR-L', 'AR-F', 'AR-M', 'AR-N', 'AR-Q', 'AR-R', 'AR-A', 'AR-J', 'AR-D', 'AR-Z', 'AR-S', 'AR-G', 'AR-V', 'AR-T'
);
- protected static $country = array(
- 'Afganistán', 'Albania', 'Alemania', 'Andorra', 'Angola', 'Antigua y Barbuda', 'Arabia Saudí', 'Argelia', 'Argentina', 'Armenia', 'Australia', 'Austria', 'Azerbaiyán',
- 'Bahamas', 'Bangladés', 'Barbados', 'Baréin', 'Belice', 'Benín', 'Bielorrusia', 'Birmania', 'Bolivia', 'Bosnia-Herzegovina', 'Botsuana', 'Brasil', 'Brunéi Darusalam', 'Bulgaria', 'Burkina Faso', 'Burundi', 'Bután', 'Bélgica',
- 'Cabo Verde', 'Camboya', 'Camerún', 'Canadá', 'Catar', 'Chad', 'Chile', 'China', 'Chipre', 'Ciudad del Vaticano', 'Colombia', 'Comoras', 'Congo', 'Corea del Norte', 'Corea del Sur', 'Costa Rica', 'Costa de Marfil', 'Croacia', 'Cuba',
- 'Dinamarca', 'Dominica',
- 'Ecuador', 'Egipto', 'El Salvador', 'Emiratos Árabes Unidos', 'Eritrea', 'Eslovaquia', 'Eslovenia', 'España', 'Estados Unidos de América', 'Estonia', 'Etiopía',
- 'Filipinas', 'Finlandia', 'Fiyi', 'Francia',
- 'Gabón', 'Gambia', 'Georgia', 'Ghana', 'Granada', 'Grecia', 'Guatemala', 'Guinea', 'Guinea Ecuatorial', 'Guinea-Bisáu', 'Guyana',
- 'Haití', 'Honduras', 'Hungría',
- 'India', 'Indonesia', 'Irak', 'Irlanda', 'Irán', 'Islandia', 'Islas Marshall', 'Islas Salomón', 'Israel', 'Italia',
- 'Jamaica', 'Japón', 'Jordania',
- 'Kazajistán', 'Kenia', 'Kirguistán', 'Kiribati', 'Kuwait',
- 'Laos', 'Lesoto', 'Letonia', 'Liberia', 'Libia', 'Liechtenstein', 'Lituania', 'Luxemburgo', 'Líbano',
- 'Macedonia', 'Madagascar', 'Malasia', 'Malaui', 'Maldivas', 'Mali', 'Malta', 'Marruecos', 'Mauricio', 'Mauritania', 'Micronesia', 'Moldavia', 'Mongolia', 'Montenegro', 'Mozambique', 'México', 'Mónaco',
- 'Namibia', 'Nauru', 'Nepal', 'Nicaragua', 'Nigeria', 'Noruega', 'Nueva Zelanda', 'Níger',
- 'Omán',
- 'Pakistán', 'Palaos', 'Panamá', 'Papúa Nueva Guinea', 'Paraguay', 'Países Bajos', 'Perú', 'Polonia', 'Portugal',
- 'Reino Unido', 'Reino Unido de Gran Bretaña e Irlanda del Norte', 'República Centroafricana', 'República Checa', 'República Democrática del Congo', 'República Dominicana', 'Ruanda', 'Rumanía', 'Rusia',
- 'Samoa', 'San Cristóbal y Nieves', 'San Marino', 'San Vicente y las Granadinas', 'Santa Lucía', 'Santo Tomé y Príncipe', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leona', 'Singapur', 'Siria', 'Somalia', 'Sri Lanka', 'Suazilandia', 'Sudáfrica', 'Sudán', 'Suecia', 'Suiza', 'Surinam',
- 'Tailandia', 'Tanzania', 'Tayikistán', 'Timor Oriental', 'Togo', 'Tonga', 'Trinidad y Tobago', 'Turkmenistán', 'Turquía', 'Tuvalu', 'Túnez',
- 'Ucrania', 'Uganda', 'Uruguay', 'Uzbekistán',
- 'Vanuatu', 'Venezuela', 'Vietnam',
- 'Yemen', 'Yibuti',
- 'Zambia', 'Zimbabue'
- );
protected static $cityFormats = array(
'{{cityPrefix}} {{firstName}} {{citySuffix}}',
'{{cityPrefix}} {{firstName}}',
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Company.php
index 8e33f57c..b255ef6c 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Company.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Company.php
@@ -48,7 +48,7 @@ class Company extends \Faker\Provider\Company
$result[] = static::randomElement($word);
}
- return join($result, ' ');
+ return join(' ', $result);
}
/**
@@ -61,6 +61,6 @@ class Company extends \Faker\Provider\Company
$result[] = static::randomElement($word);
}
- return join($result, ' ');
+ return join(' ', $result);
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php
index 4ec70f15..1c16f386 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/es_AR/Person.php
@@ -39,12 +39,12 @@ class Person extends \Faker\Provider\Person
protected static $firstNameFemale = array(
'Abigail', 'Abril', 'Adriana', 'Agustina', 'Alejandra', 'Alessandra', 'Alexa', 'Allison', 'Alma', 'Amanda', 'Amelia', 'Ana', 'Ana Paula',
'Ana Sofía', 'Andrea', 'Antonella', 'Antonia', 'Ariadna', 'Ariana', 'Ashley', 'Bianca', 'Camila', 'Carla', 'Carolina', 'Catalina',
- 'Clara', 'Constanza', 'Daniela', 'Delfina', 'Elena ', 'Elizabeth', 'Emilia', 'Emily', 'Emma', 'Fabiana', 'Florencia', 'Fátima ',
+ 'Clara', 'Constanza', 'Daniela', 'Delfina', 'Elena', 'Elizabeth', 'Emilia', 'Emily', 'Emma', 'Fabiana', 'Florencia', 'Fátima',
'Gabriela', 'Guadalupe', 'Irene', 'Isabel', 'Isabella', 'Isidora', 'Ivanna', 'Jazmín', 'Josefa', 'Josefina', 'Juana', 'Julia',
'Juliana', 'Julieta', 'Laura', 'Lola', 'Luana', 'Luciana', 'Lucía', 'Luna', 'Magdalena', 'Maite', 'Malena', 'Manuela',
'Mariana', 'Mariangel', 'Martina', 'María', 'María Alejandra', 'María Camila', 'María Fernanda', 'María José', 'María Paula', 'Micaela', 'Michelle', 'Miranda',
'Montserrat', 'Mía', 'Nadia', 'Natalia', 'Nicole', 'Oliva', 'Olivia', 'Ornela', 'Paula', 'Paulina', 'Rafaela', 'Rebeca',
- 'Regina', 'Renata', 'Romina', 'Salomé', 'Samantha', 'Sara', 'Silvana ', 'Sofía', 'Sophie', 'Valentina', 'Valeria', 'Valery ',
+ 'Regina', 'Renata', 'Romina', 'Salomé', 'Samantha', 'Sara', 'Silvana', 'Sofía', 'Sophie', 'Valentina', 'Valeria', 'Valery',
'Victoria', 'Violeta', 'Zoe', 'Aitana', 'Sara Sofía', 'Ximena'
);
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php
index 89f73b11..ee9f1e7a 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Address.php
@@ -8,14 +8,14 @@ class Address extends \Faker\Provider\Address
protected static $citySuffix = array('del Vallès', 'del Penedès', 'del Bages', 'de Ulla', 'de Lemos', 'del Mirador', 'de Arriba', 'de la Sierra', 'del Barco', 'de San Pedro', 'del Pozo', 'del Puerto', 'de las Torres', 'Alta', 'Baja', 'Medio');
protected static $buildingNumber = array('###', '##', '#');
protected static $streetPrefix = array(
- 'Calle', 'Avenida', 'Plaza', 'Paseo', 'Ronda', 'Travesia', 'Camino', 'Carrer', 'Avinguda', 'Plaça', 'Passeig', 'Travessera', 'Rúa', 'Praza', 'Ruela', 'Camiño'
+ 'Calle', 'Avenida', 'Plaza', 'Paseo', 'Ronda', 'Travesía', 'Camino', 'Carrer', 'Avinguda', 'Plaça', 'Passeig', 'Travessera', 'Rúa', 'Praza', 'Ruela', 'Camiño'
);
protected static $postcode = array('#####');
protected static $community = array(
'Andalucía', 'Aragón', 'Principado de Asturias', 'Illes Balears', 'Canarias', 'Cantabria', 'Castilla y León', 'Castilla - La Mancha', 'Cataluña', 'Comunitat Valenciana', 'Extremadura', 'Galicia', 'Comunidad de Madrid', 'Región de Murcia', 'Comunidad Foral de Navarra', 'País Vasco', 'La Rioja', 'Ceuta', 'Melilla'
);
protected static $state = array(
- 'A Coruña', 'Alava', 'Albacete', 'Alicante', 'Almería', 'Asturias', 'Avila', 'Badajoz', 'Barcelona', 'Burgos', 'Cáceres', 'Cádiz', 'Cantabria', 'Castellón', 'Ceuta', 'Ciudad Real', 'Cuenca', 'Córdoba', 'Girona', 'Granada', 'Guadalajara', 'Guipuzkoa', 'Huelva', 'Huesca', 'Illes Balears', 'Jaén', 'La Rioja', 'Las Palmas', 'León', 'Lleida', 'Lugo', 'Málaga', 'Madrid', 'Melilla', 'Murcia', 'Navarra', 'Ourense', 'Palencia', 'Pontevedra', 'Salamanca', 'Segovia', 'Sevilla', 'Soria', 'Sta Cruz De Tenerife', 'Tarragona', 'Teruel', 'Toledo', 'Valencia', 'Valladolid', 'Vizcaya', 'Zamora', 'Zaragoza'
+ 'A Coruña', 'Álava', 'Albacete', 'Alicante', 'Almería', 'Asturias', 'Ávila', 'Badajoz', 'Barcelona', 'Burgos', 'Cáceres', 'Cádiz', 'Cantabria', 'Castellón', 'Ceuta', 'Ciudad Real', 'Cuenca', 'Córdoba', 'Girona', 'Granada', 'Guadalajara', 'Guipuzkoa', 'Huelva', 'Huesca', 'Illes Balears', 'Jaén', 'La Rioja', 'Las Palmas', 'León', 'Lleida', 'Lugo', 'Málaga', 'Madrid', 'Melilla', 'Murcia', 'Navarra', 'Ourense', 'Palencia', 'Pontevedra', 'Salamanca', 'Segovia', 'Sevilla', 'Soria', 'Santa Cruz de Tenerife', 'Tarragona', 'Teruel', 'Toledo', 'Valencia', 'Valladolid', 'Vizcaya', 'Zamora', 'Zaragoza'
);
protected static $country = array(
'Afganistán','Albania','Alemania','Andorra','Angola','Antigua y Barbuda','Arabia Saudí','Argelia','Argentina','Armenia','Australia','Austria','Azerbaiyán',
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Color.php b/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Color.php
new file mode 100644
index 00000000..99f43324
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/es_ES/Color.php
@@ -0,0 +1,24 @@
+numberBetween($min = 10000, $max = 100000000);
+ $id = static::randomElement(static::$nationalityId);
+ if ($id == 'V') {
+ return $id . $separator . $this->numberBetween(10000, 100000000);
+ }
+
+ return $id . $separator . $this->numberBetween(80000000, 100000000);
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/et_EE/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/et_EE/Person.php
new file mode 100644
index 00000000..1589a4b3
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/et_EE/Person.php
@@ -0,0 +1,89 @@
+
+ */
+class Person extends \Faker\Provider\Person
+{
+ /**
+ * @link https://news.err.ee/114745/most-popular-baby-names-of-2014
+ * @link https://www.stat.ee/public/apps/nimed/TOP
+ */
+ protected static $firstNameMale = array(
+ "Andrei", "Aleksei", "Andres", "Alexander", "Aivar", "Aleksander", "Artur", "Andrus", "Ants", "Artjom", "Anatoli", "Anton", "Arvo", "Aare", "Ain", "Aleksandr",
+ "Dmitri", "Daniil", "Daniel",
+ "Eduard", "Erik", "Enn",
+ "Fjodorov",
+ "Gennadi",
+ "Heino", "Henri", "Hugo",
+ "Igor", "Indrek", "Ivan", "Ilja",
+ "Jüri", "Jaan", "Jevgeni", "Jaanus", "Janek", "Jaak",
+ "Kristjan", "Kalev", "Karl", "Kalle", "Kaido", "Kevin", "Konstantin", "Kaspar", "Kirill", "Kristo", "Kalju", "Kristofer",
+ "Lauri", "Lembit", "Laur",
+ "Martin", "Margus", "Maksim", "Marko", "Mati", "Meelis", "Mihhail", "Marek", "Mihkel", "Mart", "Madis", "Markus", "Mark", "Marten",
+ "Nikolai", "Nikita", "Nikolay",
+ "Oleg", "Oliver", "Oskar",
+ "Peeter", "Priit", "Pavel",
+ "Rein", "Roman", "Raivo", "Rasmus", "Raul", "Robert", "Riho", "Robin", "Romet",
+ "Sergei", "Sander", "Sergey", "Siim", "Silver", "Sebastian",
+ "Toomas", "Tarmo", "Tõnu", "Tiit", "Tanel", "Taavi", "Toivo", "Tõnis",
+ "Urmas", "Ülo",
+ "Vladimir", "Viktor", "Valeri", "Vello", "Vadim", "Vitali", "Vladislav", "Vjatšeslav", "Victor",
+ );
+
+ /**
+ * @link https://news.err.ee/114745/most-popular-baby-names-of-2014
+ * @link https://www.stat.ee/public/apps/nimed/TOP
+ */
+ protected static $firstNameFemale = array(
+ "Aino", "Aleksandra", "Alisa", "Anastasia", "Anna", "Anne", "Anneli", "Anu", "Arina", "Annika", "Anastassia", "Alla", "Aili", "Alina", "Aime", "Antonina",
+ "Darja", "Diana",
+ "Elena", "Eliise", "Elisabeth", "Emma", "Ene", "Eve", "Eha", "Evi",
+ "Galina",
+ "Hanna", "Helen", "Heli", "Helle", "Helgi",
+ "Irina", "Inna", "Ingrid",
+ "Jekaterina", "Jelena", "Julia", "Jana",
+ "Kadri", "Katrin", "Kristi", "Kristiina", "Kristina", "Karin", "Kersti", "Kristel", "Kaja", "Külli", "Kätlin", "Krista",
+ "Laura", "Lenna", "Liisa", "Linda", "Lisandra", "Ljubov", "Ljudmila", "Liina", "Ljudmilla", "Larissa", "Liis", "Lea", "Laine", "Liudmila",
+ "Maie", "Malle", "Mare", "Maria", "Marina", "Marleen", "Marta", "Merike", "Mia", "Milana", "Mirtel", "Marika", "Merle", "Margit", "Milvi", "Maire", "Margarita", "Mari", "Maarja",
+ "Natalia", "Niina", "Nora", "Natalja", "Nadežda", "Nina",
+ "Olga", "Oksana",
+ "Piret", "Polina", "Pille",
+ "Reet", "Riina",
+ "Sandra", "Sirje", "Sofia", "Svetlana", "Silvi",
+ "Tamara", "Tatiana", "Tiina", "Tiiu", "Triin", "Tatjana", "Tiia",
+ "Ülle", "Urve",
+ "Valentina", "Viktoria", "Veera", "Veronika", "Vaike",
+ "Zinaida",
+ );
+
+ /**
+ * @link https://en.wikipedia.org/wiki/Category:Estonian-language_surnames
+ * @link https://www.stat.ee/public/apps/nimed/pere/TOP
+ */
+ protected static $lastName = array(
+ "Aleksejev", "Andrejev", "Allik", "Aas", "Aleksandrov", "Aare", "Aarma", "Aas", "Aasmäe", "Aav", "Aavik", "Allik", "Alver", "Andrejeva", "Aleksejeva", "Aleksandrova", "Allik", "Aas",
+ "Bogdanova", "Bogdanov",
+ "Eenpalu", "Eskola",
+ "Fjodorov", "Fjodorov", "Fjodorova", "Fjodorova",
+ "Grigorjev", "Grigorjeva",
+ "Hunt", "Hein", "Hein", "Härma",
+ "Ivanov", "Ilves", "Ilves", "Ivanov", "Ivanova", "Ivanova", "Ilves",
+ "Jõgi", "Jakobson", "Jakovlev", "Jürgenson", "Jegorov", "Järv", "Johanson", "Järve", "Jakobson", "Jänes", "Järve", "Järvis", "Jõgi", "Jõgi", "Johanson", "Jürgenson", "Järv", "Jakovleva", "Jegorova", "Järve", "Jakobson",
+ "Kuzmina", "Kalda", "Kozlova", "Kruus", "Kask", "Kukk", "Kuznetsov", "Koppel", "Kaasik", "Kuusk", "Karu", "Kütt", "Kallas", "Kivi", "Kangur", "Kuusik", "Kõiv", "Kozlov", "Kull", "Kuzmin", "Kalda", "Kaaleste", "Kaasik", "Käbin", "Kalda", "Kaljulaid", "Kaljurand", "Kallas", "Kallaste", "Kangro", "Kangur", "Kapp", "Kärner", "Karu", "Kask", "Käsper", "Kass", "Keres", "Keskküla", "Kesküla", "Kikkas", "Kingsepp", "Kirs", "Kirsipuu", "Kivi", "Klavan", "Kõiv", "Kokk", "Kontaveit", "Koppel", "Korjus", "Kotkas", "Kreek", "Kross", "Kruus", "Kukk", "Kull", "Kütt", "Kuusik", "Kuusk", "Kuznetsov", "Kuznetsova", "Kask", "Kukk", "Kuznetsova", "Koppel", "Kaasik", "Kuusk", "Karu", "Kütt", "Kallas", "Kivi", "Kuusik", "Kangur", "Kõiv", "Kull",
+ "Luik", "Lepik", "Lepp", "Lõhmus", "Liiv", "Laur", "Leppik", "Lebedev", "Laas", "Laar", "Laht", "Lass", "Laur", "Laurits", "Lemsalu", "Lepik", "Lepmets", "Lepp", "Leppik", "Levandi", "Liiv", "Lill", "Lindmaa", "Linna", "Lipp", "Lippmaa", "Lõhmus", "Loo", "Lõoke", "Luik", "Luts", "Luik", "Lepik", "Lepp", "Lõhmus", "Laur", "Liiv", "Leppik", "Lebedeva", "Laas",
+ "Männik", "Mänd", "Mitt", "Makarova", "Mägi", "Mets", "Mihhailov", "Mölder", "Morozov", "Mitt", "Männik", "Mõttus", "Mänd", "Makarov", "Mägi", "Mälk", "Mänd", "Männik", "Margiste", "Mark", "Masing", "Mets", "Mihhailov", "Mihhailova", "Mölder", "Must", "Mägi", "Mets", "Mihhailova", "Mölder", "Morozova",
+ "Nikolajev", "Nõmm", "Nikitin", "Novikov", "Nõmmik", "Nurme", "Nurmsalu", "Nõmm", "Nikitina", "Nikolajeva",
+ "Orlova", "Orav", "Oja", "Ots", "Orav", "Orlov", "Oja", "Olesk", "Öpik", "Orav", "Ots", "Oja", "Ots",
+ "Petrov", "Pärn", "Põder", "Pavlov", "Popov", "Peterson", "Puusepp", "Paju", "Põld", "Pukk", "Paas", "Palm", "Pääsuke", "Padar", "Pärn", "Pavlov", "Pavlova", "Peebo", "Peetre", "Peterson", "Petrov", "Petrova", "Pihlak", "Piho", "Piip", "Põder", "Põld", "Popov", "Popova", "Poska", "Puhvel", "Pütsep", "Puusepp", "Petrova", "Pärn", "Pavlova", "Põder", "Peterson", "Popova", "Puusepp", "Paas", "Paju", "Pukk", "Parts", "Palm", "Põld",
+ "Romanova", "Rand", "Roos", "Rebane", "Raudsepp", "Raud", "Rand", "Roos", "Rätsep", "Raag", "Raud", "Raudsepp", "Rebane", "Reek", "Reinsalu", "Rooba", "Roolaid", "Rootare", "Rummo", "Rüütel", "Rüütli", "Rebane", "Raudsepp", "Raud",
+ "Saar", "Sepp", "Smirnov", "Stepanov", "Semjonov", "Sokolov", "Sild", "Sarapuu", "Saks", "Saar", "Salumäe", "Semjonov", "Sepp", "Sibul", "Siimar", "Simm", "Sirel", "Sisask", "Smirnov", "Smirnova", "Sokk", "Sokolov", "Soosaar", "Stepanov", "Stepanova", "Susi", "Saar", "Sepp", "Smirnova", "Stepanova", "Sokolova", "Saks", "Sarapuu", "Sild", "Semjonova",
+ "Tamme", "Tomson", "Tamm", "Teder", "Toom", "Tomson", "Tamme", "Talts", "Tamm", "Tamme", "Tarvas", "Teder", "Toom", "Toome", "Toots", "Tamm", "Teder", "Toom",
+ "Uibo", "Uibo",
+ "Vassiljev", "Vaher", "Volkov", "Valk", "Vaher", "Vahtra", "Vaino", "Vainola", "Välbe", "Valdma", "Väljas", "Valk", "Vassiljev", "Vassiljeva", "Vesik", "Veski", "Viiding", "Vitsut", "Võigemast", "Volkov", "Volkova", "Võsu", "Vassiljeva", "Vaher", "Volkova",
+ );
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Address.php
new file mode 100644
index 00000000..f2209138
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Address.php
@@ -0,0 +1,100 @@
+generator->parse($format);
+ }
+
+ /**
+ * @example 'کد پستی'
+ */
+ public static function postcodePrefix()
+ {
+ return static::randomElement(static::$postcodePrefix);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Company.php
new file mode 100644
index 00000000..0de47b35
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/Company.php
@@ -0,0 +1,57 @@
+ 1; $i--) {
+ $sum += $subNationalCodeString[$count] * ($i);
+ $count++;
+ }
+
+ if (($sum % 11) < 2) {
+ return $sum % 11;
+ }
+ return 11 - ($sum % 11);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/PhoneNumber.php
new file mode 100644
index 00000000..fb80b1d2
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fa_IR/PhoneNumber.php
@@ -0,0 +1,75 @@
+format('dmy');
+
+ switch ((int)($birthdate->format('Y')/100)) {
+ case 18:
+ $centurySign = '+';
+ break;
+ case 19:
+ $centurySign = '-';
+ break;
+ case 20:
+ $centurySign = 'A';
+ break;
+ default:
+ throw new \InvalidArgumentException('Year must be between 1800 and 2099 inclusive.');
+ }
+
+ $randomDigits = self::numberBetween(0, 89);
+ if ($gender && $gender == static::GENDER_MALE) {
+ if ($randomDigits === 0) {
+ $randomDigits .= static::randomElement(array(3,5,7,9));
+ } else {
+ $randomDigits .= static::randomElement(array(1,3,5,7,9));
+ }
+ } elseif ($gender && $gender == static::GENDER_FEMALE) {
+ if ($randomDigits === 0) {
+ $randomDigits .= static::randomElement(array(2,4,6,8));
+ } else {
+ $randomDigits .= static::randomElement(array(0,2,4,6,8));
+ }
+ } else {
+ if ($randomDigits === 0) {
+ $randomDigits .= self::numberBetween(2, 9);
+ } else {
+ $randomDigits .= (string)static::numerify('#');
+ }
+ }
+ $randomDigits = str_pad($randomDigits, 3, '0', STR_PAD_LEFT);
+
+ $checksum = $checksumCharacters[(int)($datePart . $randomDigits) % strlen($checksumCharacters)];
+
+ return $datePart . $centurySign . $randomDigits . $checksum;
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php
index 39f0e784..a3230740 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fi_FI/PhoneNumber.php
@@ -4,17 +4,96 @@ namespace Faker\Provider\fi_FI;
class PhoneNumber extends \Faker\Provider\PhoneNumber
{
- protected static $formats = array(
- '+358 (40) ### ####',
- '+358 (50) ### ####',
- '+358 40 ### ####',
- '+358 50 ### ####',
- '040 ### ####',
- '050 ### ####',
- '###-########',
- '### #######',
- '040-#######',
- '050-#######',
- '(###) #######'
+ /**
+ * @link https://www.viestintavirasto.fi/en/internettelephone/numberingoftelecommunicationsnetworks/localcallsandtelecommunicationsareas/mapoftelecommunicationsareas.html
+ * @var array
+ */
+ protected static $landLineareaCodes = array(
+ '02',
+ '03',
+ '05',
+ '06',
+ '08',
+ '09',
+ '013',
+ '014',
+ '015',
+ '016',
+ '017',
+ '018',
+ '019',
);
+
+ /**
+ * @link https://www.viestintavirasto.fi/en/internettelephone/numberingoftelecommunicationsnetworks/mobilenetworks/mobilenetworkareacodes.html
+ * @var array
+ */
+ protected static $mobileNetworkAreaCodes = array(
+ '040',
+ '050',
+ '044',
+ '045',
+ );
+
+ protected static $numberFormats = array(
+ '### ####',
+ '#######',
+ );
+
+ protected static $formats = array(
+ '+358 ({{ e164MobileNetworkAreaCode }}) {{ numberFormat }}',
+ '+358 {{ e164MobileNetworkAreaCode }} {{ numberFormat }}',
+ '+358 ({{ e164landLineAreaCode }}) {{ numberFormat }}',
+ '+358 {{ e164landLineAreaCode }} {{ numberFormat }}',
+ '{{ mobileNetworkAreaCode }}{{ separator }}{{ numberFormat }}',
+ '{{ landLineAreaCode }}{{ separator }}{{ numberFormat }}',
+ );
+
+ /**
+ * @return string
+ */
+ public function landLineAreaCode()
+ {
+ return static::randomElement(static::$landLineareaCodes);
+ }
+
+ /**
+ * @return string
+ */
+ public function e164landLineAreaCode()
+ {
+ return substr(static::randomElement(static::$landLineareaCodes), 1);
+ }
+
+ /**
+ * @return string
+ */
+ public function mobileNetworkAreaCode()
+ {
+ return static::randomElement(static::$mobileNetworkAreaCodes);
+ }
+
+ /**
+ * @return string
+ */
+ public function e164MobileNetworkAreaCode()
+ {
+ return substr(static::randomElement(static::$mobileNetworkAreaCodes), 1);
+ }
+
+ /**
+ * @return string
+ */
+ public function numberFormat()
+ {
+ return static::randomElement(static::$numberFormats);
+ }
+
+ /**
+ * @return string
+ */
+ public function separator()
+ {
+ return static::randomElement(array(' ', '-'));
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php
index 9aa35bff..7ecef77a 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Address.php
@@ -2,7 +2,7 @@
namespace Faker\Provider\fr_BE;
-class Address extends \Faker\Provider\Address
+class Address extends \Faker\Provider\fr_FR\Address
{
protected static $postcode = array('####');
@@ -50,25 +50,6 @@ class Address extends \Faker\Provider\Address
'Hainaut', 'Liège', 'Luxembourg', 'Namur', 'Brabant wallon'
);
- protected static $country = array(
- 'Afghanistan', 'Afrique du sud', 'Albanie', 'Algérie', 'Allemagne', 'Andorre', 'Angola', 'Anguilla', 'Antarctique', 'Antigua et Barbuda', 'Antilles néerlandaises', 'Arabie saoudite', 'Argentine', 'Arménie', 'Aruba', 'Australie', 'Autriche', 'Azerbaïdjan', 'Bahamas', 'Bahrain', 'Bangladesh', 'Belgique', 'Belize', 'Benin', 'Les Bermudes', 'Bhoutan', 'Biélorussie', 'Bolivie', 'Bosnie-Herzégovine', 'Botswana', 'Îles Bouvet', 'Brunei', 'Brésil', 'Bulgarie', 'Burkina Faso', 'Burundi', 'Cambodge', 'Cameroun', 'Canada', 'Cap Vert', 'Îles Cayman', 'Chili', 'Chine', 'Île Christmas', 'Chypre', 'Îles Cocos', 'Colombie', 'Comores', 'Îles Cook', 'Corée du Nord', 'Corée du Sud', 'Costa Rica', 'Croatie', 'Cuba', 'Côte d\'Ivoire', 'Danemark', 'Djibouti', 'Dominique', 'Égypte', 'El Salvador', 'Émirats arabes unis', 'Équateur', 'Érythrée', 'Espagne', 'Estonie', 'États-Unis', 'Ethiopie', 'Île Falkland', 'République des Fidji', 'Finlande', 'France', 'Îles Féroé', 'Gabon',
- 'Gambie', 'Ghana', 'Gibraltar', 'Grenade', 'Groenland', 'Grèce', 'Guadeloupe', 'Guam', 'Guatemala', 'Guinée', 'Guinée Equatoriale', 'Guinée-Bissau', 'Guyane', 'Guyane française', 'Géorgie', 'Îles Géorgie du Sud et Sandwich du Sud', 'Haïti', 'Îles Heard et McDonald', 'Honduras', 'Hong Kong', 'Hongrie', 'Îles Mineures Éloignées des États-Unis', 'Inde', 'Indonésie', 'Irak', 'Iran', 'Irlande', 'Islande', 'Israël', 'Italie', 'Jamaïque', 'Japon', 'Jordanie', 'Kazakhstan', 'Kenya', 'Kirghizistan', 'Kiribati', 'Koweit', 'La Barbad', 'Laos', 'Lesotho', 'Lettonie', 'Liban', 'Libye', 'Libéria', 'Liechtenstein', 'Lithuanie', 'Luxembourg', 'Macau', 'Macédoine', 'Madagascar', 'Malaisie', 'Malawi', 'Îles Maldives', 'Mali', 'Malte', 'Îles Mariannes du Nord', 'Maroc', 'Îles Marshall', 'Martinique', 'Maurice', 'Mauritanie', 'Mayotte', 'Mexique', 'États fédérés de Micronésie', 'Moldavie', 'Monaco', 'Mongolie', 'Montserrat', 'Mozambique', 'Myanmar', 'Namibie', 'Nauru', 'Nepal',
- 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Îles Norfolk', 'Norvège', 'Nouvelle Calédonie', 'Nouvelle-Zélande', 'Oman', 'Ouganda', 'Ouzbékistan', 'Pakistan', 'Palau', 'Panama', 'Papouasie-Nouvelle-Guinée', 'Paraguay', 'Pays-Bas', 'Philippines', 'Îles Pitcairn', 'Pologne', 'Polynésie française', 'Porto Rico', 'Portugal', 'Pérou', 'Qatar', 'Roumanie', 'Royaume-Uni', 'Russie', 'Rwanda', 'Rép. dém. du Congo', 'République centrafricaine', 'République dominicaine', 'République tchèque', 'La Réunion', 'Sahara Occidental', 'Saint Pierre et Miquelon', 'Saint Vincent et les Grenadines', 'Saint-Kitts et Nevis', 'Saint-Marin', 'Sainte Hélène', 'Sainte Lucie', 'Samoa', 'Samoa', 'Seychelles', 'Sierra Leone', 'Singapour', 'Slovaquie', 'Slovénie', 'Somalie', 'Soudan', 'Sri Lanka', 'Suisse', 'Suriname', 'Suède', 'Îles Svalbard et Jan Mayen', 'Swaziland', 'Syrie', 'São Tomé et Príncipe', 'Sénégal', 'Tadjikistan', 'Taiwan', 'Tanzanie', 'Tchad',
- 'Territoire britannique de l\'océan Indien', 'Territoires français du sud', 'Thailande', 'Timor', 'Togo', 'Tokelau', 'Tonga', 'Trinité et Tobago', 'Tunisie', 'Turkménistan', 'Îles Turks et Caïques', 'Turquie', 'Tuvalu', 'Ukraine', 'Uruguay', 'Vanuatu', 'Vatican', 'Venezuela', 'Îles Vierges', 'Îles Vierges britanniques', 'Vietnam', 'Îles Wallis et Futuna', 'Yemen', 'Yougoslavie', 'Zambie', 'Zaïre', 'Zimbabwe'
- );
-
- /**
- * Randomly returns a belgian region.
- *
- * @example 'wallonne'
- *
- * @return string
- */
- public static function region()
- {
- return static::randomElement(static::$region);
- }
-
/**
* Randomly returns a belgian province.
*
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Company.php
index f1961301..6b8c0c7d 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Company.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Company.php
@@ -2,7 +2,7 @@
namespace Faker\Provider\fr_BE;
-class Company extends \Faker\Provider\Company
+class Company extends \Faker\Provider\fr_FR\Company
{
protected static $formats = array(
'{{lastName}} {{companySuffix}}',
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Payment.php
index c281183f..21da5b5c 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Payment.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_BE/Payment.php
@@ -16,4 +16,24 @@ class Payment extends \Faker\Provider\Payment
{
return static::iban($countryCode, $prefix, $length);
}
+
+ /**
+ * Value Added Tax (VAT)
+ *
+ * @example 'BE0123456789', ('spaced') 'BE 0123456789'
+ *
+ * @see http://ec.europa.eu/taxation_customs/vies/faq.html?locale=en#item_11
+ * @see http://www.iecomputersystems.com/ordering/eu_vat_numbers.htm
+ * @see http://en.wikipedia.org/wiki/VAT_identification_number
+ *
+ * @param bool $spacedNationalPrefix
+ *
+ * @return string VAT Number
+ */
+ public static function vat($spacedNationalPrefix = true)
+ {
+ $prefix = $spacedNationalPrefix ? "BE " : "BE";
+
+ return sprintf("%s0%d", $prefix, self::randomNumber(9, true));
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php
index 1ea91bdd..4930b54f 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Address.php
@@ -2,7 +2,7 @@
namespace Faker\Provider\fr_CA;
-class Address extends \Faker\Provider\Address
+class Address extends \Faker\Provider\fr_FR\Address
{
protected static $cityPrefix = array('Saint-', 'Sainte-', 'St-', 'Ste-');
@@ -76,44 +76,13 @@ class Address extends \Faker\Provider\Address
protected static $secondaryAddressFormats = array('Apt. ###', 'Suite ###', 'Bureau ###');
protected static $state = array(
- 'Alberta', 'Colombie-Brittanique', 'Manitoba', 'Nouveau-Brunswick', 'Terre-Neuve-et-Labrador', 'Nouvelle-Écosse', 'Ontario', 'Île-du-Prince-Édouard', 'Québec', 'Saskatchewan'
+ 'Alberta', 'Colombie-Britannique', 'Manitoba', 'Nouveau-Brunswick', 'Terre-Neuve-et-Labrador', 'Nouvelle-Écosse', 'Ontario', 'Île-du-Prince-Édouard', 'Québec', 'Saskatchewan'
);
protected static $stateAbbr = array(
'AB', 'BC', 'MB', 'NB', 'NL', 'NS', 'ON', 'PE', 'QC', 'SK'
);
- /**
- * This list is the same as in \Faker\Provider\fr_FR\Address.php
- */
- protected static $country = array(
- 'Afghanistan', 'Afrique du sud', 'Albanie', 'Algérie', 'Allemagne', 'Andorre', 'Angola', 'Anguilla', 'Antarctique', 'Antigua et Barbuda', 'Antilles néerlandaises', 'Arabie saoudite', 'Argentine', 'Arménie', 'Aruba', 'Australie', 'Autriche', 'Azerbaïdjan',
- 'Bahamas', 'Bahrain', 'Bangladesh', 'Belgique', 'Belize', 'Benin', 'Bermudes (Les)', 'Bhoutan', 'Biélorussie', 'Bolivie', 'Bosnie-Herzégovine', 'Botswana', 'Bouvet (Îles)', 'Brunei', 'Brésil', 'Bulgarie', 'Burkina Faso', 'Burundi',
- 'Cambodge', 'Cameroun', 'Canada', 'Cap Vert', 'Cayman (Îles)', 'Chili', 'Chine (Rép. pop.)', 'Christmas (Île)', 'Chypre', 'Cocos (Îles)', 'Colombie', 'Comores', 'Cook (Îles)', 'Corée du Nord', 'Corée, Sud', 'Costa Rica', 'Croatie', 'Cuba', 'Côte d\'Ivoire',
- 'Danemark', 'Djibouti', 'Dominique',
- 'Égypte', 'El Salvador', 'Émirats arabes unis', 'Équateur', 'Érythrée', 'Espagne', 'Estonie', 'États-Unis', 'Ethiopie',
- 'Falkland (Île)', 'Fidji (République des)', 'Finlande', 'France', 'Féroé (Îles)',
- 'Gabon', 'Gambie', 'Ghana', 'Gibraltar', 'Grenade', 'Groenland', 'Grèce', 'Guadeloupe', 'Guam', 'Guatemala', 'Guinée', 'Guinée Equatoriale', 'Guinée-Bissau', 'Guyane', 'Guyane française', 'Géorgie', 'Géorgie du Sud et Sandwich du Sud (Îles)',
- 'Haïti', 'Heard et McDonald (Îles)', 'Honduras', 'Hong Kong', 'Hongrie',
- 'Îles Mineures Éloignées des États-Unis', 'Inde', 'Indonésie', 'Irak', 'Iran', 'Irlande', 'Islande', 'Israël', 'Italie',
- 'Jamaïque', 'Japon', 'Jordanie',
- 'Kazakhstan', 'Kenya', 'Kirghizistan', 'Kiribati', 'Koweit',
- 'La Barbade', 'Laos', 'Lesotho', 'Lettonie', 'Liban', 'Libye', 'Libéria', 'Liechtenstein', 'Lithuanie', 'Luxembourg',
- 'Macau', 'Macédoine', 'Madagascar', 'Malaisie', 'Malawi', 'Maldives (Îles)', 'Mali', 'Malte', 'Mariannes du Nord (Îles)', 'Maroc', 'Marshall (Îles)', 'Martinique', 'Maurice', 'Mauritanie', 'Mayotte', 'Mexique', 'Micronésie (États fédérés de)', 'Moldavie', 'Monaco', 'Mongolie', 'Montserrat', 'Mozambique', 'Myanmar',
- 'Namibie', 'Nauru', 'Nepal', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk (Îles)', 'Norvège', 'Nouvelle Calédonie', 'Nouvelle-Zélande',
- 'Oman', 'Ouganda', 'Ouzbékistan',
- 'Pakistan', 'Palau', 'Panama', 'Papouasie-Nouvelle-Guinée', 'Paraguay', 'Pays-Bas', 'Philippines', 'Pitcairn (Îles)', 'Pologne', 'Polynésie française', 'Porto Rico', 'Portugal', 'Pérou',
- 'Qatar',
- 'Roumanie', 'Royaume-Uni', 'Russie', 'Rwanda', 'Rép. Dém. du Congo', 'République centrafricaine', 'République Dominicaine', 'République tchèque', 'Réunion (La)',
- 'Sahara Occidental', 'Saint Pierre et Miquelon', 'Saint Vincent et les Grenadines', 'Saint-Kitts et Nevis', 'Saint-Marin (Rép. de)', 'Sainte Hélène', 'Sainte Lucie', 'Samoa', 'Samoa', 'Seychelles', 'Sierra Leone', 'Singapour', 'Slovaquie', 'Slovénie', 'Somalie', 'Soudan', 'Sri Lanka', 'Suisse', 'Suriname', 'Suède', 'Svalbard et Jan Mayen (Îles)', 'Swaziland', 'Syrie', 'São Tomé et Príncipe (Rép.)', 'Sénégal',
- 'Tadjikistan', 'Taiwan', 'Tanzanie', 'Tchad', 'Territoire britannique de l\'océan Indien', 'Territoires français du sud', 'Thailande', 'Timor', 'Togo', 'Tokelau', 'Tonga', 'Trinité et Tobago', 'Tunisie', 'Turkménistan', 'Turks et Caïques (Îles)', 'Turquie', 'Tuvalu',
- 'Ukraine', 'Uruguay',
- 'Vanuatu', 'Vatican (Etat du)', 'Venezuela', 'Vierges (Îles)', 'Vierges britanniques (Îles)', 'Vietnam',
- 'Wallis et Futuna (Îles)',
- 'Yemen', 'Yougoslavie',
- 'Zambie', 'Zaïre', 'Zimbabwe'
- );
-
/**
* @example 'Saint-'
*/
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Company.php
new file mode 100644
index 00000000..b6ffefdc
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_CA/Company.php
@@ -0,0 +1,7 @@
+ 'Argovie'),
+ array('AI' => 'Appenzell Rhodes-Intérieures'),
+ array('AR' => 'Appenzell Rhodes-Extérieures'),
+ array('BE' => 'Berne'),
+ array('BL' => 'Bâle-Campagne'),
+ array('BS' => 'Bâle-Ville'),
+ array('FR' => 'Fribourg'),
+ array('GE' => 'Genève'),
+ array('GL' => 'Glaris'),
+ array('GR' => 'Grisons'),
+ array('JU' => 'Jura'),
+ array('LU' => 'Lucerne'),
+ array('NE' => 'Neuchâtel'),
+ array('NW' => 'Nidwald'),
+ array('OW' => 'Obwald'),
+ array('SG' => 'Saint-Gall'),
+ array('SH' => 'Schaffhouse'),
+ array('SO' => 'Soleure'),
+ array('SZ' => 'Schwytz'),
+ array('TG' => 'Thurgovie'),
+ array('TI' => 'Tessin'),
+ array('UR' => 'Uri'),
+ array('VD' => 'Vaud'),
+ array('VS' => 'Valais'),
+ array('ZG' => 'Zoug'),
+ array('ZH' => 'Zurich')
+ );
+
+ protected static $cityFormats = array(
+ '{{cityName}}',
+ );
+
+ protected static $streetNameFormats = array(
+ '{{streetPrefix}} {{lastName}}',
+ '{{streetPrefix}} de {{cityName}}',
+ '{{streetPrefix}} de {{lastName}}'
+ );
+
+ protected static $streetAddressFormats = array(
+ '{{streetName}} {{buildingNumber}}',
+ );
+ protected static $addressFormats = array(
+ "{{streetAddress}}\n{{postcode}} {{city}}",
+ );
+
+ /**
+ * Returns a random street prefix
+ * @example Rue
+ * @return string
+ */
+ public static function streetPrefix()
+ {
+ return static::randomElement(static::$streetPrefix);
+ }
+
+ /**
+ * Returns a random city name.
+ * @example Luzern
+ * @return string
+ */
+ public function cityName()
+ {
+ return static::randomElement(static::$cityNames);
+ }
+
+ /**
+ * Returns a canton
+ * @example array('BE' => 'Bern')
+ * @return array
+ */
+ public static function canton()
+ {
+ return static::randomElement(static::$canton);
+ }
+
+ /**
+ * Returns the abbreviation of a canton.
+ * @return string
+ */
+ public static function cantonShort()
+ {
+ $canton = static::canton();
+ return key($canton);
+ }
+
+ /**
+ * Returns the name of canton.
+ * @return string
+ */
+ public static function cantonName()
+ {
+ $canton = static::canton();
+ return current($canton);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/Company.php
new file mode 100644
index 00000000..a4e91eaf
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_CH/Company.php
@@ -0,0 +1,15 @@
+ 'Guadeloupe'), array('972' => 'Martinique'), array('973' => 'Guyane'), array('974' => 'La Réunion'), array('976' => 'Mayotte')
);
+ protected static $secondaryAddressFormats = array('Apt. ###', 'Suite ###', 'Étage ###', "Bât. ###", "Chambre ###");
+
+ /**
+ * @example 'Appt. 350'
+ */
+ public static function secondaryAddress()
+ {
+ return static::numerify(static::randomElement(static::$secondaryAddressFormats));
+ }
+
/**
* @example 'rue'
*/
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php
index 5f440666..9112802c 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Company.php
@@ -51,7 +51,7 @@ class Company extends \Faker\Provider\Company
/**
* @var array Company suffixes.
*/
- protected static $companySuffix = array('SA', 'S.A.', 'SARL', 'S.A.R.L.', 'S.A.S.', 'et Fils');
+ protected static $companySuffix = array('SA', 'S.A.', 'SARL', 'S.A.R.L.', 'SAS', 'S.A.S.', 'et Fils');
protected static $siretNicFormats = array('####', '0###', '00#%');
@@ -112,7 +112,7 @@ class Company extends \Faker\Provider\Company
*/
public function siret($formatted = true)
{
- $siret = $this->siren(false);
+ $siret = self::siren(false);
$nicFormat = static::randomElement(static::$siretNicFormats);
$siret .= $this->numerify($nicFormat);
$siret .= Luhn::computeCheckDigit($siret);
@@ -129,9 +129,9 @@ class Company extends \Faker\Provider\Company
* @see http://fr.wikipedia.org/wiki/Syst%C3%A8me_d%27identification_du_r%C3%A9pertoire_des_entreprises
* @return string
*/
- public function siren($formatted = true)
+ public static function siren($formatted = true)
{
- $siren = $this->numerify('%#######');
+ $siren = self::numerify('%#######');
$siren .= Luhn::computeCheckDigit($siren);
if ($formatted) {
$siren = substr($siren, 0, 3) . ' ' . substr($siren, 3, 3) . ' ' . substr($siren, 6, 3);
@@ -166,4 +166,311 @@ class Company extends \Faker\Provider\Company
return true;
}
+
+ /**
+ * @link http://www.pole-emploi.fr/candidat/le-code-rome-et-les-fiches-metiers-@/article.jspz?id=60702
+ * @note Randomly took 300 from this list
+ */
+ protected static $jobTitleFormat = array(
+ 'Agent d\'accueil',
+ 'Agent d\'enquêtes',
+ 'Agent d\'entreposage',
+ 'Agent de curage',
+ 'Agro-économiste',
+ 'Aide couvreur',
+ 'Aide à domicile',
+ 'Aide-déménageur',
+ 'Ambassadeur',
+ 'Analyste télématique',
+ 'Animateur d\'écomusée',
+ 'Animateur web',
+ 'Appareilleur-gazier',
+ 'Archéologue',
+ 'Armurier d\'art',
+ 'Armurier spectacle',
+ 'Artificier spectacle',
+ 'Artiste dramatique',
+ 'Aspigiculteur',
+ 'Assistant de justice',
+ 'Assistant des ventes',
+ 'Assistant logistique',
+ 'Assistant styliste',
+ 'Assurance',
+ 'Auteur-adaptateur',
+ 'Billettiste voyages',
+ 'Brigadier',
+ 'Bruiteur',
+ 'Bâtonnier d\'art',
+ 'Bûcheron',
+ 'Cameraman',
+ 'Capitaine de pêche',
+ 'Carrier',
+ 'Caviste',
+ 'Chansonnier',
+ 'Chanteur',
+ 'Chargé de recherche',
+ 'Chasseur-bagagiste',
+ 'Chef de fabrication',
+ 'Chef de scierie',
+ 'Chef des ventes',
+ 'Chef du personnel',
+ 'Chef géographe',
+ 'Chef monteur son',
+ 'Chef porion',
+ 'Chiropraticien',
+ 'Choréologue',
+ 'Chromiste',
+ 'Cintrier-machiniste',
+ 'Clerc hors rang',
+ 'Coach sportif',
+ 'Coffreur béton armé',
+ 'Coffreur-ferrailleur',
+ 'Commandant de police',
+ 'Commandant marine',
+ 'Commis de coupe',
+ 'Comptable unique',
+ 'Conception et études',
+ 'Conducteur de jumbo',
+ 'Conseiller culinaire',
+ 'Conseiller funéraire',
+ 'Conseiller relooking',
+ 'Consultant ergonome',
+ 'Contrebassiste',
+ 'Convoyeur garde',
+ 'Copiste offset',
+ 'Corniste',
+ 'Costumier-habilleur',
+ 'Coutelier d\'art',
+ 'Cueilleur de cerises',
+ 'Céramiste concepteur',
+ 'Danse',
+ 'Danseur',
+ 'Data manager',
+ 'Dee-jay',
+ 'Designer produit',
+ 'Diététicien conseil',
+ 'Diététique',
+ 'Doreur sur métaux',
+ 'Décorateur-costumier',
+ 'Défloqueur d\'amiante',
+ 'Dégustateur',
+ 'Délégué vétérinaire',
+ 'Délégué à la tutelle',
+ 'Désamianteur',
+ 'Détective',
+ 'Développeur web',
+ 'Ecotoxicologue',
+ 'Elagueur-botteur',
+ 'Elagueur-grimpeur',
+ 'Elastiqueur',
+ 'Eleveur d\'insectes',
+ 'Eleveur de chats',
+ 'Eleveur de volailles',
+ 'Embouteilleur',
+ 'Employé d\'accueil',
+ 'Employé d\'étage',
+ 'Employé de snack-bar',
+ 'Endivier',
+ 'Endocrinologue',
+ 'Epithésiste',
+ 'Essayeur-retoucheur',
+ 'Etainier',
+ 'Etancheur',
+ 'Etancheur-bardeur',
+ 'Etiqueteur',
+ 'Expert back-office',
+ 'Exploitant de tennis',
+ 'Extraction',
+ 'Facteur',
+ 'Facteur de clavecins',
+ 'Facteur de secteur',
+ 'Fantaisiste',
+ 'Façadier-bardeur',
+ 'Façadier-ravaleur',
+ 'Feutier',
+ 'Finance',
+ 'Flaconneur',
+ 'Foreur pétrole',
+ 'Formateur d\'italien',
+ 'Fossoyeur',
+ 'Fraiseur',
+ 'Fraiseur mouliste',
+ 'Frigoriste maritime',
+ 'Fromager',
+ 'Galeriste',
+ 'Gardien de résidence',
+ 'Garçon de chenil',
+ 'Garçon de hall',
+ 'Gendarme mobile',
+ 'Guitariste',
+ 'Gynécologue',
+ 'Géodésien',
+ 'Géologue prospecteur',
+ 'Géomètre',
+ 'Géomètre du cadastre',
+ 'Gérant d\'hôtel',
+ 'Gérant de tutelle',
+ 'Gériatre',
+ 'Hydrothérapie',
+ 'Hématologue',
+ 'Hôte de caisse',
+ 'Ingénieur bâtiment',
+ 'Ingénieur du son',
+ 'Ingénieur géologue',
+ 'Ingénieur géomètre',
+ 'Ingénieur halieute',
+ 'Ingénieur logistique',
+ 'Instituteur',
+ 'Jointeur de placage',
+ 'Juge des enfants',
+ 'Juriste financier',
+ 'Kiwiculteur',
+ 'Lexicographe',
+ 'Liftier',
+ 'Litigeur transport',
+ 'Logistique',
+ 'Logopède',
+ 'Magicien',
+ 'Manager d\'artiste',
+ 'Mannequin détail',
+ 'Maquilleur spectacle',
+ 'Marbrier-poseur',
+ 'Marin grande pêche',
+ 'Matelassier',
+ 'Maçon',
+ 'Maçon-fumiste',
+ 'Maçonnerie',
+ 'Maître de ballet',
+ 'Maïeuticien',
+ 'Menuisier',
+ 'Miroitier',
+ 'Modéliste industriel',
+ 'Moellonneur',
+ 'Moniteur de sport',
+ 'Monteur audiovisuel',
+ 'Monteur de fermettes',
+ 'Monteur de palettes',
+ 'Monteur en siège',
+ 'Monteur prototypiste',
+ 'Monteur-frigoriste',
+ 'Monteur-truquiste',
+ 'Mouleur sable',
+ 'Mouliste drapeur',
+ 'Mécanicien-armurier',
+ 'Médecin du sport',
+ 'Médecin scolaire',
+ 'Médiateur judiciaire',
+ 'Médiathécaire',
+ 'Net surfeur surfeuse',
+ 'Oenologue',
+ 'Opérateur de plateau',
+ 'Opérateur du son',
+ 'Opérateur géomètre',
+ 'Opérateur piquage',
+ 'Opérateur vidéo',
+ 'Ouvrier d\'abattoir',
+ 'Ouvrier serriste',
+ 'Ouvrier sidérurgiste',
+ 'Palefrenier',
+ 'Paléontologue',
+ 'Pareur en abattoir',
+ 'Parfumeur',
+ 'Parqueteur',
+ 'Percepteur',
+ 'Photographe d\'art',
+ 'Pilote automobile',
+ 'Pilote de soutireuse',
+ 'Pilote fluvial',
+ 'Piqueur en ganterie',
+ 'Pisteur secouriste',
+ 'Pizzaïolo',
+ 'Plaquiste enduiseur',
+ 'Plasticien',
+ 'Plisseur',
+ 'Poissonnier-traiteur',
+ 'Pontonnier',
+ 'Porion',
+ 'Porteur de hottes',
+ 'Porteur de journaux',
+ 'Portier',
+ 'Poseur de granit',
+ 'Posticheur spectacle',
+ 'Potier',
+ 'Praticien dentaire',
+ 'Praticiens médicaux',
+ 'Premier clerc',
+ 'Preneur de son',
+ 'Primeuriste',
+ 'Professeur d\'italien',
+ 'Projeteur béton armé',
+ 'Promotion des ventes',
+ 'Présentateur radio',
+ 'Pyrotechnicien',
+ 'Pédicure pour bovin',
+ 'Pédologue',
+ 'Pédopsychiatre',
+ 'Quincaillier',
+ 'Radio chargeur',
+ 'Ramasseur d\'asperges',
+ 'Ramasseur d\'endives',
+ 'Ravaleur-ragréeur',
+ 'Recherche',
+ 'Recuiseur',
+ 'Relieur-doreur',
+ 'Responsable de salle',
+ 'Responsable télécoms',
+ 'Revenue Manager',
+ 'Rippeur spectacle',
+ 'Rogneur',
+ 'Récupérateur',
+ 'Rédacteur des débats',
+ 'Régleur funéraire',
+ 'Régleur sur tour',
+ 'Sapeur-pompier',
+ 'Scannériste',
+ 'Scripte télévision',
+ 'Sculpteur sur verre',
+ 'Scénariste',
+ 'Second de cuisine',
+ 'Secrétaire juridique',
+ 'Semencier',
+ 'Sertisseur',
+ 'Services funéraires',
+ 'Solier-moquettiste',
+ 'Sommelier',
+ 'Sophrologue',
+ 'Staffeur',
+ 'Story boarder',
+ 'Stratifieur',
+ 'Stucateur',
+ 'Styliste graphiste',
+ 'Surjeteur-raseur',
+ 'Séismologue',
+ 'Technicien agricole',
+ 'Technicien bovin',
+ 'Technicien géomètre',
+ 'Technicien plateau',
+ 'Technicien énergie',
+ 'Terminologue',
+ 'Testeur informatique',
+ 'Toiliste',
+ 'Topographe',
+ 'Toréro',
+ 'Traducteur d\'édition',
+ 'Traffic manager',
+ 'Trieur de métaux',
+ 'Turbinier',
+ 'Téléconseiller',
+ 'Tôlier-traceur',
+ 'Vendeur carreau',
+ 'Vendeur en lingerie',
+ 'Vendeur en meubles',
+ 'Vendeur en épicerie',
+ 'Verrier d\'art',
+ 'Verrier à la calotte',
+ 'Verrier à la main',
+ 'Verrier à main levée',
+ 'Vidéo-jockey',
+ 'Vitrier',
+ );
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Payment.php
index 5316876a..d436dfe3 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Payment.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Payment.php
@@ -4,6 +4,31 @@ namespace Faker\Provider\fr_FR;
class Payment extends \Faker\Provider\Payment
{
+ /**
+ * Value Added Tax (VAT)
+ *
+ * @example 'FR12123456789', ('spaced') 'FR 12 123 456 789'
+ *
+ * @see http://ec.europa.eu/taxation_customs/vies/faq.html?locale=en#item_11
+ * @see http://www.iecomputersystems.com/ordering/eu_vat_numbers.htm
+ * @see http://en.wikipedia.org/wiki/VAT_identification_number
+ *
+ * @param bool $spacedNationalPrefix
+ *
+ * @return string VAT Number
+ */
+ public function vat($spacedNationalPrefix = true)
+ {
+ $siren = Company::siren(false);
+ $key = (12 + 3 * ($siren % 97)) % 97;
+ $pattern = "%s%'.02d%s";
+ if ($spacedNationalPrefix) {
+ $siren = trim(chunk_split($siren, 3, ' '));
+ $pattern = "%s %'.02d %s";
+ }
+ return sprintf($pattern, 'FR', $key, $siren);
+ }
+
/**
* International Bank Account Number (IBAN)
* @link http://en.wikipedia.org/wiki/International_Bank_Account_Number
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php
index 1907f5f0..5778a7c0 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/Person.php
@@ -67,4 +67,63 @@ class Person extends \Faker\Provider\Person
{
return static::randomElement(static::$prefix);
}
+
+ /**
+ * Generates a NIR / Sécurité Sociale number (13 digits + 2 digits for the key)
+ *
+ * @see https://fr.wikipedia.org/wiki/Num%C3%A9ro_de_s%C3%A9curit%C3%A9_sociale_en_France
+ * @return string
+ */
+ public function nir($gender = null, $formatted = false)
+ {
+ // Gender
+ if ($gender === static::GENDER_MALE) {
+ $nir = 1;
+ } elseif ($gender === static::GENDER_FEMALE) {
+ $nir = 2;
+ } else {
+ $nir = $this->numberBetween(1, 2);
+ }
+
+ $nir .=
+ // Year of birth (aa)
+ $this->numerify('##') .
+ // Mont of birth (mm)
+ sprintf('%02d', $this->numberBetween(1, 12));
+
+ // Department
+ $department = key(Address::department());
+ $nir .= $department;
+
+ // Town number, depends on department length
+ if (strlen($department) === 2) {
+ $nir .= $this->numerify('###');
+ } elseif (strlen($department) === 3) {
+ $nir .= $this->numerify('##');
+ }
+
+ // Born number (depending of town and month of birth)
+ $nir .= $this->numerify('###');
+
+ /**
+ * The key for a given NIR is `97 - 97 % NIR`
+ * NIR has to be an integer, so we have to do a little replacment
+ * for departments 2A and 2B
+ */
+ if ($department === '2A') {
+ $nirInteger = str_replace('2A', '19', $nir);
+ } elseif ($department === '2B') {
+ $nirInteger = str_replace('2B', '18', $nir);
+ } else {
+ $nirInteger = $nir;
+ }
+ $nir .= sprintf('%02d', 97 - $nirInteger % 97);
+
+ // Format is x xx xx xx xxx xxx xx
+ if ($formatted) {
+ $nir = substr($nir, 0, 1) . ' ' . substr($nir, 1, 2) . ' ' . substr($nir, 3, 2) . ' ' . substr($nir, 5, 2) . ' ' . substr($nir, 7, 3). ' ' . substr($nir, 10, 3). ' ' . substr($nir, 13, 2);
+ }
+
+ return $nir;
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php
index c7c9f9eb..7c0bd9d5 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/fr_FR/PhoneNumber.php
@@ -14,8 +14,8 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
'+33 (0)4 ## ## ## ##',
'+33 (0)5 ## ## ## ##',
'+33 (0)6 ## ## ## ##',
- '+33 (0)7 ## ## ## ##',
- '+33 (0)8 ## ## ## ##',
+ '+33 (0)7 {{phoneNumber07WithSeparator}}',
+ '+33 (0)8 {{phoneNumber08WithSeparator}}',
'+33 (0)9 ## ## ## ##',
'+33 1 ## ## ## ##',
'+33 1 ## ## ## ##',
@@ -24,8 +24,8 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
'+33 4 ## ## ## ##',
'+33 5 ## ## ## ##',
'+33 6 ## ## ## ##',
- '+33 7 ## ## ## ##',
- '+33 8 ## ## ## ##',
+ '+33 7 {{phoneNumber07WithSeparator}}',
+ '+33 8 {{phoneNumber08WithSeparator}}',
'+33 9 ## ## ## ##',
'01########',
'01########',
@@ -34,8 +34,8 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
'04########',
'05########',
'06########',
- '07########',
- '08########',
+ '07{{phoneNumber07}}',
+ '08{{phoneNumber08}}',
'09########',
'01 ## ## ## ##',
'01 ## ## ## ##',
@@ -44,27 +44,98 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
'04 ## ## ## ##',
'05 ## ## ## ##',
'06 ## ## ## ##',
- '07 ## ## ## ##',
- '08 ## ## ## ##',
+ '07 {{phoneNumber07WithSeparator}}',
+ '08 {{phoneNumber08WithSeparator}}',
'09 ## ## ## ##',
);
// Mobile phone numbers start by 06 and 07
// 06 is the most common prefix
protected static $mobileFormats = array(
+ '+33 (0)6 ## ## ## ##',
'+33 6 ## ## ## ##',
- '+33 7 ## ## ## ##',
+ '+33 (0)7 {{phoneNumber07WithSeparator}}',
+ '+33 7 {{phoneNumber07WithSeparator}}',
'06########',
- '07########',
+ '07{{phoneNumber07}}',
'06 ## ## ## ##',
- '07 ## ## ## ##',
+ '07 {{phoneNumber07WithSeparator}}',
);
+ protected static $serviceFormats = array(
+ '+33 (0)8 {{phoneNumber08WithSeparator}}',
+ '+33 8 {{phoneNumber08WithSeparator}}',
+ '08 {{phoneNumber08WithSeparator}}',
+ '08{{phoneNumber08}}',
+ );
+
+ public function phoneNumber07()
+ {
+ $phoneNumber = $this->phoneNumber07WithSeparator();
+ $phoneNumber = str_replace(' ', '', $phoneNumber);
+ return $phoneNumber;
+ }
+
+ /**
+ * Only 073 to 079 are acceptable prefixes with 07
+ *
+ * @see http://www.arcep.fr/index.php?id=8146
+ */
+ public function phoneNumber07WithSeparator()
+ {
+ $phoneNumber = $this->generator->numberBetween(3, 9);
+ $phoneNumber .= $this->numerify('# ## ## ##');
+ return $phoneNumber;
+ }
+
+ public function phoneNumber08()
+ {
+ $phoneNumber = $this->phoneNumber08WithSeparator();
+ $phoneNumber = str_replace(' ', '', $phoneNumber);
+ return $phoneNumber;
+ }
+
+ /**
+ * Valid formats for 08:
+ *
+ * 0# ## ## ##
+ * 1# ## ## ##
+ * 2# ## ## ##
+ * 91 ## ## ##
+ * 92 ## ## ##
+ * 93 ## ## ##
+ * 97 ## ## ##
+ * 98 ## ## ##
+ * 99 ## ## ##
+ *
+ * Formats 089(4|6)## ## ## are valid, but will be
+ * attributed when other 089 resource ranges are exhausted.
+ *
+ * @see https://www.arcep.fr/index.php?id=8146#c9625
+ * @see https://issuetracker.google.com/u/1/issues/73269839
+ */
+ public function phoneNumber08WithSeparator()
+ {
+ $regex = '([012]{1}\d{1}|(9[1-357-9])( \d{2}){3}';
+ return $this->regexify($regex);
+ }
+
/**
* @example '0601020304'
*/
- public static function mobileNumber()
+ public function mobileNumber()
{
- return static::numerify(static::randomElement(static::$mobileFormats));
+ $format = static::randomElement(static::$mobileFormats);
+
+ return static::numerify($this->generator->parse($format));
+ }
+ /**
+ * @example '0891951357'
+ */
+ public function serviceNumber()
+ {
+ $format = static::randomElement(static::$serviceFormats);
+
+ return static::numerify($this->generator->parse($format));
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/he_IL/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/he_IL/Address.php
new file mode 100644
index 00000000..6cd9d2e9
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/he_IL/Address.php
@@ -0,0 +1,122 @@
+ static::latitude(46.262740, 47.564721),
+ 'longitude' => static::longitude(17.077949, 20.604560)
+ );
+ }
+
+ /* ----------- DATA -------------------- */
+
+ protected static $streetSuffix = array(
+ 'árok', 'átjáró', 'dűlősor', 'dűlőút', 'erdősor', 'fasor', 'forduló', 'gát', 'határsor', 'határút', 'híd', 'játszótér', 'kert', 'körönd', 'körtér', 'körút', 'köz', 'lakótelep', 'lejáró', 'lejtő', 'lépcső', 'liget', 'mélyút', 'orom', 'országút', 'ösvény', 'park', 'part', 'pincesor', 'rakpart', 'sétány', 'sétaút', 'sor', 'sugárút', 'tér', 'tere', 'turistaút', 'udvar', 'út', 'útja', 'utca', 'üdülőpart'
+ );
+ protected static $postcode = array('####');
+ protected static $state = array(
+ 'Budapest', 'Bács-Kiskun', 'Baranya', 'Békés', 'Borsod-Abaúj-Zemplén', 'Csongrád', 'Fejér', 'Győr-Moson-Sopron', 'Hajdú-Bihar', 'Heves', 'Jász-Nagykun-Szolnok', 'Komárom-Esztergom', 'Nógrád', 'Pest', 'Somogy', 'Szabolcs-Szatmár-Bereg', 'Tolna', 'Vas', 'Veszprém', 'Zala'
+ );
+ protected static $country = array(
+ 'Afganisztán', 'Albánia', 'Algéria', 'Amerikai Egyesült Államok', 'Andorra', 'Angola', 'Antigua és Barbuda', 'Argentína', 'Ausztria', 'Ausztrália', 'Azerbajdzsán',
+ 'Bahama-szigetek', 'Bahrein', 'Banglades', 'Barbados', 'Belgium', 'Belize', 'Benin', 'Bhután', 'Bolívia', 'Bosznia-Hercegovina', 'Botswana', 'Brazília', 'Brunei', 'Bulgária', 'Burkina Faso', 'Burma', 'Burundi',
+ 'Chile', 'Ciprus', 'Costa Rica', 'Csehország', 'Csád',
+ 'Dominikai Köztársaság', 'Dominikai Közösség', 'Dzsibuti', 'Dánia', 'Dél-Afrika', 'Dél-Korea', 'Dél-Szudán',
+ 'Ecuador', 'Egyenlítői-Guinea', 'Egyesült Arab Emírségek', 'Egyesült Királyság', 'Egyiptom', 'Elefántcsontpart', 'Eritrea', 'Etiópia',
+ 'Fehéroroszország', 'Fidzsi-szigetek', 'Finnország', 'Franciaország', 'Fülöp-szigetek',
+ 'Gabon', 'Gambia', 'Ghána', 'Grenada', 'Grúzia', 'Guatemala', 'Guinea', 'Guyana', 'Görögország',
+ 'Haiti', 'Hollandia', 'Horvátország',
+ 'India', 'Indonézia', 'Irak', 'Irán', 'Izland', 'Izrael',
+ 'Japán', 'Jemen', 'Jordánia',
+ 'Kambodzsa', 'Kamerun', 'Kanada', 'Katar', 'Kazahsztán', 'Kelet-Timor', 'Kenya', 'Kirgizisztán', 'Kiribati', 'Kolumbia', 'Kongói Demokratikus Köztársaság', 'Kongói Köztársaság', 'Kuba', 'Kuvait', 'Kína', 'Közép-Afrika',
+ 'Laosz', 'Lengyelország', 'Lesotho', 'Lettország', 'Libanon', 'Libéria', 'Liechtenstein', 'Litvánia', 'Luxemburg', 'Líbia',
+ 'Macedónia', 'Madagaszkár', 'Magyarország', 'Malawi', 'Maldív-szigetek', 'Mali', 'Malájzia', 'Marokkó', 'Marshall-szigetek', 'Mauritánia', 'Mexikó', 'Mikronézia', 'Moldova', 'Monaco', 'Mongólia', 'Montenegró', 'Mozambik', 'Málta',
+ 'Namíbia', 'Nauru', 'Nepál', 'Nicaragua', 'Niger', 'Nigéria', 'Norvégia', 'Németország',
+ 'Olaszország', 'Omán', 'Oroszország',
+ 'Pakisztán', 'Palau', 'Panama', 'Paraguay', 'Peru', 'Portugália', 'Pápua Új-Guinea',
+ 'Románia', 'Ruanda',
+ 'Saint Kitts és Nevis', 'Saint Vincent', 'Salamon-szigetek', 'Salvador', 'San Marino', 'Seychelle-szigetek', 'Spanyolország', 'Srí Lanka', 'Suriname', 'Svájc', 'Svédország', 'Szamoa', 'Szaúd-Arábia', 'Szenegál', 'Szerbia', 'Szingapúr', 'Szlovákia', 'Szlovénia', 'Szomália', 'Szudán', 'Szváziföld', 'Szíria', 'São Tomé és Príncipe',
+ 'Tadzsikisztán', 'Tanzánia', 'Thaiföld', 'Togo', 'Tonga', 'Trinidad és Tobago', 'Tunézia', 'Tuvalu', 'Törökország', 'Türkmenisztán',
+ 'Uganda', 'Ukrajna', 'Uruguay',
+ 'Vanuatu', 'Venezuela', 'Vietnám',
+ 'Zambia', 'Zimbabwe', 'Zöld-foki-szigetek',
+ 'Észak-Korea', 'Észtország', 'Írország', 'Örményország', 'Új-Zéland', 'Üzbegisztán'
+ );
+
+ /**
+ * Source: https://hu.wikipedia.org/wiki/Magyarorsz%C3%A1g_v%C3%A1rosainak_list%C3%A1ja
+ */
+ protected static $capitals = array('Budapest');
+ protected static $bigCities = array(
+ 'Békéscsaba', 'Debrecen', 'Dunaújváros', 'Eger', 'Érd', 'Győr', 'Hódmezővásárhely', 'Kaposvár', 'Kecskemét', 'Miskolc', 'Nagykanizsa', 'Nyíregyháza', 'Pécs', 'Salgótarján', 'Sopron', 'Szeged', 'Székesfehérvár', 'Szekszárd', 'Szolnok', 'Szombathely', 'Tatabánya', 'Veszprém', 'Zalaegerszeg'
+ );
+ protected static $smallerCities = array(
+ 'Ajka', 'Aszód', 'Bácsalmás',
+ 'Baja', 'Baktalórántháza', 'Balassagyarmat', 'Balatonalmádi', 'Balatonfüred', 'Balmazújváros', 'Barcs', 'Bátonyterenye', 'Békés', 'Bélapátfalva', 'Berettyóújfalu', 'Bicske', 'Bóly', 'Bonyhád', 'Budakeszi',
+ 'Cegléd', 'Celldömölk', 'Cigánd', 'Csenger', 'Csongrád', 'Csorna', 'Csurgó',
+ 'Dabas', 'Derecske', 'Devecser', 'Dombóvár', 'Dunakeszi',
+ 'Edelény', 'Encs', 'Enying', 'Esztergom',
+ 'Fehérgyarmat', 'Fonyód', 'Füzesabony',
+ 'Gárdony', 'Gödöllő', 'Gönc', 'Gyál', 'Gyomaendrőd', 'Gyöngyös', 'Gyula',
+ 'Hajdúböszörmény', 'Hajdúhadház', 'Hajdúnánás', 'Hajdúszoboszló', 'Hatvan', 'Heves',
+ 'Ibrány',
+ 'Jánoshalma', 'Jászapáti', 'Jászberény',
+ 'Kalocsa', 'Kapuvár', 'Karcag', 'Kazincbarcika', 'Kemecse', 'Keszthely', 'Kisbér', 'Kiskőrös', 'Kiskunfélegyháza', 'Kiskunhalas', 'Kiskunmajsa', 'Kistelek', 'Kisvárda', 'Komárom', 'Komló', 'Körmend', 'Kőszeg', 'Kunhegyes', 'Kunszentmárton', 'Kunszentmiklós',
+ 'Lenti', 'Letenye',
+ 'Makó', 'Marcali', 'Martonvásár', 'Mátészalka', 'Mezőcsát', 'Mezőkovácsháza', 'Mezőkövesd', 'Mezőtúr', 'Mohács', 'Monor', 'Mór', 'Mórahalom', 'Mosonmagyaróvár',
+ 'Nagyatád', 'Nagykálló', 'Nagykáta', 'Nagykőrös', 'Nyíradony', 'Nyírbátor',
+ 'Orosháza', 'Oroszlány', 'Ózd',
+ 'Paks', 'Pannonhalma', 'Pápa', 'Pásztó', 'Pécsvárad', 'Pétervására', 'Pilisvörösvár', 'Polgárdi', 'Püspökladány', 'Putnok',
+ 'Ráckeve', 'Rétság',
+ 'Sárbogárd', 'Sarkad', 'Sárospatak', 'Sárvár', 'Sásd', 'Sátoraljaújhely', 'Sellye', 'Siklós', 'Siófok', 'Sümeg', 'Szarvas', 'Szécsény', 'Szeghalom', 'Szentendre', 'Szentes', 'Szentgotthárd', 'Szentlőrinc', 'Szerencs', 'Szigetszentmiklós', 'Szigetvár', 'Szikszó', 'Szob',
+ 'Tab', 'Tamási', 'Tapolca', 'Tata', 'Tét', 'Tiszafüred', 'Tiszakécske', 'Tiszaújváros', 'Tiszavasvári', 'Tokaj', 'Tolna', 'Törökszentmiklós',
+ 'Vác', 'Várpalota', 'Vásárosnamény', 'Vasvár', 'Vecsés',
+ 'Záhony', 'Zalaszentgrót', 'Zirc'
+ );
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Payment.php
new file mode 100644
index 00000000..e2fdced5
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Payment.php
@@ -0,0 +1,19 @@
+generator->parse(static::randomElement(static::$formats)));
+ }
+
+ public function code()
+ {
+ return static::randomElement(static::$codes);
+ }
+
+ /**
+ * @return mixed
+ */
+ public function numberFormat()
+ {
+ return static::randomElement(static::$numberFormats);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/id_ID/Color.php b/vendor/fzaninotto/faker/src/Faker/Provider/id_ID/Color.php
new file mode 100644
index 00000000..bb1444da
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/id_ID/Color.php
@@ -0,0 +1,41 @@
+birthPlaceCode();
+ $nik .= $this->generator->numerify('##');
+
+ if (!$birthDate) {
+ $birthDate = $this->generator->dateTimeBetween();
+ }
+
+ if (!$gender) {
+ $gender = $this->generator->randomElement(array(self::GENDER_MALE, self::GENDER_FEMALE));
+ }
+
+ # if gender is female, add 40 to days
+ if ($gender == self::GENDER_FEMALE) {
+ $nik .= $birthDate->format('d') + 40;
+ } else {
+ $nik .= $birthDate->format('d');
+ }
+
+ $nik .= $birthDate->format('my');
+
+ # add last random digits
+ $nik .= $this->generator->numerify('####');
+
+ return $nik;
+ }
+
+ /**
+ * Generates birth place code for NIK
+ *
+ * @link https://id.wikipedia.org/wiki/Nomor_Induk_Kependudukan
+ * @link http://informasipedia.com/wilayah-indonesia/daftar-kabupaten-kota-di-indonesia/
+ */
+ protected function birthPlaceCode()
+ {
+ return static::randomElement(static::$birthPlaceCode);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php
index 1b4d5649..0fdea683 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/is_IS/Person.php
@@ -78,7 +78,7 @@ class Person extends \Faker\Provider\Person
*/
public function lastNameMale()
{
- return $this->lastName().'dóttir';
+ return $this->lastName().'son';
}
/**
@@ -88,7 +88,7 @@ class Person extends \Faker\Provider\Person
*/
public function lastNameFemale()
{
- return $this->lastName().'son';
+ return $this->lastName().'dóttir';
}
/**
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Address.php
new file mode 100644
index 00000000..1eee3b6d
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Address.php
@@ -0,0 +1,139 @@
+ 'Argovia'),
+ array('AI' => 'Appenzello Interno'),
+ array('AR' => 'Appenzello Esterno'),
+ array('BE' => 'Berna'),
+ array('BL' => 'Basilea Campagna'),
+ array('BS' => 'Basilea Città'),
+ array('FR' => 'Friburgo'),
+ array('GE' => 'Ginevra'),
+ array('GL' => 'Glarona'),
+ array('GR' => 'Grigioni'),
+ array('JU' => 'Giura'),
+ array('LU' => 'Lucerna'),
+ array('NE' => 'Neuchâtel'),
+ array('NW' => 'Nidvaldo'),
+ array('OW' => 'Obvaldo'),
+ array('SG' => 'San Gallo'),
+ array('SH' => 'Sciaffusa'),
+ array('SO' => 'Soletta'),
+ array('SZ' => 'Svitto'),
+ array('TG' => 'Turgovia'),
+ array('TI' => 'Ticino'),
+ array('UR' => 'Uri'),
+ array('VD' => 'Vaud'),
+ array('VS' => 'Vallese'),
+ array('ZG' => 'Zugo'),
+ array('ZH' => 'Zurigo')
+ );
+
+ protected static $cityFormats = array(
+ '{{cityName}}',
+ );
+
+ protected static $streetNameFormats = array(
+ '{{streetSuffix}} {{firstName}}',
+ '{{streetSuffix}} {{lastName}}'
+ );
+
+ protected static $streetAddressFormats = array(
+ '{{streetName}} {{buildingNumber}}',
+ );
+ protected static $addressFormats = array(
+ "{{streetAddress}}\n{{postcode}} {{city}}",
+ );
+
+ /**
+ * Returns a random street prefix
+ * @example Via
+ * @return string
+ */
+ public static function streetPrefix()
+ {
+ return static::randomElement(static::$streetPrefix);
+ }
+
+ /**
+ * Returns a random city name.
+ * @example Luzern
+ * @return string
+ */
+ public function cityName()
+ {
+ return static::randomElement(static::$cityNames);
+ }
+
+ /**
+ * Returns a canton
+ * @example array('BE' => 'Bern')
+ * @return array
+ */
+ public static function canton()
+ {
+ return static::randomElement(static::$canton);
+ }
+
+ /**
+ * Returns the abbreviation of a canton.
+ * @return string
+ */
+ public static function cantonShort()
+ {
+ $canton = static::canton();
+ return key($canton);
+ }
+
+ /**
+ * Returns the name of canton.
+ * @return string
+ */
+ public static function cantonName()
+ {
+ $canton = static::canton();
+ return current($canton);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Company.php
new file mode 100644
index 00000000..9a42b1c3
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/it_CH/Company.php
@@ -0,0 +1,15 @@
+generator->parse($format);
}
/**
- * @example 'アオタ'
+ * @param string|null $gender 'male', 'female' or null for any
+ * @return string
+ * @example 'アキラ'
*/
- public static function firstKanaName()
+ public function firstKanaName($gender = null)
{
- return static::randomElement(static::$firstKanaName);
+ if ($gender === static::GENDER_MALE) {
+ return static::firstKanaNameMale();
+ } elseif ($gender === static::GENDER_FEMALE) {
+ return static::firstKanaNameFemale();
+ }
+
+ return $this->generator->parse(static::randomElement(static::$firstKanaNameFormat));
}
/**
* @example 'アキラ'
*/
+ public static function firstKanaNameMale()
+ {
+ return static::randomElement(static::$firstKanaNameMale);
+ }
+
+ /**
+ * @example 'アケミ'
+ */
+ public static function firstKanaNameFemale()
+ {
+ return static::randomElement(static::$firstKanaNameFemale);
+ }
+
+ /**
+ * @example 'アオタ'
+ */
public static function lastKanaName()
{
return static::randomElement(static::$lastKanaName);
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php
index f4230d1b..9f03c565 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/PhoneNumber.php
@@ -4,9 +4,16 @@ namespace Faker\Provider\ja_JP;
class PhoneNumber extends \Faker\Provider\PhoneNumber
{
+ /**
+ * @link http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/number_shitei.html#kotei-denwa
+ */
protected static $formats = array(
'080-####-####',
'090-####-####',
- '##-####-####'
+ '0#-####-####',
+ '0####-#-####',
+ '0###-##-####',
+ '0##-###-####',
+ '0##0-###-###',
);
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/Text.php
new file mode 100644
index 00000000..c8671cc0
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ja_JP/Text.php
@@ -0,0 +1,635 @@
+generator->parse($format);
+ }
+
+ public static function companyPrefix()
+ {
+ return static::randomElement(static::$companyPrefixes);
+ }
+
+ public static function companyNameElement()
+ {
+ return static::randomElement(static::$companyElements);
+ }
+
+ public static function companyNameSuffix()
+ {
+ return static::randomElement(static::$companyNameSuffixes);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/DateTime.php b/vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/DateTime.php
new file mode 100644
index 00000000..1a1a4dd4
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/DateTime.php
@@ -0,0 +1,42 @@
+ 'კვირა',
+ 'Monday' => 'ორშაბათი',
+ 'Tuesday' => 'სამშაბათი',
+ 'Wednesday' => 'ოთხშაბათი',
+ 'Thursday' => 'ხუთშაბათი',
+ 'Friday' => 'პარასკევი',
+ 'Saturday' => 'შაბათი',
+ );
+ $week = static::dateTime($max)->format('l');
+ return isset($map[$week]) ? $map[$week] : $week;
+ }
+
+ public static function monthName($max = 'now')
+ {
+ $map = array(
+ 'January' => 'იანვარი',
+ 'February' => 'თებერვალი',
+ 'March' => 'მარტი',
+ 'April' => 'აპრილი',
+ 'May' => 'მაისი',
+ 'June' => 'ივნისი',
+ 'July' => 'ივლისი',
+ 'August' => 'აგვისტო',
+ 'September' => 'სექტემბერი',
+ 'October' => 'ოქტომბერი',
+ 'November' => 'ნოემბერი',
+ 'December' => 'დეკემბერი',
+ );
+ $month = static::dateTime($max)->format('F');
+ return isset($map[$month]) ? $map[$month] : $month;
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Internet.php
new file mode 100644
index 00000000..01b15c77
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ka_GE/Internet.php
@@ -0,0 +1,15 @@
+generator->parse($format);
- }
-
- public static function country()
- {
- return static::randomElement(static::$country);
- }
-
- public static function postcode()
- {
- return static::toUpper(static::bothify(static::randomElement(static::$postcode)));
- }
-
public static function regionSuffix()
{
return static::randomElement(static::$regionSuffix);
@@ -109,21 +93,11 @@ class Address extends \Faker\Provider\Address
return static::randomElement(static::$region);
}
- public static function citySuffix()
- {
- return static::randomElement(static::$citySuffix);
- }
-
public function city()
{
return static::randomElement(static::$city);
}
- public static function streetSuffix()
- {
- return static::randomElement(static::$streetSuffix);
- }
-
public static function street()
{
return static::randomElement(static::$street);
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Company.php
index 56b002a3..f8f8d159 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Company.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Company.php
@@ -52,7 +52,7 @@ class Company extends \Faker\Provider\Company
/**
* National Business Identification Numbers
*
- * @link http://egov.kz/wps/portal/!utWCM/p/b1/04_Sj9Q1MjAwsDQ1s9CP0I_KSyzLTE8syczPS8wB8aPM4oO8PE2cnAwdDSxMw4wMHE08nZ2CA0KDXcwMgQoikRUYWIY4gxS4hwU4mRkbGBgTp98AB3A0IKQ_XD8KVQkWF4AV4LHCzyM_N1U_uKhUPzcqx83SU9cRANth_Rk!/dl4/d5/L0lHSkovd0RNQU5rQUVnQSEhLzRKVUUvZW4!/
+ * @link http://egov.kz/wps/portal/Content?contentPath=%2Fegovcontent%2Fbus_business%2Ffor_businessmen%2Farticle%2Fbusiness_identification_number&lang=en
* @param \DateTime $registrationDate
* @return string 12 digits, like 150140000019
*/
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Payment.php
index 56285b39..ab7f20e0 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Payment.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Payment.php
@@ -17,4 +17,17 @@ class Payment extends \Faker\Provider\Payment
{
return static::randomElement(static::$banks);
}
+
+ /**
+ * International Bank Account Number (IBAN)
+ * @link http://en.wikipedia.org/wiki/International_Bank_Account_Number
+ * @param string $prefix for generating bank account number of a specific bank
+ * @param string $countryCode ISO 3166-1 alpha-2 country code
+ * @param integer $length total length without country code and 2 check digits
+ * @return string
+ */
+ public static function bankAccountNumber($prefix = '', $countryCode = 'KZ', $length = null)
+ {
+ return static::iban($countryCode, $prefix, $length);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Person.php
index 3eca4a5c..4e1e6811 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/kk_KZ/Person.php
@@ -2,9 +2,52 @@
namespace Faker\Provider\kk_KZ;
+use \Faker\Provider\DateTime;
+
class Person extends \Faker\Provider\Person
{
+ const GENDER_MALE = 0;
+ const GENDER_FEMALE = 1;
+
+ const CENTURY_19TH = 0;
+ const CENTURY_20TH = 1;
+ const CENTURY_21ST = 2;
+
+ const MALE_CENTURY_19TH = 1;
+ const MALE_CENTURY_20TH = 3;
+ const MALE_CENTURY_21ST = 5;
+
+ const FEMALE_CENTURY_19TH = 2;
+ const FEMALE_CENTURY_20TH = 4;
+ const FEMALE_CENTURY_21ST = 6;
+
+ /**
+ * @var array
+ */
+ public static $firstSequenceBitWeights = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
+
+ /**
+ * @var array
+ */
+ public static $secondSequenceBitWeights = array(3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 2);
+
+ /**
+ * @var array
+ */
+ public static $genderCenturyMap = array(
+ self::GENDER_MALE => array(
+ self::CENTURY_19TH => self::MALE_CENTURY_19TH,
+ self::CENTURY_20TH => self::MALE_CENTURY_20TH,
+ self::CENTURY_21ST => self::MALE_CENTURY_21ST,
+ ),
+ self::GENDER_FEMALE => array(
+ self::CENTURY_19TH => self::FEMALE_CENTURY_19TH,
+ self::CENTURY_20TH => self::FEMALE_CENTURY_20TH,
+ self::CENTURY_21ST => self::FEMALE_CENTURY_21ST,
+ ),
+ );
+
/**
* @see https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D0%B7%D0%B0%D1%85%D1%81%D0%BA%D0%B0%D1%8F_%D1%84%D0%B0%D0%BC%D0%B8%D0%BB%D0%B8%D1%8F
*
@@ -133,23 +176,82 @@ class Person extends \Faker\Provider\Person
'Ісмет',
);
+ /**
+ * @param integer $year
+ *
+ * @return integer|null
+ */
+ private static function getCenturyByYear($year)
+ {
+ if ($year >= 2000 && $year <= DateTime::year()) {
+ return self::CENTURY_21ST;
+ } elseif ($year >= 1900) {
+ return self::CENTURY_20TH;
+ } elseif ($year >= 1800) {
+ return self::CENTURY_19TH;
+ }
+ }
+
/**
* National Individual Identification Numbers
*
- * @link http://egov.kz/wps/portal/!utWCM/p/b1/04_Sj9S1tDAwMzY1NjLTj9CPykssy0xPLMnMz0vMAfGjzOKDvDxNnJwMHQ0sTMOMDBxNPJ2dggNCg13MDIEKIpEVGFiGOIMUuIcFOJkZGxgYE6ffAAdwNCCkP1w_ClUJFheAFeCxws8jPzdVPzcqx83SU9cRADxWbyg!/dl4/d5/L0lDUmlTUSEhL3dHa0FKRnNBLzRKVXFDQSEhL2Vu/
+ * @link http://egov.kz/wps/portal/Content?contentPath=%2Fegovcontent%2Fcitizen_migration%2Fpassport_id_card%2Farticle%2Fiin_info&lang=en
+ * @link https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B4%D0%B8%D0%B2%D0%B8%D0%B4%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B8%D0%B4%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80
+ *
* @param \DateTime $birthDate
+ * @param integer $gender
+ *
* @return string 12 digits, like 780322300455
*/
- public static function individualIdentificationNumber(\DateTime $birthDate = null)
+ public static function individualIdentificationNumber(\DateTime $birthDate = null, $gender = self::GENDER_MALE)
{
if (!$birthDate) {
- $birthDate = \Faker\Provider\DateTime::dateTimeBetween();
+ $birthDate = DateTime::dateTimeBetween();
}
- $dateAsString = $birthDate->format('ymd');
- $genderAndCenturyId = (string) static::numberBetween(1, 6);
- $randomDigits = (string) static::numerify('#####');
+ do {
+ $population = mt_rand(1000, 2000);
+ $century = self::getCenturyByYear((int) $birthDate->format('Y'));
- return $dateAsString . $genderAndCenturyId . $randomDigits;
+ $iin = $birthDate->format('ymd');
+ $iin .= (string) self::$genderCenturyMap[$gender][$century];
+ $iin .= (string) $population;
+ $checksum = self::checkSum($iin);
+ } while ($checksum === 10);
+
+ return $iin . (string) $checksum;
+ }
+
+ /**
+ * @param string $iinValue
+ *
+ * @return integer
+ */
+ public static function checkSum($iinValue)
+ {
+ $controlDigit = self::getControlDigit($iinValue, self::$firstSequenceBitWeights);
+
+ if ($controlDigit === 10) {
+ return self::getControlDigit($iinValue, self::$secondSequenceBitWeights);
+ }
+
+ return $controlDigit;
+ }
+
+ /**
+ * @param string $iinValue
+ * @param array $sequence
+ *
+ * @return integer
+ */
+ protected static function getControlDigit($iinValue, $sequence)
+ {
+ $sum = 0;
+
+ for ($i = 0; $i <= 10; $i++) {
+ $sum += (int) $iinValue[$i] * $sequence[$i];
+ }
+
+ return $sum % 11;
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Address.php
index 1c1b7e7b..9b5398d9 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Address.php
@@ -4,7 +4,7 @@ namespace Faker\Provider\ko_KR;
class Address extends \Faker\Provider\Address
{
- protected static $postcode = array('###-###');
+ protected static $postcode = array('#####');
protected static $buildingNumber = array('####', '###');
protected static $metropolitanCity = array(
'서울특별시', '부산광역시', '대구광역시', '인천광역시', '광주광역시', '대전광역시', '울산광역시',
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php
index 48c00388..1c3dfb5a 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Internet.php
@@ -4,6 +4,83 @@ namespace Faker\Provider\ko_KR;
class Internet extends \Faker\Provider\Internet
{
- protected static $freeEmailDomain = array('gmail.com', 'yahoo.com', 'hotmail.com', 'gmail.co.kr', 'hotmail.co.kr');
- protected static $tld = array('com', 'com', 'com', 'com', 'com', 'biz', 'info', 'net', 'org', 'co.kr', 'kr');
+ protected static $userNameFormats = array(
+ '{{lastNameAscii}}.{{firstNameAscii}}', '{{firstNameAscii}}.{{lastNameAscii}}', '{{firstNameAscii}}##', '?{{lastNameAscii}}',
+ );
+
+ protected static $safeEmailTld = array(
+ 'com', 'kr', 'me', 'net', 'org',
+ );
+
+ protected static $tld = array(
+ 'biz', 'com', 'info', 'kr', 'net', 'org',
+ );
+
+ /**
+ * {@link} http://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%9D%B8%EA%B5%AC%EC%88%9C_%EC%84%B1%EC%94%A8_%EB%AA%A9%EB%A1%9D
+ */
+ protected static $lastNameAscii = array(
+ 'ahn', 'bae', 'baek', 'chang', 'cheon', 'cho', 'choi', 'chung', 'gang', 'go', 'gwak', 'gwon', 'ha', 'han',
+ 'heo', 'hong', 'hwang', 'jang', 'jeon', 'jo', 'jung', 'kang', 'kim', 'ko', 'kwak', 'kwon', 'lee', 'lim', 'moon',
+ 'nam', 'no', 'oh', 'park', 'ryu', 'seo', 'shim', 'shin', 'son', 'song', 'yang', 'yoon', 'yu',
+ );
+
+ /**
+ * {@link} http://ko.wikipedia.org/wiki/%ED%95%9C%EA%B5%AD%EC%9D%98_%EC%84%B1%EC%94%A8%EC%99%80_%EC%9D%B4%EB%A6%84#.EC.8B.9C.EB.8C.80.EB.B3.84_.EA.B0.80.EC.9E.A5_.ED.9D.94.ED.95.9C_.EC.9D.B4.EB.A6.84_10.EC.84.A0.28.E9.81.B8.29
+ */
+ protected static $firstNameAscii = array(
+ 'areum', 'arin', 'banhee', 'bom', 'bomi', 'bomin', 'boram', 'byungcheol', 'byungho', 'chaehyun', 'chaewon',
+ 'changyoung', 'daesoo', 'daesun', 'dayoung', 'dohyunn', 'dongha', 'donghyun', 'donghyun', 'dongyoon', 'doyoon',
+ 'doyoun', 'eunae', 'eunhee', 'eunhye', 'eunhyoung', 'eunji', 'eunjin', 'eunju', 'eunjung', 'eunkyoung', 'eunmi',
+ 'eunsang', 'eunseo', 'eunsung', 'eunteck', 'eunyoung', 'gangeun', 'ganghee', 'garam', 'geongeun', 'gunho',
+ 'gunwoo', 'haeun', 'hana', 'hanna', 'hayun', 'heekyoung', 'heewon', 'hojin', 'homin', 'hongsun', 'hyejin',
+ 'hyemin', 'hyena', 'hyerim', 'hyesuk', 'hyesun', 'hyeyoun', 'hyoil', 'hyojin', 'hyounjung', 'hyuksang',
+ 'hyungcheol', 'hyungmin', 'hyunji', 'hyunjong', 'hyunjoo', 'hyunjun', 'hyunkyu', 'hyunwoo', 'hyunyoung',
+ 'ingyu', 'inhwa', 'jaecheo', 'jaeho', 'jaehun', 'jaehyuk', 'jaehyun', 'jaeyeon', 'jaeyun', 'jia', 'jieun',
+ 'jihee', 'jihoo', 'jihoon', 'jihye', 'jihyeon', 'jimin', 'jina', 'jinhee', 'jinho', 'jinsoo', 'jinwoo', 'jisuk',
+ 'jisun', 'jiwon', 'jiwoo', 'jiye', 'jiyeon', 'jiyoung', 'jonghun', 'jongju', 'jongsoo', 'jughyung', 'juhee',
+ 'jumi', 'jumyoung', 'jun', 'junbum', 'jungeun', 'jungho', 'junghun', 'junghwa', 'jungmin', 'jungnam', 'jungran',
+ 'jungshik', 'jungsoo', 'jungsoo', 'jungwoong', 'junho', 'junhyuk', 'junhyung', 'junseo', 'junyoung', 'juwon',
+ 'juyeon', 'kisoo', 'kiyun', 'kubum', 'kwangsoo', 'kyungchoon', 'kyunghwan', 'kyungjoo', 'kyungseok', 'kyungsoo',
+ 'kyusan', 'mijung', 'mikyoung', 'mina', 'mincheol', 'minhee', 'minhwan', 'minhyoung', 'minjae', 'minji',
+ 'minjun', 'minseo', 'minseok', 'minsoo', 'minsung', 'mira', 'miran', 'miyoung', 'moonchang', 'moonyong',
+ 'myungho', 'myungshik', 'naeun', 'nahyoung', 'namho', 'namsoo', 'naree', 'naroo', 'nayun', 'nuree', 'saemi',
+ 'sangah', 'sangcheol', 'sangho', 'sanghun', 'sanghyun', 'sangjun', 'sangmyoung', 'sangsoo', 'sangsun',
+ 'sangwoo', 'sangwook', 'seoho', 'seohyeon', 'seojun', 'seoyeon', 'seoyoung', 'seoyun', 'seulki', 'seungho',
+ 'seunghyun', 'seungmin', 'sewon', 'sieun', 'sinae', 'siwoo', 'sojung', 'somin', 'soyoun', 'soyoung', 'subin',
+ 'sujin', 'sujung', 'sumin', 'sungeun', 'sunggon', 'sungho', 'sunghun', 'sunghyun', 'sungjin', 'sungmi',
+ 'sungmin', 'sungmin', 'sungryung', 'sungsoo', 'sunhang', 'sunho', 'sunjung', 'sunwoo', 'sunyoung', 'sunyup',
+ 'suran', 'suwon', 'suwon', 'suyoun', 'taehee', 'taeho', 'taehyun', 'wonhee', 'wonjin', 'wonjun', 'woojin',
+ 'yeji', 'yejin', 'yejun', 'yeojin', 'yeon', 'yewon', 'youngcheol', 'younggil', 'youngha', 'youngho', 'younghun',
+ 'younghwa', 'youngil', 'youngjin', 'youngjin', 'youngshik', 'youngsoo', 'youngtae', 'youngwhan', 'youngwhan',
+ 'younhee', 'younsun', 'yujin', 'yujung', 'yunkyoung', 'yunmi', 'yunseo', 'yunyoung', 'yuri'
+ );
+
+ public static function lastNameAscii()
+ {
+ return static::randomElement(static::$lastNameAscii);
+ }
+
+ public static function firstNameAscii()
+ {
+ return static::randomElement(static::$firstNameAscii);
+ }
+
+ /**
+ * @example 'gunwoo.gang'
+ */
+ public function userName()
+ {
+ $format = static::randomElement(static::$userNameFormats);
+
+ return static::bothify($this->generator->parse($format));
+ }
+
+ /**
+ * @example 'kim.kr'
+ */
+ public function domainName()
+ {
+ return static::randomElement(static::$lastNameAscii) . '.' . $this->tld();
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php
index 21bc22c8..92d858f5 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Person.php
@@ -46,7 +46,10 @@ class Person extends \Faker\Provider\Person
* {@link} http://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%9D%B8%EA%B5%AC%EC%88%9C_%EC%84%B1%EC%94%A8_%EB%AA%A9%EB%A1%9D
*/
protected static $lastName = array(
- '강', '고', '곽', '권', '김', '남', '노', '류', '문', '박', '배', '백', '서', '손', '송', '신', '심', '안', '양', '오',
- '유', '윤', '이', '임', '장', '전', '정', '조', '최', '하', '한', '허', '홍', '황',
+ '김', '이', '박', '최', '정', '강', '조', '윤', '장', '임', '오', '한', '신', '서', '권', '황', '안', '송', '류', '홍',
+ '전', '고', '문', '손', '양', '배', '조', '백', '허', '남', '심', '유', '노', '하', '전', '정', '곽', '성', '차', '유',
+ '구', '우', '주', '임', '나', '신', '민', '진', '지', '엄', '원', '채', '강', '천', '양', '공', '현', '방', '변', '함',
+ '노', '염', '여', '추', '변', '도', '석', '신', '소', '선', '주', '설', '방', '마', '정', '길', '위', '연', '표', '명',
+ '기', '금', '왕', '반', '옥', '육', '진', '인', '맹', '제', '탁', '모', '남궁', '여', '장', '어', '유', '국', '은', '편',
);
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php
index c1c0a2e9..6008bbf3 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/PhoneNumber.php
@@ -4,14 +4,39 @@ namespace Faker\Provider\ko_KR;
class PhoneNumber extends \Faker\Provider\PhoneNumber
{
+ //reference : https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%A0%84%ED%99%94%EB%B2%88%ED%98%B8_%EC%B2%B4%EA%B3%84
+
protected static $formats = array(
- '010-####-####',
+ //local area phone format
'070-####-####',
'02-####-####',
'03#-####-####',
'04#-####-####',
'05#-####-####',
'06#-####-####',
- '1588-####',
+
+ //cell phone format
+ '010-####-####',
+
+ //others: Intelligent Network(기간통신사업자)
+ '15##-####',
+ '16##-####',
+ '18##-####',
);
+
+ public function localAreaPhoneNumber()
+ {
+ $format = self::randomElement(array_slice(static::$formats, 0, 6));
+
+ return self::numerify($this->generator->parse($format));
+ }
+
+
+
+ public function cellPhoneNumber()
+ {
+ $format = self::randomElement(array_slice(static::$formats, 6, 1));
+
+ return self::numerify($this->generator->parse($format));
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Text.php
new file mode 100644
index 00000000..5f5148e5
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ko_KR/Text.php
@@ -0,0 +1,1723 @@
+에 나오는 요귀의 불빛 모양으로 푸르무레 하게 허공을 비추오. 동경의 불바다는 내 마음을 더욱 음침하게 하였소.
+이 때에 뒤에서,
+"모시모시(여보세요)."
+하는 소리가 들렸소. 그것은 흰 저고리를 입은 호텔 보이였소.
+"왜?"
+하고 나는 고개만 돌렸소.
+"손님이 오셨습니다."
+"손님?"
+하고 나는 보이에게로 한 걸음 가까이 갔소. 나를 찾을 손님이 어디 있나 하고 나는 놀란 것이오.
+"따님께서 오셨습니다. 방으로 모셨습니다."
+하고 보이는 들어가 버리고 말았소.
+"따님?"
+하고 나는 더욱 놀랐소. 순임이가 서울서 나를 따라왔나? 그것은 안 될 말이오. 순임이가 내 뒤를 따라 떠났더라도 아무리 빨리 와도 내일이 아니면 못 왔을 것이오. 그러면 누군가. 정임인가. 정임이가 병원에서 뛰어온 것인가.
+나는 두근거리는 가슴을 억지로 진정하면서 내 방문을 열었소.
+그것은 정임이었소. 정임은 내가 쓰다가 둔 편지를 보고 있다가 벌떡 일어나 내게 달려들어 안겨 버렸소. 나는 얼빠진 듯이 정임이가 하라는 대로 내버려두었소. 그 편지는 부치려고 쓴 것도 아닌데 그 편지를 정임이가 본 것이 안되었다고 생각하였소.
+형! 나를 책망하시오. 심히 부끄러운 말이지마는 나는 정임을 힘껏 껴안아 주고 싶었소. 나는 몇 번이나 정임의 등을 굽어 보면서 내 팔에 힘을 넣으려고 하였소. 정임은 심히 귀여웠소. 정임이가 그처럼 나를 사모하는 것이 심히 기뻤소. 나는 감정이 재우쳐서 눈이 안 보이고 정신이 몽롱하여짐을 깨달았소. 나는 아프고 쓰린 듯한 기쁨을 깨달았소. 영어로 엑스터시라든지, 한문으로 무아의 경지란 이런 것이 아닌가 하였소. 나는 사십 평생에 이러한 경험을 처음 한 것이오.
+형! 형이 아시다시피 나는 내 아내 이외에 젊은 여성에게 이렇게 안겨 본 일이 없소. 물론 안아 본 일도 없소.
+그러나 형! 나는 나를 눌렀소. 내 타오르는 애욕을 차디찬 이지의 입김으로 불어서 끄려고 애를 썼소.
+"글쎄 웬일이냐. 앓는 것이 이 밤중에 비를 맞고 왜 나온단 말이냐. 철없는 것 같으니."
+하고 나는 아버지의 위엄으로 정임의 두 어깨를 붙들어 암체어에 앉혔소. 그리고 나도 테이블을 하나 세워 두고 맞은편에 앉았소.
+정임은 부끄러운 듯이 두 손으로 낯을 가리우고 제 무릎에 엎드려 울기를 시작하오.
+정임은 누런 갈색의 외투를 입었소. 무엇을 타고 왔는지 모르지마는 구두에는 꽤 많이 물이 묻고 모자에는 빗방울 얼룩이 보이오.
+"네가 이러다가 다시 병이 더치면 어찌한단 말이냐. 아이가 왜 그렇게 철이 없니?"
+하고 나는 더욱 냉정한 어조로 책망하고 데스크 위에 놓인 내 편지 초를 집어 박박 찢어 버렸소. 종이 찢는 소리에 정임은 잠깐 고개를 들어서 처음에는 내 손을 보고 다음에는 내 얼굴을 보았소. 그러나 나는 모르는 체하고 도로 교의에 돌아와 앉아서 가만히 눈을 감았소. 그리고 도무지 흥분되지 아니한 모양을 꾸몄소.
+형! 어떻게나 힘드는 일이오? 참으면 참을수록 내 이빨이 마주 부딪고, 얼굴의 근육은 씰룩거리고 손은 불끈불끈 쥐어지오.
+"정말 내일 가세요?"
+하고 아마 오 분 동안이나 침묵을 지키다가 정임이가 고개를 들고 물었소.
+"그럼, 가야지."
+하고 나는 빙그레 웃어 보였소.
+"저도 데리고 가세요!"
+하는 정임의 말은 마치 서릿발이 날리는 칼날과 같았소. 나는 깜짝 놀라서 정임을 바라보았소. 그의 눈은 빛나고 입은 꼭 다물고 얼굴의 근육은 팽팽하게 켕겼소. 정임의 얼굴에는 찬바람이 도는 무서운 기운이 있었소.
+나는 즉각적으로 죽기를 결심한 여자의 모양이라고 생각하였소. 열정으로 불덩어리가 되었던 정임은 내가 보이는 냉랭한 태도로 말미암아 갑자기 얼어 버린 것 같았소.
+"어디를?"
+하고 나는 정임의 `저도 데리고 가세요.' 하는 담대한 말에 놀라면서 물었소.
+"어디든지, 아버지 가시는 데면 어디든지 저를 데리고 가세요. 저는 아버지를 떠나서는 혼자서는 못 살 것을 지나간 반 달 동안에 잘 알았습니다. 아까 아버지 오셨다 가신 뒤에 생각해 보니깐 암만해도 아버지는 다시 저에게 와 보시지 아니하고 가실 것만 같애요. 그리고 저로 해서 아버지께서는 무슨 큰 타격을 당하신 것만 같으셔요. 처음 뵈올 적에 벌써 가슴이 뜨끔했습니다. 그리고 여행을 떠나신다는 말씀을 듣고는 반드시 무슨 큰일이 나셨느니라고만 생각했습니다. 그리고 저어, 저로 해서 그러신 것만 같고, 저를 버리시고 혼자 가시려는 것만 같고, 그래서 달려왔더니 여기 써 놓으신 편지를 보고 그 편지에 다른 말씀은 어찌 됐든지, 네 일기를 보았다 하신 말씀을 보고는 다 알았습니다. 저와 한 방에 있는 애가 암만해도 어머니 스파인가봐요. 제가 입원하기 전에도 제 눈치를 슬슬 보고 또 책상 서랍도 뒤지는 눈치가 보이길래 일기책은 늘 쇠 잠그는 서랍에 넣어 두었는데 아마 제가 정신 없이 앓고 누웠는 동안에 제 핸드백에서 쇳대를 훔쳐 갔던가봐요. 그래서는 그 일기책을 꺼내서 서울로 보냈나봐요. 그걸루 해서 아버지께서는 불명예스러운 누명을 쓰시고 학교일도 내놓으시게 되고 집도 떠나시게 되셨나봐요. 다시는 집에 안 돌아오실 양으로 결심을 하셨나봐요. 아까 병원에서도 하시는 말씀이 모두 유언하시는 것만 같아서 퍽 의심을 가졌었는데 지금 그 쓰시던 편지를 보고는 다 알았습니다. 그렇지만 그렇지만."
+하고 웅변으로 내려 말하던 정임은 갑자기 복받치는 열정을 이기지 못하는 듯이, 한 번 한숨을 지우고,
+"그렇지만 저는 아버지를 따라가요. 절루 해서 아버지께서는 집도 잃으시고 명예도 잃으시고 사업도 잃으시고 인생의 모든 것을 다 잃으셨으니 저는 아버지를 따라가요. 어디를 가시든지 저는 어린 딸로 아버지를 따라다니다가 아버지께서 먼저 돌아가시면 저도 따라 죽어서 아버지 발 밑에 묻힐 테야요. 제가 먼저 죽거든 제가 병이 있으니깐 물론 제가 먼저 죽지요. 죽어도 좋습니다. 병원에서 앓다가 혼자 죽는 건 싫어요. 아버지 곁에서 죽으면 아버지께서, 오 내 딸 정임아 하시고 귀해 주시고 불쌍히 여겨 주시겠지요. 그리고 제 몸을 어디든지 땅에 묻으시고 `사랑하는 내 딸 정임의 무덤'이라고 패라도 손수 쓰셔서 세워 주시지 않겠습니까."
+하고 정임은 비쭉비쭉하다가 그만 무릎 위에 엎더져 울고 마오.
+나는 다만 죽은 사람 모양으로 반쯤 눈을 감고 앉아 있었소. 가슴 속에는 정임의 곁에서 지지 않는 열정을 품으면서도 정임의 말대로 정임을 데리고 아무도 모르는 곳으로 가 버리고 싶으면서도 나는 이 열정의 불길을 내 입김으로 꺼 버리지 아니하면 아니 되는 것이었소.
+"아아, 제가 왜 났어요? 왜 하나님께서 저를 세상에 보내셨어요? 아버지의 일생을 파멸시키려 난 것이지요? 제가 지금 죽어 버려서 아버지의 명예를 회복할 수 있다면 저는 죽어 버릴 터이야요. 기쁘게 죽어 버리겠습니다. 제가 여덟 살부터 오늘날까지 받은 은혜를 제 목숨 하나로 갚을 수가 있다면 저는 지금으로 죽어 버리겠습니다. 그렇지만 그렇지만…….
+그렇지만 그렇지만 저는 다만 얼마라도 다만 하루라도 아버지 곁에서 살고 싶어요 다만 하루만이라도, 아버지! 제가 왜 이렇습니까, 네? 제가 어려서 이렇습니까. 미친 년이 되어서 이렇습니까. 아버지께서는 아실 테니 말씀해 주세요. 하루만이라도 아버지를 모시고 아버지 곁에서 살았으면 죽어도 한이 없겠습니다. 제 생각이 잘못이야요? 제 생각이 죄야요? 왜 죄입니까? 아버지, 저를 버리시고 혼자 가시지 마세요, 네? `정임아, 너를 데리고 가마.' 하고 약속해 주세요, 네."
+정임은 아주 담대하게 제가 하고자 하는 말을 다 하오. 그 얌전한, 수삽한정임의 속에 어디 그러한 용기가 있었던가, 참 이상한 일이오. 나는 귀여운 어린 계집애 정임의 속에 엉큼한 여자가 들어앉은 것을 발견하였소. 그가 몇 가지 재료(내가 여행을 떠난다는 것과 제 일기를 보았다는 것)를 종합하여 나와 저와의 새에, 또 그 때문에 어떠한 일이 일어난 것을 추측하는 그 상상력도 놀랍거니와 그렇게 내 앞에서는 별로 입도 벌리지 아니하던 그가 이처럼 담대하게 제 속에 있는 말을 거리낌없이 다 해 버리는 용기를 아니 놀랄 수 없었소. 내가, 사내요 어른인 내가 도리어 정임에게 리드를 받고 놀림을 받음을 깨달았소.
+그러나 정임을 위해서든지, 중년 남자의 위신을 위해서든지 나는 의지력으로, 도덕력으로, 정임을 누르고 훈계하지 아니하면 아니 되겠다고 생각하였소.
+"정임아."
+하고 나는 비로소 입을 열어서 불렀소. 내 어성은 장중하였소. 나는 할 수 있는 위엄을 다하여 `정임아.' 하고 부른 것이오.
+"정임아, 네 속은 다 알았다. 네 마음 네 뜻은 그만하면 다 알았다. 네가 나를 그처럼 생각해 주는 것을 고맙게 생각한다. 기쁘게도 생각한다. 그러나 정임아."
+하고 나는 일층 태도와 소리를 엄숙하게 하여,
+"네가 청하는 말은 절대로 들을 수 없는 말이다. 내가 너를 친딸같이 사랑하기 때문에 나는 너를 데리고 가지 못하는 것이다. 나는 세상에서 죽고 조선에서 죽더라도 너는 죽어서 아니 된다. 차마 너까지는 죽이고 싶지 아니하단 말이다. 내가 어디 가서 없어져 버리면 세상은 네게 씌운 누명이 애매한 줄을 알게 될 것이 아니냐. 그리되면 너는 조선의 좋은 일꾼이 되어서 일도 많이 하고 또 사랑하는 남편을 맞아서 행복된 생활도 할 수 있을 것이 아니냐. 그것이 내가 네게 바라는 것이다. 내가 어디 가 있든지, 내가 살아 있는 동안 나는 네가 잘되는 것만, 행복되게 사는 것만 바라보고 혼자 기뻐할 것이 아니냐.
+네가 다 옳게 알았다. 나는 네 말대로 조선을 영원히 떠나기로 하였다. 그렇지마는 나는 이렇게 된 것을 조금도 슬퍼하지 아니한다. 너를 위해서 내가 무슨 희생을 한다고 하면 내게는 그것이 큰 기쁨이다. 그뿐 아니라, 나는 인제는 세상이 싫어졌다. 더 살기가 싫어졌다. 내가 십여 년 동안 전생명을 바쳐서 교육한 학생들에게까지 배척을 받을 때에는 나는 지금까지 살아온 것을 생각만 하여도 진저리가 난다. 그렇지마는 나는 이것이 다 내가 부족한 때문인 줄을 잘 안다. 나는 조선을 원망한다든가, 내 동포를 원망한다든가, 그럴 생각은 없다. 원망을 한다면 나 자신의 부족을 원망할 뿐이다. 내가 원체 교육을 한다든지 남의 지도자가 된다든지 할 자격이 없음을 원망한다면 원망할까, 내가 어떻게 조선이나 조선 사람을 원망하느냐. 그러니까 인제 내게 남은 일은 나를 조선에서 없애 버리는 것이다. 감히 십여 년 간 교육가라고 자처해 오던 거짓되고 외람된 생활을 끊어 버리는 것이다. 남편 노릇도 못 하고 아버지 노릇도 못 하는 사람이 남의 스승은 어떻게 되고 지도자는 어떻게 되느냐. 하니까 나는 이제 세상을 떠나 버리는 것이 조금도 슬프지 아니하고 도리어 몸이 가뜬하고 유쾌해지는 것 같다.
+오직 하나 마음에 걸리는 것은 내 선배요 사랑하는 동지이던 남 선생의 유일한 혈육이던 네게다가 누명을 씌우고 가는 것이다."
+"그게 어디 아버지 잘못입니까?"
+하고 정임은 입술을 깨물었소.
+"모두 제가 철이 없어서 저 때문에……."
+하고 정임은 몸을 떨고 울었소.
+"아니! 그렇게 생각하지 마라. 내가 지금 세상을 버릴 때에 무슨 기쁨이 한 가지 남는 것이 있다고 하면 너 하나가, 이 세상에서 오직 너 하나가 나를 따라 주는 것이다. 아마 너도 나를 잘못 알고 따라 주는 것이겠지마는 세상이 다 나를 버리고, 처자까지도 다 나를 버릴 때에 오직 너 하나가 나를 소중히 알아 주니 어찌 고맙지 않겠느냐. 그러니까 정임아 너는 몸을 조심하여서 건강을 회복하여서 오래 잘 살고, 그리고 나를 생각해 다오."
+하고 나도 울었소.
+형! 내가 정임에게 이런 말을 한 것이 잘못이지요. 그러나 나는 그 때에 이런 말을 아니 할 수 없었소. 왜 그런고 하니, 그것이 내 진정이니까. 나도 학교 선생으로, 교장으로, 또 주제넘게 지사로의 일생을 보내노라고 마치 오직 얼음 같은 의지력만 가진 사람 모양으로 사십 평생을 살아 왔지마는 내 속에도 열정은 있었던 것이오. 다만 그 열정을 누르고 죽이고 있었을 뿐이오. 물론 나는 아마 일생에 이 열정의 고삐를 놓아 줄 날이 없겠지요. 만일 내가 이 열정의 고삐를 놓아서 자유로 달리게 한다고 하면 나는 이 경우에 정임을 안고, 내 열정으로 정임을 태워 버렸을는지도 모르오. 그러나 나는 정임이가 열정으로 탈수록 나는 내 열정의 고삐를 두 손으로 꽉 붙들고 이를 악물고 매달릴 결심을 한 것이오.
+열한 시!
+"정임아. 인제 병원으로 가거라."
+하고 나는 엄연하게 명령하였소.
+"내일 저를 보시고 떠나시지요?"
+하고 정임은 눈물을 씻고 물었소.
+"그럼, J조교수도 만나고 너도 보고 떠나지."
+하고 나는 거짓말을 하였소. 이 경우에 내가 거짓말쟁이라는 큰 죄인이 되는 것이 정임에게 대하여 정임을 위하여 가장 옳은 일이라고 생각한 까닭이오.
+정임은, 무서운 직각력과 상상력을 가진 정임은 내 말의 진실성을 의심하는 듯이 나를 뚫어지게 바라보았소. 나는 차마 정임의 시선을 마주 보지 못하여 외면하여 버렸소.
+정임은 수건으로 눈물을 씻고 체경 앞에 가서 화장을 고치고 그리고,
+"저는 가요."
+하고 내 앞에 허리를 굽혀서 작별 인사를 하였소.
+"오, 가 자거라."
+하고 나는 극히 범연하게 대답하였소. 나는 자리옷을 입었기 때문에 현관까지 작별할 수도 없어서 보이를 불러 자동차를 하나 준비하라고 명하고 내 방에서 작별할 생각을 하였소.
+"내일 병원에 오세요?"
+하고 정임은 고개를 숙이고 낙루하였소.
+"오, 가마."
+하고 나는 또 거짓말을 하였소. 세상을 버리기로 결심한 사람의 거짓말은 하나님께서도 용서하시겠지요. 설사 내가 거짓말을 한 죄로 지옥에 간다 하더라도 이 경우에 정임을 위하여 거짓말을 아니 할 수가 없지 않소? 내가 거짓말을 아니 하면 정임은 아니 갈 것이 분명하였소.
+"전 가요."
+하고 정임은 또 한 번 절을 하였으나 소리를 내어서 울었소.
+"울지 마라! 몸 상한다."
+하고 나는 정임에게 대한 최후의 친절을 정임의 곁에 한 걸음 가까이 가서 어깨를 또닥또닥하여 주고, 외투를 입혀 주었소.
+"안녕히 주무세요."
+하고 정임은 문을 열고 나가 버렸소.
+정임의 걸어가는 소리가 차차 멀어졌소.
+나는 얼빠진 사람 모양으로 그 자리에 우두커니 서 있었소.
+창에 부딪히는 빗발 소리가 들리고 자동차 소리가 먼 나라에서 오는 것같이 들리오. 이것이 정임이가 타고 가는 자동차 소리인가. 나는 정임을 따라가서 붙들어 오고 싶었소. 내 몸과 마음은 정임을 따라서 허공에 떠가는 것 같았소.
+아아 이렇게 나는 정임을 곁에 두고 싶을까. 이렇게 내가 정임의 곁에 있고 싶을까. 그러하건마는 나는 정임을 떼어 버리고 가지 아니하면 아니 된다! 그것은 애끓는 일이다. 기막히는 일이다! 그러나 내 도덕적 책임은 엄정하게 그렇게 명령하지 않느냐. 나는 이 도덕적 책임의 명령 그것은 더위가 없는 명령이다 을 털끝만치라도 휘어서는 아니 된다.
+그러나 정임이가 호텔 현관까지 자동차를 타기 전에 한 번만 더 바라보는 것도 못 할 일일까. 한 번만, 잠깐만 더 바라보는 것도 못 할 일일까. 잠깐만 일 분만 아니 일 초만 한 시그마라는 극히 짧은 동안만 바라보는 것도 못 할 일일까. 아니, 정임을 한 시그마 동안만 더 보고 싶다 나는 이렇게 생각하고 벌떡 일어나서 도어의 핸들에 손을 대었소.
+`안 된다! 옳잖다!'
+하고 나는 내 소파에 돌아와서 털썩 몸을 던졌소.
+`최후의 순간이 아니냐. 최후의 순간에 용감히 이겨야 할 것이 아니냐. 아서라! 아서라!'
+하고 나는 혼자 주먹을 불끈불끈 쥐었소.
+이 때에 짜박짜박 하고 걸어오는 소리가 들리오. 내 가슴은 쌍방망이로 두들기는 것같이 뛰었소.
+`설마 정임일까.'
+하면서도 나는 숨을 죽이고 귀를 기울였소.
+그 발자국 소리는 분명 내 문 밖에 와서 그쳤소. 그리고는 소리가 없었소.
+`내 귀의 환각인가.'
+하고 나는 한숨을 내쉬었소.
+그러나 다음 순간 또 두어 번 문을 두드리는 소리가 들렸소.
+"이에스."
+하고 나는 대답하고 문을 바라보았소.
+문이 열렸소.
+들어오는 이는 정임이었소.
+"웬일이냐."
+하고 나는 엄숙한 태도를 지었소. 그것으로 일 초의 일천분지 일이라도 다시 한 번 보고 싶던 정임을 보고 기쁨을 카무플라주한 것이오.
+정임은 서슴지 않고 내 뒤에 와서 내 교의에 몸을 기대며,
+"암만해도 오늘이 마지막인 것만 같아서, 다시 뵈올 기약은 없는 것만 같아서 가다가 도로 왔습니다. 한 번만 더 뵙고 갈 양으로요. 그래 도로 와서도 들어올까 말까 하고 주저주저하다가 이것이 마지막인데 하고 용기를 내어서 들어왔습니다. 내일 저를 보시고 가신다는 것이 부러 하신 말씀만 같고, 마지막 뵈옵고, 뵈온대도 그래도 한 번 더 뵈옵기만 해도……."
+하고 정임의 말은 끝을 아물지 못하였소. 그는 내 등 뒤에 서 있기 때문에 그가 어떠한 표정을 하고 있는지는 볼 수가 없었소. 나는 다만 아버지의 위엄으로 정면을 바라보고 있었을 뿐이오.
+`정임아, 나도 네가 보고 싶었다. 네 뒤를 따라가고 싶었다. 내 몸과 마음은 네 뒤를 따라서 허공으로 날았다. 나는 너를 한 초라도 한 초의 천분지 일 동안이라도 한 번 더 보고 싶었다. 정임아, 내 진정은 너를 언제든지 내 곁에 두고 싶다. 정임아, 지금 내 생명이 가진 것은 오직 너뿐이다.'
+이런 말이라도 하고 싶었소. 그러나 이런 말을 하여서는 아니 되오! 만일 내가 이런 말을 하여 준다면 정임이가 기뻐하겠지요. 그러나 나는 정임이에게 이런 기쁨을 주어서는 아니 되오!
+나는 어디까지든지 아버지의 위엄, 아버지의 냉정함을 아니 지켜서는 아니 되오.
+그렇지마는 내 가슴에 타오르는 이름지을 수 없는 열정의 불길은 내 이성과 의지력을 태워 버리려 하오. 나는 눈이 아뜩아뜩함을 깨닫소. 나는 내 생명의 불길이 깜박깜박함을 깨닫소.
+그렇지마는! 아아 그렇지마는 나는 이 도덕적 책임의 무상 명령의 발령자인 쓴 잔을 마시지 아니하여서는 아니 되는 것이오.
+`산! 바위!'
+나는 정신을 가다듬어서 이것을 염하였소.
+그러나 열정의 파도가 치는 곳에 산은 움직이지 아니하오? 바위는 흔들리지 아니하오? 태산과 반석이 그 흰 불길에 타서 재가 되지는 아니하오? 인생의 모든 힘 가운데 열정보다 더 폭력적인 것이 어디 있소? 아마도 우주의 모든 힘 가운데 사람의 열정과 같이 폭력적, 불가항력적인 것은 없으리라. 뇌성, 벽력, 글쎄 그것에나 비길까. 차라리 천체와 천체가 수학적으로 계산할 수 없는 비상한 속력을 가지고 마주 달려들어서 우리의 귀로 들을 수 없는 큰 소리와 우리가 굳다고 일컫는 금강석이라도 증기를 만들고야 말 만한 열을 발하는 충돌의 순간에나 비길까. 형. 사람이라는 존재가 우주의 모든 존재 중에 가장 비상한 존재인 것 모양으로 사람의 열정의 힘은 우주의 모든 신비한 힘 가운데 가장 신비한 힘이 아니겠소? 대체 우주의 모든 힘은 그것이 아무리 큰 힘이라고 하더라도 저 자신을 깨뜨리는 것은 없소. 그렇지마는 사람이라는 존재의 열정은 능히 제 생명을 깨뜨려 가루를 만들고 제 생명을 살라서 소지를 올리지 아니하오? 여보, 대체 이에서 더 폭력이요, 신비적인 것이 어디 있단 말이오.
+이 때 내 상태, 어깨 뒤에서 열정으로 타고 섰는 정임을 느끼는 내 상태는 바야흐로 대폭발, 대충돌을 기다리는 아슬아슬한 때가 아니었소. 만일 조금만이라도 내가 내 열정의 고삐에 늦춤을 준다고 하면 무서운 대폭발이 일어났을 것이오.
+"정임아!"
+하고 나는 충분히 마음을 진정해 가지고 고개를 옆으로 돌려 정임의 얼굴을 찾았소.
+"네에."
+하고 정임은 입을 약간 내 귀 가까이로 가져와서 그 씨근거리는 소리가 분명히 내 귀에 들리고 그 후끈후끈하는 뜨거운 입김이 내 목과 뺨에 감각되었소.
+억지로 진정하였던 내 가슴은 다시 설레기를 시작하였소. 그 불규칙한 숨소리와 뜨거운 입김 때문이었을까.
+"시간 늦는다. 어서 가거라. 이 아버지는 언제까지든지 너를 사랑하는 딸 로 소중히 소중히 가슴에 품고 있으마. 또 후일에 다시 만날 때도 있을지 아느냐. 설사 다시 만날 때가 없다기로니 그것이 무엇이 그리 대수냐. 나이 많은 사람은 먼저 죽고 젊은 사람은 오래 살아서 인생의 일을 많이 하는 것이 순서가 아니냐. 너는 몸이 아직 약하니 마음을 잘 안정해서 어서 건강을 회복하여라. 그리고 굳세게 굳세게, 힘있게 힘있게 살아 다오. 조선은 사람을 구한다. 나 같은 사람은 인제 조선서 더 일할 자격을 잃어버린 사람이지마는 네야 어떠냐. 설사 누가 무슨 말을 해서 학교에서 학비를 아니 준다거든 내가 네게 준 재산을 가지고 네 마음대로 공부를 하려무나. 네가 그렇게 해 주어야 나를 위하는 것이다. 자 인제 가거라. 네 앞길이 양양하지 아니하냐. 자 인제 가거라. 나는 내일 아침 동경을 떠날란다. 자 어서."
+하고 나는 화평하게 웃는 낯으로 일어섰소.
+정임은 울먹울먹하고 고개를 숙이오.
+밖에서는 바람이 점점 강해져서 소리를 하고 유리창을 흔드오.
+"그럼, 전 가요."
+하고 정임은 고개를 들었소.
+"그래. 어서 가거라. 벌써 열한시 반이다. 병원 문은 아니 닫니!"
+정임은 대답이 없소.
+"어서!"
+하고 나는 보이를 불러 자동차를 하나 준비하라고 일렀소.
+"갈랍니다."
+하고 정임은 고개를 숙여서 내게 인사를 하고 문을 향하여 한 걸음 걷다가 잠깐 주저하더니, 다시 돌아서서,
+"저를 한 번만 안아 주셔요. 아버지가 어린 딸을 안듯이 한 번만 안아 주셔요."
+하고 내 앞으로 가까이 와 서오.
+나는 팔을 벌려 주었소. 정임은 내 가슴을 향하고 몸을 던졌소. 그리고 제 이뺨 저뺨을 내 가슴에 대고 비볐소. 나는 두 팔을 정임의 어깨 위에 가벼이 놓았소.
+이러한 지 몇 분이 지났소. 아마 일 분도 다 못 되었는지 모르오.
+정임은 내 가슴에서 고개를 들어 나를 뚫어지게 우러러보더니, 다시 내 가슴에 낯을 대더니 아마 내 심장이 무섭게 뛰는 소리를 정임은 들었을 것이오 정임은 다시 고개를 들고,
+"어디를 가시든지 편지나 주셔요."
+하고 굵은 눈물을 떨구고는 내게서 물러서서 또 한 번 절하고,
+"안녕히 가셔요. 만주든지 아령이든지 조선 사람 많이 사는 곳에 가셔서 일하고 사셔요. 돌아가실 생각은 마셔요. 제가, 아버지 말씀대로 혼자 떨어져 있으니 아버지도 제 말씀대로 돌아가실 생각은 마셔요, 네, 그렇다고 대답하셔요!"
+하고는 또 한 번 내 가슴에 몸을 기대오.
+죽기를 결심한 나는 `오냐, 그러마.' 하는 대답을 할 수는 없었소. 그래서,
+"오, 내 살도록 힘쓰마."
+하는 약속을 주어서 정임을 돌려보냈소.
+정임의 발자국 소리가 안 들리게 된 때에 나는 빠른 걸음으로 옥상 정원으로 나갔소. 비가 막 뿌리오.
+나는 정임이가 타고 나가는 자동차라도 볼 양으로 호텔 현관 앞이 보이는 꼭대기로 올라갔소. 현관을 떠난 자동차 하나가 전찻길로 나서서는 북을 향하고 달아나서 순식간에 그 꽁무니에 달린 붉은 불조차 스러져 버리고 말았소.
+나는 미친 사람 모양으로,
+"정임아, 정임아!"
+하고 수없이 불렀소. 나는 사 층이나 되는 이 꼭대기에서 뛰어내려서 정임이가 타고 간 자동차의 뒤를 따르고 싶었소.
+"아아 영원한 인생의 이별!"
+나는 그 옥상에 얼마나 오래 섰던지를 모르오. 내 머리와 낯과 배스로브에서는 물이 흐르오. 방에 들어오니 정임이가 끼치고 간 향기와 추억만 남았소.
+나는 방 안 구석구석에 정임의 모양이 보이는 것을 깨달았소. 특별히 정임이가 고개를 숙이고 서 있던 내 교의 뒤에는 분명히 갈색 외투를 입은 정임의 모양이 완연하오.
+"정임아!"
+하고 나는 그 곳으로 따라가오. 그러나 가면 거기는 정임은 없소.
+나는 교의에 앉소. 그러면 정임의 씨근씨근하는 숨소리와 더운 입김이 분명 내 오른편에 감각이 되오. 아아 무서운 환각이여!
+나는 자리에 눕소. 그리고 정임의 환각을 피하려고 불을 끄오. 그러면 정임이가 내게 안기던 자리쯤에 환하게 정임의 모양이 나타나오.
+나는 불을 켜오. 또 불을 끄오.
+날이 밝자 나는 비가 갠 것을 다행으로 비행장에 달려가서 비행기를 얻어 탔소.
+나는 다시 조선의 하늘을 통과하기가 싫어서 북강에서 비행기에서 내려서 문사에 와서 대련으로 가는 배를 탔소.
+나는 대련에서 내려서 하룻밤을 여관에서 자고는 곧 장춘 가는 급행을 탔소. 물론 아무에게도 엽서 한 장 한 일 없었소. 그것은 인연을 끊은 세상에 대하여 연연한 마음을 가지는 것을 부끄럽게 생각한 까닭이오.
+차가 옛날에는 우리 조상네가 살고 문화를 짓던 옛 터전인 만주의 벌판을 달릴 때에는 감회도 없지 아니하였소. 그러나 나는 지금 그런 한가한 감상을 쓸 겨를이 없소.
+내가 믿고 가는 곳은 하얼빈에 있는 어떤 친구요. 그는 R라는 사람으로서 경술년에 A씨 등의 망명객을 따라 나갔다가 아라사에서 무관 학교를 졸업하고 아라사 사관으로서 구주 대전에도 출정을 하였다가, 혁명 후에도 이내 적위군에 머물러서 지금까지 소비에트 장교로 있는 사람이오. 지금은 육군 소장이라던가.
+나는 하얼빈에 그 사람을 찾아가는 것이오. 그 사람을 찾아야 아라사에 들어갈 여행권을 얻을 것이요, 여행권을 얻어야 내가 평소에 이상하게도 그리워하던 바이칼 호를 볼 것이오.
+하얼빈에 내린 것은 해가 뉘엿뉘엿 넘어가는 석양이었소.
+나는 안중근이 이등박문(伊藤博文:이토 히로부미)을 쏜 곳이 어딘가 하고 벌판과 같이 넓은 플랫폼에 내렸소. 과연 국제 도시라 서양 사람, 중국 사람, 일본 사람이 각기 제 말로 지껄이오. 아아 조선 사람도 있을 것이오마는 다들 양복을 입거나 청복을 입거나 하고 또 사람이 많은 곳에서는 말도 잘 하지 아니하여 아무쪼록 조선 사람인 것을 표시하지 아니하는 판이라 그 골격과 표정을 살피기 전에는 어느 것이 조선 사람인지 알 길이 없소. 아마 허름하게 차리고 기운 없이, 비창한 빛을 띠고 사람의 눈을 슬슬 피하는 저 순하게 생긴 사람들이 조선 사람이겠지요. 언제나 한 번 가는 곳마다 동양이든지, 서양이든지,
+`나는 조선 사람이오!'
+하고 뽐내고 다닐 날이 있을까 하면 눈물이 나오. 더구나, 하얼빈과 같은 각색 인종이 모여서 생존 경쟁을 하는 마당에 서서 이런 비감이 간절하오. 아아 이 불쌍한 유랑의 무리 중에 나도 하나를 더 보태는가 하면 눈물을 씻지 아니할 수 없었소.
+나는 역에서 나와서 어떤 아라사 병정 하나를 붙들고 R의 아라사 이름을 불렀소. 그리고 아느냐고 영어로 물었소.
+그 병정은 내 말을 잘못 알아들었는지, 또는 R를 모르는지 무엇이라고 아라사말로 지껄이는 모양이나 나는 물론 그것을 알아들을 수가 없었소. 그러나 나는 그 병정의 표정에서 내게 호의를 가진 것을 짐작하고 한 번 더 분명히,
+"요십 알렉산드로비치 리가이."
+라고 불러 보았소.
+그 병정은 빙그레 웃고 고개를 흔드오. 이 두 외국 사람의 이상한 교섭에 흥미를 가지고 여러 아라사 병정과 동양 사람들이 십여 인이나 우리 주위에 모여드오.
+그 병정이 나를 바라보고 또 한 번 그 이름을 불러 보라는 모양 같기로 나는 이번에는 R의 아라사 이름에 `제너럴'이라는 말을 붙여 불러 보았소.
+그랬더니 어떤 다른 병정이 뛰어들며,
+"게네라우 리가이!"
+하고 안다는 표정을 하오. `게네라우'라는 것이 아마 아라사말로 장군이란 말인가 하였소.
+"예스. 예스."
+하고 나는 기쁘게 대답하였소. 그리고는 아라사 병정들끼리 무에라고 지껄이더니, 그 중에 한 병정이 나서면서 고개를 끄덕끄덕하고, 제가 마차 하나를 불러서 나를 태우고 저도 타고 어디로 달려가오.
+그 아라사 병정은 친절히 알지도 못하는 말로 이것저것을 가리키면서 설명을 하더니 내가 못 알아듣는 줄을 생각하고 내 어깨를 툭 치고 웃소. 어린애와 같이 순한 사람들이구나 하고 나는 고맙다는 표로 고개만 끄덕끄덕하였소.
+어디로 어떻게 가는지 서양 시가로 달려가다가 어떤 큰 저택 앞에 이르러서 마차를 그 현관 앞으로 들이몰았소.
+현관에서는 종졸이 나왔소. 내가 명함을 들여보냈더니 부관인 듯한 아라사 장교가 나와서 나를 으리으리한 응접실로 인도하였소. 얼마 있노라니 중년이 넘은 어떤 대장이 나오는데 군복에 칼끈만 늘였소.
+"이게 누구요."
+하고 그 대장은 달려들어서 나를 껴안았소. 이십오 년 만에 만나는 우리는 서로 알아본 것이오.
+이윽고 나는 그의 부인과 자녀들도 만났소. 그들은 다 아라사 사람이오.
+저녁이 끝난 뒤에 나는 R의 부인과 딸의 음악과 그림 구경과 기타의 관대를 받고 단둘이 이야기할 기회를 얻었소. 경술년 당시 이야기도 나오고, A씨의 이야기도 나오고, R의 신세 타령도 나오고, 내 이십오 년 간의 생활 이야기도 나오고, 소비에트 혁명 이야기도 나오고, 하얼빈 이야기도 나오고, 우리네가 어려서 서로 사귀던 회구담도 나오고 이야기가 그칠 바를 몰랐소. "조선은 그립지 않은가."
+하는 내 말에 쾌활하던 R는 고개를 숙이고 추연한 빛을 보였소.
+나는 R의 추연한 태도를 아마 고국을 그리워하는 것으로만 여겼소. 그래서 나는 그리 침음하는 것을 보고,
+"얼마나 고국이 그립겠나. 나는 고국을 떠난 지가 일 주일도 안 되건마는 못 견디게 그리운데."
+하고 동정하는 말을 하였소.
+했더니, 이 말 보시오. 그는 침음을 깨뜨리고 고개를 번쩍 들며,
+"아니! 나는 고국이 조금도 그립지 아니하이. 내가 지금 생각한 것은 자네 말을 듣고 고국이 그리운가 그리워할 것이 있는가를 생각해 본 것일세. 그랬더니 아무리 생각하여도 나는 고국이 그립다는 생각을 가질 수가 없어. 그야 어려서 자라날 때에 보던 강산이라든지 내 기억에 남은 아는 사람들이라든지, 보고 싶다 하는 생각도 없지 아니하지마는 그것이 고국이 그리운 것이라고 할 수가 있을까. 그 밖에는 나는 아무리 생각하여도 고국이 그리운 것을 찾을 길이 없네. 나도 지금 자네를 보고 또 자네 말을 듣고 오래 잊어버렸던 고국을 좀 그립게, 그립다 하게 생각하려고 해 보았지마는 도무지 나는 고국이 그립다는 생각이 나지 않네."
+이 말에 나는 깜짝 놀랐소. 몸서리치게 무서웠소. 나는 해외에 오래 표랑하는 사람은 으레 고국을 그리워할 것으로 믿고 있었소. 그런데 이 사람이, 일찍은 고국을 사랑하여 목숨까지도 바치려던 이 사람이 도무지 이처럼 고국을 잊어버린다는 것은 놀라운 정도를 지나서 괘씸하기 그지없었소. 나도 비록 조선을 떠난다고, 영원히 버린다고 나서기는 했지마는 나로는 죽기 전에는 아니 비록 죽더라도 잊어버리지 못할 고국을 잊어버린 R의 심사가 난측하고 원망스러웠소.
+"고국이 그립지가 않아?"
+하고 R에게 묻는 내 어성에는 격분한 빛이 있었소.
+"이상하게 생각하시겠지. 하지만 고국에 무슨 그리울 것이 있단 말인가. 그 빈대 끓는 오막살이가 그립단 말인가. 나무 한 개 없는 산이 그립단 말인가. 물보다도 모래가 많은 다 늙어빠진 개천이 그립단 말인가. 그 무기력하고 가난한, 시기 많고 싸우고 하는 그 백성을 그리워한단 말인가. 그렇지 아니하면 무슨 그리워할 음악이 있단 말인가, 미술이 있단 말인가, 문학이 있단 말인가, 사상이 있단 말인가, 사모할 만한 인물이 있단 말인가! 날더러 고국의 무엇을 그리워하란 말인가. 나는 조국이 없는 사람일세. 내가 소비에트 군인으로 있으니 소비에트가 내 조국이겠지. 그러나 진심으로 내 조국이라는 생각은 나지 아니하네."
+하고 저녁 먹을 때에 약간 붉었던 R의 얼굴은 이상한 흥분으로 더욱 붉어지오.유 정유 정
+R는 먹던 담배를 화나는 듯이 재떨이에 집어던지며,
+"내가 하얼빈에 온 지가 인제 겨우 삼사 년밖에 안 되지마는 조선 사람 때문에 나는 견딜 수가 없어. 와서 달라는 것도 달라는 것이지마는 조선 사람이 또 어찌하였느니 또 어찌하였느니 하는 불명예한 말을 들을 때에는 나는 금시에 죽어 버리고 싶단 말일세. 내게 가장 불쾌한 것이 있다고 하면 그것은 고국이라는 기억과 조선 사람의 존잴세. 내가 만일 어느 나라의 독재자가 된다고 하면 나는 첫째로 조선인 입국 금지를 단행하려네. 만일 조선이라는 것을 잊어버릴 약이 있다고 하면 나는 생명과 바꾸어서라도 사 먹고 싶어."
+하고 R는 약간 흥분된 어조를 늦추어서,
+"나도 모스크바에 있다가 처음 원동에 나왔을 적에는 길을 다녀도 혹시 동포가 눈에 뜨이지나 아니하나 하고 찾았네. 그래서 어디서든지 동포를 만나면 반가이 손을 잡았지. 했지만 점점 그들은 오직 귀찮은 존재에 지나지 못하다는 것을 알았단 말일세. 인제는 조선 사람이라고만 하면 만나기가 무섭고 끔찍끔찍하고 진저리가 나는 걸 어떡허나. 자네 명함이 들어온 때에도 조선 사람인가 하고 가슴이 뜨끔했네."
+하고 R는 웃지도 아니하오. 그의 얼굴에는, 군인다운 기운찬 얼굴에는 증오와 분노의 빛이 넘쳤소.
+"나도 자네 집에 환영받는 나그네는 아닐세그려."
+하고 나는 이 견디기 어려운 불쾌하고 무서운 공기를 완화하기 위하여 농담삼아 한 마디를 던지고 웃었소.
+나는 R의 말이 과격함에 놀랐지마는, 또 생각하면 R가 한 말 가운데는 들을 만한 이유도 없지 아니하오. 그것을 생각할 때에 나는 R를 괘씸하게 생각하기 전에 내가 버린다는 조선을 위하여서 가슴이 아팠소. 그렇지만 이제 나 따위가 가슴을 아파한대야 무슨 소용이 있소. 조선에 남아 계신 형이나 R의 말을 참고삼아 쓰시기 바라오. 어쨌으나 나는 R에게서 목적한 여행권을 얻었소. R에게는 다만,
+`나는 피곤한 몸을 좀 정양하고 싶다. 나는 내가 평소에 즐겨하는 바이칼 호반에서 눈과 얼음의 한겨울을 지내고 싶다.'
+는 것을 여행의 이유로 삼았소.
+R는 나의 초췌한 모양을 짐작하고 내 핑계를 그럴듯하게 아는 모양이었소. 그리고 나더러, `이왕 정양하려거든 카프카 지방으로 가거라. 거기는 기후 풍경도 좋고 또 요양원의 설비도 있다.'는 것을 말하였소. 나도 톨스토이의 소설에서, 기타의 여행기 등속에서 이 지방에 관한 말을 못 들은 것이 아니나 지금 내 처지에는 그런 따뜻하고 경치 좋은 지방을 가릴 여유도 없고 또 그러한 지방보다도 눈과 얼음과 바람의 시베리아의 겨울이 합당한 듯하였소.
+그러나 나는 R의 호의를 굳이 사양할 필요도 없어서 그가 써 주는 대로 소개장을 다 받아 넣었소. 그는 나를 처남 매부 간이라고 소개해 주었소.
+나는 모스크바 가는 다음 급행을 기다리는 사흘 동안 R의 집의 손이 되어서 R부처의 친절한 대우를 받았소.
+그 후에는 나는 R와 조선에 관한 토론을 한 일은 없지마는 R가 이름지어 말을 할 때에는 조선을 잊었노라, 그리워할 것이 없노라, 하지마는 무의식적으로 말을 할 때에는 조선을 못 잊고 또 조선을 여러 점으로 그리워하는 양을 보았소. 나는 그것으로써 만족하게 여겼소.
+나는 금요일 오후 세시 모스크바 가는 급행으로 하얼빈을 떠났소. 역두에는 R와 R의 가족이 나와서 꽃과 과일과 여러 가지 선물로 나를 전송하였소. R와 R의 가족은 나를 정말 형제의 예로 대우하여 차가 떠나려 할 때에 포옹과 키스로 작별하여 주었소.
+이 날은 퍽 따뜻하고 일기가 좋은 날이었소. 하늘에 구름 한 점, 땅에 바람 한 점 없이 마치 늦은 봄날과 같이 따뜻한 날이었소.
+차는 떠났소. 판다는 둥 안 판다는 둥 말썽 많은 동중로(지금은 북만 철로라고 하오.)의 국제 열차에 몸을 의탁한 것이오.
+송화강(松花江:쑹화 강)의 철교를 건너오. 아아 그리도 낯익은 송화강! 송화강이 왜 낯이 익소. 이 송화강은 불함산(장백산)에 근원을 발하여 광막한 북만주의 사람도 없는 벌판을 혼자 소리도 없이 흘러가는 것이 내 신세와 같소. 이 북만주의 벌판을 만든 자가 송화강이지마는 나는 그만한 힘이 없는 것이 부끄러울 뿐이오. 이 광막한 북만의 벌판을 내 손으로 개척하여서 조선 사람의 낙원을 만들자 하고 뽐내어 볼까. 그것은 형이 하시오. 내 어린것이 자라거든 그놈에게나 그러한 생각을 넣어 주시오.
+동양의 국제적 괴물인 하얼빈 시가도 까맣게 안개에서 스러져 버리고 말았소. 그러나 그 시가를 싼 까만 기운이 국제적 풍운을 포장한 것이라고 할까요.
+가도가도 벌판. 서리맞은 마른 풀바다. 실개천 하나도 없는 메마른 사막. 어디를 보아도 산 하나 없으니 하늘과 땅이 착 달라붙은 듯한 천지. 구름 한 점 없건만도 그 큰 태양 가지고도 미처 다 비추지 못하여 지평선 호를 그린 지평선 위에는 항상 황혼이 떠도는 듯한 세계. 이 속으로 내가 몸을 담은 열차는 서쪽으로 서쪽으로 해가 가는 걸음을 따라서 달리고 있소. 열차가 달리는 바퀴 소리도 반향할 곳이 없어 힘없는 한숨같이 스러지고 마오.
+기쁨 가진 사람이 지루해서 못 견딜 이 풍경은 나같이 수심 가진 사람에게는 가장 공상의 말을 달리기에 합당한 곳이오.
+이 곳에도 산도 있고 냇물도 있고 삼림도 있고 꽃도 피고 날짐승, 길짐승이 날고 기던 때도 있었겠지요. 그러던 것이 몇만 년 지나는 동안에 산은 낮아지고 골은 높아져서 마침내 이 꼴이 된 것인가 하오. 만일 큰 힘이 있어 이 광야를 파낸다 하면 물 흐르고 고기 놀던 강과, 울고 웃던 생물이 살던 자취가 있을 것이오. 아아 이 모든 기억을 꽉 품고 죽은 듯이 잠잠한 광야에!
+내가 탄 차가 F역에 도착하였을 때에는 북만주 광야의 석양의 아름다움은 그 극도에 달한 것 같았소. 둥긋한 지평선 위에 거의 걸린 커다란 해! 아마 그 신비하고 장엄함이 내 경험으로는 이 곳에서밖에는 볼 수 없는 것이라고생각하오. 이글이글 이글이글 그러면서도 둥글다는 체모를 변치 아니하는 그 지는 해!
+게다가 먼 지평선으로부터 기어드는 황혼은 인제는 대지를 거의 다 덮어 버려서 마른 풀로 된 지면은 가뭇가뭇한 빛을 띠고 사막의 가는 모래를 머금은 지는 해의 광선을 반사하여서 대기는 짙은 자줏빛을 바탕으로 한 가지각색의 명암을 가진, 오색이 영롱한, 도무지 내가 일찍 경험해 보지 못한 색채의 세계를 이루었소. 아 좋다!
+그 속에 수은같이 빛나는, 수없는 작고 큰 호수들의 빛! 그 속으로 날아오는 수없고 이름 모를 새들의 떼도 이 세상의 것이라고는 생각하지 아니하오.
+나는 거의 무의식적으로 차에서 뛰어내렸소. 거의 떠날 시간이 다 되어서 짐의 일부분은 미처 가지지도 못하고 뛰어내렸소. 반쯤 미친 것이오.
+정거장 앞 조그마한 아라사 사람의 여관에다가 짐을 맡겨 버리고 나는 단장을 끌고 철도 선로를 뛰어 건너서 호수의 수은빛 나는 곳을 찾아서 지향 없이 걸었소.
+한 호수를 가서 보면 또 저 편 호수가 더 아름다워 보이오. 원컨대 저 지는 해가 다 지기 전에 이 광야에 있는 호수를 다 돌아보고 싶소.
+내가 호숫 가에 섰을 때에 그 거울같이 잔잔한 호수면에 비치는 내 그림자의 외로움이여, 그러나 아름다움이여! 그 호수는 영원한 우주의 신비를 품고 하늘이 오면 하늘을, 새가 오면 새를, 구름이 오면 구름을, 그리고 내가 오면 나를 비추지 아니하오. 나는 호수가 되고 싶소. 그러나 형! 나는 이 호수면에서 얼마나 정임의 얼굴을 찾았겠소. 그것은 물리학적으로 불가능한 일이겠지요. 동경의 병실에 누워 있는 정임의 모양이 몽고 사막의 호수면에 비칠 리야 있겠소. 없겠지마는 나는 호수마다 정임의 그림자를 찾았소. 그러나 보이는 것은 외로운 내 그림자뿐이오.
+`가자. 끝없는 사막으로 한없이 가자. 가다가 내 기운이 진하는 자리에 나는 내 손으로 모래를 파고 그 속에 내 몸을 묻고 죽어 버리자. 살아서 다시 볼 수 없는 정임의 「이데아」를 안고 이 깨끗한 광야에서 죽어 버리 자.'
+하고 나는 지는 해를 향하고 한정 없이 걸었소. 사막이 받았던 따뜻한 기운은 아직도 다 식지는 아니하였소. 사막에는 바람 한 점도 없소. 소리 하나도 없소. 발자국 밑에서 우는 마른 풀과 모래의 바스락거리는 소리가 들릴 뿐이오.
+나는 허리를 지평선에 걸었소. 그 신비한 광선은 내 가슴으로부터 위에만을 비추고 있소.
+문득 나는 해를 따라가는 별 두 개를 보았소. 하나는 앞을 서고 하나는 뒤를 섰소. 앞의 별은 좀 크고 뒤의 별은 좀 작소. 이런 별들은 산 많은 나라 다시 말하면 서쪽 지평선을 보기 어려운 나라에서만 생장한 나로서는 보지 못하던 별이오. 나는 그 별의 이름을 모르오. `두 별'이오.
+해가 지평선에서 뚝 떨어지자 대기의 자줏빛은 남빛으로 변하였소. 오직 해가 금시 들어간 자리에만 주홍빛의 여광이 있을 뿐이오. 내 눈앞에서는 남빛 안개가 피어오르는 듯하였소. 앞에 보이는 호수만이 유난히 빛나오. 또 한 떼의 이름 모를 새들이 수면을 스치며 날 저문 것을 놀라는 듯이 어지러이 날아 지나가오. 그들은 소리도 아니 하오. 날개치는 소리도 아니 들리오. 그것들은 사막의 황혼의 허깨비인 것 같소.
+나는 자꾸 걷소. 해를 따르던 나는 두 별을 따라서 자꾸 걷소.
+별들은 진 해를 따라서 바삐 걷는 것도 같고, 헤매는 나를 어떤 나라로 끄는 것도 같소.
+아니 두 별 중에 앞선 별이 한 번 반짝하고는 최후로 한 번 반짝하고는 지평선 밑에 숨어 버리고 마오. 뒤에 남은 외별의 외로움이여! 나는 울고 싶었소. 그러나 나는 하나만 남은 작은 별 외로운 작은 별을 따라서 더 빨리 걸음을 걸었소. 그 한 별마저 넘어가 버리면 나는 어찌하오.
+내가 웬일이오. 나는 시인도 아니요, 예술가도 아니오. 나는 정으로 행동한 일은 없다고 믿는 사람이오. 그러나 형! 이 때에 미친 것이 아니요, 내 가슴에는 무엇인지 모를 것을 따를 요샛말로 이른바 동경으로 찼소.
+`아아 저 작은 별!'
+그것도 지평선에 닿았소.
+`아아 저 작은 별. 저것마저 넘어가면 나는 어찌하나.'
+인제는 어둡소. 광야의 황혼은 명색뿐이요, 순식간이요, 해지자 신비하다고 할 만한 극히 짧은 동안에 아름다운 황혼을 조금 보이고는 곧 칠과 같은 암흑이오. 호수의 물만이 어디서 은빛을 받았는지 뿌옇게 나만이 유일한 존재다, 나만이 유일한 빛이다 하는 듯이 인제는 수은빛이 아니라 남빛을 발하고 있을 뿐이오.
+나는 그 중 빛을 많이 받은, 그 중 환해 보이는 호수면을 찾아 두리번거리며, 그러나 빠른 걸음으로 헤매었소. 그러나 내가 좀더 맑은 호수면을 찾는 동안에 이 광야의 어둠은 더욱더욱 짙어지오.
+나는 어떤 조그마한 호숫 가에 펄썩 앉았소. 내 앞에는 짙은 남빛의 수면에 조그마한 거울만한 밝은 데가 있소. 마치 내 눈에서 무슨 빛이 나와서, 아마 정임을 그리워하는 빛이 나와서 그 수면에 반사하는 듯이. 나는 허겁지겁 그 빤한 수면을 들여다보았소. 혹시나 정임의 모양이 거기 나타나지나 아니할까 하고. 세상에는 그러한 기적도 있지 아니한가 하고.
+물에는 정임의 얼굴이 어른거리는 것 같았소. 이따금 정임의 눈도 어른거리고 코도 번뜻거리고 입도 번뜻거리는 것 같소. 그러나 수면은 점점 어두워 가서 그 환영조차 더욱 희미해지오.
+나는 호수면에 빤하던 한 조각조차 캄캄해지는 것을 보고 숨이 막힐 듯함을 깨달으면서 고개를 들었소.
+고개를 들려고 할 때에, 형이여, 이상한 일도 다 있소. 그 수면에 정임의 모양이, 얼굴만 아니라, 그 몸 온통이 그 어깨, 가슴, 팔, 다리까지도, 그 눈과 입까지도, 그 얼굴의 흰 것과 입술이 불그레한 것까지도, 마치 환한 대낮에 실물을 대한 모양으로 소상하게 나타났소.
+"정임이!"
+하고 나는 소리를 지르며 물로 뛰어들려 하였소. 그러나 형, 그 순간에 정임의 모양은 사라져 버리고 말았소.
+나는 이 어둠 속에 어디 정임이가 나를 따라온 것같이 생각했소. 혹시나 정임이가 죽어서 그 몸은 동경의 대학 병원에 벗어 내어던지고 혼이 빠져 나와서 물에 비치었던 것이 아닐까, 나는 가슴이 울렁거림을 진정치 못하면서 호숫 가에서 벌떡 일어나서 어둠 속에 정임을 만져보려는 듯이, 어두워서 눈에 보지는 못하더라도 자꾸 헤매노라면 몸에 부딪히기라도 할 것 같아서 함부로 헤매었소. 그리고는 눈앞에 번뜻거리는 정임의 환영을 팔을 벌려서 안고 소리를 내어서 불렀소.
+"정임이, 정임이."
+하고 나는 수없이 정임을 부르면서 헤매었소.
+그러나 형, 이것도 죄지요. 이것도 하나님께서 금하시는 일이지요. 그러길래 광야에 아주 어둠이 덮이고 새까만 하늘에 별이 총총하게 나고는 영 정임의 헛그림자조차 아니 보이지요. 나는 죄를 피해서 정임을 떠나서 멀리 온 것이니 정임의 헛그림자를 따라다니는 것도 옳지 않지요.
+그렇지만 내가 이렇게 혼자서 정임을 생각만 하는 것이야 무슨 죄 될 것이 있을까요. 내가 정임을 만 리나 떠나서 이렇게 헛그림자나 그리며 그리워하는 것이야 무슨 죄가 될까요. 설사 죄가 되기로서니 낸들 이것까지야 어찌하오. 내가 내 혼을 죽여 버리기 전에야 내 힘으로 어찌하오. 설사 죄가 되어서 내가 지옥의 꺼지지 않는 유황불 속에서 영원한 형벌을 받게 되기로서니 그것을 어찌하오. 형, 이것, 이것도 말아야 옳은가요. 정임의 헛그림자까지도 끊어 버려야 옳은가요.
+이 때요. 바로 이 때요. 내 앞 수십 보나 될까(캄캄한 밤이라 먼지 가까운지 분명히 알 수 없지마는) 하는 곳에 난데없는 등불 하나가 나서오. 나는 깜짝 놀라서 우뚝 섰소. 이 무인지경, 이 밤중에 갑자기 보이는 등불 그것은 마치 이 세상 같지 아니하였소.
+저 등불이 어떤 등불일까, 그 등불이 몇 걸음 가까이 오니, 그 등불 뒤에 사람의 다리가 보이오.
+"누구요?"
+하는 것은 귀에 익은 조선말이오. 어떻게 이 몽고의 광야에서 조선말을 들을까 하고 나는 등불을 처음 볼 때보다 더욱 놀랐소.
+"나는 지나가던 사람이오."
+하고 나도 등불을 향하여 마주 걸어갔소.
+그 사람은 등불을 들어서 내 얼굴을 비추어 보더니,
+"당신 조선 사람이오?"
+하고 묻소.
+"네, 나는 조선 사람이오. 당신도 음성을 들으니 조선 사람인데, 어떻게 이런 광야에, 아닌 밤중에, 여기 계시단 말이오."
+하고 나는 놀라는 표정 그대로 대답하였소.
+"나는 이 근방에 사는 사람이니까 여기 오는 것도 있을 일이지마는 당신이야말로 이 아닌 밤중에."
+하고 육혈포를 집어넣고, 손을 내밀어서 내게 악수를 구하오.
+나는 반갑게 그의 손을 잡았소. 그러나 나는 `죽을 지경에 어떻게 오셨단 말이오.' 하고, 그가 내가 무슨 악의를 가진 흉한이 아닌 줄을 알고 손에 빼어들었던 육혈포로 시기를 잠깐이라도 노린 것을 불쾌하게 생각하였던 것이오.
+그도 내 이름도 묻지 아니하고 또 나도 그의 이름을 묻지 아니하고 나는 그에게 끌려서 그가 인도하는 곳으로 갔소. 그 곳이란 것은 아까 등불이 처음 나타나던 곳인 듯한데, 거기서 또 한 번 놀란 것은 어떤 부인이 있는 것이오. 남자는 아라사식 양복을 입었으나 부인은 중국 옷 비슷한 옷을 입었소. 남자는 나를 끌어서 그 부인에게 인사하게 하고,
+"이는 내 아내요."
+하고 또 그 아내라는 부인에게는,
+"이 이는 조선 양반이오. 성함이 뉘시죠?"
+하고 그는 나를 바라보오. 나는,
+"최석입니다."
+하고 바로 대답하였소.
+"최석 씨?"
+하고 그 남자는 소개하던 것도 잊어버리고 내 얼굴을 들여다보오.
+"네, 최석입니다."
+"아 ●●학교 교장으로 계신 최석 씨."
+하고 그 남자는 더욱 놀라오.
+"네, 어떻게 내 이름을 아세요?"
+하고 나도 그가 혹시 아는 사람이나 아닌가 하고 등불 빛에 얼굴을 들여다 보았으나 도무지 그 얼굴이 본 기억이 없소.
+"최 선생을 내가 압니다. 남 선생한테 말씀을 많이 들었지요. 그런데 남 선생도 돌아가신 지가 벌써 몇 핸가."
+하고 감개무량한 듯이 그 아내를 돌아보오.
+"십오 년이지요."
+하고 곁에 섰던 부인이 말하오.
+"벌써 십오 년인가."
+하고 그 남자는 나를 보고,
+"정임이 잘 자랍니까? 벌써 이십이 넘었지."
+하고 또 부인을 돌아보오.
+"스물세 살이지."
+하고 부인이 확실치 아니한 듯이 대답하오.
+"네, 스물세 살입니다. 지금 동경에 있습니다. 병이 나서 입원한 것을 보고 왔는데."
+하고 나는 번개같이 정임의 병실과 정임의 호텔 장면 등을 생각하고 가슴이 설렘을 깨달았소. 의외인 곳에서 의외인 사람들을 만나서 정임의 말을 하게 된 것을 기뻐하였소.
+"무슨 병입니까. 정임이가 본래 몸이 약해서."
+하고 부인이 직접 내게 묻소.
+"네. 몸이 좀 약합니다. 병이 좀 나은 것을 보고 떠났습니다마는 염려가 됩니다."
+하고 나는 무의식중에 고개를 동경이 있는 방향으로 돌렸소. 마치 고개를 동으로 돌리면 정임이가 보이기나 할 것같이.
+"자, 우리 집으로 갑시다."
+하고 나는 아직 그의 성명도 모르는 남자는, 그의 아내를 재촉하더니,
+"우리가 조선 동포를 만난 것이 십여 년 만이오. 그런데 최 선생, 이것을 좀 보시고 가시지요."
+하고 그는 빙그레 웃으면서 나를 서너 걸음 끌고 가오. 거기는 조그마한 무덤이 있고 그 앞에는 석 자 높이나 되는 목패를 세웠는데 그 목패에는 `두 별 무덤'이라는 넉 자를 썼소.
+내가 이상한 눈으로 그 무덤과 목패를 보고 있는 것을 보고 그는,
+"이게 무슨 무덤인지 아십니까?"
+하고 유쾌하게 묻소.
+"두 별 무덤이라니 무슨 뜻인가요?"
+하고 나도 그의 유쾌한 표정에 전염이 되어서 웃고 물었소.
+"이것은 우리 둘의 무덤이외다."
+하고 그는 아내의 어깨를 치며 유쾌하게 웃었소. 부인은 부끄러운 듯이 웃고 고개를 숙이오.
+도무지 모두 꿈 같고 환영 같소.
+"자 갑시다. 자세한 말은 우리 집에 가서 합시다."
+하고 서너 걸음 어떤 방향으로 걸어가니 거기는 말을 세 필이나 맨 마차가 있소. 몽고 사람들이 가족을 싣고 수초를 따라 돌아다니는 그러한 마차요. 삿자리로 홍예형의 지붕을 만들고 그 속에 들어가 앉게 되었소. 그의 부인과 나와는 이 지붕 속에 들어앉고 그는 손수 어자대에 앉아서 입으로 쮸쮸쮸쮸 하고 말을 모오. 등불도 꺼 버리고 캄캄한 속으로 달리오.
+"불이 있으면 군대에서 의심을 하지요. 도적놈이 엿보지요. 게다가 불이 있으면 도리어 앞이 안 보인단 말요. 쯧쯧쯧쯧!"
+하는 소리가 들리오.
+대체 이 사람은 무슨 사람인가. 또 이 부인은 무슨 사람인가 하고 나는 어두운 속에서 혼자 생각하였소. 다만 잠시 본 인상으로 보아서 그들은 행복된 부부인 것 같았소. 그들이 무엇 하러 이 아닌 밤중에 광야에 나왔던가. 또 그 이상야릇한 두 별 무덤이란 무엇인가.
+나는 불현듯 집을 생각하였소. 내 아내와 어린것들을 생각하였소. 가정과 사회에서 쫓겨난 내가 아니오. 쫓겨난 자의 생각은 언제나 슬픔뿐이었소.
+나는 내 아내를 원망치 아니하오. 그는 결코 악한 여자가 아니오. 다만 보통 여자요. 그는 질투 때문에 이성의 힘을 잃은 것이오. 여자가 질투 때문에 이성을 잃는 것이 천직이 아닐까요. 그가 나를 사랑하길래 나를 위해서 질투를 가지는 것이 아니오.
+설사 질투가 그로 하여금 칼을 들어 내 가슴을 찌르게 하였다 하더라도 나는 감사한 생각을 가지고 눈을 감을 것이오. 사랑하는 자는 질투한다고 하오. 질투를 누르는 것도 아름다운 일이지마는 질투에 타는 것도 아름다운 일이 아닐까요.
+덜크럭덜크럭 하고 차바퀴가 철로길을 넘어가는 소리가 나더니 이윽고 마차는 섰소.
+앞에 빨갛게 불이 비치오.
+"자 이게 우리 집이오."
+하고 그가 마차에서 뛰어내리는 양이 보이오. 내려 보니까 달이 올라오오. 굉장히 큰 달이, 붉은 달이 지평선으로서 넘석하고 올라오오.
+달빛에 비추인 바를 보면 네모나게 담 담이라기보다는 성을 둘러쌓은 달 뜨는 곳으로 열린 대문을 들어서서 넓은 마당에 내린 것을 발견하였소.
+"아버지!"
+"엄마!"
+하고 아이들이 뛰어나오오. 말만큼이나 큰 개가 네 놈이나 꼬리를 치고 나오오. 그놈들이 주인집 마차 소리를 알아듣고 짖지 아니한 모양이오.
+큰 아이는 계집애로 여남은 살, 작은 아이는 사내로 육칠 세, 모두 중국 옷을 입었소.
+우리는 방으로 들어갔소. 방은 아라사식 절반, 중국식 절반으로 세간이 놓여 있고 벽에는 조선 지도와 단군의 초상이 걸려 있소.
+그들 부처는 지도와 단군 초상 앞에 허리를 굽혀 배례하오. 나도 무의식적으로 그대로 하였소.
+그는 차를 마시며 이렇게 말하오.
+"우리는 자식들을 이 흥안령 가까운 무변 광야에서 기르는 것으로 낙을 삼고 있지요. 조선 사람들은 하도 마음이 작아서 걱정이니 이런 호호탕탕한 넓은 벌판에서 길러나면 마음이 좀 커질까 하지요. 또 흥안령 밑에서 지나 중원을 통일한 제왕이 많이 났으니 혹시나 그 정기가 남아 있을까 하지요. 우리 부처의 자손이 몇 대를 두고 퍼지는 동안에는 행여나 마음 큰 인물이 하나 둘 날는지 알겠어요, 하하하하."
+하고 그는 제 말을 제가 비웃는 듯이 한바탕 웃고 나서,
+"그러나 이건 내 진정이외다. 우리도 이렇게 고국을 떠나 있지마는 그래도 고국 소식이 궁금해서 신문 하나는 늘 보지요. 하지만 어디 시원한 소식이 있어요. 그저 조리복소니가 되어가는 것이 아니면 조그마한 생각을 가지고, 눈곱만한 야심을 가지고, 서 푼어치 안 되는 이상을 가지고 찧고 까불고 싸우고 하는 것밖에 안 보이니 이거 어디 살 수가 있나. 그래서 나는 마음 큰 자손을 낳아서 길러 볼까 하고 이를테면 새 민족을 하나 만들어 볼까 하고, 둘째 단군, 둘째 아브라함이나 하나 낳아 볼까 하고 하하하하앗하."
+하고 유쾌하게, 그러나 비통하게 웃소.
+나는 저녁을 굶어서 배가 고프고, 밤길을 걸어서 몸이 곤한 것도 잊고 그의 말을 들었소.
+부인이 김이 무럭무럭 나는 호떡을 큰 뚝배기에 담고 김치를 작은 뚝배기에 담고, 또 돼지고기 삶은 것을 한 접시 담아다가 탁자 위에 놓소.
+건넌방이라고 할 만한 방에서 젖먹이 우는 소리가 들리오. 부인은 삼십이나 되었을까, 남편은 서른댓 되었을 듯한 키가 훨쩍 크고 눈과 코가 크고 손도 큰 건장한 대장부요, 음성이 부드러운 것이 체격에 어울리지 아니하나 그것이 아마 그의 정신 생활이 높은 표겠지요.
+"신문에서 최 선생이 학교를 고만두시게 되었다는 말도 보았지요. 그러나 나는 그것이 다 최 선생에게 대한 중상인 줄을 짐작하였고, 또 오늘 이렇게 만나 보니까 더구나 그것이 다 중상인 줄을 알지요."
+하고 그는 확신 있는 어조로 말하오.
+"고맙습니다."
+나는 이렇게밖에 대답할 말이 없었소.
+"아, 머, 고맙다고 하실 것도 없지요."
+하고 그는 머리를 뒤로 젖히고 한참이나 생각을 하더니 우선 껄껄 한바탕 웃고 나서,
+"내가 최 선생이 당하신 경우와 꼭 같은 경우를 당하였거든요. 이를테면 과부 설움은 동무 과부가 안다는 것이지요."
+하고 그는 자기의 내력을 말하기 시작하오.
+"내 집은 본래 서울입니다. 내가 어렸을 적에 내 선친께서 시국에 대해서 불평을 품고 당신 삼 형제의 가족을 끌고 재산을 모두 팔아 가지고 간도에를 건너오셨지요. 간도에 맨 먼저 ●●학교를 세운 이가 내 선친이지요."
+여기까지 하는 말을 듣고 나는 그가 누구인지를 알았소. 그는 R씨라고 간도 개척자요, 간도에 조선인 문화를 세운 이로 유명한 이의 아들인 것이 분명하오. 나는 그의 이름이 누구인지도 물어 볼 것 없이 알았소.
+"아 그러십니까. 네, 그러세요."
+하고 나는 감탄하였소.
+"네, 내 선친을 혹 아실는지요. 선친의 말씀이 노 그러신단 말씀야요. 조선 사람은 속이 좁아서 못쓴다고 <정감록>에도 그런 말이 있다고 조선은 산이 많고 들이 좁아서 사람의 마음이 작아서 큰일하기가 어렵고, 큰사람이 나기가 어렵다고. 웬만치 큰사람이 나면 서로 시기해서 큰일할 새가 없이 한다고 그렇게 <정감록>에도 있다더군요. 그래서 선친께서 자손에게나 희망을 붙이고 간도로 오신 모양이지요. 거기서 자라났다는 것이 내 꼴입니다마는, 아하하.
+내가 자라서 아버지께서 세우신 K여학교의 교사로 있을 때 일입니다. 지금 내 아내는 그 때 학생으로 있었구. 그러자 내 아버지께서 재산이 다 없어져서 학교를 독담하실 수가 없고, 또 얼마 아니해서 아버지께서 돌아가시고 보니 학교에는 세력 다툼이 생겨서 아버지의 후계자로 추정되는 나를 배척하게 되었단 말씀이오. 거기서 나를 배척하는 자료를 삼은 것이 나와 지금 내 아내가 된 학생의 관계란 것인데 이것은 전연 무근지설인 것은 말할 것도 없소. 나도 총각이요, 그는 처녀니까 혼인을 하자면 못 할 것도 없지마는 그것이 사제 관계라면 중대 문제거든. 그래서 나는 단연히 사직을 하고 내가 사직한 것은 제 죄를 승인한 것이라 하여서 그 학생 지금 내 아내도 출교 처분을 당한 것이오. 그러고 보니, 그 여자의 아버지 내 장인이지요 그 여자의 아버지는 나를 죽일 놈같이 원망을 하고 그 딸을 죽일 년이라고 감금을 하고 어쨌으나 조그마한 간도 사회에서 큰 파문을 일으켰단 말이오.
+이 문제를 더 크게 만든 것은 지금 내 아내인, 그 딸의 자백이오. 무어라고 했는고 하니, 나는 그 사람을 사랑하오, 그 사람한테가 아니면 시집을 안 가오, 하고 뻗댔단 말요.
+나는 이 여자가 이렇게 나를 생각하는가 할 때 의분심이 나서 나는 어떻게 해서든지 이 여자와 혼인하리라고 결심을 하였소. 나는 마침내 정식으로 K장로라는 내 장인에게 청혼을 하였으나 단박에 거절을 당하고 말았지요. K장로는 그 딸을 간도에 두는 것이 옳지 않다고 해서 서울로 보내기로 하였단 말을 들었소. 그래서 나는 최후의 결심으로 그 여자 지금 내 아내 된 사람을 데리고 간도에서 도망하였소. 하하하하. 밤중에 단둘이서.
+지금 같으면야 사제간에 결혼을 하기로 그리 큰 문제가 될 것이 없지마는 그 때에 어디 그랬나요. 사제간에 혼인이란 것은 부녀간에 혼인한다는 것과 같이 생각하였지요. 더구나 그 때 간도 사회에는 청교도적 사상과 열렬한 애국심이 있어서 도덕 표준이 여간 높지 아니하였지요. 그런 시대니까 내가 내 제자인 여학생을 데리고 달아난다는 것은 살인 강도를 하는 이상으로 무서운 일이었지요. 지금도 나는 그렇게 생각합니다마는.
+그래서 우리 두 사람은 우리 두 사람이라는 것보다도 내 생각에는 어찌하였으나 나를 위해서 제 목숨을 버리려는 그에게 사실 나도 마음 속으로는 그를 사랑하였지요. 다만 사제간이니까 영원히 달할 수는 없는 사랑이라고 단념하였을 뿐이지요. 그러니까 비록 부처 생활은 못 하더라도 내가 그의 사랑을 안다는 것과 나도 그를 이만큼 사랑한다는 것만을 보여 주자는 것이지요.
+때는 마침 가을이지마는, 몸에 지닌 돈도 얼마 없고 천신만고로 길림까지를 나와 가지고는 배를 타고 송화강을 내려서 하얼빈에 가 가지고 거 기서 간신히 치타까지의 여비와 여행권을 얻어 가지고 차를 타고 떠나지 않았어요. 그것이 바로 십여 년 전 오늘이란 말이오."
+이 때에 부인이 옥수수로 만든 국수와 감자 삶은 것을 가지고 들어오오.
+나는 R의 말을 듣던 끝이라 유심히 부인을 바라보았소. 그는 중키나 되는 둥근 얼굴이 혈색이 좋고 통통하여 미인이라기보다는 씩씩한 여자요. 그런 중에 조선 여자만이 가지는 아담하고 점잖은 맛이 있소.
+"앉으시지요. 지금 두 분께서 처음 사랑하시던 말씀을 듣고 있습니다."
+하고 나는 부인에게 교의를 권하였소.
+"아이, 그런 말씀은 왜 하시오."
+하고 부인은 갑자기 십 년이나 어려지는 모양으로 수삽한 빛을 보이고 고개를 숙이고 달아나오.
+"그래서요. 그래 오늘이 기념일이외다그려."
+하고 나도 웃었소.
+"그렇지요. 우리는 해마다 오늘이 오면 우리 무덤에 성묘를 가서 하룻밤을 새우지요. 오늘은 손님이 오셔서 중간에 돌아왔지만, 하하하하."
+하고 그는 유쾌하게 웃소.
+"성묘라니?"
+하고 나는 물었소.
+"아까 보신 두 별 무덤 말이오. 그것이 우리 내외의 무덤이지요. 하하하하."
+"…………."
+나는 영문을 모르고 가만히 앉았소.
+"내 이야기를 들으시지요. 그래 둘이서 차를 타고 오지 않았겠어요. 물론 여전히 선생님과 제자지요. 그렇지만 워낙 여러 날 단둘이서 같이 고생을 하고 여행을 했으니 사랑의 불길이 탈 것이야 물론 아니겠어요. 다만 사제라는 굳은 의리가 그것을 겉에 나오지 못하도록 누른 것이지요. ……그런데 꼭 오늘같이 좋은 날인데 여기는 대개 일기가 일정합니다. 좀체로 비가 오는 일도 없고 흐리는 날도 없지요. 헌데 F역에를 오니까 참 석양 경치가 좋단 말이오. 그 때에 불현듯, 에라 여기서 내려서 이 석양 속에 저 호숫 가에 둘이서 헤매다가 깨끗이 사제의 몸으로 이 깨끗한 광야에 묻혀 버리자 하는 생각이 나겠지요. 그래 그 때 말을 내 아내 그 때에는 아직 아내가 아니지요 내 아내에게 그런 말을 하였더니 참 좋다고 박장을 하고 내 어깨에 매달리는구려. 그래서 우리 둘은 차가 거의 떠날 임박해서 차에서 뛰어내렸지요."
+하고 그는 그때 광경을 눈앞에 그리는 모양으로 말을 끊고 우두커니 허공을 바라보오. 그러나 그의 입 언저리에는 유쾌한 회고에서 나오는 웃음이었소.
+"이야기 다 끝났어요?"
+하고 부인이 크바스라는 청량 음료를 들고 들어오오.
+"아니오. 이제부터가 정통이니 당신도 거기 앉으시오. 지금 차에서 내린 데까지 왔는데 당신도 앉아서 한 파트를 맡으시오."
+하고 R는 부인의 손을 잡아서 자리에 앉히오. 부인도 웃으면서 앉소.
+"최 선생 처지가 꼭 나와 같단 말요. 정임의 처지가 당신과 같고."
+하고 그는 말을 계속하오.
+"그래 차에서 내려서 나는 이 양반하고 물을 찾아 헤매었지요. 아따, 석양이 어떻게 좋은지 이 양반은 박장을 하고 노래를 부르고 우리 둘은 마치 유쾌하게 산보하는 사람 같았지요."
+"참 좋았어요. 그 때에는 참 좋았어요. 그 석양에 비친 광야와 호수라는 건 어떻게 좋은지 그 수은 같은 물 속에 텀벙 뛰어들고 싶었어요. 그 후엔 해마다 보아도 그만 못해."
+하고 부인이 참견을 하오.
+아이들은 다 자는 모양이오.
+"그래 지향없이 헤매는데 해는 뉘엿뉘엿 넘어가구, 어스름은 기어들고 그 때 마침 하늘에는 별 둘이 나타났단 말이야. 그것을 이 여학생이 먼저 보고서 갑자기 추연해지면서 선생님 저 별 보셔요, 앞선 큰 별은 선생님이 구 따라가는 작은 별은 저야요, 하겠지요. 그 말이, 또 그 태도가 어떻게 가련한지. 그래서 나는 하늘을 바라보니깐 과연 별 두 개가 지는 해를 따르는 듯이 따라간다 말요. 말을 듣고 보니 과연 우리 신세와도 같지 않아요?
+그리고는 이 사람이 또 이럽니다그려 `선생님, 앞선 큰 별은 아무리 따라도 저 작은 별은 영원히 따라잡지 못하겠지요. 영원히 영원히 따라가다가 따라가다가 못 해서 마침내는 저 작은 별은 죽어서 검은 재가 되고 말겠지요? 저 작은 별이 제 신세와 어쩌면 그리 같을까.' 하고 한탄을 하겠지요. 그 때에 한탄을 하고 눈물을 흘리고 섰는 어린 처녀의 석양빛에 비췬 모양을 상상해 보세요, 하하하하. 그 때에는 당신도 미인이었소. 하하하하."
+하고 내외가 유쾌하게 웃는 것을 보니 나는 더욱 적막하여짐을 깨달았소. 어쩌면 그 석양, 그 두 별이 이들에게와 내게 꼭 같은 인상을 주었을까 하니 참으로 이상하다 하였소.
+"그래 인제."
+하고 R는 다시 이야기를 계속하오.
+"그래 인제 둘이서 그야말로 감개무량하게 두 별을 바라보며 걸었지요. 그러다가 해가 넘어가고 앞선 큰 별이 넘어가고 그리고는 혼자서 깜빡깜빡하고 가던 작은 별이 넘어가니 우리는 그만 땅에 주저앉았소. 거기가 어딘고 하니 그 두 별 무덤이 있는 곳이지요. `선생님 저를 여기다가 파묻어 주시고 가셔요. 선생님 손수 저를 여기다가 묻어 놓고 가 주셔요.' 하고 이 사람이 조르지요."
+하는 것을 부인은,
+"내가 언제."
+하고 남편을 흘겨보오.
+"그럼 무에라고 했소? 어디 본인이 한 번 옮겨 보오."
+하고 R가 말을 끊소.
+"간도를 떠난 지가 한 달이 되도록 단둘이 다녀도 요만큼도 귀해 주는 점이 안 뵈니 그럼 파묻어 달라고 안 해요?"
+하고 부인은 웃소.
+"흥흥."
+하고 R는 부인의 말에 웃고 나서,
+"그 자리에 묻어 달란 말을 들으니까, 어떻게 측은한지, 그럼 나도 함께 묻히자고 그랬지요. 나는 그 때에 참말 그 자리에 함께 묻히고 싶었어요. 그래서 나는 손으로 곧 구덩이를 팠지요. 떡가루 같은 모래판이니까 파기는 힘이 아니 들겠지요. 이이도 물끄러미 내가 땅을 파는 것을 보고 섰더니만 자기도 파기를 시작하겠지요."
+하고 내외가 다 웃소.
+"그래 순식간에……."
+하고 R는 이야기를 계속하오.
+"순식간에 둘이 드러누울 만한 구덩이를 아마 두 자 깊이나 되게, 네모나게 파 놓고는 내가 들어가 누워 보고 그러고는 또 파고 하여 아주 편안한 구덩이를 파고 나서는 나는 아주 세상을 하직할 셈으로 사방을 둘러보 고 사방이래야 컴컴한 어둠밖에 없지만 사방을 둘러보고, 이를테면 세상과 작별을 하고 드러누웠지요. 지금 이렇게 회고담을 할 때에는 우습기도 하지마는 그 때에는 참으로 종교적이라 할 만한 엄숙이었소. 그때 우리 둘의 처지는 앞도 절벽, 뒤도 절벽이어서 죽는 길밖에 없었지요. 또 그뿐 아니라 인생의 가장 깨끗하고 가장 사랑의 맑은 정이 타고 가장 기쁘고도 슬프고도 이를테면 모든 감정이 절정에 달하고, 그러한 순간에 목숨을 끊어 버리는 것이 가장 좋은 일이요, 가장 마땅한 일같이 생각하였지요. 광야에 아름다운 황혼이 순간에 스러지는 모양으로 우리 두 생명의 아름다움도 순간에 스러지자는 우리는 철학자도 시인도 아니지마는 우리들의 환경이 우리 둘에게 그러한 생각을 넣어 준 것이지요.
+그래서 내가 가만히 드러누워 있는 것을 저이가 물끄러미 보고 있더니 자기도 내 곁에 들어와 눕겠지요. 그런 뒤에는 황혼에 남은 빛도 다 스러지고 아주 캄캄한 암흑 세계가 되어 버렸지요. 하늘에 어떻게 그렇게 별이 많은지. 가만히 하늘을 바라보노라면 참 별이 많아요. 우주란 참 커요. 그런데 이 끝없이 큰 우주에 한없이 많은 별들이 다 제자리를 지키고 제 길을 지켜서 서로 부딪지도 아니하고 끝없이 긴 시간에 질서를 유지하고 있는 것을 보면 우주에는 어떤 주재하는 뜻, 섭리하는 뜻이 있다 하는 생각이 나겠지요. 나도 예수교인의 가정에서 자라났지마는 이 때처럼 하나님이라 할까 이름은 무엇이라고 하든지 간에 우주의 섭리자의 존재를 강렬하게 의식한 일은 없었지요.
+그렇지만 `사람의 마음에 비기면 저까짓 별들이 다 무엇이오?' 하고 그때 겨우 열여덟 살밖에 안 된 이이가 내 귀에 입을 대고 말할 때에는 나도 참으로 놀랐습니다. 나이는 나보다 오륙 년 상관밖에 안 되지마는 이십 세 내외에 오륙 년 상관이 적은 것인가요? 게다가 나는 선생이요 자기는 학생이니까 어린애로만 알았던 것이 그런 말을 하니 놀랍지 않아요? 어째서 사람의 마음이 하늘보다도 더 이상할까 하고 내가 물으니까, 그 대답이 `나는 무엇이라고 설명할 수가 없지마는 내 마음 속에 일어나는 것이 하늘이나 땅에 일어나는 모든 것보다도 더 아름답고 더 알 수 없고 더 뜨겁고 그런 것 같아요.' 그러겠지요. 생명이란 모든 아름다운 것 중에 가장 아름다운 것이라는 것을 나는 깨달았어요. 그 말에, `그렇다 하면 이 아름답고 신비한 생명을 내는 우주는 더 아름다운 것이 아니오?' 하고 내가 반문하니까, 당신(부인을 향하여) 말이, `전 모르겠어요, 어쨌으나 전 행복합니다. 저는 이 행복을 깨뜨리고 싶지 않습니다. 놓쳐 버리고 싶지 않습니다. 이 행복 선생님 곁에 있는 이 행복을 꽉 안고 죽고 싶어요.' 그러지 않았소?"
+"누가 그랬어요? 아이 난 다 잊어버렸어요."
+하고 부인은 차를 따르오. R는 인제는 하하하 하는 웃음조차 잊어버리고, 부인에게 농담을 붙이는 것조차 잊어버리고, 그야말로 종교적 엄숙 그대로말을 이어,
+"`자 저는 약을 먹어요.' 하고 손을 입으로 가져가는 동작이 감행되겠지요. 약이란 것은 하얼빈에서 준비한 아편이지요. 하얼빈서 치타까지 가는 동안에 흥안령이나 어느 삼림지대나 어디서나 죽을 자리를 찾자고 준비한 것이니까. 나는 입 근처로 가는 그의 손을 붙들었어요. 붙들면서 나는 `잠깐만 기다리오. 오늘 밤 안으로 그 약을 먹으면 고만이 아니오? 이 행복된 순간을 잠깐이라도 늘립시다. 달 올라올 때까지만.' 나는 이렇게 말했지요. `선생님도 행복되셔요? 선생님은 불행이시지. 저 때문에 불행이시지. 저만 이곳에 묻어 주시구는 선생님은 세상에 돌아가 사셔요, 오래오래 사셔요, 일 많이 하고 사셔요.' 하고 울지 않겠어요. 나는 그 때에 내 아내가 하던 말을 한 마디도 잊지 아니합니다. 그 말을 듣던 때의 내 인상은 아마 일생 두고 잊히지 아니하겠지요.
+나는 자백합니다. 그 순간에 나는 처음으로 내 아내를 안고 키스를 하였지요. 내 속에 눌리고 눌리고 쌓이고 하였던 열정이 그만 일시에 폭발되었던 것이오. 아아 이것이 최초의 것이요, 동시에 최후의 것이로구나 할 때에 내 눈에서는 끓는 듯한 눈물이 흘렀소이다. 두 사람의 심장이 뛰는 소리, 두 사람의 풀무 불길 같은 숨소리.
+이윽고 달이 떠올라 왔습니다. 가이없는 벌판이니까 달이 뜨니까 갑자기 천지가 환해지고 우리 둘이 손으로 파서 쌓아 놓은 흙무더기가 이 산 없는 세상에 산이나 되는 것같이 조그마한 검은 그림자를 지고 있겠지요. `자 우리 달빛을 띠고 좀 돌아다닐까.' 하고 나는 아내를 안아 일으켰지요. 내 팔에 안겨서 고개를 뒤로 젖힌 내 아내의 얼굴이 달빛에 비친 양을 나는 잘 기억합니다. 실신한 듯한, 만족한 듯한, 그리고도 절망한 듯한 그 표정을 무엇으로 그릴지 모릅니다. 그림도 그릴 줄 모르고 조각도 할 줄 모르고 글도 쓸 줄 모르는 내가 그것을 어떻게 그립니까. 그저 가슴 속에 품고 이렇게 오늘의 내 아내를 바라볼 뿐이지요.
+나는 내 아내를 팔에 걸고 네, 걸었다고 하는 것이 가장 합당하지 요 이렇게 팔에다 걸고 달빛을 받은 황량한 벌판, 아무리 하여도 환하게 밝아지지는 아니하는 벌판을 헤매었습니다. 이따금 내 아내가, `어서 죽고 싶어요, 전 죽고만 싶어요.' 하는 말에는 대답도 아니 하고. 죽고 싶다는 그 말은 물론 진정일 것이지요. 아무리 맑은 일기라 하더라도 오후가 되면 흐려지는 법이니까 오래 살아가는 동안에 늘 한 모양으로 이 순간같이 깨끗하고 뜨거운 기분으로 갈 수는 없지 않아요? 불쾌한 일도 생기고, 보기 흉한 일도 생길는지 모르거든. 그러니까 이 완전한 깨끗과 완전한 사랑과 완전한 행복 속에 죽어 버리자는 뜻을 나는 잘 알지요. 더구나 우리들이 살아 남는대야 앞길이 기구하지 평탄할 리는 없지 아니해요? 그래서 나는 `죽지, 우리 이 달밤에 실컷 돌아다니다가, 더 돌아다니기가 싫거든 그 구덩에 돌아가서 약을 먹읍시다.' 이렇게 말하고 우리 둘은 헤맸지요. 낮에 보면 어디까지나 평평한 벌판인 것만 같지마는 달밤에 보면 이 사막에도 아직 채 스러지지 아니한 산의 형적이 남아 있어서 군데군데 거뭇거뭇한 그림자가 있겠지요. 그 그림자 속에는 걸어 들어가면 어떤 데는 우리 허리만큼 그림자에 가리우고 어떤 데는 우리 둘을 다 가리워 버리는 데도 있단 말야요. 죽음의 그림자라는 생각이 나면 그래도 몸에 소름이 끼쳐요.
+차차 달이 높아지고 추위가 심해져서 바람결이 지나갈 때에는 눈에서 눈물이 날 지경이지요. 원체 대기 중에 수분이 적으니까 서리도 많지 않지마는, 그래도 대기 중에 있는 수분은 다 얼어 버려서 얼음가루가 되었는 게지요. 공중에는 반짝반짝하는 수정가루 같은 것이 보입니다. 낮에는 땀이 흐르리만큼 덥던 사막도 밤이 되면 이렇게 기온이 내려가지요. 춥다고 생각은 하면서도 춥다는 말은 아니 하고 우리는 어떤 때에는 달을 따라서, 어떤 때에는 달을 등지고, 어떤 때에는 호수에 비친 달을 굽어보고, 이 모양으로 한없이 말도 없이 돌아다녔지요. 이 세상 생명의 마지막 순간을 힘껏 의식하려는 듯이.
+마침내 `나는 더 못 걸어요.' 하고 이이가 내 어깨에 매달려 버리고 말았지요."
+하고 R가 부인을 돌아보니 부인은 편물하던 손을 쉬고,
+"다리가 아픈 줄은 모르겠는데 다리가 이리 뉘구 저리 뉘구 해서 걸음을 걸을 수가 없었어요. 춥기는 하구."
+하고 소리를 내어서 웃소.
+"그럴 만도 하지."
+하고 R는 긴장한 표정을 약간 풀고 앉은 자세를 잠깐 고치며,
+"그 후에 그 날 밤 돌아다닌 곳을 더듬어 보니까, 자세히는 알 수 없지마는 삼십 리는 더 되는 것 같거든. 다리가 아프지 아니할 리가 있나."
+하고 차를 한 모금 마시고 나서 말을 계속하오.
+"그래서 나는 내 외투를 벗어서, 이이(부인)를 싸서 어린애 안듯이 안고 걸었지요. 외투로 쌌으니 자기도 춥지 않구, 나는 또 무거운 짐을 안았으니 땀이 날 지경이구, 그뿐 아니라 내가 제게 주는 최후의 서비스라 하니 기쁘고, 말하자면 일거 삼득이지요. 하하하하. 지난 일이니 웃지마는 그 때 사정을 생각해 보세요, 어떠했겠나."
+하고 R는 약간 처참한 빛을 띠면서,
+"그러니 그 구덩이를 어디 찾을 수가 있나. 얼마를 찾아 돌아다니다가 아무 데서나 죽을 생각도 해 보았지마는 몸뚱이를 그냥 벌판에 내놓고 죽고 싶지는 아니하고 또 그 구덩이가 우리 두 사람에게 특별한 의미가 있는 것 같아서 기어코 그것을 찾아 내고야 말았지요. 그 때는 벌써 새벽이 가까웠던 모양이오. 열 시나 넘어서 뜬 하현달이 낮이 기울었으니 그렇지 않겠어요. 그 구덩이에 와서 우리는 한 번 더 하늘과 달과 별과, 그리고 마음 속에 떠오른 사람들과 하직하고 약 먹을 준비를 했지요.
+약을 검은 고약과 같은 아편을 맛이 쓰다는 아편을 물도 없이 먹으려 들었지요.
+우리 둘은 아까 모양으로 가지런히 누워서 하늘을 바라보았는데 달이 밝으니까 보이던 별들 중에 숨은 별이 많고 또 별들의 위치 우리에게 낯익은 북두칠성 자리도 변했을 것 아니야요. 이상한 생각이 나요. 우리가 벌판으로 헤매는 동안에 천지가 모두 변한 것 같아요. 사실 변하였지요. 그 변한 것이 우스워서 나는 껄껄 웃었지요. 워낙 내가 웃음이 좀 헤프지만 이 때처럼 헤프게 실컷 웃어 본 일은 없습니다.
+왜 웃느냐고 아내가 좀 성을 낸 듯이 묻기로, `천지와 인생이 변하는 것이 우스워서 웃었소.' 그랬지요. 그랬더니, `천지와 인생은 변할는지 몰라도 내 마음은 안 변해요!' 하고 소리를 지르겠지요. 퍽 분개했던 모양이야."
+하고 R는 그 아내를 보오.
+"그럼 분개 안 해요? 남은 죽을 결심을 하고 발발 떨구 있는데 곁에서 껄껄거리고 웃으니, 어째 분하지가 않아요. 나는 분해서 달아나려고 했어요."
+하고 부인은 아직도 분함이 남은 것같이 말하오.
+"그래 달아나지 않았소?"
+하고 R는 부인이 벌떡 일어나서 비틀거리고 달아나는 흉내를 팔과 다리로 내고 나서,
+"이래서 죽는 시간이 지체가 되었지요. 그래서 내가 빌고 달래고 해서 가까스로 안정을 시키고 나니 손에 쥐었던 아편이 땀에 푹 젖었겠지요. 내가 웃은 것은 죽기 전 한 번 천지와 인생을 웃어 버린 것인데 그렇게 야단이니…… 하하하하."
+R는 식은 차를 한 모금 더 마시며,
+"참 목도 마르기도 하더니. 입에는 침 한 방울 없고. 그러나 못물을 먹을 생각도 없고. 나중에는 말을 하려고 해도 혀가 안 돌아가겠지요.
+이러는 동안에 달빛이 희미해지길래 웬일인가 하고 고개를 번쩍 들었더니 해가 떠오릅니다그려. 어떻게 붉고 둥글고 씩씩한지. `저 해 보오.' 하고 나는 기계적으로 벌떡 일어나서 구덩이에서 뛰어나왔지요."
+하고 빙그레 웃소. R의 빙그레 웃는 양이 참 좋았소.
+"내가 뛰어나오는 것을 보고 이이도 뿌시시 일어났지요. 그 해! 그 해의 새 빛을 받는 하늘과 땅의 빛! 나는 그것을 형용할 말을 가지지 못합니다. 다만 힘껏 소리치고 싶고 기운껏 달음박질치고 싶은 생각이 날 뿐이어요.
+`우리 삽시다, 죽지 말고 삽시다, 살아서 새 세상을 하나 만들어 봅시다.' 이렇게 말하였지요. 하니까 이이가 처음에는 깜짝 놀라는 것 같아요. 그러나 마침내 아내도 죽을 뜻을 변하였지요. 그래서 남 선생을 청하여다가 그 말씀을 여쭈었더니 남 선생께서 고개를 끄덕끄덕하시고 우리 둘의 혼인 주례를 하셨지요. 그 후 십여 년에 우리는 밭 갈고 아이 기르고 이런 생활을 하고 있는데 언제나 여기 새 민족이 생기고 누가 새 단군이 될는지요. 하하하하, 아하하하. 피곤하시겠습니다. 이야기가 너무 길어서."
+하고 R는 말을 끊소.
+나는 R부처가 만류하는 것도 다 뿌리치고 여관으로 돌아왔소. R와 함께 달빛 속, 개 짖는 소리 속을 지나서 아라사 사람의 조그마한 여관으로 돌아왔소. 여관 주인도 R를 아는 모양이어서 반갑게 인사하고 또 내게 대한 부탁도 하는 모양인가 보오.
+R는 내 방에 올라와서 내일 하루 지날 일도 이야기하고 또 남 선생과 정임에게 관한 이야기도 하였으나, 나는 그가 무슨 이야기를 하는지 잘 들을 만한 마음의 여유도 없어서 마음 없는 대답을 할 뿐이었소.
+R가 돌아간 뒤에 나는 옷도 벗지 아니하고 침대에 드러누웠소. 페치카를 때기는 한 모양이나 방이 써늘하기 그지없소.
+`그 두 별 무덤이 정말 R와 그 여학생과 두 사람이 영원히 달치 못할 꿈을 안은 채로 깨끗하게 죽어서 묻힌 무덤이었으면 얼마나 좋을까. 만일 그렇다 하면 내일 한 번 더 가서 보토라도 하고 오련마는.'
+하고 나는 R부처의 생활에 대하여 일종의 불만과 환멸을 느꼈소.
+그리고 내가 정임을 여기나 시베리아나 어떤 곳으로 불러다가 만일 R와 같은 흉내를 낸다 하면, 하고 생각해 보고는 나는 진저리를 쳤소. 나는 내머리 속에 다시 그러한 생각이 한 조각이라도 들어올 것을 두려워하였소.
+급행을 기다리자면 또 사흘을 기다리지 아니하면 아니 되기로 나는 이튿날 새벽에 떠나는 구간차를 타고 F역을 떠나 버렸소. R에게는 고맙다는 편지 한 장만을 써 놓고. 나는 R를 더 보기를 원치 아니하였소. 그것은 반드시 R를 죄인으로 보아서 그런 것은 아니오마는 그저 나는 다시 R를 대면하기를 원치 아니한 것이오.
+나는 차가 R의 집 앞을 지날 때에도 R의 집에 대하여서는 외면하였소.
+이 모양으로 나는 흥안령을 넘고, 하일라르의 솔밭을 지나서 마침내 이 곳에 온 것이오.
+형! 나는 인제는 이 편지를 끝내오. 더 쓸 말도 없거니와 인제는 이것을 쓰기도 싫증이 났소.
+이 편지를 쓰기 시작할 때에는 바이칼에 물결이 흉용하더니 이 편지를 끝내는 지금에는 가의 가까운 물에는 얼음이 얼었소. 그리고 저 멀리 푸른 물이 늠실늠실 하얗게 눈 덮인 산 빛과 어울리게 되었소.
+사흘이나 이어서 오던 눈이 밤새에 개고 오늘 아침에는 칼날 같은 바람이 눈을 날리고 있소.
+나는 이 얼음 위로 걸어서 저 푸른 물 있는 곳까지 가고 싶은 유혹을 금할 수 없소. 더구나 이 편지도 다 쓰고 나니, 인제는 내가 이 세상에서 할 마지막 일까지 다 한 것 같소.
+내가 이 앞에 어디로 가서 어찌 될는지는 나도 모르지마는 희미한 소원을 말하면 눈 덮인 시베리아의 인적 없는 삼림 지대로 한정 없이 헤매다가 기운 진하는 곳에서 이 목숨을 마치고 싶소.
+최석 군은 `끝'이라는 글자를 썼다가 지워 버리고 딴 종이에다가 이런 말을 썼다
+다 쓰고 나니 이런 편지도 다 부질없는 일이오. 내가 이런 말을 한대야 세상이 믿어 줄 리도 없지 않소. 말이란 소용 없는 것이오. 내가 아무리 내 아내에게 말을 했어도 아니 믿었거든 내 아내도 내 말을 아니 믿었거든 하물며 세상이 내 말을 믿을 리가 있소. 믿지 아니할 뿐 아니라 내 말 중에서 자기네 목적에 필요한 부분만은 믿고, 또 자기네 목적에 필요한 부분은 마음대로 고치고 뒤집고 보태고 할 것이니까, 나는 이 편지를 쓴 것이 한 무익하고 어리석은 일인 줄을 깨달았소.
+형이야 이 편지를 아니 보기로니 나를 안 믿겠소? 그 중에는 혹 형이 지금까지 모르던 자료도 없지 아니하니, 형만 혼자 보시고 형만 혼자 내 사정을 알아 주시면 다행이겠소. 세상에 한 믿는 친구를 가지는 것이 저마다 하는 일이겠소?
+나는 이 쓸데없는 편지를 몇 번이나 불살라 버리려고 하였으나 그래도 거기도 일종의 애착심이 생기고 미련이 생기는구려. 형 한 분이라도 보여 드리고 싶은 마음이 생기는구려. 내가 S형무소에 입감해 있을 적에 형무소 벽에 죄수가 손톱으로 성명을 새긴 것을 보았소. 뒤에 물었더니 그것은 흔히 사형수가 하는 짓이라고. 사형수가 교수대에 끌려 나가기 바로 전에 흔히 손톱으로 담벼락이나 마룻바닥에 제 이름을 새기는 일이 있다고 하는 말을 들었소. 내가 형에게 쓰는 이 편지도 그 심리와 비슷한 것일까요?
+형! 나는 보통 사람보다는, 정보다는 지로, 상식보다는 이론으로, 이해보다는 의리로 살아 왔다고 자신하오. 이를테면 논리학적으로 윤리학적으로 살아온 것이라고 할까. 나는 엄격한 교사요, 교장이었소. 내게는 의지력과 이지력밖에 없는 것 같았소. 그러한 생활을 수십 년 해 오지 아니하였소? 나는 이 앞에 몇십 년을 더 살더라도 내 이 성격이나 생활 태도에는 변함이 없으리라고 자신하였소. 불혹지년이 지났으니 그렇게 생각하였을 것이 아니오?
+그런데 형! 참 이상한 일이 있소. 그것은 내가 지금까지 처해 있던 환경을벗어나서 호호 탕탕하게 넓은 세계에 알몸을 내어던짐을 당하니 내 마음 속에는 무서운 여러 가지 변화가 일어나는구려. 나는 이 말도 형에게 아니 하려고 생각하였소. 노여워하지 마시오, 내게까지도 숨기느냐고. 그런 것이 아니오, 형은커녕 나 자신에게까지도 숨기려고 하였던 것이오. 혹시 그런 기다리지 아니 하였던 원, 그런 생각이 내 마음의 하늘에 일어나리라고 상상도 아니하였던, 그런 생각이 일어날 때에는 나는 스스로 놀라고 스스로 슬퍼하였소. 그래서 스스로 숨기기로 하였소.
+그 숨긴다는 것이 무엇이냐 하면 그것은 열정이요, 정의 불길이요, 정의 광풍이요, 정의 물결이오. 만일 내 의식이 세계를 평화로운 풀 있고, 꽃 있고, 나무 있는 벌판이라고 하면 거기 난데없는 미친 짐승들이 불을 뿜고 소리를 지르고 싸우고, 영각을 하고 날쳐서, 이 동산의 평화의 화초를 다 짓밟아 버리고 마는 그러한 모양과 같소.
+형! 그 이상야릇한 짐승들이 여태껏, 사십 년 간을 어느 구석에 숨어 있었소? 그러다가 인제 뛰어나와 각각 제 권리를 주장하오?
+지금 내 가슴 속은 끓소. 내 몸은 바짝 여위었소. 그것은 생리학적으로나 심리학적으로나 타는 것이요, 연소하는 것이오. 그래서 다만 내 몸의 지방만이 타는 것이 아니라, 골수까지 타고, 몸이 탈 뿐이 아니라 생명 그 물건이 타고 있는 것이오. 그러면 어찌할까.
+지위, 명성, 습관, 시대 사조 등등으로 일생에 눌리고 눌렸던 내 자아의 일부분이 혁명을 일으킨 것이오? 한 번도 자유로 권세를 부려 보지 못한 본능과 감정들이 내 생명이 끝나기 전에 한 번 날뛰어 보려는 것이오. 이것이 선이오? 악이오?
+그들은 내가 지금까지 옳다고 여기고 신성하다고 여기던 모든 권위를 모조리 둘러엎으려고 드오. 그러나 형! 나는 도저히 이 혁명을 용인할 수가 없소. 나는 죽기까지 버티기로 결정을 하였소. 내 속에서 두 세력이 싸우다가 싸우다가 승부가 결정이 못 된다면 나는 승부의 결정을 기다리지 아니하고 살기를 그만두려오.
+나는 눈 덮인 삼림 속으로 들어가려오. 나는 V라는 대삼림 지대가 어디인 줄도 알고 거기를 가려면 어느 정거장에서 내릴 것도 다 알아 놓았소.
+만일 단순히 죽는다 하면 구태여 멀리 찾아갈 필요도 없지마는 그래도 나 혼자로는 내 사상과 감정의 청산을 하고 싶소. 살 수 있는 날까지 세상을 떠난 곳에서 살다가 완전한 해결을 얻는 날 나는 혹은 승리의, 혹은 패배의 종막을 닫칠 것이오. 만일 해결이 안 되면 안 되는 대로 그치면 그만이지요.
+나는 이 붓을 놓기 전에 어젯밤에 꾼 꿈 이야기 하나는 하려오. 꿈이 하도 수상해서 마치 내 전도에 대한 신의 계시와도 같기로 하는 말이오. 그 꿈은 이러하였소.
+내가 꽁이깨(꼬이까라는 아라사말로 침대라는 말이 조선 동포의 입으로 변한 말이오.) 짐을 지고 삽을 메고 눈이 덮인 삼림 속을 혼자 걸었소. 이 꽁이깨 짐이란 것은 금점꾼들이 그 여행 중에 소용품, 마른 빵, 소금, 내복 등속을 침대 매트리스에 넣어서 지고 다니는 것이오. 이 짐하고 삽 한 개, 도끼 한 개, 그것이 시베리아로 금을 찾아 헤매는 조선 동포들의 행색이오. 내가 이르쿠츠크에서 이러한 동포를 만났던 것이 꿈으로 되어 나온 모양이오.
+나는 꿈에는 세상을 다 잊어버린, 아주 깨끗하고 침착한 사람으로 이 꽁이깨 짐을 지고 삽을 메고 밤인지 낮인지 알 수 없으나 땅은 눈빛으로 희고, 하늘은 구름빛으로 회색인 삼림 지대를 허덕허덕 걸었소. 길도 없는 데를, 인적도 없는 데를.
+꿈에도 내 몸은 퍽 피곤해서 쉴 자리를 찾는 마음이었소.
+나는 마침내 어떤 언덕 밑 한 군데를 골랐소. 그리고 상시에 이야기에서 들은 대로 삽으로 내가 누울 자리만한 눈을 치고, 그리고는 도끼로 곁에 선 나무 몇 개를 찍어 누이고 거기다가 불을 놓고 그 불김에 녹은 땅을 두어 자나 파내고 그 속에 드러누웠소. 훈훈한 것이 아주 편안하였소.
+하늘에는 별이 반짝거렸소. F역에서 보던 바와 같이 큰 별 작은 별도 보이고 평시에 보지 못하던 붉은 별, 푸른 별 들도 보였소. 나는 이 이상한 하늘, 이상한 별들이 있는 하늘을 보고 드러누워 있노라니까 문득 어디서 발자국 소리가 들렸소. 퉁퉁퉁퉁 우루루루…… 나는 벌떡 일어나려 하였으나 몸이 천 근이나 되어서 움직일 수가 없었소. 가까스로 고개를 조금 들고 보니 뿔이 길다랗고 눈이 불같이 붉은 사슴의 떼가 무엇에 놀랐는지 껑충껑충 뛰어 지나가오. 이것은 아마 크로포트킨의 <상호 부조론> 속에 말한 시베리아의 사슴의 떼가 꿈이 되어 나온 모양이오.
+그러더니 그 사슴의 떼가 다 지나간 뒤에, 그 사슴의 떼가 오던 방향으로서 정임이가 걸어오는 것이 아니라 스르륵 하고 미끄러져 오오. 마치 인형을 밀어 주는 것같이.
+"정임아!"
+하고 나는 소리를 치고 몸을 일으키려 하였소.
+정임의 모양은 나를 잠깐 보고는 미끄러지는 듯이 흘러가 버리오.
+나는 정임아, 정임아를 부르고 팔다리를 부둥거렸소. 그러다가 마침내 내 몸이 번쩍 일으켜짐을 깨달았소. 나는 정임의 뒤를 따랐소.
+나는 눈 위로 삼림 속으로 정임의 그림자를 따랐소. 보일 듯 안 보일 듯, 잡힐 듯 안 잡힐 듯, 나는 무거운 다리를 끌고 정임을 따랐소.
+정임은 이 추운 날이언만 눈과 같이 흰 옷을 입었소. 그 옷은 옛날 로마 여인의 옷과 같이 바람결에 펄렁거렸소.
+"오지 마세요. 저를 따라오지 못하십니다."
+하고 정임은 눈보라 속에 가리워 버리고 말았소. 암만 불러도 대답이 없고 눈보라가 다 지나간 뒤에도 붉은 별, 푸른 별과 뿔 긴 사슴의 떼뿐이오. 정임은 보이지 아니하였소. 나는 미칠 듯이 정임을 찾고 부르다가 잠을 깨었소.
+꿈은 이것뿐이오. 꿈을 깨어서 창 밖을 바라보니 얼음과 눈에 덮인 바이칼호 위에는 새벽의 겨울 달이 비치어 있었소. 저 멀리 검푸르게 보이는 것이 채 얼어붙지 아니한 물이겠지요. 오늘 밤에 바람이 없고 기온이 내리면 그것마저 얼어붙을는지 모르지요. 벌써 살얼음이 잡혔는지도 모르지요. 아아, 그 속은 얼마나 깊을까. 나는 바이칼의 물 속이 관심이 되어서 못 견디겠소.
+형! 나는 자백하지 아니할 수 없소. 이 꿈은 내 마음의 어떤 부분을 설명한 것이라고. 그러나 형! 나는 이것을 부정하려오. 굳세게 부정하려오. 나는 이 꿈을 부정하려오. 억지로라도 부정하려오. 나는 결코 내 속에 일어난 혁명을 용인하지 아니하려오. 나는 그것을 혁명으로 인정하지 아니하려오. 아니오! 아니오! 그것은 반란이오! 내 인격의 통일에 대한 반란이오. 단연코 무단적으로 진정하지 아니하면 아니 될 반란이오. 보시오! 나는 굳게 서서 한 걸음도 뒤로 물러서지 아니할 것이오. 만일에 형이 광야에 구르는 내 시체나 해골을 본다든지, 또는 무슨 인연으로 내 무덤을 발견하는 날이 있다고 하면 그 때에 형은 내가 이 모든 반란을 진정한 개선의 군주로 죽은 것을 알아 주시오.
+인제 바이칼에 겨울의 석양이 비치었소. 눈을 인 나지막한 산들이 지는 햇빛에 자줏빛을 발하고 있소. 극히 깨끗하고 싸늘한 광경이오. 아디유!
+이 편지를 우편에 부치고는 나는 최후의 방랑의 길을 떠나오. 찾을 수도 없고, 편지 받을 수도 없는 곳으로.
+부디 평안히 계시오. 일 많이 하시오. 부인께 문안 드리오. 내 가족과 정임의 일 맡기오. 아디유!
+이것으로 최석 군의 편지는 끝났다.
+나는 이 편지를 받고 울었다. 이것이 일 편의 소설이라 하더라도 슬픈 일이어든, 하물며 내가 가장 믿고 사랑하는 친구의 일임에야.
+이 편지를 받고 나는 곧 최석 군의 집을 찾았다. 주인을 잃은 이 집에서는아이들이 마당에서 떠들고 있었다.
+"삼청동 아자씨 오셨수. 어머니, 삼청동 아자씨."
+하고 최석 군의 작은딸이 나를 보고 뛰어들어갔다.
+최석의 부인이 나와 나를 맞았다.
+부인은 머리도 빗지 아니하고, 얼굴에는 조금도 화장을 아니하고, 매무시도 흘러내릴 지경으로 정돈되지 못하였다. 일 주일이나 못 만난 동안에 부인의 모양은 더욱 초췌하였다.
+"노석헌테서 무슨 기별이나 있습니까."
+하고 나는 무슨 말로 말을 시작할지 몰라서 이런 말을 하였다.
+"아니오. 왜 그이가 집에 편지하나요?"
+하고 부인은 성난 빛을 보이며,
+"집을 떠난 지가 근 사십 일이 되건만 엽서 한 장 있나요. 집안 식구가 다 죽기로 눈이나 깜짝할 인가요. 그저 정임이헌테만 미쳐서 죽을지 살지를 모르지요."
+하고 울먹울먹한다.
+"잘못 아십니다. 부인께서 노석의 마음을 잘못 아십니다. 그런 것이 아닙니다."
+하고 나는 확신 있는 듯이 말을 시작하였다.
+"노석의 생각을 부인께서 오해하신 줄은 벌써부터 알았지마는 오늘 노석의 편지를 받아보고 더욱 분명히 알았습니다."
+하고 나는 부인의 표정의 변화를 엿보았다.
+"편지가 왔어요?"
+하고 부인은 놀라면서,
+"지금 어디 있어요? 일본 있지요?"
+하고 질투의 불길을 눈으로 토하였다.
+"일본이 아닙니다. 노석은 지금 아라사에 있습니다."
+"아라사요?"
+하고 부인은 놀라는 빛을 보이더니,
+"그럼 정임이를 데리고 아주 아라사로 가케오치를 하였군요."
+하고 히스테리컬한 웃음을 보이고는 몸을 한 번 떨었다.
+부인은 남편과 정임의 관계를 말할 때마다 이렇게 경련적인 웃음을 웃고 몸을 떠는 것이 버릇이었다.
+"아닙니다. 노석은 혼자 가 있습니다. 그렇게 오해를 마세요."
+하고 나는 보에 싼 최석의 편지를 내어서 부인의 앞으로 밀어 놓으며,
+"이것을 보시면 다 아실 줄 압니다. 어쨌으나 노석은 결코 정임이를 데리고 간 것이 아니요, 도리어 정임이를 멀리 떠나서 간 것입니다. 그러나 그보다도 중대 문제가 있습니다. 노석은 이 편지를 보면 죽을 결심을 한 모양입니다."
+하고 부인의 주의를 질투로부터 그 남편에게 대한 동정에 끌어 보려 하였다.
+"흥. 왜요? 시체 정사를 하나요? 좋겠습니다. 머리가 허연 것이 딸자식 같은 계집애허구 정사를 한다면 그 꼴 좋겠습니다. 죽으라지요. 죽으래요. 죽는 것이 낫지요. 그리구 살아서 무엇 해요?"
+내 뜻은 틀려 버렸다. 부인의 표정과 말에서는 더욱더욱 독한 질투의 안개와 싸늘한 얼음가루가 날았다.
+나는 부인의 이 태도에 반감을 느꼈다. 아무리 질투의 감정이 강하다 하기로, 사람의 생명이 제 남편의 생명이 위태함에도 불구하고 오직 제 질투의 감정에만 충실하려 하는 그 태도가 불쾌하였다. 그래서 나는,
+"나는 그만큼 말씀해 드렸으니 더 할 말씀은 없습니다. 아무려나 좀더 냉정하게 생각해 보세요. 그리고 이것을 읽어 보세요."
+하고 일어나서 집으로 돌아와 버리고 말았다.
+도무지 불쾌하기 그지없는 날이다. 최석의 태도까지도 불쾌하다. 달아나긴 왜 달아나? 죽기는 왜 죽어? 못난 것! 기운 없는 것! 하고 나는 최석이가 곁에 섰기나 한 것처럼 눈을 흘기고 중얼거렸다.
+최석의 말대로 최석의 부인은 악한 사람이 아니요, 그저 보통인 여성일는지 모른다. 그렇다 하면 여자의 마음이란 너무도 질투의 종이 아닐까. 설사 남편 되는 최석의 사랑이 아내로부터 정임에게로 옮아 갔다고 하더라도 그것을 질투로 회복하려는 것은 어리석은 일이다. 이미 사랑이 떠난 남편을 네 마음대로 가거라 하고 자발적으로 내어버릴 것이지마는 그것을 못 할 사정이 있다고 하면 모르는 체하고 내버려 둘 것이 아닌가. 그래도 이것은 우리네 남자의 이론이요, 여자로는 이런 경우에 질투라는 반응밖에 없도록 생긴 것일까 나는 이런 생각을 하고 있었다.
+시계가 아홉시를 친다.
+남대문 밖 정거장을 떠나는 열차의 기적 소리가 들린다.
+나는 만주를 생각하고, 시베리아를 생각하고 최석을 생각하였다. 마음으로는 정임을 사랑하면서 그 사랑을 발표할 수 없어서 시베리아의 눈 덮인 삼림 속으로 방황하는 최석의 모양이 최석의 꿈 이야기에 있는 대로 눈앞에 선하게 떠나온다.
+`사랑은 목숨을 빼앗는다.'
+하고 나는 사랑일래 일어나는 인생의 비극을 생각하였다. 그러나 최석의 경우는 보통 있는 공식과는 달라서 사랑을 죽이기 위해서 제 목숨을 죽이는 것이었다. 그렇다 하더라도,
+`사랑은 목숨을 빼앗는다.'
+는 데에는 다름이 없다.
+나는 불쾌도 하고 몸도 으스스하여 얼른 자리에 누웠다. 며느리가 들어온 뒤부터 사랑 생활을 하는 지가 벌써 오 년이나 되었다. 우리 부처란 인제는 한 역사적 존재요, 윤리적 관계에 불과하였다. 오래 사귄 친구와 같은 익숙함이 있고, 집에 없지 못할 사람이라는 필요감도 있지마는 젊은 부처가 가지는 듯한 그런 정은 벌써 없는 지 오래였다. 아내도 나를 대하면 본체만체, 나도 아내를 대하면 본체만체, 무슨 필요가 있어서 말을 붙이더라도 아무쪼록 듣기 싫기를 원하는 듯이 톡톡 내던졌다. 아내도 근래에 와서는 옷도 아무렇게나, 머리도 아무렇게나, 어디 출입할 때밖에는 도무지 화장을 아니 하였다.
+그러나 그렇다고 우리 부처의 새가 좋지 못한 것도 아니었다. 서로 소중히 여기는 마음도 있었다. 아내가 안에 있다고 생각하면 마음이 든든하고 또 아내의 말에 의하건대 내가 사랑에 있거니 하면 마음이 든든하다고 한다.
+우리 부처의 관계는 이러한 관계다.
+나는 한 방에서 혼자 잠을 자는 것이 습관이 되어서 누가 곁에 있으면 잠이 잘 들지 아니하였다. 혹시 어린것들이 매를 얻어맞고 사랑으로 피난을 와서 울다가 내 자리에서 잠이 들면 귀엽기는 귀여워도 잠자리는 편안치 아니하였다. 나는 책을 보고 글을 쓰고 공상을 하고 있으면 족하였다. 내게는 아무 애욕적 요구도 없었다. 이것은 내 정력이 쇠모한 까닭인지 모른다.
+그러나 최석의 편지를 본 그 날 밤에는 도무지 잠이 잘 들지 아니하였다. 최석의 편지가 최석의 고민이 내 졸던 의식에 무슨 자극을 준 듯하였다. 적막한 듯하였다. 허전한 듯하였다. 무엇인지 모르나 그리운 것이 있는 것 같았다.
+"어, 이거 안되었군."
+하고 나는 벌떡 일어나 담배를 피워 물었다.
+"나으리 주무셔 곕시오?"
+하고 아범이 전보를 가지고 왔다.
+"명조 경성 착 남정임"
+이라는 것이었다.
+"정임이가 와?"
+하고 나는 전보를 다시 읽었다.
+최석의 그 편지를 보면 최석 부인에게는 어떤 반응이 일어나고 정임에게는 어떤 반응이 일어날까, 하고 생각하면 자못 마음이 편하지 못하였다.
+이튿날 아침에 나는 부산서 오는 차를 맞으려고 정거장에를 나갔다.
+차는 제 시간에 들어왔다. 남정임은 슈트케이스 하나를 들고 차에서 내렸다. 검은 외투에 검은 모자를 쓴 그의 얼굴은 더욱 해쓱해 보였다.
+"선생님!"
+하고 정임은 나를 보고 손에 들었던 짐을 땅바닥에 내려놓고, 내 앞으로 왔다.
+"풍랑이나 없었나?"
+하고 나는 내 손에 잡힌 정임의 손이 싸늘한 것을 근심하였다.
+"네. 아주 잔잔했습니다. 저같이 약한 사람도 밖에 나와서 바다 경치를 구경하였습니다."
+하고 정임은 사교적인 웃음을 웃었다. 그러나 그의 눈에는 눈물이 있는 것 같았다.
+"최 선생님 어디 계신지 아세요?"
+하고 정임은 나를 따라 서면서 물었다.
+"나도 지금까지 몰랐는데 어제 편지를 하나 받았지."
+하는 것이 내 대답이었다.
+"네? 편지 받으셨어요? 어디 계십니까?"
+하고 정임은 걸음을 멈추었다.
+"나도 몰라."
+하고 나도 정임과 같이 걸음을 멈추고,
+"그 편지를 쓴 곳도 알고 부친 곳도 알지마는 지금 어디로 갔는지 그것은 모르지. 찾을 생각도 말고 편지할 생각도 말라고 했으니까."
+하고 사실대로 대답하였다.
+"어디야요? 그 편지 부치신 곳이 어디야요? 저 이 차로 따라갈 테야요."
+하고 정임은 조급하였다.
+"갈 때에는 가더라도 이 차에야 갈 수가 있나."
+하고 나는 겨우 정임을 끌고 들어왔다.
+정임을 집으로 데리고 와서 대강 말을 하고, 이튿날 새벽 차로 떠난다는 것을,
+"가만 있어. 어떻게 계획을 세워 가지고 해야지."
+하여 가까스로 붙들어 놓았다.
+아침을 먹고 나서 최석 집에를 가 보려고 할 즈음에 순임이가 와서 마루 끝에 선 채로,
+"선생님, 어머니가 잠깐만 오십시사구요."
+하였다.
+"정임이가 왔다."
+하고 내가 그러니까,
+"정임이가요?"
+하고 순임은 깜짝 놀라면서,
+"정임이는 아버지 계신 데를 알아요?"
+하고 물었다.
+"정임이도 모른단다. 너 아버지는 시베리아에 계시고 정임이는 동경 있다가 왔는데 알 리가 있니?"
+하고 나는 순임의 생각을 깨뜨리려 하였다. 순임은,
+"정임이가 어디 있어요?"
+하고 방들 있는 곳을 둘러보며,
+"언제 왔어요?"
+하고는 그제야 정임에게 대한 반가운 정이 발하는 듯이,
+"정임아!"
+하고 불러 본다.
+"언니요? 여기 있수."
+하고 정임이가 머릿방 문을 열고 옷을 갈아입던 채로 고개를 내어민다.
+순임은 구두를 차내버리듯이 벗어 놓고 정임의 방으로 뛰어들어간다.
+나는 최석의 집에를 가느라고 외투를 입고 모자를 쓰고 정임의 방문을 열어 보았다. 두 처녀는 울고 있었다.
+"정임이도 가지. 아주머니 뵈러 안 가?"
+하고 나는 정임을 재촉하였다.
+"선생님 먼저 가 계셔요."
+하고 순임이가 눈물을 씻고 일어나면서,
+"이따가 제가 정임이허구 갑니다."
+하고 내게 눈을 끔쩍거려 보였다. 갑자기 정임이가 가면 어머니와 정임이와 사이에 어떠한 파란이 일어나지나 아니할까 하고 순임이가 염려하는 것이었다. 순임도 인제는 노성하여졌다고 나는 생각하였다.
+"선생님 이 편지가 다 참말일까요?"
+하고 나를 보는 길로 최석 부인이 물었다. 최석 부인은 히스테리를 일으킨 사람 모양으로 머리와 손을 떨었다.
+나는 참말이냐 하는 것이 무엇을 가리키는 말인지 분명하지 아니하여서,
+"노석이 거짓말할 사람입니까?"
+하고 대체론으로 대답하였다.
+"앉으십쇼. 앉으시란 말씀도 안 하고."
+하고 부인은 침착한 모양을 보이려고 빙그레 웃었으나, 그것은 실패였다.
+"그게 참말일까요? 정임이가 아기를 뗀 것이 아니라, 폐가 나빠서 피를 토하고 입원하였다는 것이?"
+하고 부인은 중대하다는 표정을 가지고 묻는다.
+"그럼 그것이 참말이 아니구요. 아직도 그런 의심을 가지고 계십니까. 정임이와 한 방에 있는 학생이 모함한 것이라고 안 그랬어요? 그게 말이 됩니까."
+하고 언성을 높여서 대답하였다.
+"그럼 왜 정임이가 호텔에서 왜 아버지한테 한 번 안아 달라고 그래요? 그 편지에 쓴 대로 한 번 안아만 보았을까요?"
+이것은 부인의 둘째 물음이었다.
+"나는 그뿐이라고 믿습니다. 그것이 도리어 깨끗하다는 표라고 믿습니다. 안 그렇습니까?"
+하고 나는 딱하다는 표정을 하였다.
+"글쎄요."
+하고 부인은 한참이나 생각하고 있다가,
+"정말 애 아버지가 혼자 달아났을까요? 정임이를 데리고 가케오치한 것이 아닐까요? 꼭 그랬을 것만 같은데."
+하고 부인은 괴로운 표정을 감추려는 듯이 고개를 숙인다.
+나는 남편에게 대한 아내의 의심이 어떻게 깊은가에 아니 놀랄 수가 없어서,
+"허."
+하고 한 마디 웃고,
+"그렇게 수십 년 동안 부부 생활을 하시고도 그렇게 노석의 인격을 몰라 주십니까. 나는 부인께서 하시는 말씀이 부러 하시는 농담으로밖에 아니 들립니다. 정임이가 지금 서울 있습니다."
+하고 또 한 번 웃었다. 정말 기막힌 웃음이었다.
+"정임이가 서울 있어요?"
+하고 부인은 펄쩍 뛰면서,
+"어디 있다가 언제 왔습니까? 그게 정말입니까?"
+하고 의아한 빛을 보인다. 꼭 최석이하고 함께 달아났을 정임이가 서울에 있을 리가 없는 것이었다.
+"동경서 오늘 아침에 왔습니다. 지금 우리 집에서 순임이허구 이야기를 하고 있으니까 조금 있으면 뵈오러 올 것입니다."
+하고 나는 정임이가 분명히 서울 있는 것을 일일이 증거를 들어서 증명하였다. 그리고 우스운 것을 속으로 참았다. 그러나 다음 순간에는 이 병들고 늙은 아내의 질투와 의심으로 괴로워서 덜덜덜덜 떨고 앉았는 것을 가엾게 생각하였다.
+정임이가 지금 서울에 있는 것이 더 의심할 여지가 없는 사실임이 판명되매, 부인은 도리어 낙망하는 듯하였다. 그가 제 마음대로 그려 놓고 믿고 하던 모든 철학의 계통이 무너진 것이었다.
+한참이나 흩어진 정신을 못 수습하는 듯이 앉아 있더니 아주 기운 없는 어조로,
+"선생님 애 아버지가 정말 죽을까요? 정말 영영 집에를 안 돌아올까요?"
+하고 묻는다. 그 눈에는 벌써 눈물이 어리었다.
+"글쎄요. 내 생각 같아서는 다시는 집에 돌아오지 아니할 것 같습니다. 또 그만치 망신을 했으니, 이제 무슨 낯으로 돌아옵니까. 내라도 다시 집에 돌아올 생각은 아니 내겠습니다."
+하고 나는 의식적으로 악의를 가지고 부인의 가슴에 칼을 하나 박았다.
+그 칼은 분명히 부인의 가슴에 아프게 박힌 모양이었다.
+"선생님. 어떡하면 좋습니까. 애 아버지가 죽지 않게 해 주세요. 그렇지 않아도 순임이년이 제가 걔 아버지를 달아나게나 한 것처럼 원망을 하는데요. 그러다가 정녕 죽으면 어떻게 합니까. 제일 딴 자식들의 원망을 들을까봐 겁이 납니다. 선생님, 어떻게 애 아버지를 붙들어다 주세요."
+하고 마침내 참을 수 없이 울었다. 말은 비록 자식들의 원망이 두렵다고 하지마는 질투의 감정이 스러질 때에 그에게는 남편에게 대한 아내의 애정이 막혔던 물과 같이 터져 나온 것이라고 나는 해석하였다.
+"글쎄, 어디 있는 줄 알고 찾습니까. 노석의 성미에 한번 아니 한다고 했으면 다시 편지할 리는 만무하다고 믿습니다."
+하여 나는 부인의 가슴에 둘째 칼날을 박았다.
+나는 비록 최석의 부인이 청하지 아니하더라도 최석을 찾으러 떠나지 아니하면 아니 될 의무를 진다. 산 최석을 못 찾더라도 최석의 시체라도, 무덤이라도, 죽은 자리라도, 마지막 있던 곳이라도 찾아보지 아니하면 아니 될 의무를 깨닫는다.
+그러나 시국이 변하여 그 때에는 아라사에 가는 것은 여간 곤란한 일이 아니었다. 그 때에는 북만의 풍운이 급박하여 만주리를 통과하기는 사실상 불가능에 가까웠다. 마점산(馬占山) 일파의 군대가 흥안령, 하일라르 등지에 웅거하여 언제 대충돌이 폭발될는지 모르던 때였다. 이 때문에 시베리아에 들어가기는 거의 절망 상태라고 하겠고, 또 관헌도 아라사에 들어가는 여행권을 잘 교부할 것 같지 아니하였다.
+부인은 울고, 나는 이런 생각 저런 생각 하고 있는 동안에 문 밖에는 순임이, 정임이가 들어오는 소리가 들렸다.
+"아이, 정임이냐."
+하고 부인은 반갑게 허리 굽혀 인사하는 정임의 어깨에 손을 대고,
+"자 앉아라. 그래 인제 병이 좀 나으냐…… 수척했구나. 더 노성해지구 반 년도 못 되었는데."
+하고 정임에게 대하여 애정을 표하는 것을 보고 나는 의외지마는 다행으로 생각하였다. 나는 정임이가 오면 보기 싫은 한 신을 연출하지 않나 하고 근심하였던 것이다.
+"희 잘 자라요?"
+하고 정임은 한참이나 있다가 비로소 입을 열었다.
+"응, 잘 있단다. 컸나 가 보아라."
+하고 부인은 더욱 반가운 표정을 보인다.
+"어느 방이야?"
+하고 정임은 선물 보퉁이를 들고 순임과 함께 나가 버린다. 여자인 정임은 희와 순임과 부인과 또 순임의 다른 동생에게 선물 사 오는 것을 잊어버리지 아니하였다.
+정임과 순임은 한 이삼 분 있다가 돌아왔다. 밖에서 희가 무엇이라고 지절대는 소리가 들린다. 아마 정임이가 사다 준 선물을 받고 좋아하는 모양이다.
+정임은 들고 온 보퉁이에서 여자용 배스로브 하나를 내어서 부인에게주며,
+"맞으실까?"
+하였다.
+"아이 그건 무어라고 사 왔니?"
+하고 부인은 좋아라고 입어 보고, 이리 보고 저리 보고 하면서,
+"난 이런 거 처음 입어 본다."
+하고 자꾸 끈을 동여맨다.
+"정임이가 난 파자마를 사다 주었어."
+하고 순임은 따로 쌌던 굵은 줄 있는 융 파자마를 내어서 경매장 사람 모양으로 흔들어 보이며,
+"어머니 그 배스로브 나 주우. 어머닌 늙은이가 그건 입어서 무엇 하우?"
+하고 부인이 입은 배스로브를 벗겨서 제가 입고 두 호주머니에 손을 넣고 어기죽어기죽하고 서양 부인네 흉내를 낸다.
+"저런 말괄량이가 너도 정임이처럼 좀 얌전해 보아라."
+하고 부인은 순임을 향하여 눈을 흘긴다.
+이 모양으로 부인과 정임과의 대면은 가장 원만하게 되었다.
+그러나 부인은 정임에게 최석의 편지를 보이기를 원치 아니하였다. 편지가 왔다는 말조차 입 밖에 내지 아니하였다. 그러나 순임이가 정임에게 대하여 표하는 애정은 여간 깊지 아니하였다. 그 둘은 하루 종일 같이 있었다. 정임은 그 날 저녁에 나를 보고,
+"순임이헌테 최 선생님 편지 사연은 다 들었어요. 순임이가 그 편지를 훔쳐다가 얼른얼른 몇 군데 읽어도 보았습니다. 순임이가 저를 퍽 동정하면서 절더러 최 선생을 따라가 보라고 그래요. 혼자 가기가 어려우면 자기허구 같이 가자고. 가서 최 선생을 데리고 오자고. 어머니가 못 가게 하거든 몰래 둘이 도망해 가자고. 그래서 그러자고 그랬습니다. 안됐지요. 선생님?"
+하고 저희끼리 작정은 다 해 놓고는 슬쩍 내 의향을 물었다.
+"젊은 여자 단둘이서 먼 여행을 어떻게 한단 말이냐? 게다가 지금 북만주 형세가 대단히 위급한 모양인데. 또 정임이는 그 건강 가지고 어디를 가, 이 추운 겨울에?"
+하고 나는 이런 말이 다 쓸데없는 말인 줄 알면서도 어른으로서 한 마디 안 할 수 없어서 하였다. 정임은 더 제 뜻을 주장하지도 아니하였다.
+그 날 저녁에 정임은 순임의 집에서 잤는지 집에 오지를 아니하였다.
+나는 이 일을 어찌하면 좋은가, 이 두 여자의 행동을 어찌하면 좋은가 하고 혼자 끙끙 생각하고 있었다.
+이튿날 나는 궁금해서 최석의 집에를 갔더니 부인이,
+"우리 순임이 댁에 갔어요?"
+하고 의외의 질문을 하였다.
+"아니오."
+하고 나는 놀랐다.
+"그럼, 이것들이 어딜 갔어요? 난 정임이허구 댁에서 잔 줄만 알았는데."
+하고 부인은 무슨 불길한 것이나 본 듯이 몸을 떤다. 히스테리가 일어난 것이었다.
+나는 입맛을 다시었다. 분명히 이 두 여자가 시베리아를 향하고 떠났구나 하였다.
+그 날은 소식이 없이 지났다. 그 이튿날도 소식이 없이 지났다.
+최석 부인은 딸까지 잃어버리고 미친 듯이 울고 애통하다가 머리를 싸매고 누워 버리고 말았다.
+정임이와 순임이가 없어진 지 사흘 만에 아침 우편에 편지 한 장을 받았다. 그 봉투는 봉천 야마도 호텔 것이었다. 그 속에는 편지 두 장이 들어 있었다. 한 장은 ,
+선생님! 저는 아버지를 위하여, 정임을 위하여 정임과 같이 집을 떠났습니다.
+어머님께서 슬퍼하실 줄은 알지마는 저희들이 다행히 아버지를 찾아서 모시고 오면 어머니께서도 기뻐하실 것을 믿습니다. 저희들이 가지 아니하고는 아버지는 살아서 돌아오실 것 같지 아니합니다. 아버지를 이처럼 불행하시게 한 죄는 절반은 어머니께 있고, 절반은 제게 있습니다. 저는 아버지 일을 생각하면 가슴이 미어지고 이가 갈립니다. 저는 아무리 해서라도 아버지를 찾아내어야겠습니다.
+저는 정임을 무한히 동정합니다. 저는 어려서 정임을 미워하고 아버지를 미워하였지마는 지금은 아버지의 마음과 정임의 마음을 알아볼 만치 자랐습니다.
+선생님! 저희들은 둘이 손을 잡고 어디를 가서든지 아버지를 찾아내겠습니다. 하나님의 사자가 낮에는 구름이 되고 밤에는 별이 되어서 반드시 저희들의 앞길을 인도할 줄 믿습니다.
+선생님, 저희 어린것들의 뜻을 불쌍히 여기셔서 돈 천 원만 전보로 보내 주시기를 바랍니다.
+만일 만주리로 가는 길이 끊어지면 몽고로 자동차로라도 가려고 합니다. 아버지 편지에 적힌 F역의 R씨를 찾고, 그리고 바이칼 호반의 바이칼리스코에를 찾아, 이 모양으로 찾으면 반드시 아버지를 찾아 내고야 말 것을 믿습니다.
+선생님, 돈 천 원만 봉천 야마도 호텔 최순임 이름으로 부쳐 주세요. 그리고 어머니헌테는 아직 말씀 말아 주세요.
+선생님. 이렇게 걱정하시게 해서 미안합니다. 용서하세요.
+순임 상서
+이렇게 써 있다. 또 한 장에는,
+선생님! 저는 마침내 돌아오지 못할 길을 떠나나이다. 어디든지 최 선생님을 뵈옵는 곳에서 이 몸을 묻어 버리려 하나이다. 지금 또 몸에 열이 나는 모양이요, 혈담도 보이오나 최 선생을 뵈올 때까지는 아무리 하여서라도 이 목숨을 부지하려 하오며, 최 선생을 뵈옵고 제가 진 은혜를 감사하는 한 말씀만 사뢰면 고대 죽사와도 여한이 없을까 하나이다.
+순임 언니가 제게 주시는 사랑과 동정은 오직 눈물과 감격밖에 더 표할 말씀이 없나이다. 순임 언니가 저를 보호하여 주니 마음이 든든하여이다…….
+이라고 하였다.
+편지를 보아야 별로 놀랄 것은 없었다. 다만 말괄량이로만 알았던 순임의 속에 어느새에 그러한 감정이 발달하였나 하는 것을 놀랄 뿐이었다.
+그러나 걱정은 이것이다. 순임이나 정임이나 다 내가 감독해야 할 처지에 있거늘 그들이 만리 긴 여행을 떠난다고 하니 감독자인 내 태도를 어떻게 할까 하는 것이다.
+나는 편지를 받는 길로 우선 돈 천 원을 은행에 가서 찾아다 놓았다.
+암만해도 내가 서울에 가만히 앉아서 두 아이에게 돈만 부쳐 주는 것이 인정에 어그러지는 것 같아서 나는 여러 가지로 주선을 하여서 여행의 양해를 얻어 가지고 봉천을 향하여 떠났다.
+내가 봉천에 도착한 것은 밤 열시가 지나서였다. 순임과 정임은 자리옷 바람으로 내 방으로 달려와서 반가워하였다. 그들이 반가워하는 양은 실로 눈물이 흐를 만하였다.
+"아이구 선생님!"
+"아이구 어쩌면!"
+하는 것이 그들의 내게 대한 인사의 전부였다.
+"정임이 어떠오?"
+하고 나는 순임의 편지에 정임이가 열이 있단 말을 생각하였다.
+"무어요. 괜찮습니다."
+하고 정임은 웃었다.
+전등빛에 보이는 정임의 얼굴은 그야말로 대리석으로 깎은 듯하였다. 여위고 핏기가 없는 것이 더욱 정임의 용모에 엄숙한 맛을 주었다.
+"돈 가져오셨어요?"
+하고 순임이가 어리광 절반으로 묻다가 내가 웃고 대답이 없음을 보고,
+"우리를 붙들러 오셨어요?"
+하고 성내는 양을 보인다.
+"그래 둘이서들 간다니 어떻게 간단 말인가. 시베리아가 어떤 곳에 붙었는지 알지도 못하면서."
+하고 나는 두 사람이 그리 슬퍼하지 아니하는 순간을 보는 것이 다행하여서 농담삼아 물었다.
+"왜 몰라요? 시베리아가 저기 아니야요?"
+하고 순임이가 산해관 쪽을 가리키며,
+"우리도 지리에서 배워서 다 알아요. 어저께 하루 종일 지도를 사다 놓고 연구를 하였답니다. 봉천서 신경, 신경서 하얼빈, 하얼빈에서 만주리, 만주리에서 이르쿠츠크, 보세요, 잘 알지 않습니까. 또 만일 중동 철도가 불통이면 어떻게 가는고 하니 여기서 산해관을 가고, 산해관서 북경을 가지요. 그리고는 북경서 장가구를 가지 않습니까. 장가구서 자동차를 타고 몽고를 통과해서 가거든요. 잘 알지 않습니까."
+하고 정임의 허리를 안으며,
+"그렇지이?"
+하고 자신 있는 듯이 웃는다.
+"또 몽고로도 못 가게 되어서 구라파를 돌게 되면?"
+하고 나는 교사가 생도에게 묻는 모양으로 물었다.
+"네, 저 인도양으로 해서 지중해로 해서 프랑스로 해서 그렇게 가지요."
+"허, 잘 아는구나."
+하고 나는 웃었다.
+"그렇게만 알아요? 또 해삼위로 해서 가는 길도 알아요. 저희를 어린애로 아시네."
+"잘못했소."
+"하하."
+"후후."
+사실 그들은 벌써 어린애들은 아니었다. 순임도 벌써 그 아버지의 말할 수 없는 사정에 동정할 나이가 되었다. 순임이가 기어다닌 것은 본 나로는 이것도 이상하게 보였다. 나는 벌써 나이 많았구나 하는 생각이 나지 아니할 수 없었다.
+나는 잠 안 드는 하룻밤을 지내면서 옆방에서 정임이가 기침을 짓는 소리를 들었다. 그 소리는 내 가슴을 아프게 하였다.
+이튿날 나는 두 사람에게 돈 천 원을 주어서 신경 가는 급행차를 태워 주었다. 대륙의 이 건조하고 추운 기후에 정임의 병든 폐가 견디어 날까 하고 마음이 놓이지 아니하였다. 그러나 나는 그들을 가라고 권할 수는 있어도 가지 말라고 붙들 수는 없었다. 다만 제 아버지, 제 애인을 죽기 전에 만날 수 있기만 빌 뿐이었다.
+나는 두 아이를 북쪽으로 떠나 보내고 혼자 여관에 들어와서 도무지 정신을 진정하지 못하여 술을 먹고 잊으려 하였다. 그러다가 그 날 밤차로 서울로 돌아왔다.
+이튿날 아침에 나는 최석 부인을 찾아서 순임과 정임이가 시베리아로 갔단 말을 전하였다.
+그 때에 최 부인은 거의 아무 정신이 없는 듯하였다. 아무 말도 하지 아니하고 울고만 있었다.
+얼마 있다가 부인은,
+"그것들이 저희들끼리 가서 괜찮을까요?"
+하는 한 마디를 할 뿐이었다.
+며칠 후에 순임에게서 편지가 왔다. 그것은 하얼빈에서 부친 것이었다.
+하얼빈을 오늘 떠납니다. 하얼빈에 와서 아버지 친구 되시는 R소장을 만나뵈옵고 아버지 일을 물어 보았습니다. 그리고 저희 둘이서 찾아 떠났다는 말씀을 하였더니 R소장이 대단히 동정하여서 여행권도 준비해 주시기로 저희는 아버지를 찾아서 오늘 오후 모스크바 가는 급행으로 떠납니다. 가다가 F역에 내리기는 어려울 듯합니다. 정임의 건강이 대단히 좋지 못합니다. 일기가 갑자기 추워지는 관계인지 정임의 신열이 오후면 삼십팔 도를 넘고 기침도 대단합니다. 저는 염려가 되어서 정임더러 하얼빈에서 입원하여 조리를 하라고 권하였지마는 도무지 듣지를 아니합니다. 어디까지든지 가는 대로 가다가 더 못 가게 되면 그 곳에서 죽는다고 합니다.
+저는 그 동안 며칠 정임과 같이 있는 중에 정임이가 어떻게 아름답고 높고 굳세게 깨끗한 여자인 것을 발견하였습니다. 저는 지금까지 정임을 몰라본 것을 부끄럽게 생각합니다. 그리고 또 제 아버지께서 어떻게 갸륵한 어른이신 것을 인제야 깨달았습니다. 자식 된 저까지도 아버지와 정임과의 관계를 의심하였습니다. 의심하는 것보다는 세상에서 말하는 대로 믿고 있었습니다. 그러나 정임을 만나 보고 정임의 말을 듣고 아버지께서 선생님께 드린 편지가 모두 참인 것을 깨달았습니다. 아버지께서는 친구의 의지 없는 딸인 정임을 당신의 친혈육인 저와 꼭 같이 사랑하려고 하신 것이었습니다. 그것이 얼마나 갸륵한 일입니까. 그런데 제 어머니와 저는 그 갸륵하신 정신을 몰라보고 오해하였습니다. 어머니는 질투하시고 저는 시기하였습니다. 이것이 얼마나 아버지를 그렇게 갸륵하신 아버지를 몰라뵈온 것입니다. 이것이 얼마나 부끄럽고 원통한 일입니까.
+선생님께서도 여러 번 아버지의 인격이 높다는 것을 저희 모녀에게 설명해 주셨습니다마는 마음이 막힌 저는 선생님의 말씀도 믿지 아니하였습니다.
+선생님, 정임은 참으로 아버지를 사랑합니다. 정임에게는 이 세상에 아버지밖에는 사랑하는 아무것도 없이, 그렇게 외●으로, 그렇게 열렬하게 아버지를 사모하고 사랑합니다. 저는 잘 압니다. 정임이가 처음에는 아버지로 사랑하였던 것을, 그러나 어느 새에 정임의 아버지에게 대한 사랑이 무엇인지 모를 사랑으로 변한 것을, 그것이 연애냐 하고 물으면 정임은 아니라고 할 것입니다. 정임의 그 대답은 결코 거짓이 아닙니다. 정임은 숙성하지마는 아직도 극히 순결합니다. 정임은 부모를 잃은 후에 아버지밖에 사랑한 사람이 없습니다. 또 아버지에게밖에 사랑받던 일도 없습니다. 그러니깐 정임은 아버지를 그저 사랑합니다 전적으로 사랑합니다. 선생님, 정임의 사랑에는 아버지에 대한 자식의 사랑, 오라비에 대한 누이의 사랑, 사내 친구에 대한 여자 친구의 사랑, 애인에 대한 애인의 사랑, 이 밖에 존경하고 숭배하는 선생에 대한 제자의 사랑까지, 사랑의 모든 종류가 포함되어 있는 것을 저는 발견하였습니다.
+선생님, 정임의 정상은 차마 볼 수가 없습니다. 아버지의 안부를 근심하는 양은 제 몇십 배나 되는지 모르게 간절합니다. 정임은 저 때문에 아버지가 불행하게 되셨다고 해서 차마 볼 수 없게 애통하고 있습니다. 진정을 말씀하오면 저는 지금 아버지보다도 어머니보다도 정임에게 가장 동정이 끌립니다. 선생님, 저는 아버지를 찾아가는 것이 아니라 정임을 돕기 위하여 간호하기 위하여 가는 것 같습니다.
+선생님, 저는 아직 사랑이란 것이 무엇인지를 모릅니다. 그러나 정임을 보고 사랑이란 것이 어떻게 신비하고 열렬하고 놀라운 것인가를 안 것 같습니다.
+순임의 편지는 계속된다.
+선생님, 하얼빈에 오는 길에 송화강 굽이를 볼 때에는 정임이가 어떻게나 울었는지, 그것은 차마 볼 수가 없었습니다. 아버지께서 송화강을 보시고 감상이 깊으셨더란 것을 생각한 것입니다. 무인지경으로, 허옇게 눈이 덮인 벌판으로 흘러가는 송화강 굽이, 그것은 슬픈 풍경입니다. 아버지께서 여기를 지나실 때에는 마른 풀만 있는 광야였을 것이니 그 때에는 더욱 황량하였을 것이라고 정임은 말하고 웁니다.
+정임은 제가 아버지를 아는 것보다 아버지를 잘 아는 것 같습니다. 평소에 아버지와는 그리 접촉이 없건마는 정임은 아버지의 의지력, 아버지의 숨은 열정, 아버지의 성미까지 잘 압니다. 저는 정임의 말을 듣고야 비로소 참 그래, 하는 감탄을 발한 일이 여러 번 있습니다.
+정임의 말을 듣고야 비로소 아버지가 남보다 뛰어나신 인물인 것을 깨달았습니다. 아버지는 정의감이 굳세고 겉으로는 싸늘하도록 이지적이지마는 속에는 불 같은 열정이 있으시고, 아버지는 쇠 같은 의지력과 칼날 같은 판단력이 있어서 언제나 주저하심이 없고 또 흔들리심이 없다는 것, 아버지께서는 모든 것을 용서하고 모든 것을 호의로 해석하여서 누구를 미워하거나 원망하심이 없는 등, 정임은 아버지의 마음의 목록과 설명서를 따로 외우는 것처럼 아버지의 성격을 설명합니다. 듣고 보아서 비로소 아버지의 딸인 저는 내 아버지가 어떤 아버지인가를 알았습니다.
+선생님, 이해가 사랑을 낳는단 말씀이 있지마는 저는 정임을 보아서 사랑이 이해를 낳는 것이 아닌가 합니다.
+어쩌면 어머니와 저는 평생을 아버지를 모시고 있으면서도 아버지를 몰랐습니까. 이성이 무디고 양심이 흐려서 그랬습니까. 정임은 진실로 존경할 여자입니다. 제가 남자라 하더라도 정임을 아니 사랑하고는 못 견디겠습니다.
+아버지는 분명 정임을 사랑하신 것입니다. 처음에는 친구의 딸로, 다음에는 친딸과 같이, 또 다음에는 무엇인지 모르게 뜨거운 사랑이 생겼으리라고 믿습니다. 그것을 아버지는 죽인 것입니다. 그것을 죽이려고 이 달할 수 없는 사랑을 죽이려고 시베리아로 달아나신 것입니다. 인제야 아버지께서 선생님께 하신 편지의 뜻이 알아진 것 같습니다. 백설이 덮인 시베리아의 삼림 속으로 혼자 헤매며 정임에게로 향하는 사랑을 죽이려고 무진 애를 쓰시는 그 심정이 알아지는 것 같습니다.
+선생님 이것이 얼마나 비참한 일입니까. 저는 정임의 짐에 지니고 온 일기를 보다가 이러한 구절을 발견하였습니다.
+선생님. 저는 세인트 오거스틴의 <참회록>을 절반이나 다 보고 나도 잠이 들지 아니합니다. 잠이 들기 전에 제가 항상 즐겨하는 아베마리아의 노래를 유성기로 듣고 나서 오늘 일기를 쓰려고 하니 슬픈 소리만 나옵니다.
+사랑하는 어른이여. 저는 멀리서 당신을 존경하고 신뢰하는 마음에서만 살아야 할 것을 잘 압니다. 여기에서 영원한 정지를 하지 아니하면 아니 됩니다. 비록 제 생명이 괴로움으로 끊어지고 제 혼이 피어 보지 못하고 스러져 버리더라도 저는 이 멀리서 바라보는 존경과 신뢰의 심경에서 한 발자국이라도 옮기지 않아야 할 것을 잘 압니다. 나를 위하여 놓여진 생의 궤도는 나의 생명을 부인하는 억지의 길입니다. 제가 몇 년 전 기숙사 베드에서 이런 밤에 내다보면 즐겁고 아름답던 내 생의 꿈은 다 깨어졌습니다.
+제 영혼의 한 조각이 먼 세상 알지 못할 세계로 떠다니고 있습니다. 잃어버린 마음 조각 어찌하다가 제가 이렇게 되었는지 모릅니다.
+피어 오르는 생명의 광채를 스스로 사형에 처하지 아니하면 아니 될 때 어찌 슬픔이 없겠습니까. 이것은 현실로 사람의 생명을 죽이는 것보다 더 무서운 죄가 아니오리까. 나의 세계에서 처음이요 마지막으로 발견한 빛을 어둠 속에 소멸해 버리라는 이 일이 얼마나 떨리는 직무오리까. 이 허깨비의 형의 사람이 살기 위하여 내 손으로 칼을 들어 내 영혼의 환희를 쳐야 옳습니까. 저는 하나님을 원망합니다.
+이렇게 씌어 있습니다. 선생님 이것이 얼마나 피 흐르는 고백입니까.
+선생님, 저는 정임의 이 고백을 보고 무조건으로 정임의 사랑을 시인합니다. 선생님, 제 목숨을 바쳐서 하는 일에 누가 시비를 하겠습니까. 더구나 그 동기에 티끌만큼도 불순한 것이 없음에야 무조건으로 시인하지 아니하고 어찌합니까.
+바라기는 정임의 병이 크게 되지 아니하고 아버지께서 무사히 계셔서 속히 만나뵙게 되는 것입니다마는 앞길이 망망하여 가슴이 두근거림을 금치 못합니다. 게다가 오늘은 함박눈이 퍼부어서 천지가 온통 회색으로 한 빛이 되었으니 더욱 전도가 막막합니다. 그러나 선생님 저는 앓는 정임을 데리고 용감하게 시베리아 길을 떠납니다.
+한 일 주일 후에 또 편지 한 장이 왔다. 그것도 순임의 편지여서 이러한 말이 있었다.
+……오늘 새벽에 흥안령을 지났습니다. 플랫폼의 한란계는 영하 이십삼 도를 가리켰습니다. 사람들의 얼굴은 솜털에 성에가 슬어서 남녀 노소 할 것 없이 하얗게 분을 바른 것 같습니다. 유리에 비친 내 얼굴도 그와 같이 흰 것을 보고 놀랐습니다. 숨을 들이쉴 때에는 코털이 얼어서 숨이 끊기고 바람결이 지나가면 눈물이 얼어서 눈썹이 마주 붙습니다. 사람들은 털과 가죽에 싸여서 곰같이 보입니다.
+또 이런 말도 있었다.
+아라사 계집애들이 우유병들을 품에 품고 서서 손님이 사기를 기다리고 있습니다. 저도 두 병을 사서 정임이와 나누어 먹었습니다. 우유는 따뜻합니다. 그것을 식히지 아니할 양으로 품에 품고 섰던 것입니다.
+또 이러한 구절도 있었다.
+정거장에 닿을 때마다 저희들은 밖을 내다봅니다. 행여나 아버지가 거기 계시지나 아니할까 하고요. 차가 어길 때에는 더구나 마음이 조입니다. 아버지가 그 차를 타고 지나가시지나 아니하는가 하고요. 그리고는 정임은 웁니다. 꼭 뵈올 어른을 놓쳐나 버린 듯이.
+그리고는 이 주일 동안이나 소식이 없다가 편지 한 장이 왔다. 그것은 정임의 글씨였다.
+선생님, 저는 지금 최 선생께서 계시던 바이칼 호반의 그 집에 와서 홀로 누웠습니다. 순임은 주인 노파와 함께 F역으로 최 선생을 찾아서 오늘 아침에 떠나고 병든 저만 혼자 누워서 얼음에 싸인 바이칼 호의 눈보라치는 바람 소리를 듣고 있습니다. 열은 삼십팔 도로부터 구 도 사이를 오르내리고 기침은 나고 몸의 괴로움을 견딜 수 없습니다. 그러하오나 선생님, 저는 하나님을 불러서 축원합니다. 이 실낱 같은 생명이 다 타 버리기 전에 최 선생의 낯을 다만 일 초 동안이라도 보여지이라고. 그러하오나 선생님, 이 축원이 이루어지겠습니까.
+저는 한사코 F역까지 가려 하였사오나 순임 형이 울고 막사오며 또 주인 노파가 본래 미국 사람과 살던 사람으로 영어를 알아서 순임 형의 도움이 되겠기로 저는 이 곳에 누워 있습니다. 순임 형은 기어코 아버지를 찾아 모시고 오마고 약속하였사오나 이 넓은 시베리아에서 어디 가서 찾겠습니까.
+선생님, 저는 죽음을 봅니다. 죽음이 바로 제 앞에 와서 선 것을 봅니다. 그의 손은 제 여윈 손을 잡으려고 들먹거림을 봅니다.
+선생님, 죽은 뒤에도 의식이 남습니까. 만일 의식이 남는다 하면 죽은 뒤에도 이 아픔과 괴로움을 계속하지 아니하면 아니 됩니까. 죽은 뒤에는 오직 영원한 어둠과 잊어버림이 있습니까. 죽은 뒤에는 혹시나 생전에 먹었던 마음을 자유로 펼 도리가 있습니까. 이 세상에서 그립고 사모하던 이를 죽은 뒤에는 자유로 만나 보고 언제나 마음껏 같이할 수가 있습니까. 그런 일도 있습니까. 이런 일을 바라는 것도 죄가 됩니까.
+정임의 편지는 더욱 절망적인 어조로 찬다.
+저는 처음 병이 났을 때에는 죽는 것이 싫고 무서웠습니다. 그러나 지금은 죽는 것이 조금도 무섭지 아니합니다. 다만 차마 죽지 못하는 것이 한.
+하고는 `다만 차마' 이하를 박박 지워 버렸다. 그리고는 새로 시작하여 나와내 가족에게 대한 문안을 하고는 끝을 막았다.
+나는 이 편지를 받고 울었다. 무슨 큰 비극이 가까운 것을 예상하게 하였다.
+그 후 한 십여 일이나 지나서 전보가 왔다. 그것은 영문으로 씌었는데,
+"아버지 병이 급하다. 나로는 어쩔 수 없다. 돈 가지고 곧 오기를 바란다."
+하고 그 끝에 B호텔이라고 주소를 적었다. 전보 발신국이 이르쿠츠크인 것을 보니 B호텔이라 함은 이르쿠츠크인 것이 분명하였다.
+나는 최석 부인에게 최석이가 아직 살아 있다는 것을 전하고 곧 여행권 수속을 하였다. 절망으로 알았던 여행권은 사정이 사정인만큼 곧 발부되었다.
+나는 비행기로 여의도를 떠났다. 백설에 개개한 땅을, 남빛으로 푸른 바다를 굽어보는 동안에 대련을 들러 거기서 다른 비행기를 갈아타고 봉천, 신경, 하얼빈을 거쳐, 치치하얼에 들렀다가 만주리로 급행하였다.
+웅대한 대륙의 설경도 나에게 아무러한 인상도 주지 못하였다. 다만 푸른 하늘과 희고 평평한 땅과의 사이로 한량 없이 허공을 날아간다는 생각밖에 없었다. 그것은 사랑하는 두 친구가 목숨이 경각에 달린 것을 생각할 때에 마음에 아무 여유도 없는 까닭이었다.
+만주리에서도 비행기를 타려 하였으나 소비에트 관헌이 허락을 아니 하여 열차로 갈 수밖에 없었다.
+초조한 몇 밤을 지나고 이르쿠츠크에 내린 것이 오전 두시. 나는 B호텔로 이스보스치카라는 마차를 몰았다. 죽음과 같이 고요하게 눈 속에 자는 시간에는 여기저기 전등이 반짝거릴 뿐, 이따금 밤의 시가를 경계하는 병정들의 눈이 무섭게 빛나는 것이 보였다.
+B호텔에서 미스 초이(최 양)를 찾았으나 순임은 없고 어떤 서양 노파가 나와서,
+"유 미스터 Y?"
+하고 의심스러운 눈으로 나를 보았다.
+그렇다는 내 대답을 듣고는 노파는 반갑게 손을 내밀어서 내 손을 잡았다.
+나는 넉넉하지 못한 영어로 그 노파에게서 최석이가 아직 살았다는 말과 정임의 소식은 들은 지 오래라는 말과 최석과 순임은 여기서 삼십 마일이나 떨어진 F역에서도 썰매로 더 가는 삼림 속에 있다는 말을 들었다.
+나는 그 밤을 여기서 지내고 이튿날 아침에 떠나는 완행차로 그 노파와 함께 이르쿠츠크를 떠났다.
+이 날도 천지는 오직 눈뿐이었다. 차는 가끔 삼림 중으로 가는 모양이나 모두 회색빛에 가리워서 분명히 보이지를 아니하였다.
+F역이라는 것은 삼림 속에 있는 조그마한 정거장으로 집이라고는 정거장 집밖에 없었다. 역부 두엇이 털옷에 하얗게 눈을 뒤쓰고 졸리는 듯이 오락가락할 뿐이었다.
+우리는 썰매 하나를 얻어 타고 어디가 길인지 분명치도 아니한 눈 속으로 말을 몰았다.
+바람은 없는 듯하지마는 그래도 눈발을 한편으로 비끼는 모양이어서 아름드리 나무들의 한쪽은 하얗게 눈으로 쌓이고 한쪽은 검은 빛이 더욱 돋보였다. 백 척은 넘을 듯한 꼿꼿한 침엽수(전나무 따윈가)들이 어디까지든지, 하늘에서 곧 내려박은 못 모양으로, 수없이 서 있는 사이로 우리 썰매는 간다. 땅에 덮인 눈은 새로 피워 놓은 솜같이 희지마는 하늘에서 내리는 눈은 구름빛과 공기빛과 어울려서 밥 잦힐 때에 굴뚝에서 나오는 연기와 같이 연회색이다.
+바람도 불지 아니하고 새도 날지 아니하건마는 나무 높은 가지에 쌓인 눈이 이따금 덩치로 떨어져서는 고요한 수풀 속에 작은 동요를 일으킨다.
+우리 썰매가 가는 길이 자연스러운 복잡한 커브를 도는 것을 보면 필시 얼음 언 개천 위로 달리는 모양이었다.
+한 시간이나 달린 뒤에 우리 썰매는 늦은 경사지를 올랐다. 말을 어거하는 아라사 사람은 쭈쭈쭈쭈, 후르르 하고 주문을 외우듯이 입으로 말을 재촉하고 고삐를 이리 들고 저리 들어 말에게 방향을 가리킬 뿐이요, 채찍은 보이기만하고 한 번도 쓰지 아니하였다. 그와 말과는 완전히 뜻과 정이 맞는 동지인 듯하였다.
+처음에는 몰랐으나 차차 추워짐을 깨달았다. 발과 무르팍이 시렸다.
+"얼마나 머오?"
+하고 나는 오래간만에 입을 열어서 노파에게 물었다. 노파는 털수건으로 머리를 싸매고 깊숙한 눈만 남겨 가지고 실신한 사람 모양으로 허공만 바라보고 있다가, 내가 묻는 말에 비로소 잠이나 깬 듯이,
+"멀지 않소. 인젠 한 십오 마일."
+하고는 나를 바라보았다. 그 눈은 아마 웃는 모양이었다.
+그 얼굴, 그 눈, 그 음성이 모두 이 노파가 인생 풍파의 슬픈 일 괴로운 일에 부대끼고 지친 것을 표하였다. 그리고 죽는 날까지 살아간다 하는 듯하였다.
+경사지를 올라서서 보니 그것은 한 산등성이였다. 방향은 알 수 없으나 우리가 가는 방향에는 더 높은 등성이가 있는 모양이나 다른 곳은 다 이보다 낮은 것 같아서 하얀 눈바다가 끝없이 보이는 듯하였다. 그 눈보라는 들쑹날쑹이 있는 것을 보면 삼림의 꼭대기인 것이 분명하였다. 더구나 여기저기 뾰족뾰족 눈송이 붙을 수 없는 마른 나뭇가지가 거뭇거뭇 보이는 것을 보아서 그러하였다. 만일 눈이 걷혀 주었으면 얼마나 안계가 넓으랴, 최석 군이 고민하는 가슴을 안고 이리로 헤매었구나 하면서 나는 목을 둘러서 사방을 바라보았다.
+우리는 그 등성이를 내려갔다. 말이 미처 발을 땅에 놓을 수가 없는 정도로 빨리 내려갔다. 여기는 산불이 났던 자리인 듯하여 거뭇거뭇 불탄 자국 있는 마른 나무들이 드문드문 서 있었다. 그 나무들은 찍어 가는 사람도 없으매 저절로 썩어서 없어지기를 기다릴 수밖에 없었다. 그들은 나서 아주 썩어 버리기까지 천 년 이상은 걸린다고 하니 또한 장한 일이다.
+이 대삼림에 불이 붙는다 하면 그것은 장관일 것이다. 달밤에 높은 곳에서 이 경치를 내려다본다 하면 그도 장관일 것이요, 여름에 한창 기운을 펼 때도 장관일 것이다. 나는 오뉴월경에 시베리아를 여행하는 이들이 끝없는 꽃바다를 보았다는 기록을 생각하였다.
+"저기요!"
+하는 노파의 말에 나는 생각의 줄을 끊었다. 저기라고 가리키는 곳을 보니 거기는 집이라고 생각되는 물건이 나무 사이로 보였다. 창이 있으니 분명 집이었다.
+우리 이스보스치카가 가까이 오는 것을 보았는지, 그 집 같은 물건의 문 같은 것이 열리며 검은 외투 입은 여자 하나가 팔을 허우적거리며 뛰어나온다. 아마 소리도 치는 모양이겠지마는 그 소리는 아니 들렸다. 나는 그것이 순임인 줄을 얼른 알았다. 또 순임이밖에 될 사람도 없었다.
+순임은 한참 달음박질로 오다가 눈이 깊어서 걸음을 걷기가 힘이 드는지 멈칫 섰다. 그의 검은 외투는 어느덧 흰 점으로 얼려져 가지고 어깨는 희게 되는 것이 보였다.
+순임의 갸름한 얼굴이 보였다.
+"선생님!"
+하고 순임도 나를 알아보고는 또 팔을 허우적거리며 소리를 질렀다.
+나도 반가워서 모자를 벗어 둘렀다.
+"아이 선생님!"
+하고 순임은 내가 썰매에서 일어서기도 전에 내게 와서 매달리며 울었다.
+"아버지 어떠시냐?"
+하고 나는 순임의 등을 두드렸다. 나는 다리가 마비가 되어서 곧 일어설 수가 없었다.
+"아버지 어떠시냐?"
+하고 나는 한 번 더 물었다.
+순임은 벌떡 일어나 두 주먹으로 흐르는 눈물을 쳐내 버리며,
+"대단하셔요."
+하고도 울음을 금치 못하였다.
+노파는 벌써 썰매에서 내려서 기운 없는 걸음으로 비틀비틀 걷기를 시작하였다.
+나는 순임을 따라서 언덕을 오르며,
+"그래 무슨 병환이시냐?"
+하고 물었다.
+"몰라요. 신열이 대단하셔요."
+"정신은 차리시든?"
+"처음 제가 여기 왔을 적에는 그렇지 않더니 요새에는 가끔 혼수 상태에 빠지시는 모양이야요."
+이만한 지식을 가지고 나는 최석이가 누워 있는 집 앞에 다다랐다.
+이 집은 통나무를 댓 개 우물 정자로 가로놓고 지붕은 무엇으로 했는지 모르나 눈이 덮이고, 문 하나 창 하나를 내었는데 문은 나무껍질인 모양이나 창은 젖빛 나는 유리창인 줄 알았더니 뒤에 알아본즉 그것은 유리가 아니요, 양목을 바르고 물을 뿜어서 얼려 놓은 것이었다. 그리고 통나무와 통나무 틈바구니에는 쇠털과 같은 마른 풀을 꼭꼭 박아서 바람을 막았다.
+문을 열고 들어서니 부엌에 들어서는 모양으로 쑥 빠졌는데 화끈화끈하는 것이 한증과 같다. 그렇지 않아도 침침한 날에 언 눈으로 광선 부족한 방에 들어오니, 캄캄 절벽이어서 아무것도 보이지 아니하였다.
+순임이가 앞서서 양초에 불을 켠다. 촛불 빛은 방 한편 쪽 침대라고 할 만한 높은 곳에 담요를 덮고 누운 최석의 시체와 같은 흰 얼굴을 비춘다.
+"아버지, 아버지 샌전 아저씨 오셨어요."
+하고 순임은 최석의 귀에 입을 대고 가만히 불렀다.
+그러나 대답이 없었다.
+나는 최석의 이마를 만져 보았다. 축축하게 땀이 흘렀다. 그러나 그리 더운 줄은 몰랐다.
+방 안의 공기는 숨이 막힐 듯하였다. 그 난방 장치는 삼굿의 원리를 이용한 것이었다. 돌멩이로 아궁이를 쌓고 그 위에 큰 돌멩이들을 많이 쌓고 거기다가 불을 때어서 달게 한 뒤에 거기 눈을 부어 뜨거운 증기를 발하는 것이었다.
+이 건축법은 조선 동포들이 시베리아로 금광을 찾아다니면서 하는 법이란 말을 들었으나 최석이가 누구에게서 배워 가지고 어떤 모양으로 지었는지는 최석의 말을 듣기 전에는 알 수 없는 일이다.
+나는 내 힘이 미치는 데까지 최석의 병 치료에 대한 손을 쓰고 어떻게 해서든지 이르쿠츠크의 병원으로 최석을 데려다가 입원시킬 도리를 궁리하였다. 그러나 냉정하게 생각하면 최석은 살아날 가망이 없는 것만 같았다.
+내가 간 지 사흘 만에 최석은 처음으로 정신을 차려서 눈을 뜨고 나를 알아보았다.
+그는 반가운 표정을 하고 빙그레 웃기까지 하였다.
+"다 일없나?"
+이런 말도 알아들을 수가 있었다.
+그러나 심히 기운이 없는 모양이기로 나는 많이 말을 하지 아니하였다.
+최석은 한참이나 눈을 감고 있더니,
+"정임이 소식 들었나?"
+하였다.
+"괜찮대요."
+하고 곁에서 순임이가 말하였다.
+그리고는 또 혼몽하는 듯하였다.
+그 날 또 한 번 최석은 정신을 차리고 순임더러는 저리로 가라는 뜻을 표하고 나더러 귀를 가까이 대라는 뜻을 보이기로 그대로 하였더니,
+"내 가방 속에 일기가 있으니 그걸 자네만 보고는 불살라 버려. 내가 죽은 뒤에라도 그것이 세상 사람의 눈에 들면 안 되지. 순임이가 볼까 걱정이 되지마는 내가 몸을 꼼짝할 수가 있나."
+하는 뜻을 말하였다.
+"그러지."
+하고 나는 고개를 끄덕여 보였다.
+그러고 난 뒤에 나는 최석이가 시킨 대로 가방을 열고 책들을 뒤져서 그 일기책이라는 공책을 꺼내었다.
+"순임이 너 이거 보았니?"
+하고 나는 곁에서 내가 책 찾는 것을 보고 섰던 순임에게 물었다.
+"아니오. 그게 무어여요?"
+하고 순임은 내 손에 든 책을 빼앗으려는 듯이 손을 내밀었다.
+나는 순임의 손이 닿지 않도록 책을 한편으로 비키며,
+"이것이 네 아버지 일기인 모양인데 너는 보이지 말고 나만 보라고 하셨다. 네 아버지가 네가 이것을 보았을까 해서 염려를 하시는데 안 보았으면 다행이다."
+하고 나는 그 책을 들고 밖으로 나왔다.
+날이 밝다. 해는 중천에 있다. 중천이래야 저 남쪽 지평선 가까운 데다. 밤이 열여덟 시간, 낮이 대여섯 시간밖에 안 되는 북쪽 나라다. 멀건 햇빛이다.
+나는 볕이 잘 드는 곳을 골라서 나무에 몸을 기대고 최석의 일기를 읽기 시작하였다. 읽은 중에서 몇 구절을 골라 볼까.
+"집이 다 되었다. 이 집은 내가 생전 살고 그 속에서 이 세상을 마칠 집이다. 마음이 기쁘다. 시끄러운 세상은 여기서 멀지 아니하냐. 내가 여기 홀로 있기로 누가 찾을 사람도 없을 것이다. 내가 여기서 죽기로 누가 슬퍼해 줄 사람도 없을 것이다. 때로 곰이나 찾아올까. 지나가던 사슴이나 들여다볼까.
+이것이 내 소원이 아니냐. 세상의 시끄러움을 떠나는 것이 내 소원이 아니냐. 이 속에서 나는 나를 이기기를 공부하자."
+첫날은 이런 평범한 소리를 썼다.
+그 이튿날에는.
+"어떻게나 나는 약한 사람인고. 제 마음을 제가 지배하지 못하는 사람인고. 밤새도록 나는 정임을 생각하였다. 어두운 허공을 향하여 정임을 불렀다. 정임이가 나를 찾아서 동경을 떠나서 이리로 오지나 아니하나 하고 생각하였다. 어떻게나 부끄러운 일인고? 어떻게나 가증한 일인고?
+나는 아내를 생각하려 하였다. 아이들을 생각하려 하였다. 아내와 아이들을 생각함으로 정임의 생각을 이기려 하였다.
+최석아, 너는 남편이 아니냐. 아버지가 아니냐. 정임은 네 딸이 아니냐. 이런 생각을 하였다.
+그래도 정임의 일류전은 아내와 아이들의 생각을 밀치고 달려오는 절대 위력을 가진 듯하였다.
+아, 나는 어떻게나 파렴치한 사람인고. 나이 사십이 넘어 오십을 바라보는 놈이 아니냐. 사십에 불혹이라고 아니 하느냐. 교육가로 깨끗한 교인으로 일생을 살아 왔다고 자처하는 내가 아니냐 하고 나는 내 입으로 내 손가락을 물어서 두 군데나 피를 내었다."
+최석의 둘째 날 일기는 계속된다.
+"내 손가락에서 피가 날 때에 나는 유쾌하였다. 나는 승첩의 기쁨을 깨달았다.
+그러나 아아 그러나 그 빨간, 참회의 핏방울 속에서도 애욕의 불길이 일지 아니하는가. 나는 마침내 제도할 수 없는 인생인가."
+이 집에 든 지 둘째날에 벌써 이러한 비관적 말을 하였다.
+또 며칠을 지난 뒤 일기에,
+"나는 동경으로 돌아가고 싶다. 정임의 곁으로 가고 싶다. 시베리아의광야의 유혹도 아무 힘이 없다. 어젯밤은 삼림의 좋은 달을 보았으나 그 달을 아름답게 보려 하였으나 아무리 하여도 아름답게 보이지를 아니하였다.
+하늘이나 달이나 삼림이나 모두 무의미한 존재다. 이처럼 무의미한 존재를 나는 경험한 일이 없다. 그것은 다만 기쁨을 자아내지 아니할 뿐더러 슬픔도 자아내지 못하였다. 그것은 잿더미였다. 아무도 듣는 이 없는 데서 내 진정을 말하라면 그것은 이 천지에 내게 의미 있는 것은 정임이밖에 없다는 것이다.
+나는 정임의 곁에 있고 싶다. 정임을 내 곁에 두고 싶다. 왜? 그것은 나도 모른다.
+만일 이 움 속에라도 정임이가 있다 하면 얼마나 이것이 즐거운 곳이 될까.
+그러나 이것은 불가능한 일이다. 이 일이 있어서는 아니 된다. 나는 이 생각을 죽여야 한다. 다시 거두를 못 하도록 목숨을 끊어 버려야 한다.
+이것을 나는 원한다. 원하지마는 내게는 그 힘이 없는 모양이다.
+나는 종교를 생각하여 본다. 철학을 생각하여 본다. 인류를 생각하여 본다. 나라를 생각하여 본다. 이것을 가지고 내 애욕과 바꾸려고 애써 본다. 그렇지마는 내게 그러한 힘이 없다. 나는 완전히 헬플리스함을 깨닫는다.
+아아 나는 어찌할꼬?
+나는 못생긴 사람이다. 그까짓 것을 못 이겨? 그까짓 것을 못 이겨?
+나는 예수의 광야에서의 유혹을 생각한다. 천하를 주마 하는 유혹을 생각한다. 나는 싯다르타 태자가 왕궁을 버리고 나온 것을 생각하고, 또 스토아 철학자의 의지력을 생각하였다.
+그러나 나는 그러한 생각으로도 이 생각을 이길 수가 없는 것 같다.
+나는 혁명가를 생각하였다. 모든 것 사랑도 목숨도 다 헌신짝같이 집어던지고 피 흐르는 마당으로 뛰어나가는 용사를 생각하였다. 나는 이끝없는 삼림 속으로 혁명의 용사 모양으로 달음박질치다가 기운이 진한 곳에서 죽어 버리는 것이 소원이었다. 그러나 거기까지도 이 생각은 따르지 아니할까.
+나는 지금 곧 죽어 버릴까. 나는 육혈포를 손에 들어 보았다. 이 방아쇠를 한 번만 튕기면 내 생명은 없어지는 것이 아닌가. 그리 되면 모든 이 마음의 움직임은 소멸되는 것이 아닌가. 이것으로 만사가 해결되는 것이 아닌가.
+아 하나님이시여, 힘을 주시옵소서. 천하를 이기는 힘보다도 나 자신을 이기는 힘을 주시옵소서. 이 죄인으로 하여금 하나님의 눈에 의롭고 깨끗한 사람으로 이 일생을 마치게 하여 주시옵소서, 이렇게 나는 기도를 한다.
+그러나 하나님께서는 나를 버리셨다. 하나님께서는 내게 힘을 주시지 아니하시었다. 나를 이 비참한 자리에서 썩어져 죽게 하시었다."
+최석은 어떤 날 일기에 또 이런 것도 썼다. 그것은 예전 내게 보낸 편지에 있던 꿈 이야기를 연상시키는 것이었다. 그것은 이러하다.
+"오늘 밤은 달이 좋다. 시베리아의 겨울 해는 참 못생긴 사람과도 같이 기운이 없지마는 하얀 땅, 검푸른 하늘에 저쪽 지평선을 향하고 흘러가는 반달은 참으로 맑음 그것이었다.
+나는 평생 처음 시 비슷한 것을 지었다.
+임과 이별하던 날 밤에는 남쪽 나라에 바람비가 쳤네
+임 타신 자동차의 뒷불이 빨간 뒷불이 빗발에 찢겼네
+임 떠나 혼자 헤매는 시베리아의 오늘 밤에는
+지려는 쪽달이 눈 덮인 삼림에 걸렸구나
+아아 저 쪽달이여
+억지로 반을 갈겨진 것도 같아라
+아아 저 쪽달이여
+잃어진 짝을 찾아
+차디찬 허공 속을 영원히 헤매는 것도 같구나
+나도 저 달과 같이 잃어버린 반쪽을 찾아 무궁한 시간과 공간에서 헤매는 것만 같다.
+에익. 내가 왜 이리 약한가. 어찌하여 크나큰 많은 일을 돌아보지 못하고 요만한 애욕의 포로가 되는가.
+그러나 나는 차마 그 달을 버리고 들어올 수가 없었다. 내가 왜 이렇게 센티멘털하게 되었는고. 내 쇠 같은 의지력이 어디로 갔는고. 내 누를 수 없는 자존심이 어디로 갔는고. 나는 마치 유모의 손에 달린 젖먹이와도 같다. 내 일신은 도시 애욕 덩어리로 화해 버린 것 같다.
+이른바 사랑 사랑이란 말은 종교적 의미인 것 이외에도 입에 담기도 싫어하던 말이다 이런 것은 내 의지력과 자존심을 녹여 버렸는가. 또 이 부자연한 고독의 생활이 나를 이렇게 내 인격을 이렇게 파괴하였는가.
+그렇지 아니하면 내 자존심이라는 것이나, 의지력이라는 것이나, 인격이라는 것이 모두 세상의 습관과 사조에 휩쓸리던 것인가. 남들이 그러니까 남들이 옳다니까 남들이 무서우니까 이 애욕의 무덤에 회를 발랐던 것인가. 그러다가 고독과 반성의 기회를 얻으매 모든 회칠과 가면을 떼어 버리고 빨가벗은 애욕의 뭉텅이가 나온 것인가.
+그렇다 하면, 이것이 참된 나인가. 이것이 하나님께서 지어 주신 대로의 나인가. 가슴에 타오르는 애욕의 불길 이 불길이 곧 내 영혼의 불길인가.
+어쩌면 그 모든 높은 이상들 인류에 대한, 민족에 대한, 도덕에 대한, 신앙에 대한 그 높은 이상들이 이렇게도 만만하게 마치 바람에 불리는 재 모양으로 자취도 없이 흩어져 버리고 말까. 그리고 그 뒤에는 평소에그렇게도 미워하고 천히 여기던 애욕의 검은 흙만 남고 말까.
+아아 저 눈 덮인 땅이여, 차고 맑은 달이여, 허공이여! 나는 너희들을 부러워하노라.
+불교도들의 해탈이라는 것이 이러한 애욕이 불붙는 지옥에서 눈과 같이 싸늘하고 허공과 같이 빈 곳으로 들어감을 이름인가.
+석가의 팔 년 간 설산 고행이 이 애욕의 뿌리를 끊으려 함이라 하고 예수의 사십 일 광야의 고행과 겟세마네의 고민도 이 애욕의 뿌리 때문이었던가.
+그러나 그것을 이기어 낸 사람이 천지 개벽 이래에 몇몇이나 되었는고? 나 같은 것이 그 중에 한 사람 되기를 바랄 수가 있을까.
+나 같아서는 마침내 이 애욕의 불길에 다 타서 재가 되어 버릴 것만 같다. 아아 어떻게나 힘있고 무서운 불길인고."
+이러한 고민의 자백도 있었다.
+또 어떤 날 일기에는 최석은 이런 말을 썼다.
+"나는 단연히 동경으로 돌아가기를 결심하였다."
+그리고는 그 이튿날은,
+"나는 단연히 동경으로 돌아가리란 결심을 한 것을 굳세게 취소한다. 나는 이러한 결심을 하는 나 자신을 굳세게 부인한다."
+또 이런 말도 있다.
+"나는 정임을 시베리아로 부르련다."
+또 그 다음에는,
+"아아 나는 하루바삐 죽어야 한다. 이 목숨을 연장하였다가는 무슨 일을 저지를는지 모른다. 나는 깨끗하게 나를 이기는 도덕적 인격으로 이 일생을 마쳐야 한다. 이 밖에 내 사업이 무엇이냐."
+또 어떤 곳에는,
+"아아 무서운 하룻밤이었다. 나는 지난 하룻밤을 누를 수 없는 애욕의 불길에 탔다. 나는 내 주먹으로 내 가슴을 두드리고 머리를 벽에 부딪쳤다. 나는 주먹으로 담벽을 두드려 손등이 터져서 피가 흘렀다. 나는 내 머리카락을 쥐어뜯었다. 나는 수없이 발을 굴렀다. 나는 이 무서운 유혹을 이기려고 내 몸을 아프게 하였다. 나는 견디다 못하여 문을 박차고 뛰어나갔다. 밖에는 달이 있고 눈이 있었다. 그러나 눈은 핏빛이요, 달은 찌그러진 것 같았다. 나는 눈 속으로 달음박질쳤다. 달을 따라서 엎드러지며 자빠지며 달음질쳤다. 나는 소리를 질렀다. 나는 미친 사람 같았다."
+그러고는 어디까지 갔다가 어느 때에 어떠한 심경의 변화를 얻어 가지고 돌아왔다는 말은 쓰이지 아니하였으나 최석의 병의 원인을 설명하는 것 같았다.
+"열이 나고 기침이 난다. 가슴이 아프다. 이것이 폐렴이 되어서 혼자 깨끗하게 이 생명을 마치게 하여 주소서 하고 빈다. 나는 오늘부터 먹고 마시기를 그치련다."
+이러한 말을 썼다. 그러고는,
+"정임, 정임, 정임, 정임."
+하고 정임의 이름을 수없이 쓴 것도 있고, 어떤 데는,
+"Overcome, Overcome."
+하고 영어로 쓴 것도 있었다.
+그리고 마지막에,
+"나는 죽음과 대면하였다. 사흘째 굶고 앓은 오늘에 나는 극히 맑고 침착한 정신으로 죽음과 대면하였다. 죽음은 검은 옷을 입었으나 그 얼굴에는 자비의 표정이 있었다. 죽음은 곧 검은 옷을 입은 구원의 손이었다. 죽음은 아름다운 그림자였다. 죽음은 반가운 애인이요, 결코 무서운 원수가 아니었다. 나는 죽음의 손을 잡노라. 감사하는 마음으로 죽음의 품에 안기노라. 아멘."
+이것을 쓴 뒤에는 다시는 일기가 없었다. 이것으로 최석이가 그 동안 지난 일을 적어도 심리적 변화만은 대강 추측할 수가 있었다.
+다행히 최석의 병은 점점 돌리는 듯하였다. 열도 내리고 식은땀도 덜 흘렸다. 안 먹는다고 고집하던 음식도 먹기를 시작하였다.
+정임에게로 갔던 노파에게서는 정임도 열이 내리고 일어나 앉을 만하다는 편지가 왔다.
+나는 노파의 편지를 최석에게 읽어 주었다. 최석은 그 편지를 듣고 매우 흥분하는 모양이었으나 곧 안심하는 빛을 보였다.
+나는 최석의 병이 돌리는 것을 보고 정임을 찾아볼 양으로 떠나려 하였으나 순임이가 듣지 아니하였다. 혼자서 앓는 아버지를 맡아 가지고 있을 수는 없다는 것이었다. 그래서 노파가 오기를 기다리기로 하였다.
+나는 최석이가 먹을 음식도 살 겸 우편국에도 들를 겸 시가까지 가기로 하고 이 곳 온 지 일 주일이나 지나서 처음으로 산에서 나왔다.
+나는 이르쿠츠크에 가서 최석을 위하여 약품과 먹을 것을 사고 또 순임을 위해서도 먹을 것과 의복과 또 하모니카와 손풍금도 사 가지고 정거장에 나와서 돌아올 차를 기다리고 있었다.
+나는 순후해 보이는 아라사 사람들이 정거장에서 오락가락하는 것을 보고 속으로는 최석이가 병이 좀 나은 것을 다행으로 생각하고, 또 최석과 정임의 장래가 어찌 될까 하는 것도 생각하면서 뷔페(식당)에서 뜨거운 차이(차)를 마시고 있었다.
+이 때에 밖을 바라보고 있던 내 눈은 문득 이상한 것을 보았다. 그것은 그 노파가 이리로 향하고 걸어오는 것인데 그 노파와 팔을 걸은 젊은 여자가 있는 것이다. 머리를 검은 수건으로 싸매고 입과 코를 가리웠으니 분명히 알 수 없으나 혹은 정임이나 아닌가 할 수밖에 없었다. 정임이가 몸만 기동하게 되면 최석을 보러 올 것은 정임의 열정적인 성격으로 보아서 당연한 일이기 때문이었다.
+나는 반쯤 먹던 차를 놓고 뷔페 밖으로 뛰어나갔다.
+"오 미시즈 체스터필드?"
+하고 나는 노파 앞에 손을 내어밀었다. 노파는 체스터필드라는 미국 남편의 성을 따라서 부르는 것을 기억하였다.
+"선생님!"
+하는 것은 정임이었다. 그 소리만은 변치 아니하였다. 나는 검은 장갑을 낀 정임의 손을 잡았다. 나는 여러 말 아니하고 노파와 정임을 뷔페로 끌고 들어왔다.
+늙은 뷔페 보이는 번쩍번쩍하는 사모바르에서 차 두 잔을 따라다가 노파와 정임의 앞에 놓았다.
+노파는 어린애에게 하는 모양으로 정임의 수건을 벗겨 주었다. 그 속에서는 해쓱하게 여윈 정임의 얼굴이 나왔다. 두 볼에 불그레하게 홍훈이 도는 것도 병 때문인가.
+"어때? 신열은 없나?"
+하고 나는 정임에게 물었다.
+"괜찮아요."
+하고 정임은 웃으며,
+"최 선생님께서는 어떠세요?"
+하고 묻는다.
+"좀 나으신 모양이야. 그래서 나는 오늘 정임을 좀 보러 가려고 했는데 이 체스터필드 부인께서 아니 오시면 순임이가 혼자 있을 수가 없다고 해서, 그래 이렇게 최 선생 자실 것을 사 가지고 가는 길이야."
+하고 말을 하면서도 나는 정임의 눈과 입과 목에서 그의 병과 마음을 알아보려고 애를 썼다.
+중병을 앓은 깐 해서는 한 달 전 남대문서 볼 때보다 얼마 더 초췌한 것 같지는 아니하였다.
+"네에."
+하고 정임은 고개를 숙였다. 그의 안경알에는 이슬이 맺혔다.
+"선생님 댁은 다 안녕하셔요?"
+"응, 내가 떠날 때에는 괜찮았어."
+"최 선생님 댁도?"
+"응."
+"선생님 퍽은 애를 쓰셨어요."
+하고 정임은 울음인지 웃음인지 모를 웃음을 웃는다.
+말을 모르는 노파는 우리가 하는 말을 눈치나 채려는 듯이 멀거니 보고 있다가 서투른 영어로,
+"아직 미스 남은 신열이 있답니다. 그래도 가 본다고, 죽어도 가 본다고 내 말을 안 듣고 따라왔지요."
+하고 정임에게 애정 있는 눈흘김을 주며,
+"유 노티 차일드(말썽꾼이)."
+하고 입을 씰룩하며 정임을 안경 위로 본다.
+"니체워, 마뚜슈까(괜찮아요, 어머니)."
+하고 정임은 노파를 보고 웃었다. 정임의 서양 사람에게 대한 행동은 서양식으로 째었다고 생각하였다.
+정임은 도리어 유쾌한 빛을 보였다. 다만 그의 붉은빛 띤 눈과 마른 입술이 그의 몸에 열이 있음을 보였다. 나는 그의 손끝과 발끝이 싸늘하게 얼었을 것을 상상하였다.
+마침 이 날은 날이 온화하였다. 엷은 햇빛도 오늘은 두꺼워진 듯하였다.
+우리 세 사람은 F역에서 내려서 썰매 하나를 얻어 타고 산으로 향하였다. 산도 아니지마는 산 있는 나라에서 살던 우리는 최석이가 사는 곳을 산이라고 부르는 습관을 지었다. 삼림이 있으니 산같이 생각된 까닭이었다.
+노파가 오른편 끝에 앉고, 가운데다가 정임을 앉히고 왼편 끝에 내가 앉았다.
+쩟쩟쩟 하는 소리에 말은 달리기 시작하였다. 한 필은 키 큰 말이요, 한 필은 키가 작은 말인데 키 큰 말은 아마 늙은 군마 퇴물인가 싶게 허우대는 좋으나 몸이 여위고 털에는 윤이 없었다. 조금만 올라가는 길이 되어도 고개를 숙이고 애를 썼다. 작은 말은 까불어서 가끔 채찍으로 얻어맞았다.
+"아이 삼림이 좋아요."
+하고 정임은 정말 기쁜 듯이 나를 돌아보았다.
+"좋아?"
+하고 나는 멋없이 대꾸하고 나서, 후회되는 듯이,
+"밤낮 삼림 속에서만 사니까 지루한데."
+하는 말을 붙였다.
+"저는 저 눈 있는 삼림 속으로 한정 없이 가고 싶어요. 그러나 저는 인제 기운이 없으니깐 웬걸 그래 보겠어요?"
+하고 한숨을 쉬었다.
+"왜 그런 소릴 해. 인제 나을걸."
+하고 나는 정임의 눈을 들여다보았다. 마치 슬픈 눈물 방울이나 찾으려는 듯이.
+"제가 지금도 열이 삼십팔 도가 넘습니다. 정신이 흐릿해지는 것을 보니까 아마 더 올라가나 봐요. 그래도 괜찮아요. 오늘 하루야 못 살라고요. 오늘 하루만 살면 괜찮아요. 최 선생님만 한 번 뵙고 죽으면 괜찮아요."
+"왜 그런 소릴 해?"
+하고 나는 책망하는 듯이 언성을 높였다.
+정임은 기침을 시작하였다. 한바탕 기침을 하고는 기운이 진한 듯이 노파에게 기대며 조선말로,
+"추워요."
+하였다. 이 여행이 어떻게 정임의 병에 좋지 못할 것은 의사가 아닌 나로도 짐작할 수가 있었다. 그러나 나로는 더 어찌할 수가 없었다.
+나는 외투를 벗어서 정임에게 입혀 주고 노파는 정임을 안아서 몸이 덜 흔들리도록 또 춥지 않도록 하였다.
+나는 정임의 모양을 애처로워서 차마 볼 수가 없었다. 그러나 이것은 하나님밖에는 어찌할 도리가 없는 일이었다.
+얼마를 지나서 정임은 갑자기 고개를 들고 일어나며,
+"인제 몸이 좀 녹았습니다. 선생님 추우시겠어요. 이 외투 입으셔요."
+하고 그의 입만 웃는 웃음을 웃었다.
+"난 춥지 않아. 어서 입고 있어."
+하고 나는 정임이가 외투를 벗는 것을 막았다. 정임은 더 고집하려고도 아니하고,
+"선생님 시베리아의 삼림은 참 좋아요. 눈 덮인 것이 더 좋은 것 같아요. 저는 이 인적 없고 자유로운 삼림 속으로 헤매어 보고 싶어요."
+하고 아까 하던 것과 같은 말을 또 하였다.
+"며칠 잘 정양하여서, 날이나 따뜻하거든 한 번 산보나 해 보지."
+하고 나는 정임의 말 뜻이 다른 데 있는 줄을 알면서도 부러 평범하게 대답하였다.
+정임은 대답이 없었다.
+"여기서도 아직 멀어요?"
+하고 정임은 몸이 흔들리는 것을 심히 괴로워하는 모양으로 두 손을 자리에 짚어 몸을 버티면서 말하였다.
+"고대야, 최 선생이 반가워할 터이지. 오죽이나 반갑겠나."
+하고 나는 정임을 위로하는 뜻으로 말하였다.
+"아이 참 미안해요. 제가 죄인이야요. 저 때문에 애매한 누명을 쓰시고 저렇게 사업도 버리시고 병환까지 나시니 저는 어떡허면 이 죄를 씻습니까?"
+하고 눈물 고인 눈으로 정임은 나를 쳐다보았다.
+나는 정임과 최석을 이 자유로운 시베리아의 삼림 속에 단둘이 살게 하고 싶었다. 그러나 최석은 살아나가겠지마는 정임이가 살아날 수가 있을까, 하고 나는 정임의 어깨를 바라보았다. 그의 목숨은 실낱 같은 것 같았다. 바람받이에 놓인 등잔불과만 같은 것 같았다. 이 목숨이 끊어지기 전에 사랑하는 이의 얼굴을 한 번 대하겠다는 것밖에 아무 소원이 없는 정임은 참으로 가엾어서 가슴이 미어지는 것 같았다.
+"염려 말어. 무슨 걱정이야? 최 선생도 병이 돌리고 정임도 인제 얼마 정양하면 나을 것 아닌가. 아무 염려 말아요."
+하고 나는 더욱 최석과 정임과 두 사람의 사랑을 달하게 할 결심을 하였다. 하나님께서 계시다면 이 가엾은 간절한 두 사람의 마음을 가슴 미어지게 아니 생각할 리가 없다고 생각하였다. 우주의 모든 일 중에 정임의 정경보다 더 슬프고 불쌍한 정경이 또 있을까 하였다. 차디찬 눈으로 덮인 시베리아의 광야에 병든 정임의 사랑으로 타는 불똥과 같이 날아가는 이 정경은 인생이 가질 수 있는 최대한 비극인 것 같았다.
+정임은 지쳐서 고개를 숙이고 있다가도 가끔 고개를 들어서는 기운 나는 양을 보이려고, 유쾌한 양을 보이려고 애를 썼다.
+"저 나무 보셔요. 오백 년은 살았겠지요?"
+이런 말도 하였다. 그러나 그것은 다 억지로 지어서 하는 것이었다. 그러다가는 또 기운이 지쳐서는 고개를 숙이고, 혹은 노파의 어깨에 혹은 내 어깨에 쓰러졌다.
+마침내 우리가 향하고 가는 움집이 보였다.
+"정임이, 저기야."
+하고 나는 움집을 가리켰다.
+"네에?"
+하고 정임은 내 손가락 가는 곳을 보고 다음에는 내 얼굴을 보았다. 잘 보이지 않는 모양이다.
+"저기 저것 말야. 저기 저 고작 큰 전나무 두 개가 있지 않아? 그 사이로 보이는 저, 저거 말야. 옳지 옳지, 순임이 지금 나오지 않아?"
+하였다.
+순임이가 무엇을 가지러 나오는지 문을 열고 나와서는 밥 짓느라고 지어 놓은 이를테면 부엌에를 들어갔다가 나오는 길에 이 쪽을 바라보다가 우리를 발견하였는지 몇 걸음 빨리 오다가는 서서 보고 오다가는 서서 보더니 내가 모자를 내두르는 것을 보고야 우리 일행인 것을 확실히 알고 달음박질을 쳐서 나온다.
+우리 썰매를 만나자,
+"정임이야? 어쩌면 이 추운데."
+하고 순임은 정임을 안고 그 안경으로 정임의 눈을 들여다본다.
+"어쩌면 앓으면서 이렇게 와?"
+하고 순임은 노파와 나를 책망하는 듯이 돌아보았다.
+"아버지 어떠시냐?"
+하고 나는 짐을 들고 앞서서 오면서 뒤따르는 순임에게 물었다.
+"아버지요?"
+하고 순임은 어른에게 대한 경의를 표하노라고 내 곁에 와서 걸으며,
+"아버지께서 오늘은 말씀을 많이 하셨어요. 순임이가 고생하는구나 고맙다, 이런 말씀도 하시고, 지금 같아서는 일어날 것도 같은데 기운이 없어서, 이런 말씀도 하시고, 또 선생님이 이르쿠츠크에를 들어가셨으니 무엇을 사 오실 듯싶으냐, 알아맞혀 보아라, 이런 농담도 하시고, 정임이가 어떤가 한 번 보았으면, 이런 말씀도 하시겠지요. 또 순임아, 내가 죽더라도 정임을 네 친동생으로 알아서 부디 잘 사랑해 주어라, 정임은 불쌍한 애다, 참 정임은 불쌍해! 이런 말씀도 하시겠지요. 그렇게 여러 가지 말씀을 많이 하시더니, 순임아 내가 죽거든 선생님을 아버지로 알고 그 지도를 받아라, 그러시길래 제가 아버지 안 돌아가셔요! 그랬더니 아버지께서 웃으시면서, 죽지 말까, 하시고는 어째 가슴이 좀 거북한가, 하시더니 잠이 드셨어요. 한 시간이나 되었을까, 온."
+집 앞에 거의 다 가서는 순임은 정임의 팔을 꼈던 것을 놓고 빨리 집으로 뛰어들어갔다.
+치마폭을 펄럭거리고 뛰는 양에는 어렸을 적 말괄량이 순임의 모습이 남아 있어서 나는 혼자 웃었다. 순임은 정임이가 왔다는 기쁜 소식을 한 시각이라도 빨리 아버지께 전하고 싶었던 것이다.
+"아버지, 주무시우? 정임이가 왔어요. 정임이가 왔습니다."
+하고 부르는 소리가 밖에서도 들렸다.
+나도 방에 들어서고, 정임도 뒤따라 들어서고, 노파는 부엌으로 물건을 두러 들어갔다.
+방은 절벽같이 어두웠다.
+"순임아, 불을 좀 켜려무나."
+하고 최석의 얼굴을 찾느라고 눈을 크게 뜨고 고개를 숙이며,
+"자나? 정임이가 왔네."
+하고 불렀다.
+정임도 곁에 와서 선다.
+최석은 대답이 없었다.
+순임이가 촛불을 켜자 최석의 얼굴이 환하게 보였다.
+"여보게, 여봐. 자나?"
+하고 나는 무서운 예감을 가지면서 최석의 어깨를 흔들었다.
+그것이 무엇인지 모르지마는 최석은 시체라 하는 것을 나는 내 손을 통해서 깨달았다.
+나는 깜짝 놀라서 이불을 벗기고 최석의 팔을 잡아 맥을 짚어 보았다. 거기는 맥이 없었다.
+나는 최석의 자리옷 가슴을 헤치고 귀를 가슴에 대었다. 그 살은 얼음과 같이 차고 그 가슴은 고요하였다. 심장은 뛰기를 그친 것이었다.
+나는 최석의 가슴에서 귀를 떼고 일어서면서,
+"네 아버지는 돌아가셨다. 네 손으로 눈이나 감겨 드려라."
+하였다. 내 눈에서는 눈물이 흘렀다.
+"선생님!"
+하고 정임은 전연히 절제할 힘을 잃어버린 듯이 최석의 가슴에 엎어졌다. 그러고는 소리를 내어 울었다. 순임은,
+"아버지, 아버지!"
+하고 최석의 베개 곁에 이마를 대고 울었다.
+아라사 노파도 울었다.
+방 안에는 오직 울음 소리뿐이요, 말이 없었다. 최석은 벌써 이 슬픈 광경도 몰라보는 사람이었다.
+최석이가 자기의 싸움을 이기고 죽었는지, 또는 끝까지 지다가 죽었는지 그것은 영원한 비밀이어서 알 도리가 없었다. 그러나 이것만은 확실하다 그의 의식이 마지막으로 끝나는 순간에 그의 의식기에 떠오르던 오직 하나가 정임이었으리라는 것만은.
+지금 정임이가 그의 가슴에 엎어져 울지마는, 정임의 뜨거운 눈물이 그의 가슴을 적시건마는 최석의 가슴은 뛸 줄을 모른다. 이것이 죽음이란 것이다.
+뒤에 경찰의가 와서 검사한 결과에 의하면, 최석은 폐렴으로 앓던 결과로 심장마비를 일으킨 것이라고 하였다.
+나는 최석의 장례를 끝내고 순임과 정임을 데리고 오려 하였으나 정임은 듣지 아니하고 노파와 같이 바이칼 촌으로 가 버렸다.
+그런 뒤로는 정임에게서는 일체 음신이 없다. 때때로 노파에게서 편지가 오는데 정임은 최석이가 있던 방에 가만히 있다고만 하였다.
+서투른 영어가 뜻을 충분히 발표하지 못하는 것이었다.
+나는 정임에게 안심하고 병을 치료하라는 편지도 하고 돈이 필요하거든 청구하라는 편지도 하나 영 답장이 없다.
+만일 정임이가 죽었다는 기별이 오면 나는 한 번 더 시베리아에 가서 둘을 가지런히 묻고 `두 별 무덤'이라는 비를 세워 줄 생각이다. 그러나 나는 정임이가 조선으로 오기를 바란다.
+여러분은 최석과 정임에게 대한 이 기록을 믿고 그 두 사람에게 대한 오해를 풀라.
+EOT;
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Address.php
new file mode 100644
index 00000000..5f446408
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Address.php
@@ -0,0 +1,131 @@
+generator->parse($format);
+ }
+
+ public static function country()
+ {
+ return static::randomElement(static::$country);
+ }
+
+ public static function postcode()
+ {
+ return static::toUpper(static::bothify(static::randomElement(static::$postcode)));
+ }
+
+ public static function regionSuffix()
+ {
+ return static::randomElement(static::$regionSuffix);
+ }
+
+ public static function region()
+ {
+ return static::randomElement(static::$region);
+ }
+
+ public static function citySuffix()
+ {
+ return static::randomElement(static::$citySuffix);
+ }
+
+ public function city()
+ {
+ return static::randomElement(static::$city);
+ }
+
+ public static function streetSuffix()
+ {
+ return static::randomElement(static::$streetSuffix);
+ }
+
+ public static function street()
+ {
+ return static::randomElement(static::$street);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Company.php
new file mode 100644
index 00000000..4a110c2c
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/Company.php
@@ -0,0 +1,15 @@
+generator->parse(static::randomElement(static::$lastNameFormat));
+ }
+
+ /**
+ * Return male last name
+ * @return string
+ * @example 'Vasiliauskas'
+ */
+ public function lastNameMale()
+ {
+ return static::randomElement(static::$lastNameMale);
+ }
+
+ /**
+ * Return female last name
+ * @return string
+ * @example 'Žukauskaitė'
+ */
+ public function lastNameFemale()
+ {
+ return static::randomElement(static::$lastNameFemale);
+ }
+
+ /**
+ * Return driver license number
+ * @return string
+ * @example 12345678
+ */
+ public function driverLicence()
+ {
+ return $this->bothify("########");
+ }
+
+ /**
+ * Return passport number
+ * @return string
+ * @example 12345678
+ */
+ public function passportNumber()
+ {
+ return $this->bothify("########");
+ }
+
+ /**
+ * National Personal Identity number (asmens kodas)
+ * @link https://en.wikipedia.org/wiki/National_identification_number#Lithuania
+ * @link https://lt.wikipedia.org/wiki/Asmens_kodas
+ * @param string [male|female]
+ * @param \DateTime $birthdate
+ * @param string $randomNumber three integers
+ * @return string on format XXXXXXXXXXX
+ */
+ public function personalIdentityNumber($gender = 'male', \DateTime $birthdate = null, $randomNumber = '')
+ {
+ if (!$birthdate) {
+ $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury();
+ }
+
+ $genderNumber = ($gender == 'male') ? 1 : 0;
+ $firstNumber = (int) floor($birthdate->format('Y') / 100) * 2 - 34 - $genderNumber;
+
+ $datePart = $birthdate->format('ymd');
+ $randomDigits = (string) ( ! $randomNumber || strlen($randomNumber) < 3) ? static::numerify('###') : substr($randomNumber, 0, 3);
+ $partOfPerosnalCode = $firstNumber . $datePart . $randomDigits;
+
+ $sum = self::calculateSum($partOfPerosnalCode, 1);
+ $liekana = $sum % 11;
+
+ if ($liekana !== 10) {
+ $lastNumber = $liekana;
+ return $firstNumber . $datePart . $randomDigits . $lastNumber;
+ }
+
+ $sum = self::calculateSum($partOfPerosnalCode, 2);
+ $liekana = $sum % 11;
+
+ $lastNumber = ($liekana !== 10) ? $liekana : 0;
+ return $firstNumber . $datePart . $randomDigits . $lastNumber;
+ }
+
+ /**
+ * Calculate the sum of personal code
+ * @link https://en.wikipedia.org/wiki/National_identification_number#Lithuania
+ * @link https://lt.wikipedia.org/wiki/Asmens_kodas
+ * @param string $numbers
+ * @param int $time [1|2]
+ * @return int
+ */
+ private static function calculateSum($numbers, $time = 1)
+ {
+ if ($time == 1) {
+ $multipliers = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 1 );
+ } else {
+ $multipliers = array(3, 4, 5, 6, 7, 8, 9, 1, 2, 3 );
+ }
+
+ $sum = 0;
+ for ($i=1; $i <= 10; $i++) {
+ $sum += $numbers[$i-1] * $multipliers[$i-1];
+ }
+
+ return (int) $sum;
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/PhoneNumber.php
new file mode 100644
index 00000000..752eb78b
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/lt_LT/PhoneNumber.php
@@ -0,0 +1,17 @@
+bothify("??######");
+ return static::bothify('??######');
}
public function passportNumber()
{
- return $this->bothify("??#######");
+ return static::bothify('??#######');
}
/**
@@ -70,7 +115,7 @@ class Person extends \Faker\Provider\Person
public function personalIdentityNumber(\DateTime $birthdate = null)
{
if (!$birthdate) {
- $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury();
+ $birthdate = DateTime::dateTimeThisCentury();
}
$datePart = $birthdate->format('dmy');
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/PhoneNumber.php
index f6b61486..29c19f63 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/PhoneNumber.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/lv_LV/PhoneNumber.php
@@ -4,10 +4,12 @@ namespace Faker\Provider\lv_LV;
class PhoneNumber extends \Faker\Provider\PhoneNumber
{
+ /**
+ * {@link} https://en.wikipedia.org/wiki/Telephone_numbers_in_Latvia
+ **/
protected static $formats = array(
- '##-###-###',
- '##-######',
'########',
- '+371 #######',
+ '## ### ###',
+ '+371 ########',
);
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/me_ME/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/me_ME/Address.php
index 5b9caf14..422207ea 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/me_ME/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/me_ME/Address.php
@@ -109,19 +109,11 @@ class Address extends \Faker\Provider\Address
return static::randomElement(static::$cityNames);
}
- /**
- * @example '77.147489'
- */
- public static function latitude()
+ public static function localCoordinates()
{
- return number_format(mt_rand(42430000, 42450000)/1000000, 6);
- }
-
- /**
- * @example '86.211205'
- */
- public static function longitude()
- {
- return number_format(mt_rand(19260000, 19270000)/1000000, 6);
+ return array(
+ 'latitude' => static::latitude(42.43, 42.45),
+ 'longitude' => static::longitude(19.16, 19.27)
+ );
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/Person.php
new file mode 100644
index 00000000..3042b5bb
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/Person.php
@@ -0,0 +1,100 @@
+generator->parse(static::$idNumberFormat));
+ }
+
+ /**
+ * @return string
+ * @example 'Ф'
+ */
+ public function alphabet()
+ {
+ return static::randomElement(static::$alphabet);
+ }
+
+ /**
+ * @return string
+ * @example 'Э'
+ */
+ public function namePrefix()
+ {
+ return static::randomElement(static::$namePrefix);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/PhoneNumber.php
new file mode 100644
index 00000000..dd0bb4ab
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/mn_MN/PhoneNumber.php
@@ -0,0 +1,13 @@
+ Townships
+ * @link https://en.wikipedia.org/wiki/Template:Johor > Townships
+ * @link https://en.wikipedia.org/wiki/Template:Kedah > Townships
+ * @link https://en.wikipedia.org/wiki/Template:Kelantan > Townships
+ * @link https://en.wikipedia.org/wiki/Template:Melaka > Townships
+ * @link https://en.wikipedia.org/wiki/Template:Negeri_Sembilan > Townships
+ * @link https://en.wikipedia.org/wiki/Template:Perak > Townships
+ * @link https://en.wikipedia.org/wiki/Template:Penang > Townships
+ * @link https://en.wikipedia.org/wiki/Template:Selangor > Townships
+ * @link https://en.wikipedia.org/wiki/Template:Terengganu > Townships
+ */
+ protected static $townshipPrefix = array(
+ 'Alam','Apartment','Ara',
+ 'Bandar','Bandar','Bandar','Bandar','Bandar','Bandar',
+ 'Bandar Bukit','Bandar Seri','Bandar Sri','Bandar Baru','Batu','Bukit',
+ 'Desa','Damansara',
+ 'Kampung','Kampung Baru','Kampung Baru','Kondominium','Kota',
+ 'Laman','Lembah',
+ 'Medan',
+ 'Pandan','Pangsapuri','Petaling','Puncak',
+ 'Seri','Sri',
+ 'Taman','Taman','Taman','Taman','Taman','Taman',
+ 'Taman Desa',
+ );
+ protected static $townshipSuffix = array(
+ 'Aman','Amanjaya','Anggerik','Angkasa','Antarabangsa','Awan',
+ 'Bahagia','Bangsar','Baru','Belakong','Bendahara','Bestari','Bintang','Brickfields',
+ 'Casa','Changkat','Country Heights',
+ 'Damansara','Damai','Dato Harun','Delima','Duta',
+ 'Flora',
+ 'Gembira','Genting',
+ 'Harmoni','Hartamas',
+ 'Impian','Indah','Intan',
+ 'Jasa','Jaya',
+ 'Keramat','Kerinchi','Kiara','Kinrara','Kuchai',
+ 'Laksamana',
+ 'Mahkota','Maluri','Manggis','Maxwell','Medan','Melawati','Menjalara','Meru','Mulia','Mutiara',
+ 'Pahlawan','Perdana','Pertama','Permai','Pelangi','Petaling','Pinang','Puchong','Puteri','Putra',
+ 'Rahman','Rahmat','Raya','Razak','Ria',
+ 'Saujana','Segambut','Selamat','Selatan','Semarak','Sentosa','Seputeh','Setapak','Setia Jaya','Sinar','Sungai Besi','Sungai Buaya','Sungai Long','Suria',
+ 'Tasik Puteri','Tengah','Timur','Tinggi','Tropika','Tun Hussein Onn','Tun Perak','Tunku',
+ 'Ulu','Utama','Utara',
+ 'Wangi',
+ );
+
+ /**
+ * @link https://en.wikipedia.org/wiki/Template:Greater_Kuala_Lumpur
+ * @link https://en.wikipedia.org/wiki/Template:Johor
+ * @link https://en.wikipedia.org/wiki/Template:Kedah
+ * @link https://en.wikipedia.org/wiki/Template:Kelantan
+ * @link https://en.wikipedia.org/wiki/Template:Labuan
+ * @link https://en.wikipedia.org/wiki/Template:Melaka
+ * @link https://en.wikipedia.org/wiki/Template:Negeri_Sembilan
+ * @link https://en.wikipedia.org/wiki/Template:Pahang
+ * @link https://en.wikipedia.org/wiki/Template:Perak
+ * @link https://en.wikipedia.org/wiki/Template:Perlis
+ * @link https://en.wikipedia.org/wiki/Template:Penang
+ * @link https://en.wikipedia.org/wiki/Template:Sabah
+ * @link https://en.wikipedia.org/wiki/Template:Sarawak
+ * @link https://en.wikipedia.org/wiki/Template:Selangor
+ * @link https://en.wikipedia.org/wiki/Template:Terengganu
+ */
+ protected static $towns = array(
+ 'johor' => array(
+ 'Ayer Hitam',
+ 'Batu Pahat','Bukit Gambir','Bukit Kepong','Bukit Naning',
+ 'Desaru',
+ 'Endau',
+ 'Gelang Patah','Gemas Baharu',
+ 'Iskandar Puteri',
+ 'Jementah','Johor Lama','Johor Bahru',
+ 'Kempas','Kluang','Kota Iskandar','Kota Tinggi','Kukup','Kulai',
+ 'Labis ','Larkin','Layang-Layang',
+ 'Mersing','Muar',
+ 'Pagoh','Paloh','Parit Jawa','Pasir Gudang','Pekan Nanas','Permas Jaya','Pontian Kechil',
+ 'Renggam',
+ 'Segamat','Senai','Simpang Renggam','Skudai','Sri Gading',
+ 'Tangkak','Tebrau',
+ 'Ulu Tiram',
+ 'Yong Peng',
+ ),
+ 'kedah' => array(
+ 'Alor Setar',
+ 'Baling','Bukit Kayu Hitam',
+ 'Changlun',
+ 'Durian Burung',
+ 'Gurun',
+ 'Jitra',
+ 'Kepala Batas','Kuah','Kuala Kedah','Kuala Ketil','Kulim',
+ 'Langgar','Lunas',
+ 'Merbok',
+ 'Padang Serai','Pendang',
+ 'Serdang','Sintok','Sungai Petani',
+ 'Tawar, Baling',
+ 'Yan',
+ ),
+ 'kelantan' => array(
+ 'Bachok','Bunut Payong',
+ 'Dabong',
+ 'Gua Musang',
+ 'Jeli',
+ 'Ketereh','Kota Bharu','Kuala Krai',
+ 'Lojing',
+ 'Machang',
+ 'Pasir Mas','Pasir Puteh',
+ 'Rantau Panjang',
+ 'Salor',
+ 'Tok Bali',
+ 'Wakaf Bharu','Wakaf Che Yeh',
+ ),
+ 'kl' => array(
+ 'Ampang',
+ 'Bandar Tasik Selatan','Bandar Tun Razak','Bangsar','Batu','Brickfields','Bukit Bintang','Bukit Jalil','Bukit Tunku',
+ 'Cheras','Chow Kit',
+ 'Damansara Town Centre','Dang Wangi','Desa Petaling','Desa Tun Hussein Onn',
+ 'Jinjang',
+ 'Kampung Baru','Kampung Kasipillay','Kampung Pandan','Kampung Sungai Penchala','Kepong','KLCC','Kuchai Lama',
+ 'Lake Gardens','Lembah Pantai',
+ 'Medan Tuanku','Mid Valley City','Mont Kiara',
+ 'Pantai Dalam','Pudu',
+ 'Salak South','Segambut','Semarak','Sentul','Setapak','Setiawangsa','Seputeh','Sri Hartamas','Sri Petaling','Sungai Besi',
+ 'Taman Desa','Taman Melawati','Taman OUG','Taman Tun Dr Ismail','Taman U-Thant','Taman Wahyu','Titiwangsa','Tun Razak Exchange',
+ 'Wangsa Maju',
+ ),
+ 'labuan' => array(
+ 'Batu Manikar',
+ 'Kiamsam',
+ 'Layang-Layang',
+ 'Rancha-Rancha'
+ ),
+ 'melaka' => array(
+ 'Alor Gajah',
+ 'Bandaraya Melaka','Batu Berendam','Bukit Beruang','Bukit Katil',
+ 'Cheng',
+ 'Durian Tunggal',
+ 'Hang Tuah Jaya',
+ 'Jasin',
+ 'Klebang',
+ 'Lubuk China',
+ 'Masjid Tanah',
+ 'Naning',
+ 'Pekan Asahan',
+ 'Ramuan China',
+ 'Simpang Ampat',
+ 'Tanjung Bidara','Telok Mas',
+ 'Umbai',
+ ),
+ 'nsembilan' => array(
+ 'Ayer Kuning','Ampangan',
+ 'Bahau','Batang Benar',
+ 'Chembong',
+ 'Dangi',
+ 'Gemas',
+ 'Juasseh',
+ 'Kuala Pilah',
+ 'Labu','Lenggeng','Linggi',
+ 'Mantin',
+ 'Nilai',
+ 'Pajam','Pedas','Pengkalan Kempas','Port Dickson',
+ 'Rantau','Rompin',
+ 'Senawang','Seremban','Sungai Gadut',
+ 'Tampin','Tiroi',
+ ),
+ 'pahang' => array(
+ 'Bandar Tun Razak','Bentong','Brinchang','Bukit Fraser','Bukit Tinggi',
+ 'Chendor',
+ 'Gambang','Genting Highlands','Genting Sempah',
+ 'Jerantut',
+ 'Karak','Kemayan','Kota Shahbandar','Kuala Lipis','Kuala Pahang','Kuala Rompin','Kuantan',
+ 'Lanchang','Lubuk Paku',
+ 'Maran','Mengkuang','Mentakab',
+ 'Nenasi',
+ 'Panching',
+ 'Pekan','Penor',
+ 'Raub',
+ 'Sebertak','Sungai Lembing',
+ 'Tanah Rata','Tanjung Sepat','Tasik Chini','Temerloh','Teriang','Tringkap',
+ ),
+ 'penang' => array(
+ 'Air Itam',
+ 'Balik Pulau','Batu Ferringhi','Batu Kawan','Bayan Lepas','Bukit Mertajam','Butterworth',
+ 'Gelugor','George Town',
+ 'Jelutong',
+ 'Kepala Batas',
+ 'Nibong Tebal',
+ 'Permatang Pauh','Pulau Tikus',
+ 'Simpang Ampat',
+ 'Tanjung Bungah','Tanjung Tokong',
+ ),
+ 'perak' => array(
+ 'Ayer Tawar',
+ 'Bagan Serai','Batu Gajah','Behrang','Bidor','Bukit Gantang','Bukit Merah',
+ 'Changkat Jering','Chemor','Chenderiang',
+ 'Damar Laut',
+ 'Gerik','Gopeng','Gua Tempurung',
+ 'Hutan Melintang',
+ 'Ipoh',
+ 'Jelapang',
+ 'Kamunting','Kampar','Kuala Kangsar',
+ 'Lekir','Lenggong','Lumut',
+ 'Malim Nawar','Manong','Menglembu',
+ 'Pantai Remis','Parit','Parit Buntar','Pasir Salak','Proton City',
+ 'Simpang Pulai','Sitiawan','Slim River','Sungai Siput','Sungkai',
+ 'Taiping','Tambun','Tanjung Malim','Tanjung Rambutan','Tapah','Teluk Intan',
+ 'Ulu Bernam',
+ ),
+ 'perlis' => array(
+ 'Arau',
+ 'Beseri',
+ 'Chuping',
+ 'Kaki Bukit','Kangar','Kuala Perlis',
+ 'Mata Ayer',
+ 'Padang Besar',
+ 'Sanglang','Simpang Empat',
+ 'Wang Kelian',
+ ),
+ 'putrajaya' => array(
+ 'Precinct 1','Precinct 4','Precinct 5',
+ 'Precinct 6','Precinct 8','Precinct 10',
+ 'Precinct 11','Precinct 12','Precinct 13',
+ 'Precinct 16','Precinct 18','Precinct 19',
+ ),
+ 'sabah' => array(
+ 'Beaufort','Bingkor',
+ 'Donggongon',
+ 'Inanam',
+ 'Kinabatangan','Kota Belud','Kota Kinabalu','Kuala Penyu','Kimanis','Kundasang',
+ 'Lahad Datu','Likas','Lok Kawi',
+ 'Manggatal',
+ 'Nabawan',
+ 'Papar','Pitas',
+ 'Ranau',
+ 'Sandakan','Sapulut','Semporna','Sepanggar',
+ 'Tambunan','Tanjung Aru','Tawau','Tenom','Tuaran',
+ 'Weston',
+ ),
+ 'sarawak' => array(
+ 'Asajaya',
+ 'Ba\'kelalan','Bario','Batu Kawa','Batu Niah','Betong','Bintulu',
+ 'Dalat','Daro',
+ 'Engkilili',
+ 'Julau',
+ 'Kapit','Kota Samarahan','Kuching',
+ 'Lawas','Limbang','Lubok Antu',
+ 'Marudi','Matu','Miri',
+ 'Oya',
+ 'Pakan',
+ 'Sadong Jaya','Sematan','Sibu','Siburan','Song','Sri Aman','Sungai Tujoh',
+ 'Tanjung Kidurong','Tanjung Manis','Tatau',
+ ),
+ 'selangor' => array(
+ 'Ampang','Assam Jawa',
+ 'Balakong','Bandar Baru Bangi','Bandar Baru Selayang','Bandar Sunway','Bangi','Banting','Batang Kali','Batu Caves','Bestari Jaya','Bukit Lanjan',
+ 'Cheras','Cyberjaya',
+ 'Damansara','Dengkil',
+ 'Ijok',
+ 'Jenjarom',
+ 'Kajang','Kelana Jaya','Klang','Kuala Kubu Bharu','Kuala Selangor','Kuang',
+ 'Lagong',
+ 'Morib',
+ 'Pandamaran','Paya Jaras','Petaling Jaya','Port Klang','Puchong',
+ 'Rasa','Rawang',
+ 'Salak Tinggi','Sekinchan','Selayang','Semenyih','Sepang','Serendah','Seri Kembangan','Shah Alam','Subang','Subang Jaya','Sungai Buloh',
+ 'Tanjung Karang','Tanjung Sepat',
+ 'Ulu Klang','Ulu Yam',
+ ),
+ 'terengganu' => array(
+ 'Ajil',
+ 'Bandar Ketengah Jaya','Bandar Permaisuri','Bukit Besi','Bukit Payong',
+ 'Chukai',
+ 'Jerteh',
+ 'Kampung Raja','Kerteh','Kijal','Kuala Besut','Kuala Berang','Kuala Dungun','Kuala Terengganu',
+ 'Marang','Merchang',
+ 'Pasir Raja',
+ 'Rantau Abang',
+ 'Teluk Kalung',
+ 'Wakaf Tapai',
+ )
+ );
+
+ /**
+ * @link https://en.wikipedia.org/wiki/States_and_federal_territories_of_Malaysia
+ */
+ protected static $states = array(
+ 'johor' => array(
+ 'Johor Darul Ta\'zim',
+ 'Johor'
+ ),
+ 'kedah' => array(
+ 'Kedah Darul Aman',
+ 'Kedah'
+ ),
+ 'kelantan' => array(
+ 'Kelantan Darul Naim',
+ 'Kelantan'
+ ),
+ 'kl' => array(
+ 'KL',
+ 'Kuala Lumpur',
+ 'WP Kuala Lumpur'
+ ),
+ 'labuan' => array(
+ 'Labuan'
+ ),
+ 'melaka' => array(
+ 'Malacca',
+ 'Melaka'
+ ),
+ 'nsembilan' => array(
+ 'Negeri Sembilan Darul Khusus',
+ 'Negeri Sembilan'
+ ),
+ 'pahang' => array(
+ 'Pahang Darul Makmur',
+ 'Pahang'
+ ),
+ 'penang' => array(
+ 'Penang',
+ 'Pulau Pinang'
+ ),
+ 'perak' => array(
+ 'Perak Darul Ridzuan',
+ 'Perak'
+ ),
+ 'perlis' => array(
+ 'Perlis Indera Kayangan',
+ 'Perlis'
+ ),
+ 'putrajaya' => array(
+ 'Putrajaya'
+ ),
+ 'sabah' => array(
+ 'Sabah'
+ ),
+ 'sarawak' => array(
+ 'Sarawak'
+ ),
+ 'selangor' => array(
+ 'Selangor Darul Ehsan',
+ 'Selangor'
+ ),
+ 'terengganu' => array(
+ 'Terengganu Darul Iman',
+ 'Terengganu'
+ )
+ );
+
+ /**
+ * @link https://ms.wikipedia.org/wiki/Senarai_negara_berdaulat
+ */
+ protected static $country = array(
+ 'Abkhazia','Afghanistan','Afrika Selatan','Republik Afrika Tengah','Akrotiri dan Dhekelia','Albania','Algeria','Amerika Syarikat','Andorra','Angola','Antigua dan Barbuda','Arab Saudi','Argentina','Armenia','Australia','Austria','Azerbaijan',
+ 'Bahamas','Bahrain','Bangladesh','Barbados','Belanda','Belarus','Belgium','Belize','Benin','Bhutan','Bolivia','Bonaire','Bosnia dan Herzegovina','Botswana','Brazil','Brunei Darussalam','Bulgaria','Burkina Faso','Burundi',
+ 'Cameroon','Chad','Chile','Republik Rakyat China','Republik China di Taiwan','Colombia','Comoros','Republik Demokratik Congo','Republik Congo','Kepulauan Cook','Costa Rica','Côte d\'Ivoire (Ivory Coast)','Croatia','Cuba','Curaçao','Cyprus','Republik Turki Cyprus Utara','Republik Czech',
+ 'Denmark','Djibouti','Dominika','Republik Dominika',
+ 'Ecuador','El Salvador','Emiriah Arab Bersatu','Eritrea','Estonia',
+ 'Kepulauan Faroe','Fiji','Filipina','Finland',
+ 'Gabon','Gambia','Georgia','Ghana','Grenada','Greece (Yunani)','Guatemala','Guinea','Guinea-Bissau','Guinea Khatulistiwa','Guiana Perancis','Guyana',
+ 'Habsyah (Etiopia)','Haiti','Honduras','Hungary',
+ 'Iceland','India','Indonesia','Iran','Iraq','Ireland','Israel','Itali',
+ 'Jamaika','Jepun','Jerman','Jordan',
+ 'Kanada','Kazakhstan','Kemboja','Kenya','Kiribati','Korea Selatan','Korea Utara','Kosovo','Kuwait','Kyrgyzstan',
+ 'Laos','Latvia','Lesotho','Liberia','Libya','Liechtenstein','Lithuania','Lubnan','Luxembourg',
+ 'Macedonia','Madagaskar','Maghribi','Malawi','Malaysia','Maldives','Mali','Malta','Kepulauan Marshall','Mauritania','Mauritius','Mesir','Mexico','Persekutuan Micronesia','Moldova','Monaco','Montenegro','Mongolia','Mozambique','Myanmar',
+ 'Namibia','Nauru','Nepal','New Zealand','Nicaragua','Niger','Nigeria','Niue','Norway',
+ 'Oman','Ossetia Selatan',
+ 'Pakistan','Palau','Palestin','Panama','Papua New Guinea','Paraguay','Perancis','Peru','Poland','Portugal',
+ 'Qatar',
+ 'Romania','Russia','Rwanda',
+ 'Sahara Barat','Saint Kitts dan Nevis','Saint Lucia','Saint Vincent dan Grenadines','Samoa','San Marino','São Tomé dan Príncipe','Scotland','Senegal','Sepanyol','Serbia','Seychelles','Sierra Leone','Singapura','Slovakia','Slovenia','Kepulauan Solomon','Somalia','Somaliland','Sri Lanka','Sudan','Sudan Selatan','Suriname','Swaziland','Sweden','Switzerland','Syria',
+ 'Tajikistan','Tanjung Verde','Tanzania','Thailand','Timor Leste','Togo','Tonga','Transnistria','Trinidad dan Tobago','Tunisia','Turki','Turkmenistan','Tuvalu',
+ 'Uganda','Ukraine','United Kingdom','Uruguay','Uzbekistan',
+ 'Vanuatu','Kota Vatican','Venezuela','Vietnam',
+ 'Yaman',
+ 'Zambia','Zimbabwe',
+ );
+
+ /**
+ * Return a building prefix
+ *
+ * @example 'No.'
+ *
+ * @return @string
+ */
+ public static function buildingPrefix()
+ {
+ return static::randomElement(static::$buildingPrefix);
+ }
+
+ /**
+ * Return a building number
+ *
+ * @example '123'
+ *
+ * @return @string
+ */
+ public static function buildingNumber()
+ {
+ return static::toUpper(static::lexify(static::numerify(static::randomElement(static::$buildingNumber))));
+ }
+
+ /**
+ * Return a street prefix
+ *
+ * @example 'Jalan'
+ */
+ public function streetPrefix()
+ {
+ $format = static::randomElement(static::$streetPrefix);
+
+ return $this->generator->parse($format);
+ }
+
+ /**
+ * Return a complete streename
+ *
+ * @example 'Jalan Utama 7'
+ *
+ * @return @string
+ */
+ public function streetName()
+ {
+ $format = static::toUpper(static::lexify(static::numerify(static::randomElement(static::$streetNameFormats))));
+
+ return $this->generator->parse($format);
+ }
+
+ /**
+ * Return a randown township
+ *
+ * @example Taman Bahagia
+ *
+ * @return @string
+ */
+ public function township()
+ {
+ $format = static::toUpper(static::lexify(static::numerify(static::randomElement(static::$townshipFormats))));
+
+ return $this->generator->parse($format);
+ }
+
+ /**
+ * Return a township prefix abbreviation
+ *
+ * @example 'USJ'
+ *
+ * @return @string
+ */
+ public function townshipPrefixAbbr()
+ {
+ return static::randomElement(static::$townshipPrefixAbbr);
+ }
+
+ /**
+ * Return a township prefix
+ *
+ * @example 'Taman'
+ *
+ * @return @string
+ */
+ public function townshipPrefix()
+ {
+ return static::randomElement(static::$townshipPrefix);
+ }
+
+ /**
+ * Return a township suffix
+ *
+ * @example 'Bahagia'
+ */
+ public function townshipSuffix()
+ {
+ return static::randomElement(static::$townshipSuffix);
+ }
+
+ /**
+ * Return a postcode based on state
+ *
+ * @example '55100'
+ * @link https://en.wikipedia.org/wiki/Postal_codes_in_Malaysia#States
+ *
+ * @param null|string $state 'state' or null
+ *
+ * @return @string
+ */
+ public static function postcode($state = null)
+ {
+ $format = array(
+ 'perlis' => array( // (01000 - 02800)
+ '0' . mt_rand(1000, 2800)
+ ),
+ 'kedah' => array( // (05000 - 09810)
+ '0' . mt_rand(5000, 9810)
+ ),
+ 'penang' => array( // (10000 - 14400)
+ mt_rand(10000, 14400)
+ ),
+ 'kelantan' => array( // (15000 - 18500)
+ mt_rand(15000, 18500)
+ ),
+ 'terengganu' => array( // (20000 - 24300)
+ mt_rand(20000, 24300)
+ ),
+ 'pahang' => array( // (25000 - 28800 | 39000 - 39200 | 49000, 69000)
+ mt_rand(25000, 28800),
+ mt_rand(39000, 39200),
+ mt_rand(49000, 69000)
+ ),
+ 'perak' => array( // (30000 - 36810)
+ mt_rand(30000, 36810)
+ ),
+ 'selangor' => array( // (40000 - 48300 | 63000 - 68100)
+ mt_rand(40000, 48300),
+ mt_rand(63000, 68100)
+ ),
+ 'kl' => array( // (50000 - 60000)
+ mt_rand(50000, 60000),
+ ),
+ 'putrajaya' => array( // (62000 - 62988)
+ mt_rand(62000, 62988)
+ ),
+ 'nsembilan' => array( // (70000 - 73509)
+ mt_rand(70000, 73509)
+ ),
+ 'melaka' => array( // (75000 - 78309)
+ mt_rand(75000, 78309)
+ ),
+ 'johor' => array( // (79000 - 86900)
+ mt_rand(79000, 86900)
+ ),
+ 'labuan' => array( // (87000 - 87033)
+ mt_rand(87000, 87033)
+ ),
+ 'sabah' => array( // (88000 - 91309)
+ mt_rand(88000, 91309)
+ ),
+ 'sarawak' => array( // (93000 - 98859)
+ mt_rand(93000, 98859)
+ )
+ );
+
+ $postcode = is_null($state) ? static::randomElement($format) : $format[$state];
+ return (string)static::randomElement($postcode);
+ }
+
+ /**
+ * Return the complete town address with matching postcode and state
+ *
+ * @example 55100 Bukit Bintang, Kuala Lumpur
+ *
+ * @return @string
+ */
+ public function townState()
+ {
+ $state = static::randomElement(array_keys(static::$states));
+ $postcode = static::postcode($state);
+ $town = static::randomElement(static::$towns[$state]);
+ $state = static::randomElement(static::$states[$state]);
+
+ return $postcode . ' ' . $town . ', ' . $state;
+ }
+
+ /**
+ * Return a random city (town)
+ *
+ * @example 'Ampang'
+ *
+ * @return @string
+ */
+ public function city()
+ {
+ $state = static::randomElement(array_keys(static::$towns));
+ return static::randomElement(static::$towns[$state]);
+ }
+
+ /**
+ * Return a random state
+ *
+ * @example 'Johor'
+ *
+ * @return @string
+ */
+ public function state()
+ {
+ $state = static::randomElement(array_keys(static::$states));
+ return static::randomElement(static::$states[$state]);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Company.php
new file mode 100644
index 00000000..0e681330
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Company.php
@@ -0,0 +1,105 @@
+generator->parse($formats);
+ }
+
+ /**
+ * Return Peninsular prefix alphabet
+ *
+ * @example 'W'
+ *
+ * @return @string
+ */
+ public static function peninsularPrefix()
+ {
+ return static::randomElement(static::$peninsularPrefix);
+ }
+
+ /**
+ * Return Sarawak state prefix alphabet
+ *
+ * @example 'QA'
+ *
+ * @return @string
+ */
+ public static function sarawakPrefix()
+ {
+ return static::randomElement(static::$sarawakPrefix);
+ }
+
+ /**
+ * Return Sabah state prefix alphabet
+ *
+ * @example 'SA'
+ *
+ * @return @string
+ */
+ public static function sabahPrefix()
+ {
+ return static::randomElement(static::$sabahPrefix);
+ }
+
+ /**
+ * Return specialty licence plate prefix
+ *
+ * @example 'G1M'
+ *
+ * @return @string
+ */
+ public static function specialPrefix()
+ {
+ return static::randomElement(static::$specialPrefix);
+ }
+
+ /**
+ * Return a valid license plate alphabet
+ *
+ * @example 'A'
+ *
+ * @return @string
+ */
+ public static function validAlphabet()
+ {
+ return static::randomElement(static::$validAlphabets);
+ }
+
+ /**
+ * Return a valid number sequence between 1 and 9999
+ *
+ * @example '1234'
+ *
+ * @return @integer
+ */
+ public static function numberSequence()
+ {
+ return mt_rand(1, 9999);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Payment.php
new file mode 100644
index 00000000..4a46af16
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Payment.php
@@ -0,0 +1,244 @@
+generator->parse($formats);
+ }
+
+ /**
+ * Return a Malaysian Bank account number
+ *
+ * @example '1234567890123456'
+ *
+ * @return @string
+ */
+ public function bankAccountNumber()
+ {
+ $formats = static::randomElement(static::$bankAccountNumberFormats);
+
+ return static::numerify($formats);
+ }
+
+ /**
+ * Return a Malaysian Local Bank
+ *
+ * @example 'Public Bank'
+ *
+ * @return @string
+ */
+ public static function localBank()
+ {
+ return static::randomElement(static::$localBanks);
+ }
+
+ /**
+ * Return a Malaysian Foreign Bank
+ *
+ * @example 'Citibank Berhad'
+ *
+ * @return @string
+ */
+ public static function foreignBank()
+ {
+ return static::randomElement(static::$foreignBanks);
+ }
+
+ /**
+ * Return a Malaysian Government Bank
+ *
+ * @example 'Bank Simpanan Nasional'
+ *
+ * @return @string
+ */
+ public static function governmentBank()
+ {
+ return static::randomElement(static::$governmentBanks);
+ }
+
+ /**
+ * Return a Malaysian insurance company
+ *
+ * @example 'AIA Malaysia'
+ *
+ * @return @string
+ */
+ public static function insurance()
+ {
+ return static::randomElement(static::$insuranceCompanies);
+ }
+
+ /**
+ * Return a Malaysian Bank SWIFT Code
+ *
+ * @example 'MBBEMYKLXXX'
+ *
+ * @return @string
+ */
+ public static function swiftCode()
+ {
+ return static::toUpper(static::lexify(static::randomElement(static::$swiftCodes)));
+ }
+
+ /**
+ * Return the Malaysian currency symbol
+ *
+ * @example 'RM'
+ *
+ * @return @string
+ */
+ public static function currencySymbol()
+ {
+ return static::randomElement(static::$currencySymbol);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Person.php
new file mode 100644
index 00000000..28d1092a
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/Person.php
@@ -0,0 +1,813 @@
+generator->parse(static::randomElement($formats));
+ }
+
+ /**
+ * Return a Malaysian I.C. No.
+ *
+ * @example '890123-45-6789'
+ *
+ * @link https://en.wikipedia.org/wiki/Malaysian_identity_card#Structure_of_the_National_Registration_Identity_Card_Number_(NRIC)
+ *
+ * @param string|null $gender 'male', 'female' or null for any
+ * @param bool|string|null $hyphen true, false, or any separator characters
+ *
+ * @return string
+ */
+ public static function myKadNumber($gender = null, $hyphen = false)
+ {
+ // year of birth
+ $yy = mt_rand(0, 99);
+
+ // month of birth
+ $mm = DateTime::month();
+
+ // day of birth
+ $dd = DateTime::dayOfMonth();
+
+ // place of birth (1-59 except 17-20)
+ while (in_array($pb = mt_rand(1, 59), array(17, 18, 19, 20))) {
+ }
+
+ // random number
+ $nnn = mt_rand(0, 999);
+
+ // gender digit. Odd = MALE, Even = FEMALE
+ $g = mt_rand(0, 9);
+ //Credit: https://gist.github.com/mauris/3629548
+ if ($gender === static::GENDER_MALE) {
+ $g = $g | 1;
+ } elseif ($gender === static::GENDER_FEMALE) {
+ $g = $g & ~1;
+ }
+
+ // formatting with hyphen
+ if ($hyphen === true) {
+ $hyphen = "-";
+ } elseif ($hyphen === false) {
+ $hyphen = "";
+ }
+
+ return sprintf("%02d%02d%02d%s%02d%s%03d%01d", $yy, $mm, $dd, $hyphen, $pb, $hyphen, $nnn, $g);
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/PhoneNumber.php
new file mode 100644
index 00000000..f89111d9
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ms_MY/PhoneNumber.php
@@ -0,0 +1,217 @@
+generator->parse($format));
+ } else {
+ return static::numerify($this->generator->parse($format));
+ }
+ }
+
+ /**
+ * Return prefix digits for 011 numbers
+ *
+ * @example '10'
+ *
+ * @return string
+ */
+ public static function zeroOneOnePrefix()
+ {
+ return static::numerify(static::randomElement(static::$zeroOneOnePrefix));
+ }
+
+ /**
+ * Return prefix digits for 014 numbers
+ *
+ * @example '2'
+ *
+ * @return string
+ */
+ public static function zeroOneFourPrefix()
+ {
+ return static::numerify(static::randomElement(static::$zeroOneFourPrefix));
+ }
+
+ /**
+ * Return prefix digits for 015 numbers
+ *
+ * @example '1'
+ *
+ * @return string
+ */
+ public static function zeroOneFivePrefix()
+ {
+ return static::numerify(static::randomElement(static::$zeroOneFivePrefix));
+ }
+
+ /**
+ * Return a Malaysian Fixed Line Phone Number.
+ *
+ * @example '+603-4567-8912'
+ *
+ * @param bool $countryCodePrefix true, false
+ * @param bool $formatting true, false
+ *
+ * @return string
+ */
+ public function fixedLineNumber($countryCodePrefix = true, $formatting = true)
+ {
+ if ($formatting) {
+ $format = static::randomElement(static::$fixedLineNumberFormatsWithFormatting);
+ } else {
+ $format = static::randomElement(static::$fixedLineNumberFormats);
+ }
+
+ if ($countryCodePrefix) {
+ return static::countryCodePrefix($formatting) . static::numerify($this->generator->parse($format));
+ } else {
+ return static::numerify($this->generator->parse($format));
+ }
+ }
+
+ /**
+ * Return a Malaysian VoIP Phone Number.
+ *
+ * @example '+6015-678-9234'
+ *
+ * @param bool $countryCodePrefix true, false
+ * @param bool $formatting true, false
+ *
+ * @return string
+ */
+ public function voipNumber($countryCodePrefix = true, $formatting = true)
+ {
+ if ($formatting) {
+ $format = static::randomElement(static::$voipNumberWithFormatting);
+ } else {
+ $format = static::randomElement(static::$voipNumber);
+ }
+
+ if ($countryCodePrefix) {
+ return static::countryCodePrefix($formatting) . static::numerify($this->generator->parse($format));
+ } else {
+ return static::numerify($this->generator->parse($format));
+ }
+ }
+
+ /**
+ * Return a Malaysian Country Code Prefix.
+ *
+ * @example '+6'
+ *
+ * @param bool $formatting true, false
+ *
+ * @return string
+ */
+ public static function countryCodePrefix($formatting = true)
+ {
+ if ($formatting) {
+ return static::randomElement(static::$plusSymbol) . static::randomElement(static::$countryCodePrefix);
+ } else {
+ return static::randomElement(static::$countryCodePrefix);
+ }
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/no_NO/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/Address.php
similarity index 99%
rename from vendor/fzaninotto/faker/src/Faker/Provider/no_NO/Address.php
rename to vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/Address.php
index 845afc17..d1d8c9e4 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/no_NO/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/Address.php
@@ -1,6 +1,6 @@
format('dmy');
-
+
/**
* @todo These number should be random based on birth year
* @link http://no.wikipedia.org/wiki/F%C3%B8dselsnummer
*/
$randomDigits = (string)static::numerify('##');
-
- switch($gender) {
+
+ switch ($gender) {
case static::GENDER_MALE:
$genderDigit = static::randomElement(array(1,3,5,7,9));
break;
@@ -310,16 +310,16 @@ class Person extends \Faker\Provider\Person
default:
$genderDigit = (string)static::numerify('#');
}
-
-
+
+
$digits = $datePart.$randomDigits.$genderDigit;
-
+
/**
* @todo Calculate modulo 11 of $digits
* @link http://no.wikipedia.org/wiki/F%C3%B8dselsnummer
*/
$checksum = (string)static::numerify('##');
-
+
return $digits.$checksum;
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/PhoneNumber.php
new file mode 100644
index 00000000..c97e720a
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/nb_NO/PhoneNumber.php
@@ -0,0 +1,41 @@
+generator->parse($format));
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php
index 7f69a5bc..ee81af28 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Address.php
@@ -78,7 +78,7 @@ class Address extends \Faker\Provider\Address
'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar',
'Namibia', 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Mariana Islands', 'Norway',
'Oman',
- 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico',
+ 'Pakistan', 'Palau', 'Palestinian Territories', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico',
'Qatar',
'Reunion', 'Romania', 'Russian Federation', 'Rwanda',
'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia (Slovak Republic)', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Georgia and the South Sandwich Islands', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Sweden', 'Switzerland', 'Syrian Arab Republic',
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php
index 0a88375e..706cd339 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ne_NP/Person.php
@@ -45,11 +45,11 @@ class Person extends \Faker\Provider\Person
'Kabindra', 'Kailash', 'Kalyan', 'Kamal', 'Kamod', 'Kapil', 'Karan', 'Karna', 'Khagendra', 'Kishor', 'Kris', 'Krishna', 'Krisus', 'Kuber',
'Lakshman', 'Lalit', 'Lava', 'Lochan', 'Lokesh',
'Madhav', 'Madhukar', 'Madhur', 'Mandeep', 'Manish', 'Manjul', 'Manoj', 'Milan', 'Mohit', 'Mridul',
- 'Nabin', 'Nakul', 'Narayan', 'Narendra', 'Naresh', 'Neil', 'Nerain', 'Nirajan', 'Nirajan', 'Nirmal', 'Nirupam', 'Nischal', 'Nishad', 'Nishant', 'Nutan',
+ 'Nabin', 'Nakul', 'Narayan', 'Narendra', 'Naresh', 'Neil', 'Nerain', 'Nirajan', 'Nirmal', 'Nirupam', 'Nischal', 'Nishad', 'Nishant', 'Nutan',
'Om',
'Paras', 'Parikshit', 'Parimal', 'Pawan', 'Piyush', 'Prabal', 'Prabesh', 'Prabhat', 'Prabin', 'Prajwal', 'Prakash', 'Pramesh', 'Pramod', 'Pranaya', 'Pranil', 'Prasanna', 'Prashant', 'Prasun', 'Pratap', 'Pratik', 'Prayag', 'Prianshu', 'Prithivi', 'Purna', 'Pushkar',
'Raghab', 'Rahul', 'Rajan', 'Rajesh', 'Rakesh', 'Ramesh', 'Ranjan', 'Ranjit', 'Ricky', 'Rijan', 'Rishab', 'Rishikesh', 'Rohan', 'Rohit', 'Roshan',
- 'Sabin', 'Sachit', 'Safal', 'Sahaj', 'Sahan', 'Sajal', 'Sakar', 'Samir', 'Sanchit', 'Sandesh', 'Sanjay', 'Sanjeev', 'Sankalpa', 'Santosh', 'Sarad', 'Saroj', 'Sashi', 'Saumya', 'Sevak', 'Shailesh', 'Shakti', 'Shamundra', 'Shantanu', 'Shashank', 'Shashwat', 'Shekar', 'Shyam', 'Siddhartha', 'Sitaram', 'Sohan', 'Sohil', 'Soviet', 'Spandan', 'Subal', 'Subham', 'Subodh', 'Sudan', 'Sudhir', 'Sudin', 'Sudip', 'Sujan', 'Sujit', 'Sukanta', 'Sumel', 'Sunil', 'Suraj', 'Suraj', 'Surendra', 'Surya', 'Sushant', 'Sushil', 'Suyash', 'Suyog', 'Swagat', 'Swapnil', 'Swarup',
+ 'Sabin', 'Sachit', 'Safal', 'Sahaj', 'Sahan', 'Sajal', 'Sakar', 'Samir', 'Sanchit', 'Sandesh', 'Sanjay', 'Sanjeev', 'Sankalpa', 'Santosh', 'Sarad', 'Saroj', 'Sashi', 'Saumya', 'Sevak', 'Shailesh', 'Shakti', 'Shamundra', 'Shantanu', 'Shashank', 'Shashwat', 'Shekar', 'Shyam', 'Siddhartha', 'Sitaram', 'Sohan', 'Sohil', 'Soviet', 'Spandan', 'Subal', 'Subham', 'Subodh', 'Sudan', 'Sudhir', 'Sudin', 'Sudip', 'Sujan', 'Sujit', 'Sukanta', 'Sumel', 'Sunil', 'Suraj', 'Surendra', 'Surya', 'Sushant', 'Sushil', 'Suyash', 'Suyog', 'Swagat', 'Swapnil', 'Swarup',
'Tej', 'Tilak', 'Tirtha', 'Trailokya', 'Trilochan',
'Udit', 'Ujjwal', 'Umesh', 'Uttam',
'Yogendra', 'Yogesh', 'Yuvaraj',
@@ -80,7 +80,7 @@ class Person extends \Faker\Provider\Person
protected static $lastName = array(
'Acharya', 'Adhikari', 'Agarwal', 'Amatya', 'Aryal',
'Baidya', 'Bajracharya', 'Balami', 'Banepali', 'Baniya', 'Banjade', 'Baral', 'Basnet', 'Bastakoti', 'Bastola', 'Basyal', 'Belbase', 'Bhandari', 'Bhatta', 'Bhattarai', 'Bhusal', 'Bijukchhe', 'Bisht', 'Bohara', 'Budathoki', 'Byanjankar',
- 'Chalise', 'Chamling', 'Chapagain', 'Chaudhary', 'Chhetri', 'Chhetri',
+ 'Chalise', 'Chamling', 'Chapagain', 'Chaudhary', 'Chhetri',
'Dahal', 'Dangol', 'Dawadi', 'Devkota', 'Dhakal', 'Dhamla', 'Dhaubhadel', 'Dhungel',
'Gauchan', 'Gautam', 'Ghale', 'Ghimire', 'Giri', 'Golchha', 'Gurung', 'Gyalzen', 'Gyawali',
'Hamal', 'Himanshu', 'Humagain',
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Address.php
index 8b699644..d0f6d362 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Address.php
@@ -4,7 +4,20 @@ namespace Faker\Provider\nl_BE;
class Address extends \Faker\Provider\Address
{
- protected static $postcode = array('####');
+ protected static $postcodes = array(
+ '2970', '3700', '7510', '9420', '8511', '3800', '9300', '9880', '3200', '8700', '8211', '2630', '4557',
+ '4280', '3930', '5590', '5362', '4219', '6280', '9991', '8660', '1790', '9051', '5544', '4317', '5310',
+ '6250', '5070', '3570', '5550', '4432', '1652', '8690', '4540', '6680', '6953', '4770', '6997', '7750',
+ '5300', '1070', '6150', '4821', '4031', '7387', '5537', '6721', '6890', '4430', '5500', '5520', '4520',
+ '4160', '7640', '2000', '2018', '2020', '2030', '2040', '2050', '2060', '2099', '7910', '8570', '9200',
+ '9400', '5170', '7811', '4990', '1390', '8850', '2370', '4601', '6700', '7181', '5060', '6870', '3665',
+ '9404', '9890', '7040', '1730', '8310', '1007', '9960', '6860', '3460', '5330', '9800', '7800', '6791',
+ '3404', '3384', '6717', '7941', '6790', '7972', '4880', '5660', '6880', '7382', '6706', '1367', '5580',
+ '8630', '8580', '4260', '3271', '4340', '4400', '6900', '4630', '4920', '3128', '9310', '2387', '4837',
+ '6464', '6460', '5555', '7730', '5377', '7380', '1470', '5190', '9860', '2490', '6951', '6500', '4671',
+ '5570', '7534', '5370', '6940', '7971', '4983', '4690', '9968', '7830', '6600', '3870', '4651', '7130',
+ '7331', '7870', '7604', '1401', '9520', '8531', '9150', '4052', '6980', '1320', '6594', '7532', '3960',
+ );
protected static $streetAddressFormats = array(
'{{streetName}} {{buildingNumber}}'
@@ -88,6 +101,11 @@ class Address extends \Faker\Provider\Address
'Wit-Rusland', 'Zambia', 'Zuid-Afrika', 'Zuid-Georgia en de Zuidelijke Sandwicheilanden', 'Zimbabwe'
);
+ public static function postcode()
+ {
+ return static::randomElement(static::$postcodes);
+ }
+
/**
* @example 'Gelderland'
*/
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php
index d587e675..f8eb2338 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Payment.php
@@ -16,4 +16,24 @@ class Payment extends \Faker\Provider\Payment
{
return static::iban($countryCode, $prefix, $length);
}
+
+ /**
+ * Value Added Tax (VAT)
+ *
+ * @example 'BE0123456789', ('spaced') 'BE 0123456789'
+ *
+ * @see http://ec.europa.eu/taxation_customs/vies/faq.html?locale=en#item_11
+ * @see http://www.iecomputersystems.com/ordering/eu_vat_numbers.htm
+ * @see http://en.wikipedia.org/wiki/VAT_identification_number
+ *
+ * @param bool $spacedNationalPrefix
+ *
+ * @return string VAT Number
+ */
+ public static function vat($spacedNationalPrefix = true)
+ {
+ $prefix = $spacedNationalPrefix ? "BE " : "BE";
+
+ return sprintf("%s0%d", $prefix, self::randomNumber(9, true));
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php
index c9ac865b..bde3bf64 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Person.php
@@ -2,6 +2,8 @@
namespace Faker\Provider\nl_BE;
+use Faker\Provider\DateTime;
+
class Person extends \Faker\Provider\Person
{
protected static $firstNameMale = array(
@@ -69,4 +71,36 @@ class Person extends \Faker\Provider\Person
'Vermeersch', 'Vermeiren', 'Vermeulen', 'Verschueren', 'Verstraete', 'Verstraeten',
'Vervoort', 'Wauters', 'Willems', 'Wouters', 'Wuyts', 'Yildirim', 'Yilmaz'
);
+
+ /**
+ * Belgian Rijksregister numbers are used to identify each citizen,
+ * it consists of three parts, the person's day of birth, in the
+ * format 'ymd', followed by a number between 1 and 997, odd for
+ * males, even for females. The last part is used to check if it's
+ * a valid number.
+ *
+ * @link https://nl.wikipedia.org/wiki/Rijksregisternummer
+ *
+ * @param string|null $gender 'male', 'female' or null for any
+ * @return string
+ */
+ public static function rrn($gender = null)
+ {
+ $middle = self::numberBetween(1, 997);
+ if ($gender === static::GENDER_MALE) {
+ $middle = $middle %2 === 1 ? $middle : $middle+1;
+ } elseif ($gender === static::GENDER_FEMALE) {
+ $middle = $middle %2 === 0 ? $middle : $middle+1;
+ }
+ $middle = sprintf('%03d', $middle);
+
+ $date = DateTime::dateTimeThisCentury();
+ $dob = sprintf('%06d', $date->format('ymd'));
+ $help = $date->format('Y') >= 2000 ? 2 : null;
+
+ $check = intval($help.$dob.$middle);
+ $rest = sprintf('%02d', 97 - ($check % 97));
+
+ return $dob.$middle.$rest;
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Text.php
new file mode 100644
index 00000000..d41104d1
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/nl_BE/Text.php
@@ -0,0 +1,25347 @@
+generator->lastName;
+ break;
+ }
+
+ if (0 !== static::numberBetween(0, 1)) {
+ return $companyName . ' ' . static::randomElement(static::$companySuffix);
+ }
+
+ return $companyName;
+ }
+
+ /**
+ * Belasting Toegevoegde Waarde (BTW) = VAT
+ *
+ * @example 'NL123456789B01'
+ *
+ * @see http://www.belastingdienst.nl/wps/wcm/connect/bldcontentnl/belastingdienst/zakelijk/btw/administratie_bijhouden/btw_nummers_controleren/uw_btw_nummer
+ *
+ * @return string VAT Number
+ */
+ public static function vat()
+ {
+ return sprintf("%s%d%s%d", 'NL', self::randomNumber(9, true), 'B', self::randomNumber(2, true));
+ }
+
+ /**
+ * Alias dutch vat number format
+ *
+ * @return string
+ */
+ public static function btw()
+ {
+ return self::vat();
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php
index 45f6074a..a3d7dc8a 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Person.php
@@ -26,10 +26,26 @@ class Person extends \Faker\Provider\Person
'mr.', 'dr.', 'ir.', 'drs', 'bacc.', 'kand.', 'dr.h.c.', 'prof.', 'ds.', 'ing.', 'bc.'
);
- private static $suffix = array(
+ protected static $suffix = array(
'BA', 'Bsc', 'LLB', 'LLM', 'MA', 'Msc', 'MPhil', 'D', 'PhD', 'AD', 'B', 'M'
);
+ protected static $prefix = array("'s", "'t", 'a', 'aan', "aan 't", 'aan de', 'aan den', 'aan der', 'aan het',
+ "aan t", 'af', 'al', 'am', 'am de', 'auf', 'auf dem', 'auf den', 'auf der', 'auf ter', 'aus', "aus 'm",
+ 'aus dem', 'aus den', 'aus der', 'aus m', 'ben', 'bij', "bij 't", 'bij de', 'bij den', 'bij het', 'bij t',
+ 'bin', 'boven d', "boven d'", 'd', "d'", 'da', 'dal', 'dal’', 'dalla', 'das', 'de', 'de die', 'de die le',
+ 'de l', 'de l’', 'de la', 'de las', 'de le', 'de van der', 'deca', 'degli', 'dei', 'del', 'della', 'den',
+ 'der', 'des', 'di', 'die le', 'do', 'don', 'dos', 'du', 'el', 'het', 'i', 'im', 'in', "in 't", 'in de', 'in den',
+ 'in der', 'in het', 'in t', 'l', 'l’', 'la', 'las', 'le', 'les', 'lo', 'los', 'of', 'onder', "onder 't",
+ 'onder de', 'onder den', 'onder het', 'onder t', 'op', "op 't", 'op de', 'op den', 'op der', 'op gen', 'op het',
+ 'op t', 'op ten', 'over', "over 't", 'over de', 'over den', 'over het', 'over t', 's', "s'", 't', 'te', 'ten',
+ 'ter', 'tho', 'thoe', 'thor', 'to', 'toe', 'tot', 'uijt', "uijt 't", 'uijt de', 'uijt den', 'uijt te de',
+ 'uijt ten', 'uit', "uit 't", 'uit de', 'uit den', 'uit het', 'uit t', 'uit te de', 'uit ten', 'unter', 'van',
+ "van 't", 'van De', 'van de', 'van de l', "van de l'", 'van den', 'van der', 'van gen', 'van het', 'van la',
+ 'van t', 'van ter', 'van van de', 'ver', 'vom', 'von', "von 't", 'von dem', 'von den', 'von der', 'von t', 'voor',
+ "voor 't", 'voor de', 'voor den', "voor in 't", 'voor in t', 'vor', 'vor der', 'zu', 'zum', 'zur'
+ );
+
protected static $commonDutchLastNames = array(
'de Jong', 'Jansen', 'de Vries', 'van de Berg', 'van den Berg', 'van der Berg', 'van Dijk', 'Bakker', 'Janssen',
'Visser', 'Smit', 'Meijer', 'Meyer', 'de Boer', 'Mulder', 'de Groot', 'Bos', 'Vos', 'Peters', 'Hendriks',
@@ -70,7 +86,7 @@ class Person extends \Faker\Provider\Person
'Coreth von und zu Coredo und Starkenberg', 'Cornelisse', 'Cornelissen', 'Cornelisz', 'van den Corput',
'Corstiaens', 'Cosman', 'van de Coterlet', 'Courtier', 'van Cuijck', 'van Daal', 'Dachgelder', 'Dachgeldt',
'Dachgelt', 'van Dagsburg', 'van Dalem', 'van Dam', 'van de Darnau', 'David', 'Dekker', 'Demmendaal',
- 'Dennenberg', 'Die Bont', 'Diesbergen', 'van Dijk', 'Dijkman', 'van Dillen', 'Dircken', 'Dirksen', 'Dirven',
+ 'Dennenberg', 'die Bont', 'Diesbergen', 'van Dijk', 'Dijkman', 'van Dillen', 'Dircken', 'Dirksen', 'Dirven',
'Doesburg', 'van Dokkum', 'van Dommelen', 'van Dongen', 'van Dooren', 'Doorhof', 'Doornhem', 'Dorsman',
'Doyle', 'Draaisma', 'van Drenthe', 'Dries', 'Drysdale', 'Dubois', 'van Duivenvoorde', 'Duivenvoorden',
'van Duvenvoirde', 'van Duyvenvoorde', 'die Bont', 'die Pelser', 'die Witte', 'van Eck', 'Eckhardt', 'Eelman',
@@ -89,18 +105,18 @@ class Person extends \Faker\Provider\Person
'Groote', 'de Grote', 'Gruijl', 'de Gruijl', 'de Gruijter', 'de Gruil', 'de Grunt', 'de Gruson', 'le Guellec',
'Guit', 'le Gulcher', 'Höning', 'Haack', 'den Haag', 'van Haarlem', 'de Haas', 'van Haeften', 'Haengreve',
'van Hagen', 'Hagendoorn', 'Hak', 'Hakker', 'van Ham', 'van Hamaland', 'Haneberg', 'Hanegraaff', 'Haring',
- 'Haselaar', 'van Haspengouw Hesbaye', 'van Haspengouw', 'Hazenveld', 'de Heer', 'Heere', 'Heerkens',
+ 'Haselaar', 'van Haspengouw', 'Hazenveld', 'de Heer', 'Heere', 'Heerkens',
'Heerschop', 'Hehl', 'van der Heiden', 'van der Heijden', 'Heijman', 'Heijmans', 'Heijmen', 'Heinrichs',
- 'Hekker', 'Hellevoort', 'Helmerhorst', 'van Hemert', 'Hemma van Allemanië', 'Hendricks', 'Hendriks',
- 'Hendrikse', 'van Henegouwen', 'Henric van den Nuwenhuse', 'van den Henst', 'Heribert van Laon', 'd\' Heripon',
+ 'Hekker', 'Hellevoort', 'Helmerhorst', 'van Hemert', 'Hemma', 'Hendricks', 'Hendriks',
+ 'Hendrikse', 'van Henegouwen', 'van den Henst', 'Heribert van Laon', "d' Heripon",
'Hermans', 'van Herstal', 'van Heusden', 'Hexspoor', 'Heymans', 'Heyne', 'Hoedemakers', 'van den Hoek', 'Hoeks',
'Hoelen', 'Hoes', 'van Hoevel en van Zwindrecht', 'van der Hoeven', 'van Holland', 'Hollander', 'Holthuis',
'Hondeveld', 'Honing', 'de Hoog', 'Hoogers', 'de Hoogh', 'Hoppenbrouwer', 'Horrocks', 'van der Horst',
- 'van Hostaden', 'Houdijk', 'van \'t Houteveen', 'Huberts', 'Huel', 'Huijben', 'Huijbrechts', 'Huijs',
+ 'van Hostaden', 'Houdijk', "van 't Houteveen", 'Huberts', 'Huel', 'Huijben', 'Huijbrechts', 'Huijs',
'Huijzing', 'Huisman', 'Huls', 'Hulshouts', 'Hulskes', 'Hulst', 'van Hulten', 'Huurdeman', 'van het Heerenveen',
'Jaceps', 'Jacobi', 'Jacobs', 'Jacquot', 'de Jager', 'Jans', 'Jansdr', 'Janse', 'Jansen', 'Jansen', 'Jansse',
- 'Janssen', 'Janssens', 'Jasper dr.', 'Jdotte', 'Jeggij', 'Jekel', 'Jerusalem', 'Jochems', 'de Jode Vastraedsd',
- 'Jones', 'de Jong', 'Jonkman', 'Joosten', 'Jorlink', 'Jorrisen', 'van Jumiège', 'Jurrijens', 'Köster',
+ 'Janssen', 'Janssens', 'Jasper dr', 'Jdotte', 'Jeggij', 'Jekel', 'Jerusalem', 'Jochems',
+ 'Jones', 'de Jong', 'Jonkman', 'Joosten', 'Jorlink', 'Jorissen', 'van Jumiège', 'Jurrijens', 'Köster',
'van der Kaay', 'de Kale', 'Kallen', 'Kalman', 'Kamp', 'Kamper', 'Karels', 'Kas', 'van Kasteelen', 'Kathagen',
'Keijser', 'de Keijser', 'Keijzer', 'de Keijzer', 'Keltenie', 'van Kempen', 'Kerkhof', 'Ketel', 'Ketting',
'der Kijnder', 'van der Kint', 'Kirpenstein', 'Kisman', 'van Klaarwater', 'van de Klashorst', 'Kleibrink',
@@ -135,7 +151,7 @@ class Person extends \Faker\Provider\Person
'van de Plas', 'van der Plas', 'van der Ploeg', 'van der Pluijm', 'Poncelet', 'Ponci', 'Pons', 'van Poppel',
'Post', 'Potters', 'van der Pouw', 'van Praagh', 'Pratt', 'Prinsen', 'Puig', 'Rackham', 'Rademaker', 'Ramaker',
'Recer', 'Recers', 'de Reede', 'Rehorst', 'Reijers', 'Reimes', 'Rek', 'Remmers', 'van Rheineck', 'Ridder',
- 'Riem', 'van Riet', 'van \'t Riet', 'Rietveld', 'Rijcken', 'Rijks', 'Rijn', 'van Rijnsbergen', 'Rijntjes',
+ 'Riem', 'van Riet', "van 't Riet", 'Rietveld', 'Rijcken', 'Rijks', 'Rijn', 'van Rijnsbergen', 'Rijntjes',
'van Rijthoven', 'Rippey', 'Risma', 'Robbrechts Bruijne', 'Roessink', 'van Roijen', 'Romijn', 'de Roo',
'Roodesteijn', 'van Rooij', 'Room', 'de Roos', 'Roose', 'Roosenboom', 'van Rossum', 'Rotteveel', 'Roukes',
'Rousselet', 'Rouwenhorst', 'Rouwhorst', 'Rubben', 'Ruijs', 'Rutten', 'van Saksen', 'Salet', 'van Salm',
@@ -152,20 +168,20 @@ class Person extends \Faker\Provider\Person
'van Stralen', 'van der Strigt', 'de Strigter', 'Strijker', 'Strik', 'Stuivenberg', 'Suijker', 'van Suinvorde',
'van Susa', 'de Swart', 'Symons', 'Takkelenburg', 'Tammerijn', 'Tamsma', 'Terry', 'den Teuling', 'Teunissen',
'Texier', 'Thatcher', 'The Elder', 'Thomas', 'Thout', 'Tielemans', 'Tillmanno', 'Timmerman', 'Timmermans',
- 'Tins', 'Tirie', 'Totwiller', 'van Tours', 'van Tuijl', 'Tuithof', 'Uit de Willigen', 'Uittenbosch', 'Ulrich',
- 'Unruoch Hunerik', 'Uphaus', 'Uphuis', 'Uphus', 'VI', 'Vaessen', 'Vallenduuk', 'Van Bragt', 'Vandenbergh',
+ 'Tins', 'Tirie', 'Totwiller', 'van Tours', 'van Tuijl', 'Tuithof', 'Uittenbosch', 'Ulrich',
+ 'Uphaus', 'Uphuis', 'Uphus', 'VI', 'Vaessen', 'Vallenduuk', 'Van Bragt', 'Vandenbergh',
'Vastenhouw', 'Veenendaal', 'Vegt', 'van der Veiver', 'Velderman', 'van Velthoven', 'Veltman', 'van Velzen',
'van de Ven', 'van Venrooy', 'Verbeeck', 'Verbeek', 'Verboom', 'Verbruggen', 'Verda', 'van Verdun', 'Vergeer',
'Verhaar', 'Verhagen', 'Verharen', 'Verheij', 'Verheuvel', 'Verhoeven', 'Verkade', 'van Vermandois',
'Vermeulen', 'Verschuere', 'Verschut', 'Versluijs', 'Vertoor', 'Vertooren', 'Vervoort', 'Verwoert', 'Vial',
'Vierdag', 'Vignon', 'van Vlaanderen', 'Volcke', 'van Voorhout', 'van Voorst', 'Voortman', 'Vos', 'Vrancken',
'de Vries', 'de Vroege', 'de Vrome', 'ter Waarbeek', 'Waardeloo', 'van Waas', 'Wagenvoort', 'van Wallaert',
- 'Walsteijn', 'Walter', 'Waltrade Walderade', 'van Wassenaar', 'van de Water', 'Weeldenburg', 'Weerdenburg',
- 'Weijland', 'Weijters', 'van Wel', 'van \'t Wel', 'Welf', 'Wendt', 'Wensen', 'de Werd', 'Werdes',
- 'Werl-Arnsberg, van', 'van Wessex', 'West-Francië, van', 'Westerbeek', 'Westerburg', 'Westermann',
+ 'Walsteijn', 'Walter', 'van Wassenaar', 'van de Water', 'Weeldenburg', 'Weerdenburg',
+ 'Weijland', 'Weijters', 'van Wel', "van 't Wel", 'Welf', 'Wendt', 'Wensen', 'de Werd', 'Werdes',
+ 'van Wessex', 'Westerbeek', 'Westerburg', 'Westermann',
'van Westfalen', 'van de Weterink', 'Wever', 'Weyland', 'Weylant', 'van Wickerode', 'van de Wiel', 'Wigman',
'Wijland', 'van Wijland', 'Wilcken', 'Wildschut', 'Willems', 'Willems van Lier', 'Willemsen', 'Wilmont',
- 'Wilson', 'Winnrich', 'Winters', 'Wipstrik', 'de Wit', 'van den Wittenboer', 'Wolffel', 'Wolfsdr',
+ 'Wilson', 'Winnrich', 'Winters', 'Wipstrik', 'de Wit', 'van den Wittenboer', 'Wolffel',
'Wolfswinkel', 'Wolters', 'Wolzak', 'Wooning', 'Woudenberg', 'Wouters', 'Wouters van Eijndhoven', 'Woutersz',
'Wright', 'Wunderink', 'Wutke', 'Zaal', 'Zeemans', 'Zeldenrust', 'Zevenboom', 'van der Zijl', 'Zijlemans',
'Zijlmans', 'Zuidweg', 'Zuijdveld', 'van Zwaben', 'Zwart', 'Zwijsen'
@@ -248,14 +264,14 @@ class Person extends \Faker\Provider\Person
*/
public function lastName()
{
- $determinator = static::numberBetween(0, 3);
+ $determinator = static::numberBetween(0, 25);
if ($determinator === 0) {
$lastName = static::randomElement(static::$longLastNames);
- } elseif ($determinator === 1) {
+ } elseif ($determinator <= 10) {
$lastName = static::randomElement(static::$commonDutchLastNames);
- } elseif ($determinator === 2) {
+ } elseif ($determinator <= 15) {
$lastName = static::randomElement(static::$commonForeignLastNames);
- } elseif ($determinator === 3) {
+ } else {
$lastName = static::randomElement(static::$dutchLastNames);
}
@@ -272,7 +288,7 @@ class Person extends \Faker\Provider\Person
*/
public static function titleMale()
{
- return static::title();
+ return static::randomElement(static::$title);
}
/**
@@ -280,7 +296,7 @@ class Person extends \Faker\Provider\Person
*/
public static function titleFemale()
{
- return static::title();
+ return static::randomElement(static::$title);
}
/**
@@ -290,4 +306,44 @@ class Person extends \Faker\Provider\Person
{
return static::randomElement(static::$suffix);
}
+
+ /*
+ * @example 'van der'
+ */
+ public static function prefix()
+ {
+ return static::randomElement(static::$prefix);
+ }
+
+ /**
+ * @link https://nl.wikipedia.org/wiki/Burgerservicenummer#11-proef
+ *
+ * @return string
+ */
+ public function idNumber()
+ {
+ $return = '';
+ $nr = array();
+ $nr[] = 0;
+ while (count($nr) < 8) {
+ $nr[] = static::randomDigit();
+ }
+ $nr[] = mt_rand(0, 6);
+ if ($nr[7] == 0 && $nr[8] == 0) {
+ $nr[7] = 0;
+ }
+
+ $bsn = (9 * $nr[8]) + (8 * $nr[7]) + (7 * $nr[6]) + (6 * $nr[5]) + (5 * $nr[4]) + (4 * $nr[3]) + (3 * $nr[2]) + (2 * $nr[1]);
+ $nr[0] = floor($bsn - floor($bsn / 11) * 11);
+ if ($nr[0] > 9) {
+ if ($nr[1] > 0) {
+ $nr[0] = 8;
+ $nr[1]--;
+ } else {
+ $nr[0] = 1;
+ $nr[1]++;
+ }
+ }
+ return implode('', array_reverse($nr));
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Text.php
new file mode 100644
index 00000000..4ac1f0b6
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/nl_NL/Text.php
@@ -0,0 +1,3932 @@
+ 'Aareal Bank Aktiengesellschaft (Spółka Akcyjna) - Oddział w Polsce',
- '249' => 'Alior Bank SA',
- '247' => 'Banco Espirito Santo de Investimento, S.A. Spółka Akcyjna Oddział w Polsce',
- '238' => 'Banco Mais S.A. (SA) Oddział w Polsce',
- '106' => 'Bank BPH SA',
- '219' => 'Bank DnB NORD Polska SA',
- '203' => 'Bank Gospodarki Żywnościowej SA',
- '113' => 'Bank Gospodarstwa Krajowego',
- '122' => 'Bank Handlowo - Kredytowy SA (w likwidacji 31.03.92)',
- '103' => 'Bank Handlowy w Warszawie SA',
- '116' => 'Bank Millennium SA',
- '154' => 'Bank Ochrony Środowiska SA',
- '260' => 'Bank of China (Luxembourg)S.A. Spółka Akcyjna Oddział w Polsce',
- '221' => 'Bank of Tokyo-Mitsubishi UFJ (Polska) SA',
- '132' => 'Bank Pocztowy SA',
- '124' => 'Bank Polska Kasa Opieki SA',
- '193' => 'BANK POLSKIEJ SPÓŁDZIELCZOŚCI SA',
- '109' => 'Bank Zachodni WBK SA',
- '224' => 'Banque PSA Finance SA Oddział w Polsce',
- '160' => 'BNP PARIBAS BANK POLSKA SA',
- '235' => 'BNP PARIBAS SA Oddział w Polsce',
- '243' => 'BNP Paribas Securities Services SKAOddział w Polsce',
- '229' => 'BPI Bank Polskich Inwestycji SA',
- '215' => 'BRE Bank Hipoteczny SA',
- '114' => 'BRE Bank SA',
- '239' => 'CAIXABANK, S.A. (SPÓŁKA AKCYJNA)ODDZIAŁ W POLSCE',
- '254' => 'Citibank Europe plc (Publiczna Spółka Akcyjna) Oddział w Polsce',
- '194' => 'Credit Agricole Bank Polska SA',
- '252' => 'CREDIT SUISSE (LUXEMBOURG) S.A. Spółka Akcyjna, Oddział w Polsce',
- '236' => 'Danske Bank A/S SA Oddział w Polsce',
- '191' => 'Deutsche Bank PBC SA',
- '188' => 'Deutsche Bank Polska SA',
- '174' => 'DZ BANK Polska SA',
- '241' => 'Elavon Financial Services Limited (Spółka z ograniczoną odpowiedzialnością) Oddział w Polsce',
- '147' => 'Euro Bank SA',
- '265' => 'EUROCLEAR Bank SA/NV (Spółka Akcyjna) - Oddział w Polsce',
- '207' => 'FCE Bank Polska SA',
- '214' => 'Fiat Bank Polska SA',
- '253' => 'FM Bank SA',
- '248' => 'Getin Noble Bank SA',
- '128' => 'HSBC Bank Polska SA',
- '195' => 'Idea Bank SA',
- '255' => 'Ikano Bank GmbH (Sp. z o.o.) Oddział w Polsce',
- '262' => 'Industrial and Commercial Bank of China (Europe) S.A. (Spółka Akcyjna) Oddział w Polsce',
- '105' => 'ING Bank Śląski SA',
- '266' => 'Intesa Sanpaolo S.p.A. Spółka Akcyjna Oddział w Polsce',
- '168' => 'INVEST - BANK SA',
- '258' => 'J.P. Morgan Europe Limited Sp. z o.o. Oddział w Polsce',
- '158' => 'Mercedes-Benz Bank Polska SA',
- '130' => 'Meritum Bank ICB SA',
'101' => 'Narodowy Bank Polski',
- '256' => 'Nordea Bank AB SA Oddział w Polsce',
- '144' => 'NORDEA BANK POLSKA SA',
- '232' => 'Nykredit Realkredit A/S SA - Oddział w Polsce',
- '189' => 'Pekao Bank Hipoteczny SA',
- '187' => 'Polski Bank Przedsiębiorczości SA',
'102' => 'Powszechna Kasa Oszczędności Bank Polski SA',
- '200' => 'Rabobank Polska SA',
- '175' => 'Raiffeisen Bank Polska SA',
- '167' => 'RBS Bank (Polska) SA',
- '264' => 'RCI Banque Spółka Akcyjna Oddział w Polsce',
- '212' => 'Santander Consumer Bank SA',
- '263' => 'Saxo Bank A/S Spółka Akcyjna Oddział w Polsce',
+ '103' => 'Bank Handlowy w Warszawie SA',
+ '105' => 'ING Bank Śląski SA',
+ '106' => 'Bank BPH SA',
+ '109' => 'Bank Zachodni WBK SA',
+ '113' => 'Bank Gospodarstwa Krajowego',
+ '114' => 'mBank SA',
+ '116' => 'Bank Millennium SA',
+ '122' => 'Bank Handlowo-Kredytowy Spółka Akcyjna w Katowicach w likwidacji',
+ '124' => 'Bank Polska Kasa Opieki SA',
+ '128' => 'HSBC Bank Polska SA',
+ '132' => 'Bank Pocztowy SA',
+ '147' => 'Euro Bank SA',
+ '154' => 'Bank Ochrony Środowiska SA',
+ '158' => 'Mercedes-Benz Bank Polska SA',
'161' => 'SGB-Bank SA',
- '237' => 'Skandinaviska Enskilda Banken AB (SA) - Oddział w Polsce',
+ '167' => 'RBS Bank (Polska) SA',
+ '168' => 'PLUS BANK SA',
+ '175' => 'Raiffeisen Bank Polska SA',
'184' => 'Societe Generale SA Oddział w Polsce',
- '225' => 'Svenska Handelsbanken AB SA Oddział w Polsce',
- '227' => 'Sygma Banque Societe Anonyme (SA) Oddział w Polsce',
- '216' => 'Toyota Bank Polska SA',
- '257' => 'UBS Limited (spółka z ograniczoną odpowiedzialnością) Oddział w Polsce',
- '261' => 'Vanquis Bank Limited (spółka z ograniczoną odpowiedzialnością) Oddział w Polsce',
+ '187' => 'Nest Bank S.A.',
+ '189' => 'Pekao Bank Hipoteczny SA',
+ '191' => 'Deutsche Bank Polska SA',
+ '193' => 'BANK POLSKIEJ SPÓŁDZIELCZOŚCI SA',
+ '194' => 'Credit Agricole Bank Polska SA',
+ '195' => 'Idea Bank SA',
+ '203' => 'Bank BGŻ BNP Paribas SA',
+ '212' => 'Santander Consumer Bank SA',
'213' => 'VOLKSWAGEN BANK POLSKA SA',
+ '214' => 'FCA-Group Bank Polska SA',
+ '215' => 'mBank Hipoteczny SA',
+ '216' => 'Toyota Bank Polska SA',
+ '219' => 'DNB Bank Polska SA',
+ '224' => 'Banque PSA Finance SA Oddział w Polsce',
+ '225' => 'Svenska Handelsbanken AB SA Oddział w Polsce',
+ '229' => 'BPI Bank Polskich Inwestycji SA',
+ '232' => 'Nykredit Realkredit A/S SA - Oddział w Polsce',
+ '235' => 'BNP PARIBAS SA Oddział w Polsce',
+ '236' => 'Danske Bank A/S SA Oddział w Polsce',
+ '237' => 'Skandinaviska Enskilda Banken AB (SA) - Oddział w Polsce',
+ '239' => 'CAIXABANK, S.A. (SPÓŁKA AKCYJNA)ODDZIAŁ W POLSCE',
+ '241' => 'Elavon Financial Services Designated Activity Company (spółka z o.o. o wyznaczonym przedmiocie działalności) Oddział w Polsce',
+ '243' => 'BNP Paribas Securities Services SKA Oddział w Polsce',
+ '247' => 'HAITONG BANK, S.A. Spółka Akcyjna Oddział w Polsce',
+ '248' => 'Getin Noble Bank SA',
+ '249' => 'Alior Bank SA',
+ '251' => 'Aareal Bank Aktiengesellschaft (Spółka Akcyjna) - Oddział w Polsce',
+ '254' => 'Citibank Europe plc (Publiczna Spółka Akcyjna) Oddział w Polsce',
+ '255' => 'Ikano Bank AB (publ) Spółka Akcyjna Oddział w Polsce',
+ '256' => 'Nordea Bank AB SA Oddział w Polsce',
+ '257' => 'UBS Limited (spółka z ograniczoną odpowiedzialnością) Oddział w Polsce',
+ '258' => 'J.P. Morgan Europe Limited Sp. z o.o. Oddział w Polsce',
+ '260' => 'Bank of China (Luxembourg) S.A. Spółka Akcyjna Oddział w Polsce',
+ '262' => 'Industrial and Commercial Bank of China (Europe) S.A. (Spółka Akcyjna) Oddział w Polsce',
+ '263' => 'Saxo Bank A/S Spółka Akcyjna Oddział w Polsce w likwidacji',
+ '264' => 'RCI Banque Spółka Akcyjna Oddział w Polsce',
+ '265' => 'EUROCLEAR Bank SA/NV (Spółka Akcyjna) - Oddział w Polsce',
+ '266' => 'Intesa Sanpaolo S.p.A. Spółka Akcyjna Oddział w Polsce',
+ '267' => 'Western Union International Bank GmbH, Sp. z o.o. Oddział w Polsce',
+ '269' => 'PKO Bank Hipoteczny SA',
+ '270' => 'TF BANK AB (Spółka z ograniczoną odpowiedzialnością) Oddział w Polsce',
+ '271' => 'FCE Bank Spółka Akcyjna Oddział w Polsce',
+ '272' => 'AS Inbank Spółka Akcyjna - Oddział w Polsce',
+ '273' => 'China Construction Bank (Europe) S.A. (Spółka Akcyjna) Oddział w Polsce',
+ '274' => 'MUFG Bank (Europe) N.V. S.A. Oddział w Polsce',
+ '275' => 'John Deere Bank S.A. Spółka Akcyjna Oddział w Polsce',
);
/**
@@ -105,7 +100,7 @@ class Payment extends \Faker\Provider\Payment
protected static function addBankCodeChecksum($iban, $countryCode = 'PL')
{
- if ($countryCode != "PL" || strlen($iban) <= 8) {
+ if ($countryCode != 'PL' || strlen($iban) <= 8) {
return $iban;
}
$checksum = 0;
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Person.php
index c6b2402e..380f4d9f 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Person.php
@@ -159,11 +159,12 @@ class Person extends \Faker\Provider\Person
for ($i = 6; $i < $length; $i++) {
$result[$i] = static::randomDigit();
}
- if ($sex == "M") {
- $result[$length - 1] |= 1;
- } elseif ($sex == "F") {
- $result[$length - 1] ^= 1;
+
+ $result[$length - 1] |= 1;
+ if ($sex == "F") {
+ $result[$length - 1] -= 1;
}
+
$checksum = 0;
for ($i = 0; $i < $length; $i++) {
$checksum += $weights[$i] * $result[$i];
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Text.php
index 0f242105..9739b83e 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Text.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/pl_PL/Text.php
@@ -48,7 +48,7 @@ class Text extends \Faker\Provider\Text
*
*
*
- * Produced by Pawel Sobkowiak--Scanned and proofread by
+ * Produced by Pawel Sobkowiak - Scanned and proofread by
* Polska Biblioteka Internetowa
*
*
@@ -75,13 +75,13 @@ starszym bratem na pastwę białych od żaru i oszołamiających dni letnich.
Wertowaliśmy, odurzeni światłem, w tej wielkiej księdze wakacji, której
wszystkie karty pałały od blasku i miały na dnie słodki do omdlenia
miąższ złotych gruszek. Adela wracała w świetliste poranki, jak Pomona z
-ognia dnia rozżagwionego, wysypując z koszyka barwną urodę słońca--
+ognia dnia rozżagwionego, wysypując z koszyka barwną urodę słońca -
lśniące, pełne wody pod przejrzystą skórką czereśnie, tajemnicze, czarne
wiśnie, których woń przekraczała to, co ziszczało się w smaku; morele, w
których miąższu złotym był rdzeń długich popołudni; a obok tej czystej
poezji owoców wyładowywała nabrzmiałe siłą i pożywnością płaty mięsa z
klawiaturą żeber cielęcych, wodorosty jarzyn, niby zabite głowonogi i
-meduzy--surowy materiał obiadu o smaku jeszcze nie uformowanym i
+meduzy - surowy materiał obiadu o smaku jeszcze nie uformowanym i
jałowym, wegetatywne i telluryczne ingrediencje obiadu o zapachu dzikim
i polnym. Przez ciemne mieszkanie na pierwszym piętrze kamienicy w rynku
przechodziło co dzień na wskroś całe wielkie lato: cisza drgających
@@ -99,10 +99,10 @@ słoneczną kąpiel dnia. Przechodnie, brodząc w złocie, mieli oczy
zmrużone od żaru, jakby zalepione miodem, a podciągnięta górna warga
odsłaniała im dziąsła i zęby. I wszyscy brodzący w tym dniu złocistym
mieli ów grymas skwaru, jak gdyby słońce nałożyło swym wyznawcom jedną i
-tę samą maskę--złotą maskę bractwa słonecznego; i wszyscy, którzy szli
+tę samą maskę - złotą maskę bractwa słonecznego; i wszyscy, którzy szli
dziś ulicami, spotykali się, mijali, starcy i młodzi, dzieci i kobiety,
pozdrawiali się w przejściu tą maską, namalowaną grubą, złotą farbą na
-twarzy, szczerzyli do siebie ten grymas bakchiczny--barbarzyńską maskę
+twarzy, szczerzyli do siebie ten grymas bakchiczny - barbarzyńską maskę
kultu pogańskiego. Rynek był pusty i żółty od żaru, wymieciony z kurzu
gorącymi wiatrami, jak biblijna pustynia. Cierniste akacje, wyrosłe z
pustki żółtego placu, kipiały nad nim jasnym listowiem, bukietami
@@ -129,7 +129,7 @@ troskliwie chorego męża z rozpalonego siodła, ażeby go po chłodnych
schodach wnieść ostrożnie na pachnące szabasem piętro. Tak wędrowaliśmy
z matką przez dwie słoneczne strony rynku, wodząc nasze załamane cienie
po wszystkich domach, jak po klawiszach. Kwadraty bruku mijały powoli
-pod naszymi miękkimi i płaskimi krokami--jedne bladoróżowe jak skóra
+pod naszymi miękkimi i płaskimi krokami - jedne bladoróżowe jak skóra
ludzka, inne złote i sine, wszystkie płaskie, ciepłe, aksamitne na
słońcu, jak jakieś twarze słoneczne, zadeptane stopami aż do niepoznaki,
do błogiej nicości. Aż wreszcie na rogu ulicy Stryjskiej weszliśmy w
@@ -227,9 +227,9 @@ w dziwnie prostej syntezie życie tych ludzi, alembik rasy, gatunek krwi
i sekret ich losu, zawarty niedostrzegalnie w codziennym mijaniu ich
własnego, odrębnego czasu. Stare, mądre drzwi, których ciemne
westchnienia wpuszczały i wypuszczały tych ludzi, milczący świadkowie
-wchodzenia i wychodzenia matki, córek i synów--otworzyły się bezgłośnie
+wchodzenia i wychodzenia matki, córek i synów - otworzyły się bezgłośnie
jak odrzwia szafy i weszliśmy w ich życie. Siedzieli jakby w cieniu
-swego losu i nie bronili się--w pierwszych niezręcznych gestach
+swego losu i nie bronili się - w pierwszych niezręcznych gestach
wydalinam swoją tajemnicę. Czyż nie byliśmy krwią i losem spokrewnieni z
nimi? Pokój był ciemny i aksamitny od granatowych obić ze złotym
deseniem, lecz echo dnia płomiennego drgało i tutaj jeszcze mosiądzem na
@@ -288,7 +288,7 @@ oczyma, wychodząc do drugiego pokoju. Podążyłem za nim. Siedział nisko
na małej kozetce, z kolanami krzyżującymi się niemal na wysokości głowy,
łysej jak kula bilardowa. Zdawało się, że to ubranie samo leży,
fałdziste, zmięte, przerzucone przez fotel. Twarz jego była jak
-tchnienie twarzy--smuga, którą nieznany przechodzień zostawił w
+tchnienie twarzy - smuga, którą nieznany przechodzień zostawił w
powietrzu. Trzymał w bladych, emaliowanych błękitnie dłoniach portfel, w
którym coś oglądał. Z mgły twarzy wyłoniło się z trudem wypukłe bielmo
bladego oka, wabiąc mnie figlarnym mruganiem. Czułem doń nieprzepartą
@@ -301,13 +301,13 @@ i zbiegł mię dreszczem niepokoju, falą nagłego zrozumienia. Ale
tymczasem ta mgiełka uśmiechu, która się zarysowała pod miękkim i
pięknym jego wąsem, zawiązek pożądania, który napiął się na jego
skroniach pulsującą żyłą, natężenie trzymające przez chwilę jego rysy w
-skupieniu--upadły z powrotem w nicość i twarz odeszła w nieobecność,
+skupieniu - upadły z powrotem w nicość i twarz odeszła w nieobecność,
zapomniała o sobie, rozwiała się,
NAWIEDZENIE 1 Już wówczas miasto nasze popadało coraz bardziej w
chroniczną szarość zmierzchu, porastało na krawędziach liszajem cienia,
puszystą pleśnią i mchem koloru żelaza. Ledwo rozpowity z brunatnych
-dymów i mgieł poranka--przechylał się dzień od razu w niskie
+dymów i mgieł poranka - przechylał się dzień od razu w niskie
bursztynowe popołudnie, stawał się przez chwilę przezroczysty i złoty
jak ciemne piwo, ażeby potem zejść pod wielokrotnie rozczłonkowane,
fantastyczne sklepienia kolorowych i rozległych nocy. Mieszkaliśmy w
@@ -337,7 +337,7 @@ bokami po podłodze i ścianach; szedł budzić ciężko chrapiących z
twardego jak kamień snu. W świetle pozostawionej przezeń świecy wywijali
się leniwie z brudnej pościeli, wystawiali, siadając na łóżkach, bose i
brzydkie nogi i z skarpetką w ręce oddawali się jeszcze przez chwilę
-rozkoszy ziewania--ziewania przeciągniętego aż do lubieżności, do
+rozkoszy ziewania - ziewania przeciągniętego aż do lubieżności, do
bolesnego skurczu podniebienia, jak przy tęgich wymiotach. W kątach
siedziały nieruchomo wielkie karakony, wyogromnione własnym cieniem,
którym obarczała każdego płonąca świeca i który nie odłączał się od nich
@@ -365,7 +365,7 @@ bezradnie, jakby czegoś szukając. Wówczas bywało, że zbiegał po cichu z
to rodzaj klepsydry wodnej albo wielkiej fioli szklanej, podzielonej na
uncje i napełnionej ciemnym fluidem. Mój ojciec łączył się z tym
instrumentem długą kiszką gumową, jakby krętą, bolesną pępowiną, i tak
-połączony z żałosnym przyrządem--nieruchomiał w skupieniu, a oczy jego
+połączony z żałosnym przyrządem - nieruchomiał w skupieniu, a oczy jego
ciemniały, zaś na twarz przybladłą występował wyraz cierpienia czy
jakiejś występnej rozkoszy. Potem znów przychodziły dni cichej skupionej
pracy, przeplatanej samotnymi monologami. Gdy tak siedział w świetle
@@ -386,7 +386,7 @@ nocy tapety więdły, zwijały się, gubiły liście i kwiaty i przerzedzały
się jesiennie, przepuszczając dalekie świtanie. Wtedy wśród świergotu
tapetowych ptaków, w żółtym zimowym świcie zasypiał na parę godzin
gęstym, czarnym snem. Od dni, od tygodni, gdy zdawał się być pogrążonym
-w zawiłych konto-korrentach--myśl jego zapuszczała się tajnie w
+w zawiłych konto-korrentach - myśl jego zapuszczała się tajnie w
labirynty własnych wnętrzności. Wstrzymywał oddech i nasłuchiwał. I gdy
wzrok jego wracał zbielały i mętny z tamtych głębin, uspokajał go
uśmiechem. Nie wierzył jeszcze i odrzucał jak absurd te uroszczenia, te
@@ -405,7 +405,7 @@ który jeszcze urąga. Nie widziałem nigdy proroków Starego Testamentu,
ale na widok tego męża, którego gniew boży obalił, rozkraczonego szeroko
na ogromnym porcelanowym urynale, zakrytego wichrem ramion, chmurą
rozpaczliwych łamańców, nad którymi wyżej jeszcze unosił się głos jego,
-obcy i twardy--zrozumiałem gniew boży świętych mężów. Był to dialog
+obcy i twardy - zrozumiałem gniew boży świętych mężów. Był to dialog
groźny jak mowa piorunów. Łamańce rak jego rozrywały niebo na sztuki, a
w szczelinach ukazywała się twarz Jehowy, wzdęta gniewem i plująca
przekleństwa. Nie patrząc widziałem go, groźnego Demiurga, jak leżąc na
@@ -491,14 +491,14 @@ pozostało, to trochę cielesnej powłoki i ta garść bezsensownych dziwactw
PTAKI Nadeszły żółte, pełne nudy dni zimowe. Zrudziałą ziemię pokrywał
dziurawy, przetarty, za krótki obrus śniegu. Na wiele dachów nie
starczyło go i stały czarne lub rdzawe, gontowe strzechy i arki kryjące
-w sobie zakopcone przestrzenie strychów--czarne, zwęglone katedry,
-najeżone żebrami krokwi, płatwi i bantów--ciemne płuca wichrów
+w sobie zakopcone przestrzenie strychów - czarne, zwęglone katedry,
+najeżone żebrami krokwi, płatwi i bantów - ciemne płuca wichrów
zimowych. Każdy świt odkrywał nowe kominy i dymniki, wyrosłe w nocy,
wydęte przez wicher nocny, czarne piszczałki organów diabelskich.
Kominiarze nie mogli opędzić się od wron, które na kształt żywych
czarnych liści obsiadały wieczorem gałęzie drzew pod kościołem, odrywały
się znów, trzepocąc, by wreszcie przylgnąć, każda do właściwego miejsca
-na właściwej gałęzi, a o świcie ulatywały wielkimi stadami--tumany
+na właściwej gałęzi, a o świcie ulatywały wielkimi stadami - tumany
sadzy, płatki kopciu, falujące i fantastyczne, plamiąc migotliwym
krakaniem mętnożółte smugi świtu. Dni stwardniały od zimna i nudy, jak
zeszłoroczne bochenki chleba. Napoczynano je tępymi nożami, bez apetytu,
@@ -507,8 +507,8 @@ studiował nigdy niezgłębioną istotę ognia, wyczuwał słony, metaliczny
posmak i wędzony zapach zimowych płomieni, chłodną pieszczotę
salamander, liżących błyszczącą sadzę w gardzieli komina. Z zamiłowaniem
wykonywał w owych dniach wszystkie reparatury w górnych regionach
-pokoju. O każdej porze dnia można go było widzieć, jak--przykucnięty na
-szczycie drabiny--majstrował coś przy suficie, przy kamiszach wysokich
+pokoju. O każdej porze dnia można go było widzieć, jak - przykucnięty na
+szczycie drabiny - majstrował coś przy suficie, przy kamiszach wysokich
okien, przy kulach i łańcuchach lamp wiszących. Zwyczajem malarzy
posługiwał się drabiną jak ogromnymi szczudłami i czuł się dobrze w tej
ptasiej perspektywie, w pobliżu malowanego nieba, arabesek i ptaków
@@ -519,7 +519,7 @@ słuchał jej z roztargnieniem, pełen niepokoju, z drgawkami w nieobecnej
twarzy. I bywało, że przerywał jej nagle zaklinającym gestem ręki, ażeby
pobiec w kąt pokoju, przylgnąć uchem do szpary w podłodze i z
podniesionymi palcami wskazującymi obu rąk, wyrażającymi najwyższą
-ważność badania--nasłuchiwać. Nie rozumieliśmy wówczas jeszcze smutnego
+ważność badania - nasłuchiwać. Nie rozumieliśmy wówczas jeszcze smutnego
tła tych ekstrawagancji, opłakanego kompleksu, który dojrzewał w głębi.
Matka nie miała nań żadnego wpływu, natomiast wielką czcią i uwagą
darzył Adelę. Sprzątanie pokoju było dlań wielką i ważną ceremonią,
@@ -546,11 +546,11 @@ na światło dzienne. Zaczęło się to od wylęgania jaj ptasich. Z wielkim
nakładem trudu i pieniędzy sprowadzał ojciec z Hamburga, z Holandii, z
afrykańskich stacji zoologicznych zapłodnione jaja ptasie, które dawał
do wylęgania ogromnym kurom belgijskim. Był to proceder nader zajmujący
-i dla mnie--to wykluwanie się piskląt, prawdziwych dziwotworów w
+i dla mnie - to wykluwanie się piskląt, prawdziwych dziwotworów w
kształcie i ubarwieniu. Nie podobna było dopatrzyć się w tych monstrach
o ogromnych, fantastycznych dziobach, które natychmiast po urodzeniu
rozdzierały się szeroko, sycząc żarłocznie czeluściami gardła, w tych
-jaszczurach o wątłym, nagim ciele garbusów--przyszłych pawi, bażantów,
+jaszczurach o wątłym, nagim ciele garbusów - przyszłych pawi, bażantów,
głuszców i kondorów. Umieszczony w koszykach, w wacie, smoczy ten pomiot
podnosił na cienkich szyjach ślepe, bielmem zarosle głowy, kwacząc
bezgłośnie z niemych gardzieli. Mój ojciec chodził wzdłuż półek w
@@ -575,13 +575,13 @@ godności w całym zachowaniu, kierujący się żelaznym ceremoniałem swego
wielkiego rodu. Gdy siedział naprzeciw ojca, nieruchomy w swej
monumentalnej pozycji odwiecznych bóstw egipskich, z okiem zawleczonym
białawym bielmem, które zasuwał z boku na źrenice, ażeby zamknąć się
-zupełnie w kontemplacji swej dostojnej samotności--wydawał się ze swym
+zupełnie w kontemplacji swej dostojnej samotności - wydawał się ze swym
kamiennym profilem starszym bratem mego ojca. Ta sama materia ciała,
ścięgien i pomarszczonej twardej skóry, ta sama twarz wyschła i
koścista, te same zrogowaciałe, głębokie oczodoły. Nawet ręce, silne w
węzłach, długie, chude dłonie ojca, z wypukłymi paznokciami, miały swój
analogon w szponach kondora. Nie mogłem się oprzeć wrażeniu, widząc go
-tak uśpionego, że mam przed sobą mumię--wyschłą i dlatego pomniejszoną
+tak uśpionego, że mam przed sobą mumię - wyschłą i dlatego pomniejszoną
mumię mego ojca. Sądzę, że i uwagi matki nie uszło to przedziwne
podobieństwo, chociaż nigdy nie poruszaliśmy tego tematu.
Charakterystyczne jest, że kondor używał wspólnego z moim ojcem naczynia
@@ -594,7 +594,7 @@ wszelkiego rodzaju skrzydlacze z dalekich stron. Nawet długo po
zlikwidowaniu ptasiego gospodarstwa utrzymywała się w świecie ptasim ta
tradycja naszego domu i w okresie wiosennych wędrówek spadały nieraz na
nasz dach całe chmary żurawi, pelikanów, pawi i wszelkiego ptactwa.
-Impreza ta wzięła jednak niebawem--po krótkiej świetności--smutny
+Impreza ta wzięła jednak niebawem - po krótkiej świetności - smutny
obrót. Wkrótce okazała się bowiem konieczna translokacja ojca do dwóch
pokojów na poddaszu, które służyły za rupieciarnie. Stamtąd dochodził
już o wczesnym świcie zmieszany klangor głosów ptasich. Drewniane pudła
@@ -618,7 +618,7 @@ przerażeniu próbował wznieść się w powietrze. Zwolna przerzedzał się
tuman skrzydlaty, aż w końcu na pobojowisku została sama Adela,
wyczerpana, dysząca, oraz mój ojciec z miną zafrasowaną i zawstydzoną,
gotów do przyjęcia każdej kapitulacji. W chwilę później schodził mój
-ojciec ze schodów swojego dominium--człowiek złamany, król-banita,
+ojciec ze schodów swojego dominium - człowiek złamany, król-banita,
który stracił tron i królowanie.
MANEKINY Ta ptasia impreza mego ojca była ostatnim wybuchem kolorowości,
@@ -698,7 +698,7 @@ fizjonomię. Subiekci spożywali go z namaszczeniem, z powagą
kalendarzowej ceremonii. Zapach pieprzu rozchodził się po pokoju. A gdy
wytarli bułką ostatek galarety ze swych talerzy, rozważając w myśli
heraldykę następnych dni tygodnia, i na półmisku zostawały tylko głowy z
-wygotowanymi oczyma--czuliśmy wszyscy, że dzień został wspólnymi siłami
+wygotowanymi oczyma - czuliśmy wszyscy, że dzień został wspólnymi siłami
pokonany i że reszta nie wchodziła już w rachubę. W samej rzeczy z
resztą tą, wydaną na jej łaskę, Adela nie robiła sobie długich
ceregieli. Wśród brzęku garnków i chlustów zimnej wody likwidowała z
@@ -732,7 +732,7 @@ lekkomyślnych i płochych, którymi zasypać mogły cale miasto, jak
kolorową fantastyczną śnieżycą. Nagle było im gorąco i otwierały okno,
ażeby w niecierpliwości swej samotni, w głodzie obcych twarzy,
przynajmniej bezimienną twarz zobaczyć, do okna przyciśniętą. Wachlowały
-rozpalone swe policzki przed wzbierającą firankami nocą zimową--
+rozpalone swe policzki przed wzbierającą firankami nocą zimową -
odsłaniały płonące dekolty, pełne nienawiści do siebie i rywalizacji,
gotowe stanąć do walki o tego pierrota, którego by ciemny powiew nocy
przywiał na okno. Ach! jak mało wymagały one od rzeczywistości. Miały
@@ -753,26 +753,26 @@ drzwi podniósł firanki u okna, panienki dawały się oglądać, kręcąc się
biodrach, polśniewając emalią oczu, lakiem skrzypiących pantofelków,
sprzączkami podwiązek pod wzdętą od wiatru sukienką; szmatki jęły umykać
po podłodze, jak szczury, ku uchylonym drzwiom ciemnego pokoju, a ojciec
-mój przyglądał się uważnie prychającym osóbkom, szepcąc półgłosem:--
+mój przyglądał się uważnie prychającym osóbkom, szepcąc półgłosem: -
Genus avium... jeśli się nie mylę, scansores albo pistacci... w
najwyższym stopniu godne uwagi. Przypadkowe to spotkanie stało się
początkiem całej serii seansów, podczas których ojciec mój zdołał rychło
oczarować obie panienki urokiem swej przedziwnej osobistości. Odpłacając
się za pełną galanterii i dowcipu konwersację, którą zapełniał im pustkę
-wieczorów--dziewczęta pozwalały zapalonemu badaczowi studiować
+wieczorów - dziewczęta pozwalały zapalonemu badaczowi studiować
strukturę swych szczupłych i tandetnych ciałek. Działo się to w toku
konwersacji, z powagą i wytwornością, która najryzykowniejszym punktom
tych badań odbierała dwuznaczny ich pozór. Odsuwając pończoszkę z kolana
Pauliny i studiując rozmiłowanymi oczyma zwięzłą i szlachetną
-konstrukcję przegubu, ojciec mój mówił:--Jakże pełna uroku i jak
+konstrukcję przegubu, ojciec mój mówił: - Jakże pełna uroku i jak
szczęśliwa jest forma bytu, którą panie obrały. Jakże piękna i prosta
jest teza, którą dano wam swym życiem ujawnić. Lecz za to z jakim
mistrzostwem, z jaką finezją wywiązują się panie z tego zadania. Gdybym
odrzucając respekt przed Stwórcą, chciał się zabawić w krytykę
-stworzenia, wołałbym:--mniej treści, więcej formy! Ach, jakby ulżył
+stworzenia, wołałbym: - mniej treści, więcej formy! Ach, jakby ulżył
światu ten ubytek treści. Więcej skromności w zamierzeniach, więcej
-wstrzemięźliwości w pretensjach--panowie demiurdzy--a świat byłby
-doskonalszy!--wołał mój ojciec akurat w momencie, gdy dłoń jego
+wstrzemięźliwości w pretensjach - panowie demiurdzy - a świat byłby
+doskonalszy! - wołał mój ojciec akurat w momencie, gdy dłoń jego
wyłuskiwała białą łydkę Pauliny z uwięzi pończoszki. W tej chwili Adela
stanęła w otwartych drzwiach jadalni, niosąc tacę z podwieczorkiem. Było
to pierwsze spotkanie dwu tych wrogich potęg od czasu wielkiej rozprawy.
@@ -802,8 +802,8 @@ należytą ostrożnością, i unikając zgorszenia, tę nader kacerską
doktrynę, która opętała wówczas na długie miesiące mego ojca i opanowała
wszystkie jego poczynania.
-TRAKTAT O MANEKINACH ALBO WTÓRA KSIĘGA RODZAJU Demiurgos--mówił mój
-ojciec--nie posiadł monopolu na tworzenie--tworzenie jest przywilejem
+TRAKTAT O MANEKINACH ALBO WTÓRA KSIĘGA RODZAJU Demiurgos - mówił mój
+ojciec - nie posiadł monopolu na tworzenie - tworzenie jest przywilejem
wszystkich duchów. Materii dana jest nieskończona płodność,
niewyczerpana moc życiowa i zarazem uwodna siła pokusy, która nas nęci
do formowania. W głębi materii kształtują się niewyraźne uśmiechy,
@@ -813,7 +813,7 @@ dreszczami. Czekając na ożywcze tchnienie ducha, przelewa się ona w
sobie bez końca, kusi tysiącem słodkich okrąglizn i miękkości, które z
siebie w ślepych rojeniach wymajacza. Pozbawiona własnej inicjatywy,
lubieżnie podatna, po kobiecemu plastyczna, uległa wobec wszystkich
-impulsów--stanowi ona teren wyjęty spod prawa, otwarty dla wszelkiego
+impulsów - stanowi ona teren wyjęty spod prawa, otwarty dla wszelkiego
rodzaju szarlatanerii i dyletantyzmów, domenę wszelkich nadużyć i
wątpliwych manipulacji demiurgicznych. Materia jest najbierniejszą i
najbezbronniejszą istotą w kosmosie. Każdy może ją ugniatać, formować,
@@ -824,8 +824,8 @@ Jest ono nieraz koniecznym gwałtem wobec opornych i skostniałych form
bytu, które przestały być zajmujące. W interesie ciekawego i ważnego
eksperymentu może ono nawet stanowić zasługę. Tu jest punkt wyjścia dla
nowej apologii sadyzmu. Mój ojciec był niewyczerpany w gloryfikacji tego
-przedziwnego elementu, jakim była materia.--Nie ma materii martwej--
-nauczał--martwota jest jedynie pozorem, za którym ukrywają się nieznane
+przedziwnego elementu, jakim była materia. - Nie ma materii martwej -
+nauczał - martwota jest jedynie pozorem, za którym ukrywają się nieznane
formy życia. Skala tych form jest nieskończona, a odcienie i niuanse
niewyczerpane. Demiurgos był w posiadaniu ważnych i ciekawych recept
twórczych. Dzięki nim stworzył on mnogość rodzajów, odnawiających się
@@ -848,20 +848,20 @@ ironicznym palcem, póki nie dołaskotał się błysku zrozumienia i śmiechu,
kapitulować. Dziewczęta siedziały nieruchomo, lampa kopciła, sukno pod
igłą maszyny dawno się zsunęło, a maszyna stukotała pusto, stębnując
czarne, bezgwiezdne sukno, odwijające się z postawu nocy zimowej za
-oknem.--Zbyt długo żyliśmy pod terrorem niedościgłej doskonałości
-Demiurga--mówił mój ojciec--zbyt długo doskonałość jego tworu
+oknem. - Zbyt długo żyliśmy pod terrorem niedościgłej doskonałości
+Demiurga - mówił mój ojciec - zbyt długo doskonałość jego tworu
paraliżowała naszą własną twórczość. Nie chcemy z nim konkurować. Nie
mamy ambicji mu dorównać. Chcemy być twórcami we własnej, niższej
sferze, pragniemy dla siebie twórczości, pragniemy rozkoszy twórczej,
-pragniemy--jednym słowem--demiurgii.--Nie wiem, w czyim imieniu
+pragniemy - jednym słowem - demiurgii. - Nie wiem, w czyim imieniu
proklamował mój ojciec te postulaty, jaka zbiorowość, jaka korporacja,
sekta czy zakon, nadawała swą solidarnością patos jego słowom. Co do
nas, to byliśmy dalecy od wszelkich zakusów demłurgicznych. Lecz ojciec
mój rozwinął tymczasem program tej wtórej demiurgii, obraz tej drugiej
generacji stworzeń, która stanąć miała w otwartej opozycji do panującej
-epoki.--Nie zależy nam--mówił on--na tworach o długim oddechu, na
+epoki. - Nie zależy nam - mówił on - na tworach o długim oddechu, na
istotach na daleką metę. Nasze kreatury nie będą bohaterami romansów w
-wielu tomach. Ich role będą krótkie, lapidarne, ich charaktery--bez
+wielu tomach. Ich role będą krótkie, lapidarne, ich charaktery - bez
dalszych planów. Często dla jednego gestu, dla jednego słowa podejmiemy
się trudu powołania ich do życia na tę jedną chwilę. Przyznajemy
otwarcie: nie będziemy kładli nacisku na trwałość ani solidność
@@ -876,9 +876,9 @@ powołamy do życia innego człowieka. Taki jest nasz smak, to będzie świat
według naszego gustu. Demiurgos kochał się w wytrawnych, doskonałych i
skomplikowanych materiałach, my dajemy pierwszeństwo tandecie. Po prostu
porywa nas, zachwyca taniość, lichota, tandetność materiału. Czy
-rozumiecie--pytał mój ojciec--głęboki sens tej słabości, tej pasji do
+rozumiecie - pytał mój ojciec - głęboki sens tej słabości, tej pasji do
pstrej bibułki, do papier mâ ché , do lakowej farby, do kłaków i
-trociny? To jest--mówił z bolesnym uśmiechem--nasza miłość do materii
+trociny? To jest - mówił z bolesnym uśmiechem - nasza miłość do materii
jako takiej, do jej puszystości i porowatości, do jej jedynej,
mistycznej konsystencji. Demiurgos, ten wielki mistrz i artysta, czyni
ją niewidzialną, każe jej zniknąć pod grą życia. My, przeciwnie, kochamy
@@ -887,8 +887,8 @@ gestem, pod każdym ruchem widzieć jej ociężały wysiłek, jej bezwład, jej
słodką niedźwiedziowatość. Dziewczęta siedziały nieruchomo z szklanymi
oczyma. Twarze ich były wyciągnięte i zgłupiałe zasłuchaniem, policzki
podmalowane wypiekami, trudno było w tej chwili ocenić, czy należą do
-pierwszej, czy do drugiej generacji stworzenia.--Słowem--konkludował
-mój ojciec--chcemy stworzyć po raz wtóry człowieka, na obraz i
+pierwszej, czy do drugiej generacji stworzenia. - Słowem - konkludował
+mój ojciec - chcemy stworzyć po raz wtóry człowieka, na obraz i
podobieństwo manekinu. Tu musimy dla wierności sprawozdawczej opisać
pewien drobny i błahy incydent, który zaszedł w tym punkcie prelekcji i
do którego nie przywiązujemy żadnej wagi. Incydent ten, całkowicie
@@ -907,11 +907,11 @@ po obu bokach. Wszystkie trzy patrzyły rozszerzonymi oczami na ojca. Mój
ojciec chrząknął, zamilkł, pochylił się i stał się nagle bardzo
czerwony. W jednej chwili lineatura jego twarzy, dopiero co tak
rozwichrzona i pełna wibracji, zamknęła się na spokorniałych rysach. On
-- herezjarcha natchniony, ledwo wypuszczony z wichru uniesienia--złożył
+- herezjarcha natchniony, ledwo wypuszczony z wichru uniesienia - złożył
się nagle w sobie, zapadł i zwinął. A może wymieniono go na innego. Ten
inny siedział sztywny, bardzo czerwony, ze spuszczonymi oczyma. Panna
Polda podeszła i pochyliła się nad nim. Klepiąc go lekko po plecach,
-mówiła tonem łagodnej zachęty:--Jakub będzie rozsądny, Jakub posłucha,
+mówiła tonem łagodnej zachęty: - Jakub będzie rozsądny, Jakub posłucha,
Jakub nie będzie uparty. No, proszę... Jakub, Jakub... Wypięty
pantofelek Adeli drżał lekko i błyszczał jak języczek węża. Mój ojciec
podniósł się powoli ze spuszczonymi oczyma, postąpił krok naprzód, jak
@@ -924,8 +924,8 @@ odnowioną swadą ciemny i zawiły swój temat. Lineatura jego zmarszczek
rozwijała się i zawijała z wyrafinowaną chytrością. W każdej spirali
ukryty był pocisk ironii. Ale czasami inspiracja rozszerzała kręgi jego
zmarszczek, które rosły jakąś ogromną wirującą grozą, uchodząc w
-milczących wolutach w głąb nocy zimowej.--Figury panopticum, moje panie
-- zaczął on--kalwaryjskie parodie manekinów, ale nawet w tej postaci
+milczących wolutach w głąb nocy zimowej. - Figury panopticum, moje panie
+- zaczął on - kalwaryjskie parodie manekinów, ale nawet w tej postaci
strzeżcie się lekko je traktować. Materia nie zna żartów. Jest ona
zawsze pełna tragicznej powagi. Kto ośmiela się myśleć, że można igrać z
materią, że kształtować ją można dla żartu, że żart nie wrasta w nią,
@@ -971,9 +971,9 @@ zażądała bardzo dobitnie... Panienki siedziały sztywno, ze spuszczonymi
oczyma, w dziwnej drętwości...
TRAKTAT O MANEKINACH Dokończenie Któregoś z następnych wieczorów ojciec
-mój w te słowa ciągnął dalej swą prelekcję:--Nie o tych
+mój w te słowa ciągnął dalej swą prelekcję: - Nie o tych
nieporozumieniach ucieleśnionych, nie o tych smutnych parodiach, moje
-panie, owocach prostackiej i wulgarnej niepowściągliwości--chciałem
+panie, owocach prostackiej i wulgarnej niepowściągliwości - chciałem
mówić zapowiadając mą rzecz o manekinach. Miałem na myśli coś innego. Tu
ojciec mój zaczął budować przed naszymi oczyma obraz tej wymarzonej
przez niego „generaiio aequivoca”, jakiegoś pokolenia istot na wpół
@@ -984,8 +984,8 @@ mylił. Były to w istocie istoty amorfne, bez wewnętrznej struktury,
płody imitatywnej tendencji materii, która obdarzona pamięcią, powtarza
z przyzwyczajenia raz przyjęte kształty. Skala morfologii, której
podlega materia, jest w ogóle ograniczona i pewien zasób form powtarza
-się wciąż na różnych kondygnacjach bytu. Istoty te--ruchliwe, wrażliwe
-na bodźce, a jednak dalekie od prawdziwego życia--można było otrzymać
+się wciąż na różnych kondygnacjach bytu. Istoty te - ruchliwe, wrażliwe
+na bodźce, a jednak dalekie od prawdziwego życia - można było otrzymać
zawieszając pewne skomplikowane koloidy w roztworach soli kuchennej.
Koloidy te po kilku dniach formowały się, organizowały w pewne
zagęszczenia substancji przypominającej niższe formy fauny. U istot tak
@@ -995,8 +995,8 @@ białkowych ani w ogóle związków węgla. Wszelako prymitywne te formy były
niczym w porównaniu z bogactwem kształtów i wspaniałości pseudofauny i
flory, która pojawia się niekiedy w pewnych ściśle określonych
środowiskach. Środowiskami tymi są stare mieszkania, przesycone
-emanacjami wielu żywotów i zdarzeń--zużyte atmosfery, bogate w
-specyficzne ingrediencje marzeń ludzkich--rumowiska, obfitujące w humus
+emanacjami wielu żywotów i zdarzeń - zużyte atmosfery, bogate w
+specyficzne ingrediencje marzeń ludzkich - rumowiska, obfitujące w humus
wspomnień, tęsknot, jałowej nudy. Na takiej glebie owa pseudowegetacja
kiełkowała szybko i powierzchownie, pasożytowała obficie i efemerycznie,
pędziła krótkotrwałe generacje, które rozkwitały raptownie i świetnie,
@@ -1006,15 +1006,15 @@ kadencjach rytmów; nic dziwnego, że schodzą na manowce dalekich,
ryzykownych rojeń. Rdzeń mebli, ich substancja musi już być rozluźniona,
zdegenerowana i podległa występnym pokusom: wtedy na tej chorej,
zmęczonej i zdziczałej glebie wykwita, jak piękna wysypka, nalot
-fantastyczny, kolorowa, bujająca pleśń.--Wiedzą panie--mówił ojciec
-mój--że w starych mieszkaniach bywają pokoje, o których się zapomina.
+fantastyczny, kolorowa, bujająca pleśń. - Wiedzą panie - mówił ojciec
+mój - że w starych mieszkaniach bywają pokoje, o których się zapomina.
Nie odwiedzane miesiącami, więdną w opuszczeniu między starymi murami i
zdarza się, że zasklepiają się w sobie, zarastają cegłą i, raz na zawsze
stracone dla naszej pamięci, powoli tracą też swą egzystencję. Drzwi,
prowadzące do nich z jakiegoś podestu tylnych schodów, mogą być tak
dhigo przeoczane przez domowników, aż wrastają, wchodzą w ścianę, która
-zaciera ich ślad w fantastycznym rysunku pęknięć i rys.--Wszedłem raz--
-mówił ojciec mój--wczesnym rankiem na schyłku zimy, po wielu miesiącach
+zaciera ich ślad w fantastycznym rysunku pęknięć i rys. - Wszedłem raz -
+mówił ojciec mój - wczesnym rankiem na schyłku zimy, po wielu miesiącach
nieobecności, do takiego na wpół zapomnianego traktu i zdumiony byłem
wyglądem tych pokojów. Z wszystkich szpar w podłodze, z wszystkich
gzymsów i framug wystrzelały cienkie pędy i napełniały szare powietrze
@@ -1026,14 +1026,14 @@ fontanny koronkowego listowia, bijące aż pod malowane niebo sufitu
rozpylonym chlorofilem. W przyspieszonym procesie kwitnienia kiełkowały
w tym listowiu ogromne, białe i różowe kwiaty, pączkowały w oczach,
bujały od środka różowym miąższem i przelewały się przez brzegi, gubiąc
-płatki i rozpadając się w prędkim przekwitaniu.--Byłem szczęśliwy--
-mówił mój ojciec--z tego niespodzianego rozkwitu, który napełnił
+płatki i rozpadając się w prędkim przekwitaniu. - Byłem szczęśliwy -
+mówił mój ojciec - z tego niespodzianego rozkwitu, który napełnił
powietrze migotliwym szelestem, łagodnym szumem, przesypującym się jak
kolorowe confetti przez cienkie rózgi gałązek. Widziałem, jak z drgania
powietrza, z fermentacji zbyt bogatej aury wydziela się i materializuje
to pospieszne kwitnienie, przelewanie się i rozpadanie fantastycznych
oleandrów, które napełniły pokój rzadką, leniwą śnieżycą wielkich,
-różowych kiści kwietnych.--Nim zapadł wieczór--kończył ojciec--nie
+różowych kiści kwietnych. - Nim zapadł wieczór - kończył ojciec - nie
było już śladu tego świetnego rozkwitu. Cała złudna ta fatamorgana była
tylko mistyfikacją, wypadkiem dziwnej symulacji materii, która podszywa
się pod pozór życia. Ojciec mój był dnia tego dziwnie ożywiony,
@@ -1043,8 +1043,8 @@ odcieni, jakie przybierała wielokształtna materia. Fascynowały go formy
graniczne, wątpliwe i problematyczne, jak ektoplazma somnambulików,
pseudomateria, emanacja kataleptyczna mózgu, która w pewnych wypadkach
rozrastała się z ust uśpionego na cały stół, napełniała cały pokój, jako
-bujająca, rzadka tkanka, astralne ciasto, na pograniczu ciała i ducha.--
-Kto wie--mówił--ile jest cierpiących, okaleczonych, fragmentarycznych
+bujająca, rzadka tkanka, astralne ciasto, na pograniczu ciała i ducha. -
+Kto wie - mówił - ile jest cierpiących, okaleczonych, fragmentarycznych
postaci życia, jak sztucznie sklecone, gwoździami na gwałt zbite życie
szaf i stołów, ukrzyżowanego drzewa, cichych męczenników okrutnej
pomysłowości ludzkiej. Straszliwe transplantacje obcych i nienawidzących
@@ -1056,9 +1056,9 @@ gdy to mówił, rozeszła się zamyśloną lineaturą zmarszczek, stała się
podobna do sęków i słojów starej deski, z której zheblowano wszystkie
wspomnienia. Przez chwilę myśleliśmy, że ojciec popadnie w stan
drętwoty, który nawiedzał go czasem, ale ocknął się nagle, opamiętał i
-tak ciągnął dalej:--Dawne, mistyczne plemiona balsamowały swych
+tak ciągnął dalej: - Dawne, mistyczne plemiona balsamowały swych
umarłych. W ściany ich mieszkań były wprawione, wmurowane ciała, twarze:
-w salonie stał ojciec--wypchany, wygarbowana żona-nieboszczka była
+w salonie stał ojciec - wypchany, wygarbowana żona-nieboszczka była
dywanem pod stołem. Znałem pewnego kapitana, który miał w swej kajucie
lampę-meluzynę, zrobioną przez malajskich balsamistów z jego
zamordowanej kochanki. Na głowie miała ogromne rogi jelenie. W ciszy
@@ -1068,8 +1068,8 @@ pękająca od cichego szeptu. Głowonogi, żółwie i ogromne kraby,
zawieszone na belkach sufitu jako kandelabry i pająki, przebierały w tej
ciszy bez końca nogami, szły i szły na miejscu... Twarz mojego ojca
przybrała naraz wyraz troski i smutku, gdy myśli jego na drogach nie
-wiedzieć jakich asocjacji przeszły do nowych przykładów:--Czy mam
-przemilczeć--mówił przyciszonym głosem--że brat mój na skutek długiej
+wiedzieć jakich asocjacji przeszły do nowych przykładów: - Czy mam
+przemilczeć - mówił przyciszonym głosem - że brat mój na skutek długiej
i nieuleczalnej choroby zamienił się stopniowo w zwój kiszek gumowych,
że biedna moja kuzynka dniem i nocą nosiła go w poduszkach, nucąc
nieszczęśliwemu stworzeniu nieskończone kołysanki nocy zimowych? Czy
@@ -1077,8 +1077,8 @@ może być coś smutniejszego niż człowiek zamieniony w kiszkę hegarową? Co
za rozczarowanie dla rodziców, co za dezorientacja dla ich uczuć, co za
rozwianie wszystkich nadziei, wiązanych z obiecującym młodzieńcem! A
jednak wierna miłość biednej kuzynki towarzyszyła mu i w tej przemianie.
-- Ach! nie mogę już dłużej, nie mogę tego słuchać!--jęknęła Polda
-przechylając się na krześle.--Ucisz go, Adelo... Dziewczęta wstały,
+- Ach! nie mogę już dłużej, nie mogę tego słuchać! - jęknęła Polda
+przechylając się na krześle. - Ucisz go, Adelo... Dziewczęta wstały,
Adela podeszła do ojca i wyciągniętym palcem uczyniła ruch zaznaczający
łaskotanie. Ojciec stropił się, zamilkł i zaczął, pełen przerażenia,
cofać się tyłem przed kiwającym się palcem Adeli. Ta szła za nim ciągle,
@@ -1095,9 +1095,9 @@ pierwszego wejrzenia zdobyła sobie ta kruszynka życia cały zachwyt, cały
entuzjazm chłopięcej duszy. Z jakiego nieba spadł tak niespodzianie ten
ulubieniec bogów, milszy sercu od najpiękniejszych zabawek? Że też
stare, zgoła nieinteresujące pomywaczki wpadają niekiedy na tak świetne
-pomysły i przynoszą z przedmieścia--o całkiem wczesnej,
-transcendentalnej porannej godzinie--takiego oto pieska do naszej
-kuchni! Ach! było się jeszcze--niestety--nieobecnym, nieurodzonym z
+pomysły i przynoszą z przedmieścia - o całkiem wczesnej,
+transcendentalnej porannej godzinie - takiego oto pieska do naszej
+kuchni! Ach! było się jeszcze - niestety - nieobecnym, nieurodzonym z
ciemnego łona snu, a już to szczęście ziściło się, już czekało na nas,
niedołężnie leżące na chłodnej podłodze kuchni, nie docenione przez
Adelę i domowników. Dlaczego nie obudzono mnie wcześniej! Talerzyk mleka
@@ -1131,16 +1131,16 @@ mordkę z kroplą mleka na brodzie i wycofać się niedołężnie z kąpieli
mlecznej. Chód jego był niezgrabnym toczeniem się, bokiem na ukos w
niezdecydowanym kierunku, po linii trochę pijanej i chwiejnej. Dominantą
jego nastroju była jakaś nieokreślona i zasadnicza żałość, sieroctwo i
-bezradność--niezdolność do zapełnienia czymś pustki życia pomiędzy
+bezradność - niezdolność do zapełnienia czymś pustki życia pomiędzy
sensacjami posiłków. Objawiało się to bezplanowością i niekonsekwencją
ruchów, irracjonalnymi napadami nostalgii z żałosnym skomleniem i
niemożnością znalezienia sobie miejsca. Nawet jeszcze w głębi snu, w
którym potrzebę oparcia się i przytulenia zaspokajać musiał używając do
-tego własnej swej osoby, zwiniętej w kłębek drżący--towarzyszyło mu
-poczucie osamotnienia i bezdomności. Ach, życie--młode i wątłe życie,
+tego własnej swej osoby, zwiniętej w kłębek drżący - towarzyszyło mu
+poczucie osamotnienia i bezdomności. Ach, życie - młode i wątłe życie,
wypuszczone z zaufanej ciemności, z przytulnego ciepła łona
macierzystego w wielki i obcy, świetlany świat, jakże kurczy się ono i
-cofa, jak wzdraga się zaakceptować tę imprezę, którą mu proponują--
+cofa, jak wzdraga się zaakceptować tę imprezę, którą mu proponują -
pełne awersji i zniechęcenia! Lecz zwolna mały Nemrod (otrzymał był to
dumne i wojownicze imię) zaczyna smakować w życiu. Wyłączne opanowanie
obrazem macierzystej prajedni ustępuje urokowi wielości. Świat zaczyna
@@ -1149,23 +1149,23 @@ czworobok porannego słońca na podłodze, na którym tak dobrze jest
położyć się, ruchy własnych członków, własne łapki, ogonek, figlarnie
wyzywający do zabawy z samym sobą, pieszczoty ręki ludzkiej, pod którymi
zwolna dojrzewa pewna swawolność, wesołość rozpierająca ciało i rodząca
-potrzebę zgoła nowych, gwałtownych i ryzykownych ruchów--wszystko to
+potrzebę zgoła nowych, gwałtownych i ryzykownych ruchów - wszystko to
przekupuje, przekonywa i zachęca do przyjęcia, do pogodzenia się z
eksperymentem życia. I jeszcze jedno. Nemrod zaczyna rozumieć, że to, co
mu się tu podsuwa, mimo pozorów nowości jest w gruncie rzeczy czymś, co
-już było--było wiele razy--nieskończenie wiele razy. Jego ciało
+już było - było wiele razy - nieskończenie wiele razy. Jego ciało
poznaje sytuacje, wrażenia i przedmioty. W gruncie rzeczy to wszystko
nie dziwi go zbytnio. W obliczu każdej nowej sytuacji daje nura w swoją
-pamięć, w głęboką pamięć ciała, i szuka omackiem, gorączkowo--i bywa,
+pamięć, w głęboką pamięć ciała, i szuka omackiem, gorączkowo - i bywa,
że znajduje w sobie odpowiednią reakcję już gotową: mądrość pokoleń,
złożoną w jego plazmie, w jego nerwach. Znajduje jakieś czyny, decyzje,
o których sam nie wiedział, że już w nim dojrzały, że czekały na to, by
wyskoczyć. Sceneria jego młodego życia, kuchnia z wonnymi cebrami, ze
ścierkami o skomplikowanej i intrygującej woni, z kłapaniem pantofli
-Adeli, z jej hałaśliwym krzątaniem się--nie straszy go więcej. Przywykł
+Adeli, z jej hałaśliwym krzątaniem się - nie straszy go więcej. Przywykł
uważać ją za swoją domenę, zadomowił się w niej i począł rozwijać w
stosunku do niej niejasne poczucie przynależności, ojczyzny. Chyba że
-niespodzianie spadał nań kataklizm w postaci szorowania podłogi--
+niespodzianie spadał nań kataklizm w postaci szorowania podłogi -
obalenie praw natury, chlusty ciepłego ługu, podmywające wszystkie
meble, i groźny szurgot szczotek Adeli. Ale niebezpieczeństwo mija,
szczotka uspokojona i nieruchoma leży cicho w kącie, schnąca podłoga
@@ -1191,13 +1191,13 @@ odwiecznym karakonim rytuałem. Wszelako uczucia nienawiści nie mają
jeszcze trwałości i mocy w duszy pieska. Nowoobudzona radość życia
przeistacza każde uczucie w wesołość. Nemrod szczeka jeszcze, lecz sens
tego szczekania zmienił się niepostrzeżenie, stało się ono swoją własną
-parodią--pragnąc w gruncie rzeczy wysłowić niewymowną udatność tej
+parodią - pragnąc w gruncie rzeczy wysłowić niewymowną udatność tej
świetnej imprezy życia, pełnej pikanterii, niespodzianych dreszczyków i
point.
PAN W kącie między tylnymi ścianami szop i przybudówek był zaułek
podwórza, najdalsza, ostatnia odnoga, zamknięta między komorę, wychodek
-i tylną ścianę kurnika--głucha zatoka, poza którą nie było już wyjścia.
+i tylną ścianę kurnika - głucha zatoka, poza którą nie było już wyjścia.
Był to najdalszy przylądek, Gibraltar tego podwórza, bijący rozpaczliwie
głową w ślepy parkan z poziomych desek, zamykającą i ostateczną ścianę
tego świata. Spod jego omszonych dyli wyciekała strużka czarnej,
@@ -1241,7 +1241,7 @@ chwastem wszelkim, aż w samym końcu między ścianami, w szerokiej
prostokątnej zatoce tracił wszelką miarę i wpadał w szał. Tam to nie był
już sad, tylko paroksyzm szaleństwa, wybuch wściekłości, cyniczny
bezwstyd i rozpusta. Tam, rozbestwione, dając upust swej pasji,
-panoszyły się puste, zdziczałe kapusty łopuchów--ogromne wiedźmy,
+panoszyły się puste, zdziczałe kapusty łopuchów - ogromne wiedźmy,
rozdziewające się w biały dzień ze swych szerokich spódnic, zrzucając je
z siebie, spódnica za spódnicą, aż ich wzdęte, szelestne, dziurawe
łachmany oszalałymi płatami grzebały pod sobą kłótliwe to plemię
@@ -1258,13 +1258,13 @@ w obłęd. O tej godzinie opanowywał mnie szał łowienia motyli, pasja
ścigania tych migocących plamek, tych błędnych, białych płatków,
trzęsących się w rozognionym powietrzu niedołężnym gzygzakiem. I
zdarzyło się wówczas, że któraś z tych jaskrawych plamek rozpadła się w
-locie na dwie, potem na trzy--i ten drgający, oślepiająco biały
+locie na dwie, potem na trzy - i ten drgający, oślepiająco biały
trójpunkt wiódł mnie, jak błędny ognik, przez szał bodiaków, palących
się w słońcu. Dopiero na granicy łopuchów zatrzymałem się, nie śmiejąc
się pogrążyć w to głuche zapadlisko. Wtedy nagle ujrzałem go. Zanurzony
po pachy w łopuchach, kucał przede mną. Widziałem jego grube bary w
brudnej koszuli i niechlujny strzęp surduta. Przyczajony jak do skoku,
-siedział tak--z barami jakby wielkim ciężarem zgarbionymi. Ciało jego
+siedział tak - z barami jakby wielkim ciężarem zgarbionymi. Ciało jego
dyszało z natężenia, a z miedzianej, błyszczącej w słońcu twarzy lał się
pot. Nieruchomy, zdawał się ciężko pracować, mocować się bez ruchu z
jakimś ogromnym brzemieniem. Stałem, przygwożdżony jego wzrokiem, który
@@ -1283,7 +1283,7 @@ wybaczał się coraz bardziej, aż wyłamał się ryczącym, charczącym kaszlem
śmiechu. Do głębi wstrząśnięty, widziałem, jak hucząc śmiechem z
potężnych piersi, dźwignął się powoli z kucek i zgarbiony jak goryl, z
rękoma w opadających łachmanach spodni, uciekał, człapiąc przez łopocące
-blachy łopuchów, wielkimi skokami--Pan bez fletu, cofający się w
+blachy łopuchów, wielkimi skokami - Pan bez fletu, cofający się w
popłochu do swych ojczystych kniei.
PAN KAROL Po południu w sobotę mój wuj, Karol, wdowiec słomiany,
@@ -1305,17 +1305,17 @@ się o szarym świcie zdyszany, oblany potem, wyrzucony na brzeg tego
stosu pościeli, którego zmóc nie mógł w ciężkich zapasach nocnych. Tak
na wpół wyrzucony z toni snu, wisiał przez chwilę nieprzytomny na
krawędzi nocy, chwytając piersiami powietrze, a pościel rosła dokoła
-niego, puchła i nakisała--i zarastała go znowu zwałem ciężkiego,
+niego, puchła i nakisała - i zarastała go znowu zwałem ciężkiego,
białawego ciasta. Spał tak do późnego przedpołudnia, podczas gdy
poduszki układały się w wielką, białą, płaską równinę, po której
wędrował uspokojony sen jego. Tymi białymi gościńcami powracał powoli do
-siebie, do dnia, do jawy--i wreszcie otwierał oczy, jak śpiący pasażer,
+siebie, do dnia, do jawy - i wreszcie otwierał oczy, jak śpiący pasażer,
gdy pociąg zatrzymuje się na stacji. W pokoju panował odstały półmrok z
osadem wielu dni samotności i ciszy. Tylko okno kipiało od rannego
rojowiska much i story płonęły jaskrawo. Pan Karol wyziewał ze swego
ciała, z głębi jam cielesnych, resztki dnia wczorajszego. To ziewanie
chwytało go tak konwulsyjnie, jak gdyby chciało go odwrócić na nice. Tak
-wyrzucał z siebie ten piasek, te ciężary--nie strawione restancje dnia
+wyrzucał z siebie ten piasek, te ciężary - nie strawione restancje dnia
wczorajszego. Ulżywszy sobie w ten sposób, i swobodniejszy, wciągał do
notesu wydatki, kalkulował, obliczał i marzył. Potem leżał długo
nieruchomy, z szklanymi oczyma, które były koloru wody, wypukłe i
@@ -1346,7 +1346,7 @@ otumanieni z tych zatraconych dali powracał znów do siebie i do chwili;
widział swe stopy na dywanie, tłuste i delikatne jak u kobiety, i powoli
wyjmował złote spinki z mankietów dziennej koszuli. Potem szedł do
kuchni i znajdował tam w cienistym kącie wiaderko z wodą, krążek
-cichego, czujnego zwierciadła, które nań tam czekało--jedyna żywa i
+cichego, czujnego zwierciadła, które nań tam czekało - jedyna żywa i
wiedząca istota w tym pustym mieszkaniu. Nalewał do miednicy wody i
kosztował skórą jej młodej i odstałej, słodkawej mokrości. Długo i
starannie robił toaletę, nie spiesząc się i włączając pauzy między
@@ -1362,19 +1362,19 @@ toaletę wśród tych mebli, które tolerowały go w milczeniu, z nieobecną
miną, i wreszcie był gotów, to stojąc na odejściu z kapeluszem w ręku,
czuł się zażenowany, że i w ostatniej chwili nie mógł znaleźć słowa,
które by rozwiązało to wrogie milczenie, i odchodził ku drzwiom
-zrezygnowany, zwolna, ze spuszczoną głową--gdy w przeciwną stronę
-oddalał się tymczasem bez pośpiechu--w głąb zwierciadła--ktoś
-odwrócony na zawsze plecami--przez pustą amfiladę pokojów, które nie
+zrezygnowany, zwolna, ze spuszczoną głową - gdy w przeciwną stronę
+oddalał się tymczasem bez pośpiechu - w głąb zwierciadła - ktoś
+odwrócony na zawsze plecami - przez pustą amfiladę pokojów, które nie
istniały.
SKLEPY CYNAMONOWE W okresie najkrótszych, sennych dni zimowych, ujętych
z obu stron, od poranku i od wieczora, w futrzane krawędzie zmierzchów,
gdy miasto rozgałęziało się coraz głębiej w labirynty zimowych nocy, z
-trudem przywoływane przez krótki świt do opamiętania, do powrotu--
+trudem przywoływane przez krótki świt do opamiętania, do powrotu -
ojciec mój był już zatracony, zaprzedany, zaprzysiężony tamtej sferze.
Twarz jego i głowa zarastały wówczas bujnie i dziko siwym włosem,
sterczącym nieregularnie wiechciami, szczecinami, długimi pędzlami,
-strzelającymi z brodawek, z brwi, z dziurek od nosa--co nadawało jego
+strzelającymi z brodawek, z brwi, z dziurek od nosa - co nadawało jego
fizjonomii wygląd starego, nastroszonego lisa. Węch jego i słuch
zaostrzał się niepomiernie i znać było po grze jego milczącej i napiętej
twarzy, że za pośrednictwem tych zmysłów pozostaje on w ciągłym
@@ -1470,7 +1470,7 @@ spuszczonymi oczyma, w dyskretnym milczeniu, i pełni byli mądrości i
wyrozumienia dla ich najtajniejszych życzeń. Ale nade wszystko była tam
jedna księgarnia, w której raz oglądałem rzadkie i zakazane druki,
publikacje tajnych klubów, zdejmując zasłonę z tajemnic dręczących i
-upojnych. Tak rzadko zdarzała się sposobność odwiedzania tych sklepów--
+upojnych. Tak rzadko zdarzała się sposobność odwiedzania tych sklepów -
i w dodatku z małą, lecz wystarczającą sumą pieniędzy w kieszeni. Nie
można było pominąć tej okazji mimo ważności misji powierzonej naszej
gorliwości. Trzeba się było zapuścić według mego obliczenia w boczną
@@ -1484,7 +1484,7 @@ konfiguracja ulic nie odpowiadała oczekiwanemu obrazowi. Sklepów ani
śladu. Szedłem ulicą, której domy nie miały nigdzie bramy wchodowej,
tylko okna szczelnie zamknięte, ślepe odblaskiem księżyca. Po drugiej
stronie tych domów musi prowadzić właściwa ulica, od której te domy są
-dostępne--myślałem sobie. Z niepokojem przyspieszałem kroku, rezygnując
+dostępne - myślałem sobie. Z niepokojem przyspieszałem kroku, rezygnując
w duchu z myśli zwiedzenia sklepów. Byle tylko wydostać się stąd prędko
w znane okolice miasta. Zbliżałem się do wylotu, pełen niepokoju, gdzie
też ona mnie wyprowadzi. Wyszedłem na szeroki, rzadko zabudowany
@@ -1494,7 +1494,7 @@ ozdobne budynki bogaczy. W przerwach między nimi widniały parki i mury
sadów. Obraz przypominał z daleka ulicę Leszniańską w jej dolnych i
rzadko zwiedzanych okolicach. Światło księżyca, rozpuszczone w
tysiącznych barankach, w łuskach srebrnych na niebie, było blade i tak
-jasne jak w dzień--tylko parki i ogrody czerniały w tym srebrnym
+jasne jak w dzień - tylko parki i ogrody czerniały w tym srebrnym
krajobrazie. Przyjrzawszy się bacznie jednemu z budynków, doszedłem do
przekonania, że mam przed sobą tylną i nigdy nie widzianą stronę gmachu
gimnazjalnego. Właśnie dochodziłem do bramy, która ku memu zdziwieniu
@@ -1513,7 +1513,7 @@ stawiał zbyt ścisłych wymagań. Niektórzy przynosili sobie z domu
poduszki i układali się na ławkach do powierzchownej drzemki. I tylko
najpilniejsi rysowali pod samą świecą, w złotym kręgu jej blasku.
Czekaliśmy zazwyczaj długo na przyjście profesora, nudząc się wśród
-sennych rozmów. Wreszcie otwierały się drzwi jego pokoju i wchodził--
+sennych rozmów. Wreszcie otwierały się drzwi jego pokoju i wchodził -
mały, z piękną brodą, pełen ezoterycznych uśmiechów, dyskretnych
przemilczeń i aromatu tajemnicy. Szybko zaciskał za sobą drzwi gabinetu,
przez które w momencie otworzenia tłoczyła się za jego głową ciżba
@@ -1521,7 +1521,7 @@ gipsowych cieni, fragmentów klasycznych, bolesnych Niobid, Danaid i
Tantalidów, cały smutny i jałowy Olimp, więdnący od lat w tym muzeum
gipsów. Zmierzch tego pokoju mętniał i za dnia i przelewał się sennie od
gipsowych marzeń, pustych spojrzeń, blednących owali i zamyśleń
-odchodzących w nicość. Lubiliśmy nieraz podsłuchiwać pod drzwiami--
+odchodzących w nicość. Lubiliśmy nieraz podsłuchiwać pod drzwiami -
ciszy, pełnej westchnień i szeptów tego kruszejącego w pajęczynach
rumowiska, tego rozkładającego się w nudzie i monotonii zmierzchu bogów.
Profesor przechadzał się dostojnie, pełen namaszczenia, wzdłuż pustych
@@ -1587,7 +1587,7 @@ bijącym sercem, gotów do ucieczki za najlżejszym szmerem. Jakże mógłbym,
przyłapany, usprawiedliwić to moje nocne szpiegowanie, moje zuchwałe
wścibstwo? W którymś z głębokich pluszowych foteli mogła, nie
dostrzeżona i cicha, siedzieć córeczka dyrektora i podnieść nagle na
-mnie oczy znad książki--czarne, sybilińskie, spokojne oczy, których
+mnie oczy znad książki - czarne, sybilińskie, spokojne oczy, których
spojrzenia nikt z nas wytrzymać nie umiał. Ale cofnąć się w połowie
drogi, nie dokonawszy powziętego planu, poczytałbym był sobie za
tchórzostwo. Zresztą głęboka cisza panowała dookoła w pełnych przepychu
@@ -1611,7 +1611,7 @@ jeszcze nieskończoną drogę i, zatopiony w swych zawiłych procederach
niebieskich, nie myślał o świcie. Na ulicy czerniało kilka dorożek,
rozjechanych i rozklekotanych jak kalekie, drzemiące kraby czy karakony.
Woźnica nachylił się z wysokiego kozła. Miał twarz drobną, czerwoną i
-dobroduszną.--Pojedziemy, paniczu?--zapytał. Powóz zadygotał we
+dobroduszną. - Pojedziemy, paniczu? - zapytał. Powóz zadygotał we
wszystkich stawach i przegubach swego wieloczłonkowego ciała i ruszył na
lekkich obręczach. Ale kto w taką noc powierza się kaprysom
nieobliczalnego dorożkarza? Wśród klekotu szprych, wśród dudnienia pudła
@@ -1622,8 +1622,8 @@ kiwając nań przyjaźnie rękami. Odpowiedział im coś radośnie, po czym nie
zatrzymując pojazdu, rzucił mi lejce na kolana, spuścił się z kozła i
przyłączył do gromady kolegów. Koń, stary mądry koń dorożkarski,
oglądnął się pobieżnie i pojechał dalej jednostajnym, dorożkarskim
-kłusem. Właściwie koń ten budził zaufanie--wydawał się mądrzejszy od
-woźnicy. Ale powozić nie umiałem--trzeba się było zdać na jego wolę.
+kłusem. Właściwie koń ten budził zaufanie - wydawał się mądrzejszy od
+woźnicy. Ale powozić nie umiałem - trzeba się było zdać na jego wolę.
Wjechaliśmy na podmiejską ulicę ujętą z obu stron w ogrody. Ogrody te
przechodziły zwolna, w miarę posuwania się, w parki wielkodrzewne, a te
w lasy. Nie zapomnę nigdy tej jazdy świetlistej w najjaśniejszą noc
@@ -1647,8 +1647,8 @@ zbierał się wał białej piany śnieżnej, coraz wyższy i wyższy. Z trudem
przekopywał się koń przez czystą i świeżą jego masę. Wreszcie ustał.
Wyszedłem z dorożki. Dyszał ciężko ze zwieszoną głową. Przytuliłem jego
łeb do piersi, w jego wielkich czarnych oczach lśniły łzy. Wtedy
-ujrzałem na jego brzuchu okrągłą czarną ranę.---Dlaczego mi nie
-powiedziałeś?--szepnąłem ze łzami.--Drogi mój--to dla ciebie--rzekł
+ujrzałem na jego brzuchu okrągłą czarną ranę. - -Dlaczego mi nie
+powiedziałeś? - szepnąłem ze łzami. - Drogi mój - to dla ciebie - rzekł
i stał się bardzo mały, jak konik z drzewa. Opuściłem go. Czułem się
dziwnie lekki i szczęśliwy. Zastanawiałem się, czy czekać na małą
kolejkę lokalną, która tu zajeżdżała, czy też pieszo wrócić do miasta.
@@ -1741,7 +1741,7 @@ intymności, brudnego zmieszania. Dzielnica ta była eldoradem takich
dezerterów moralnych, takich zbiegów spod sztandaru godności własnej.
Wszystko zdawało się tam podejrzane i dwuznaczne, wszystko zapraszało
sekretnym mrugnięciem, cynicznie artykułowanym gestem, wyraźnie
-przymrużonym perskim okiem--do nieczystych nadziei, wszystko wyzwalało
+przymrużonym perskim okiem - do nieczystych nadziei, wszystko wyzwalało
z pęt niską naturę. Mało kto, nie uprzedzony, spostrzegał dziwną
osobliwość tej dzielnicy: brak barw, jak gdyby w tym tandetnym, w
pośpiechu wyrosłym mieście nie można było sobie pozwolić na luksus
@@ -1753,11 +1753,11 @@ rubrykach komercjalnych ogłoszeń, wśród których zagnieździły się
pasożytniczo podejrzane anonse, drażliwe notatki, wątpliwe ilustracje; i
wędrówki te były równie jałowe i bez rezultatu jak ekscytacje fantazji,
pędzonej przez szpalty i kolumny pornograficznych druków. Wchodziło się
-do jakiegoś krawca, żeby zamówić ubranie--ubranie o taniej elegancji,
+do jakiegoś krawca, żeby zamówić ubranie - ubranie o taniej elegancji,
tak charakterystycznej dla tej dzielnicy. Lokal był wielki i pusty,
bardzo wysoki i bezbarwny. Ogromne wielopiętrowe półki wznoszą się jedne
nad drugimi w nie określoną wysokość tej hali. Kondygnacje pustych półek
-wyprowadzają wzrok w górę aż pod sufit, który może być niebem--lichym,
+wyprowadzają wzrok w górę aż pod sufit, który może być niebem - lichym,
bezbarwnym, odrapanym niebem tej dzielnicy. Natomiast dalsze magazyny,
które widać przez otwarte drzwi, pełne są aż pod sufit pudeł i kartonów,
piętrzących się ogromną kartoteką, która rozpada się w górze, pod
@@ -1888,7 +1888,7 @@ pertraktacje z przekupnymi urzędnikami linii żelaznej. Zanim te
negocjacje się kończą, pociąg rusza, odprowadzany przez wolno sunący,
rozczarowany tłum, który odprowadza go daleko, ażeby się wreszcie
rozproszyć. Ulica, zacieśniona na chwilę do tego zaimprowizowanego
-dworca, pełnego zmierzchu i tchnienia dalekich dróg--rozwidnia się
+dworca, pełnego zmierzchu i tchnienia dalekich dróg - rozwidnia się
znowu, rozszerza i przepuszcza znów swym korytem beztroski monotonny
tłum spacerowiczów, który wędruje wśród gwaru rozmów wzdłuż wystaw
sklepowych, tych brudnych, szarych czworoboków, pełnych tandetnych
@@ -1899,14 +1899,14 @@ drapieżnym, posuwistym krokiem i mają w niedobrych, zepsutych twarzach
nieznaczną skazę, która je przekreśla: zezują czarnym, krzywym zezem lub
mają usta rozdarte, lub brak im koniuszka nosa. Mieszkańcy miasta dumni
są z tego odoru zepsucia, którym tchnie Ulica Krokodyli. Nie mamy
-potrzeby niczego sobie odmawiać--myślą z dumą--stać nas i na prawdziwą
+potrzeby niczego sobie odmawiać - myślą z dumą - stać nas i na prawdziwą
wielkomiejską rozpustę. Twierdzą oni, że każda kobieta w tej dzielnicy
-jest kokotą. W istocie wystarczy zwrócić uwagę na którąś--a natychmiast
+jest kokotą. W istocie wystarczy zwrócić uwagę na którąś - a natychmiast
spotyka się to uporczywe, lepkie spojrzenie, które nas zmraża rozkoszną
pewnością. Nawet dziewczęta szkolne noszą tu w pewien charakterystyczny
sposób kokardy, stawiają swoistą manierą smukłe nogi i mają tę nieczystą
skazę w spojrzeniu, w której leży preformowane przyszłe zepsucie. A
-jednak--a jednak czy mamy zdradzić ostatnią tajemnicę tej dzielnicy,
+jednak - a jednak czy mamy zdradzić ostatnią tajemnicę tej dzielnicy,
troskliwie ukrywany sekret Ulicy Krokodyli? Kilkakrotnie w trakcie
naszego sprawozdania stawialiśmy pewne znaki ostrzegawcze, dawaliśmy w
delikatny sposób wyraz naszym zastrzeżeniom. Uważny czytelnik nie będzie
@@ -1919,7 +1919,7 @@ giętkość. Powiedzmy bez ogródek: fatalnością tej dzielnicy jest, że nic
w niej nie dochodzi do skutku, nic nie odbiega od swego definitivum,
wszystkie ruchy rozpoczęte zawisają w powietrzu, wszystkie gesty
wyczerpują się przedwcześnie i nie mogą przekroczyć pewnego martwego
-punktu. Mogliśmy już zauważyć wielką bujność i rozrzutność--w
+punktu. Mogliśmy już zauważyć wielką bujność i rozrzutność - w
intencjach, w projektach i antycypacjach, która cechuje tę dzielnicę.
Cała ona nie jest niczym innym jak fermentacją pragnień, przedwcześnie
wybujałą i dlatego bezsilną i pustą. W atmosferze nadmiernej łatwości
@@ -1973,11 +1973,11 @@ pierze, które Adela raz w tygodniu wymiatała wraz z bezimiennym kurzem
pokoju. W wyłysiałych miejscach widać było workowe, grube płótno, z
którego wyłaziły kłaki konopne. Miałem ukryty żal do matki za łatwość, z
jaką przeszła do porządku dziennego nad stratą ojca. Nigdy go nie
-kochała--myślałem--a ponieważ ojciec nie był zakorzeniony w sercu
+kochała - myślałem - a ponieważ ojciec nie był zakorzeniony w sercu
żadnej kobiety, przeto nie mógł też wróść w żadną realność i unosił się
wiecznie na peryferii życia, w półrealnych regionach, na krawędziach
-rzeczywistosci. Nawet na uczciwą obywatelską śmierć nie zasłużył sobie--
-myślałem--wszystko u niego musiało, być dziwaczne i wątpliwe.
+rzeczywistosci. Nawet na uczciwą obywatelską śmierć nie zasłużył sobie -
+myślałem - wszystko u niego musiało, być dziwaczne i wątpliwe.
Postanowiłem w stosownej chwili zaskoczyć matkę otwartą rozmową. Owego
dnia (był ciężki dzień zimowy i od rana już sypał się miękki puch
zmierzchu) matka miała migrenę i leżała na sofie samotnie w salonie. W
@@ -1998,21 +1998,21 @@ nie mogły się powstrzymać, robiły perskie oczko, dawały sobie znaki,
mówiły niemym, kolorowym alfabetem, pełnym sekretnych znaczeń. Irytowało
mnie to szydercze porozumienie, ta migotliwa zmowa poza mymi plecami. Z
kolanami przyciśniętymi do sofy matki, badając dwoma palcami, jakby w
-zamyśleniu, delikatną materię jej szlafroka, rzekłem niby mimochodem:--
-Chciałem cię już od dawna zapytać: prawda, że to jest on?--I chociaż
+zamyśleniu, delikatną materię jej szlafroka, rzekłem niby mimochodem: -
+Chciałem cię już od dawna zapytać: prawda, że to jest on? - I chociaż
nie wskazałem nawet spojrzeniem na kondora, matka odgadła od razu,
zmieszała się bardzo i spuściła oczy. Dałem umyślnie upłynąć chwili,
żeby wykosztować jej zmieszanie, po czym z całym spokojem, opanowując
-wzbierający gniew, spytałem:--Jaki sens mają w takim razie te wszystkie
+wzbierający gniew, spytałem: - Jaki sens mają w takim razie te wszystkie
plotki i kłamstwa, które rozsiewasz o ojcu? Lecz jej rysy, które w
pierwszej chwili rozpadły się były w panice, zaczęły się znowu
-porządkować.--Jakie kłamstwa?--spytała mrugając oczyma, które były
-puste, nalane ciemnym błękitem, bez białka.--Znam je od Adeli--rzekłem
+porządkować. - Jakie kłamstwa? - spytała mrugając oczyma, które były
+puste, nalane ciemnym błękitem, bez białka. - Znam je od Adeli - rzekłem
- ale wiem, że pochodzą od ciebie; chcę wiedzieć prawdę. Usta jej drżały
-lekko, źrenice, unikając mego wzroku, powędrowały w kąt oka.--Nie
-kłamałam--rzekła, a usta- jej napęczniały i stały się małe zarazem.
-Uczułem, że mnie kokietuje jak kobieta mężczyznę.--Z tymi karakonami to
-prawda--sam przecież pamiętasz...--Zmieszałem się. Pamiętałem w
+lekko, źrenice, unikając mego wzroku, powędrowały w kąt oka. - Nie
+kłamałam - rzekła, a usta- jej napęczniały i stały się małe zarazem.
+Uczułem, że mnie kokietuje jak kobieta mężczyznę. - Z tymi karakonami to
+prawda - sam przecież pamiętasz... - Zmieszałem się. Pamiętałem w
istocie tę inwazję karakonów, ten zalew czarnego rojowiska, które
napełniało ciemność nocną, pajęczą bieganiną. Wszystkie szpary pełne
były drgających wąsów, każda szczelina mogła wystrzelić z nagła
@@ -2052,18 +2052,18 @@ opętany fascynacją awersji, która go wciągała w głąb swych zawiłych
dróg. Mój ojciec poruszał się wieloczłonkowym, skomplikowanym ruchem
dziwnego rytuału, w którym ze zgrozą poznałem imitację ceremoniału
karakoniego. Od tego czasu wyrzekliśmy się ojca. Podobieństwo do
-karakona występowało z dniem każdym wyraźniej--mój ojciec zamieniał się
+karakona występowało z dniem każdym wyraźniej - mój ojciec zamieniał się
w karakona. Zaczęliśmy się przyzwyczajać do tego. Widywaliśmy go coraz
-rzadziej, całymi tygodniami znikał gdzieś na swych karakonich drogach--
+rzadziej, całymi tygodniami znikał gdzieś na swych karakonich drogach -
przestaliśmy go odróżniać, zlał się w zupełności z tym czarnym
niesamowitym plemieniem. Kto mógł powiedzieć, czy żył gdzieś jeszcze w
jakiejś szparze podłogi, czy przebiegał nocami pokoje, zaplątany w afery
karakonie, czy też był może między tymi martwymi owadami, które Adela co
rana znaj-dowała brzuchem do góry leżące i najeżone nogami i które ze
-wstrętem brała na śmietniczkę i wyrzucała?--A jednak--powiedziałem
-zdetonowany--jestem pewny, że ten kondor to on.--Matka spojrzała na
-mnie spod rzęs:--Nie dręcz mnie, drogi--mówiłam ci już przecież, że
-ojciec podróżuje jako komiwojażer po kraju--przecież wiesz, że czasem w
+wstrętem brała na śmietniczkę i wyrzucała? - A jednak - powiedziałem
+zdetonowany - jestem pewny, że ten kondor to on. - Matka spojrzała na
+mnie spod rzęs: - Nie dręcz mnie, drogi - mówiłam ci już przecież, że
+ojciec podróżuje jako komiwojażer po kraju - przecież wiesz, że czasem w
nocy przyjeżdża do domu, ażeby przed świtem jeszcze dalej odjechać.
WICHURA Tej długiej i pustej zimy obrodziła ciemność w naszym mieście
@@ -2094,9 +2094,9 @@ doklęły swego. Przywołane rechotem naczyń, rozplotkowanym od brzegu do
brzegu, nadeszły wreszcie karawany, nadciągnęły potężne tabory wichru i
stanęły nad nocą. Ogromne obozowisko, czarny ruchomy amfiteatr zstępować
zaczął w potężnych kręgach ku miastu. I wybuchła ciemność ogromną
-wzburzoną wichurą i szalała przez trzy dni i trzy noce...--Nie
-pójdziesz dziś do szkoły--rzekła rano matka--jest straszna wichura na
-dworze.--W pokoju unosił się delikatny welon dymu, pachnący żywicą. Piec
+wzburzoną wichurą i szalała przez trzy dni i trzy noce... - Nie
+pójdziesz dziś do szkoły - rzekła rano matka - jest straszna wichura na
+dworze. - W pokoju unosił się delikatny welon dymu, pachnący żywicą. Piec
wył i gwizdał, jak gdyby uwiązana w nim była cała sfora psów czy
demonów. Wielki bohomaz, wymalowany na jego pękatym brzuchu, wykrzywiał
się kolorowym grymasem i fantastyczniał wzdętymi policzkami. Pobiegłem
@@ -2141,8 +2141,8 @@ Pokój drżał z lekka, obrazy na ścianach brzęczały. Szyby lśniły się
tłustym odblaskiem lampy. Firanki na oknie wisiały wzdęte i pełne
tchnienia tej burzliwej nocy. Przypomnieliśmy sobie, że ojca od rana nie
widziano. Wczesnym rankiem, domyślaliśmy się, musiał udać się do sklepu,
-gdzie go zaskóczyła wichura, odcinając mu powrót.--Cały dzień nic nie
-jadł--biadała matka. Starszy subiekt Teodor podjął się wyprawić w noc i
+gdzie go zaskóczyła wichura, odcinając mu powrót. - Cały dzień nic nie
+jadł - biadała matka. Starszy subiekt Teodor podjął się wyprawić w noc i
wichurę, żeby zanieść mu posiłek. Brat mój przyłączył się do wyprawy.
Okutani w wielkie niedźwiedzie futra, obciążyli kieszenie żelazkami i
moździerzami, balastem, który miał zapobiec porwaniu ich przez wichurę.
@@ -2227,7 +2227,7 @@ grymasy, podnosił wysoko brwi i śmiał się do siebie.
NOC WIELKIEGO SEZONU Każdy wie, że w szeregu zwykłych, normalnych lat
rodzi niekiedy zdziwaczały czas ze swego łona lata inne, lata osobliwe,
-lata wyrodne, którym--jak szósty, mały palec u ręki--wyrasta kędyś
+lata wyrodne, którym - jak szósty, mały palec u ręki - wyrasta kędyś
trzynasty, fałszywy miesiąc. Mówimy fałszywy, gdyż rzadko dochodzi on do
pełnego rozwoju. Jak dzieci późno spłodzone, pozostaje on w tyle ze
wzrostem, miesiąc garbusek, odrośl w połowie uwiędła i raczej domyślna
@@ -2235,7 +2235,7 @@ niż rzeczywista. Winna jest temu starcza niepowściągliwość lata, jego
rozpustna i późna żywotność. Bywa czasem, że sierpień minie, a stary
gruby pień lata rodzi z przyzwyczajenia jeszcze dalej, pędzi ze swego
próchna te dni-dziczki, dni-chwasty, jałowe i idiotyczne, dorzuca na
-dokładkę, za darmo, dni-kaczany, puste i niejadalne--dni białe,
+dokładkę, za darmo, dni-kaczany, puste i niejadalne - dni białe,
zdziwione i niepotrzebne. Wyrastają one, nieregularne i nierówne, nie
wykształcone i zrośnięte z sobą, jak palce potworkowatej ręki,
pączkujące i zwinięte w figę. Inni porównywają te dni do apokryfów,
@@ -2316,7 +2316,7 @@ jaskrawo w wielkie, gulgocące, rozpluskane narośle albo wykogucić się w
głupią kogucią maskę, czerwoną i piejącą, w kolorowe jesienne maszkary
fantastyczne i absurdalne. Zdawało się, że tak nadęte i piejące wzniosą
się w powietrze długimi kolorowymi łańcuchami i jak jesienne klucze
-ptaków przeciągać będą nad miastem--fantastyczne flotylle z bibułki i
+ptaków przeciągać będą nad miastem - fantastyczne flotylle z bibułki i
pogody jesiennej. Albo woziły się wśród krzyków na małych zgiełkliwych
wózkach, grających kolorowym turkotem kółek, szprych i dyszli. Wózki
zjeżdżały naładowane ich krzykiem i staczały się w dół ulicy aż do nisko
@@ -2339,9 +2339,9 @@ cichej zamieszce, w panice prędkiego rozkładu, w górze utrzymywał się i
rósł coraz wyżej milczący alarm zorzy, drgający świergotem miliona
cichych dzwonków, wzbierających wzlotem miliona cichych skowronków
lecących razem w jedną wielką, srebrną nieskończoność. Potem była już
-nagle noc--wielka noc, rosnąca jeszcze podmuchami wiatru, które ją
+nagle noc - wielka noc, rosnąca jeszcze podmuchami wiatru, które ją
rozszerzały. W jej wielokrotnym labiryncie wyłupane były gniazda jasne:
-sklepy--wielkie, kolorowe latarnie, pełne spiętrzonego towaru i zgiełku
+sklepy - wielkie, kolorowe latarnie, pełne spiętrzonego towaru i zgiełku
kupujących. Przez jasne szyby tych latani można było śledzić zgiełkliwy
i pełen dziwacznego ceremoniału obrzęd zakupów jesiennych. Ta wielka,
fałdzista noc jesienna, rosnąca cieniami, roszerzona wiatrami, kryła w
@@ -2353,12 +2353,12 @@ tandety, złoconych błahostek, cynfolii, trąbek, andrutów i kolorowych
miętówek, były stacjami lekkomyślności, grzechotkami beztroski,
rozsianymi na wiszarach ogromnej, labiryntowej, rozłopotanej wiatrami
nocy. Wielkie i ciemne tłumy płynęły w ciemności, w hałaśliwym
-zmieszaniu, w szurgocie tysięcy nóg, w gwarze tysięcy ust--rojna,
+zmieszaniu, w szurgocie tysięcy nóg, w gwarze tysięcy ust - rojna,
splątana wędrówka, ciągnąca arteriami jesiennego miasta. Tak płynęła ta
rzeka, pełna gwaru, ciemnych spojrzeń, chytrych łypnięć, pokawałkowana
rozmową, posiekana gawędą, wielka miazga plotek, śmiechów i zgiełku.
Zdawało się, że to ruszyły tłumami jesienne, suche makówki sypiące
-makiem--głowygrzechotki, ludzie-kołatki. Mój ojciec chodził
+makiem - głowygrzechotki, ludzie-kołatki. Mój ojciec chodził
zdenerwowany i kolorowy od wypieków, z błyszczącymi oczyma, w jasno
oświetlonym sklepie, i nasłuchiwał. Przez szyby wystawy i portalu
dochodził tu z daleka szum miasta, stłumiony gwar płynącej ciżby. Nad
@@ -2407,7 +2407,7 @@ ojciec mój jednym skokiem wspiął się na półki z suknem i, uwisły wysoko
nad tłumem, dął z całej siły w wielki puzon z rogu i trąbił na alarm.
Ale sklepienie nie napełniło się szumem aniołów, śpieszących na pomoc, a
zamiast tego każdemu jękowi trąby odpowiadał wielki, roześmiany chór
-tłumu.--Jakubie, handlować! Jakubie, sprzedawać!--wołali wszyscy, a
+tłumu. - Jakubie, handlować! Jakubie, sprzedawać! - wołali wszyscy, a
wołanie to, wciąż powtarzane, rytmizowało się w chórze i przechodziło
powoli w melodię refrenu, śpiewaną przez wszystkie gardła. Wtedy mój
ojciec dał za wygraną, zeskoczył z wysokiego gzymsu i ruszył z krzykiem
@@ -2460,7 +2460,7 @@ był błysk uśmiechniętej ironii. Wśród tych grup przewijał się pospolity
lud, bezpostaciowy tłum, gawiedź bez twarzy i indywidualności. Wypełniał
on niejako luki w krajobrazie, wyścielał tło dzwonkami i grzechotkami
bezmyślnego gadania. Był to element błazeński, roztańczony tłum
-poliszynelów i arlekinów, który--sam bez poważnych intencyj handlowych
+poliszynelów i arlekinów, który - sam bez poważnych intencyj handlowych
- doprowadzał do absurdu gdzieniegdzie nawiązujące się tansakcje swymi
błazeńskimi figlami. Stopniowo jednak, znudzony błaznowaniem, wesoły ten
ludek rozpraszał się w dalszych okolicach krajobrazu i tam powoli gubił
@@ -2475,7 +2475,7 @@ ciemne ich sylwety zaludniały całą tę pustynną wyżynę, nad którą zwisł
ciężkie i ciemne niebo, sfałdowane i chmurne, poorane w długie
równoległe bruzdy, w srebrne i białe skiby, ukazujące w głębi coraz
dalsze pokłady swego uwarstwienia. Światło lampy stwarzało sztuczny
-dzień w owej krainie--dzień dziwny, dzień bez świtu i wieczoru. Ojciec
+dzień w owej krainie - dzień dziwny, dzień bez świtu i wieczoru. Ojciec
mój uspokajał się powoli. Gniew jego układał się i zastygał w pokładach
i warstwach krajobrazu. Siedział teraz na galeriach wysokich półek i
patrzył w jesienniejący, rozległy kraj. Widział, jak na dalekich
@@ -2536,7 +2536,7 @@ wachlarzami, w które niepojętym sposobem tchnięto jakiś pozór życia.
Widziałem smutny powrót mego ojca. Sztuczny dzień zabarwiał się już
powoli kolorami zwyczajnego poranka. W spustoszałym sklepie najwyższe
półki syciły się barwami rannego nieba. Wśród fragmentów zgasłego
-pejzażu, wśród zburzonych kulis nocnej scenerii--ojciec widział
+pejzażu, wśród zburzonych kulis nocnej scenerii - ojciec widział
wstających ze snu subiektów. Podnosili się spomiędzy bali sukna i
ziewali do słońca. W kuchni, na piętrze, Adela, ciepła od snu i ze
zmierzwionymi włosami, mełła kawę na młynku, przyciskając go do białej
@@ -2552,7 +2552,7 @@ EOT;
Corrected EDITIONS of our eBooks get a new NUMBER, sklep11.txt
VERSIONS based on separate sources get new LETTER, sklep10a.txt
- Produced by Pawel Sobkowiak--Scanned and proofread by
+ Produced by Pawel Sobkowiak - Scanned and proofread by
Polska Biblioteka Internetowa
Project Gutenberg eBooks are often created from several printed
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Address.php
index 2f3593f5..68b6df07 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Address.php
@@ -24,6 +24,12 @@ class Address extends \Faker\Provider\Address
'MG', 'PA', 'PB', 'PR', 'PE', 'PI', 'RJ', 'RN', 'RS', 'RO', 'RR', 'SC',
'SP', 'SE', 'TO'
);
+ protected static $region = array(
+ 'Centro-Oeste', 'Nordeste', 'Norte', 'Sudeste', 'Sul'
+ );
+ protected static $regionAbbr = array(
+ 'CO', 'N', 'NE', 'SE', 'S'
+ );
protected static $country = array(
'Afeganistão', 'África do Sul', 'Albânia', 'Alemanha', 'Andorra',
'Angola', 'Antigua e Barbuda', 'Arabia Saudita', 'Argélia',
@@ -129,4 +135,20 @@ class Address extends \Faker\Provider\Address
{
return static::randomElement(static::$stateAbbr);
}
+
+ /**
+ * @example 'Nordeste'
+ */
+ public static function region()
+ {
+ return static::randomElement(static::$region);
+ }
+
+ /**
+ * @example 'NE'
+ */
+ public static function regionAbbr()
+ {
+ return static::randomElement(static::$regionAbbr);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Company.php
index 79592aeb..74f3567f 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Company.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Company.php
@@ -10,11 +10,11 @@ class Company extends \Faker\Provider\Company
'{{lastName}} {{companySuffix}}',
'{{lastName}}-{{lastName}}',
'{{lastName}} e {{lastName}}',
- '{{lastName}} de {{lastName}}',
- '{{lastName}}, {{lastName}} e {{lastName}}'
+ '{{lastName}} e {{lastName}} {{companySuffix}}',
+ '{{lastName}} Comercial Ltda.'
);
- protected static $companySuffix = array('e Filho', 'e Filha', 'e Filhos', 'e Associados', 'e Flia.', 'SRL', 'SA', 'S. de H.');
+ protected static $companySuffix = array('e Filhos', 'e Associados', 'Ltda.', 'S.A.');
/**
* A random CNPJ number.
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Payment.php
index 51b909fb..1a525613 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Payment.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/Payment.php
@@ -4,6 +4,59 @@ namespace Faker\Provider\pt_BR;
class Payment extends \Faker\Provider\Payment
{
+ protected static $cardVendors = array(
+ 'Visa', 'Visa', 'Visa', 'Visa', 'Visa',
+ 'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard', 'MasterCard',
+ 'American Express', 'Discover Card', 'Diners', 'Elo', 'Hipercard'
+ );
+
+ // see https://gist.github.com/erikhenrique/5931368 / http://pt.stackoverflow.com/q/3715/26461
+ protected static $cardParams = array(
+ 'Visa' => array(
+ "4##############"
+ ),
+ 'MasterCard' => array(
+ "5##############"
+ ),
+ 'American Express' => array(
+ "34############",
+ "37############"
+ ),
+ 'Discover Card' => array(
+ "6011###########",
+ "622############",
+ "64#############",
+ "65#############"
+ ),
+ 'Diners' => array(
+ "301############",
+ "301##########",
+ "305############",
+ "305##########",
+ "36#############",
+ "36###########",
+ "38#############",
+ "38###########",
+ ),
+ 'Elo' => array(
+ "636368#########",
+ "438935#########",
+ "504175#########",
+ "451416#########",
+ "636297#########",
+ "5067###########",
+ "4576###########",
+ "4011###########",
+ ),
+ 'Hipercard' => array(
+ "38#############",
+ "60#############",
+ ),
+ "Aura" => array(
+ "50#############"
+ )
+ );
+
/**
* International Bank Account Number (IBAN)
* @link http://en.wikipedia.org/wiki/International_Bank_Account_Number
@@ -16,4 +69,78 @@ class Payment extends \Faker\Provider\Payment
{
return static::iban($countryCode, $prefix, $length);
}
+
+
+ /**
+ * @see list of Brazilians banks (2018-02-15), source: https://pt.wikipedia.org/wiki/Lista_de_bancos_do_Brasil
+ */
+ protected static $banks = array(
+ 'BADESUL Desenvolvimento S.A. – Agência de Fomento/RS',
+ 'Banco Central do Brasil',
+ 'Banco da Amazônia',
+ 'Banco de Brasília',
+ 'Banco de Desenvolvimento de Minas Gerais',
+ 'Banco de Desenvolvimento do Espírito Santo',
+ 'Banco de Desenvolvimento do Paraná',
+ 'Banco do Brasil',
+ 'Banco do Estado de Sergipe Banese Estadual',
+ 'Banco do Estado do Espírito Santo Banestes',
+ 'Banco do Estado do Pará',
+ 'Banco do Estado do Rio Grande do Sul',
+ 'Banco do Nordeste do Brasil',
+ 'Banco Nacional de Desenvolvimento Econômico e Social',
+ 'Banco Regional de Desenvolvimento do Extremo Sul',
+ 'Caixa Econômica Federal',
+ 'Banco ABN Amro S.A.',
+ 'Banco Alfa',
+ 'Banco Banif',
+ 'Banco BBM',
+ 'Banco BMG',
+ 'Banco Bonsucesso',
+ 'Banco BTG Pactual',
+ 'Banco Cacique',
+ 'Banco Caixa Geral - Brasil',
+ 'Banco Citibank',
+ 'Banco Credibel',
+ 'Banco Credit Suisse',
+ 'Góis Monteiro & Co',
+ 'Banco Fator',
+ 'Banco Fibra',
+ 'Agibank',
+ 'Banco Guanabara',
+ 'Banco Industrial do Brasil',
+ 'Banco Industrial e Comercial',
+ 'Banco Indusval',
+ 'Banco Inter',
+ 'Banco Itaú BBA',
+ 'Banco ItaúBank',
+ 'Banco Itaucred Financiamentos',
+ 'Banco Mercantil do Brasil',
+ 'Banco Modal Modal',
+ 'Banco Morada',
+ 'Banco Pan',
+ 'Banco Paulista',
+ 'Banco Pine',
+ 'Banco Renner',
+ 'Banco Ribeirão Preto',
+ 'Banco Safra',
+ 'Banco Santander',
+ 'Banco Sofisa',
+ 'Banco Topázio',
+ 'Banco Votorantim',
+ 'Bradesco Bradesco',
+ 'Itaú Unibanco',
+ 'Banco Original',
+ 'Banco Neon',
+ 'Nu Pagamentos S.A',
+ 'XP Investimentos Corretora de Câmbio Títulos e Valores Mobiliários S.A',
+ );
+
+ /**
+ * @example 'Banco Neon'
+ */
+ public static function bank()
+ {
+ return static::randomElement(static::$banks);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php
index c66b0096..4949eef3 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/pt_BR/PhoneNumber.php
@@ -4,46 +4,42 @@ namespace Faker\Provider\pt_BR;
class PhoneNumber extends \Faker\Provider\PhoneNumber
{
-
- protected static $landlineFormats = array('2###-####', '3###-####');
-
- protected static $cellphoneFormats = array('7###-####', '8###-####', '9###-####');
+ protected static $landlineFormats = array('2###-####', '3###-####', '4###-####');
/**
- * Extracted from http://portal.embratel.com.br/embratel/9-digito/ (point 11)
- */
- protected static $ninthDigitAreaCodes = array(
- 11, 12, 13, 14, 15, 16, 17, 18, 19,
- 21, 22, 24, 27, 28,
- 91, 92, 93, 94, 95, 96, 97, 98, 99,
- //31, 32, 33, 34, 35, 37, 38, 71, 73, 74, 75, 77, 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, //by dec/2015
- //41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 53, 54, 55, 61,62, 63, 64, 65, 66, 67, 68, 69 //by dec/2016
- );
+ * Since december 2016 all mobile phone numbers in brazil begin with 9 and landlines 2, 3 or 4.
+ * @link http://www.anatel.gov.br/Portal/exibirPortalPaginaEspecial.do?org.apache.struts.taglib.html.TOKEN=9594e1d11fbc996d52bda44e608bb744&codItemCanal=1794&pastaSelecionada=2984
+ */
+ protected static $cellphoneFormats = array('9####-####');
/**
* Generates a 2-digit area code not composed by zeroes.
+ * @link http://www.anatel.gov.br/legislacao/resolucoes/16-2001/383-resolucao-263.
* @return string
*/
public static function areaCode()
{
- return static::randomDigitNotNull().static::randomDigitNotNull();
+ $areaCodes = array(
+ '11', '12', '13', '14', '15', '16', '17', '18', '19', '21', '22', '24',
+ '27', '28', '31', '32', '33', '34', '35', '37', '38', '41', '42', '43',
+ '44', '45', '46', '47', '48', '49', '51', '53', '54', '55', '61', '62',
+ '63', '64', '65', '66', '67', '68', '69', '71', '73', '74', '75', '77',
+ '79', '81', '82', '83', '84', '85', '86', '87', '88', '89', '91', '92',
+ '93', '94', '95', '96', '97', '98', '99'
+ );
+
+ return self::randomElement($areaCodes);
}
/**
- * Generates a 8/9-digit cellphone number without formatting characters.
+ * Generates a 9-digit cellphone number without formatting characters.
* @param bool $formatted [def: true] If it should return a formatted number or not.
- * @param bool $ninth [def: false] If the number should have a nine in the beginning or not.
- * If the generated number begins with 7 this is ignored.
* @return string
*/
- public static function cellphone($formatted = true, $ninth = false)
+ public static function cellphone($formatted = true)
{
$number = static::numerify(static::randomElement(static::$cellphoneFormats));
- if ($ninth && $number[0] != 7) {
- $number = "9$number";
- }
-
if (!$formatted) {
$number = strtr($number, array('-' => ''));
}
@@ -52,7 +48,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
}
/**
- * Generates an 8-digit landline number without formatting characters.
+ * Generates an 9-digit landline number without formatting characters.
* @param bool $formatted [def: true] If it should return a formatted number or not.
* @return string
*/
@@ -93,15 +89,14 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
{
$area = static::areaCode();
$number = ($type == 'cellphone')?
- static::cellphone($formatted, in_array($area, static::$ninthDigitAreaCodes)) :
+ static::cellphone($formatted) :
static::landline($formatted);
return $formatted? "($area) $number" : $area.$number;
}
/**
- * Concatenates {@link areaCode} and {@link cellphone} into a national cellphone number. The ninth digit is
- * derived from the area code.
+ * Concatenates {@link areaCode} and {@link cellphone} into a national cellphone number.
* @param bool $formatted [def: true] If it should return a formatted number or not.
* @return string
*/
@@ -124,7 +119,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
* Randomizes between complete cellphone and landline numbers.
* @return mixed
*/
- public static function phoneNumber()
+ public function phoneNumber()
{
$method = static::randomElement(array('cellphoneNumber', 'landlineNumber'));
return call_user_func("static::$method", true);
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php
index 4de0e93d..d804ff2c 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Address.php
@@ -4,7 +4,7 @@ namespace Faker\Provider\pt_PT;
class Address extends \Faker\Provider\Address
{
- protected static $streetPrefix = array('Av.', 'Avenida', 'R.', 'Rua', 'Travessa', 'Largo');
+ protected static $streetPrefix = array('Av.', 'Avenida', 'R.', 'Rua', 'Tv.', 'Travessa', 'Lg.', 'Largo');
protected static $streetNameFormats = array(
'{{streetPrefix}} {{lastName}}',
@@ -22,7 +22,7 @@ class Address extends \Faker\Provider\Address
/** @link http://www.univ-ab.pt/PINTAC/carta_normas.htm address example in letters **/
protected static $addressFormats = array(
- "{{streetAddress}}\n{{postcode}} {{city}}",
+ "{{streetAddress}} {{postcode}} {{city}}",
);
/** @link http://www.mapadeportugal.net/indicecidades.asp **/
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Company.php
new file mode 100644
index 00000000..971d18f5
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/pt_PT/Company.php
@@ -0,0 +1,16 @@
+getDateOfBirth($dateOfBirth);
+
+ if (is_null($county)) {
$countyCode = static::randomElement(array_values(static::$cnpCountyCodes));
+ } elseif (!array_key_exists($county, static::$cnpCountyCodes)) {
+ throw new \InvalidArgumentException("Invalid county code '{$county}' received");
} else {
$countyCode = static::$cnpCountyCodes[$county];
}
- $cnp = (string) static::cnpFirstDigit($gender, $century)
- . static::numerify('##')
- . sprintf('%02d', $this->generator->month())
- . sprintf('%02d', $this->generator->dayOfMonth())
- . $countyCode
- . static::numerify('##%')
+ $cnp = (string)$this->getGenderDigit($date, $gender, $isResident)
+ . $date->format('ymd')
+ . $countyCode
+ . static::numerify('##%')
;
- $cnp = static::cnpAddChecksum($cnp);
+ $checksum = $this->getChecksumDigit($cnp);
- return $cnp;
+ return $cnp.$checksum;
}
/**
- * Calculates the first digit for the Personal Numerical Code (CNP) based on
- * the gender and century
- *
- * @param string $gender Valid values: m, f, 1, 2
- * @param integer $century Valid values: 1800, 1900, 2000, 1, 2, 3, 4, 5, 6
- * @return integer
+ * @param $dateOfBirth
+ * @return \DateTime
*/
- protected static function cnpFirstDigit($gender = null, $century = null)
+ protected function getDateOfBirth($dateOfBirth)
{
- switch ($century) {
- case 1800:
+ if (empty($dateOfBirth)) {
+ $dateOfBirthParts = array(static::numberBetween(1800, 2099));
+ } else {
+ $dateOfBirthParts = explode('-', $dateOfBirth);
+ }
+ $baseDate = \Faker\Provider\DateTime::dateTimeBetween("first day of {$dateOfBirthParts[0]}", "last day of {$dateOfBirthParts[0]}");
+
+ switch (count($dateOfBirthParts)) {
+ case 1:
+ $dateOfBirthParts[] = $baseDate->format('m');
+ //don't break, we need the day also
+ case 2:
+ $dateOfBirthParts[] = $baseDate->format('d');
+ //don't break, next line will
case 3:
- case 4:
- $centuryCode = 2;
- break;
- case 1900:
- case 1:
- case 2:
- $centuryCode = 0;
- break;
- case 2000:
- case 5:
- case 6:
- $centuryCode = 4;
break;
default:
- $centuryCode = static::randomElement(array(0, 2, 4, 6, 9));
+ throw new \InvalidArgumentException("Invalid date of birth - must be null or in the 'Y-m-d', 'Y-m', 'Y' format");
}
- switch (strtolower($gender)) {
- case 'm':
- case 1:
- $genderCode = 1;
- break;
- case 'f':
- case 2:
- $genderCode = 2;
- break;
- default:
- $genderCode = static::randomElement(array(1, 2));
+ if ($dateOfBirthParts[0] < 1800 || $dateOfBirthParts[0] > 2099) {
+ throw new \InvalidArgumentException("Invalid date of birth - year must be between 1900 and 2099, '{$dateOfBirthParts[0]}' received");
}
- $firstDigit = $centuryCode + $genderCode;
+ $dateOfBirthFinal = implode('-', $dateOfBirthParts);
+ $date = \DateTime::createFromFormat('Y-m-d', $dateOfBirthFinal);
+ //a full (invalid) date might have been supplied, check if it converts
+ if ($date->format('Y-m-d') !== $dateOfBirthFinal) {
+ throw new \InvalidArgumentException("Invalid date of birth - '{$date->format('Y-m-d')}' generated based on '{$dateOfBirth}' received");
+ }
- return ($firstDigit > 9) ? 9 : $firstDigit;
+ return $date;
+ }
+
+ /**
+ *
+ * https://ro.wikipedia.org/wiki/Cod_numeric_personal#S
+ *
+ * @param \DateTime $dateOfBirth
+ * @param bool $isResident
+ * @param string $gender
+ * @return int
+ */
+ protected static function getGenderDigit(\DateTime $dateOfBirth, $gender, $isResident)
+ {
+ if (!$isResident) {
+ return 9;
+ }
+
+ if ($dateOfBirth->format('Y') < 1900) {
+ if ($gender == Person::GENDER_MALE) {
+ return 3;
+ }
+ return 4;
+ }
+
+ if ($dateOfBirth->format('Y') < 2000) {
+ if ($gender == Person::GENDER_MALE) {
+ return 1;
+ }
+ return 2;
+ }
+
+ if ($gender == Person::GENDER_MALE) {
+ return 5;
+ }
+ return 6;
}
/**
* Calculates a checksum for the Personal Numerical Code (CNP).
*
- * @param string $cnp Randomly generated CNP
- * @return string CNP with the last digit altered to a proper checksum
+ * @param string $value 12 digit CNP
+ * @return int checksum digit
*/
- protected static function cnpAddChecksum($cnp)
+ protected function getChecksumDigit($value)
{
$checkNumber = 279146358279;
$checksum = 0;
foreach (range(0, 11) as $digit) {
- $checksum += substr($cnp, $digit, 1) * substr($checkNumber, $digit, 1);
+ $checksum += (int)substr($value, $digit, 1) * (int)substr($checkNumber, $digit, 1);
}
$checksum = $checksum % 11;
- return substr($cnp, 0, 12) . ($checksum == 10 ? 1 : $checksum);
+ return $checksum == 10 ? 1 : $checksum;
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php
index 9e3c07fe..377e2245 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/PhoneNumber.php
@@ -43,12 +43,11 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
/**
* @link http://en.wikipedia.org/wiki/Telephone_numbers_in_Romania#Last_years
*/
- public static function phoneNumber()
+ public function phoneNumber()
{
$type = static::randomElement(array_keys(static::$normalFormats));
- $number = static::numerify(static::randomElement(static::$normalFormats[$type]));
- return $number;
+ return static::numerify(static::randomElement(static::$normalFormats[$type]));
}
public static function tollFreePhoneNumber()
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/Text.php
new file mode 100644
index 00000000..410c6f9b
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ro_RO/Text.php
@@ -0,0 +1,154 @@
+middleNameMale();
+ } elseif ($gender === static::GENDER_FEMALE) {
+ return $this->middleNameFemale();
+ }
+
+ return $this->middleName(static::randomElement(array(
+ static::GENDER_MALE,
+ static::GENDER_FEMALE,
+ )));
+ }
+
+ /**
+ * Return last name for the specified gender.
+ *
+ * @param string|null $gender A gender of the last name should be generated
+ * for. If the argument is skipped a random gender will be used.
+ * @return string Last name
+ */
+ public function lastName($gender = null)
+ {
+ $lastName = static::randomElement(static::$lastName);
+
+ if (static::GENDER_FEMALE === $gender) {
+ return $lastName . 'a';
+ } elseif (static::GENDER_MALE === $gender) {
+ return $lastName;
+ }
+
+ return $lastName . static::randomElement(static::$lastNameSuffix);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Text.php
index 871f7a13..7a989c28 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Text.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/ru_RU/Text.php
@@ -4,6 +4,13 @@ namespace Faker\Provider\ru_RU;
class Text extends \Faker\Provider\Text
{
+ public function realText($maxNbChars = 200, $indexSize = 2)
+ {
+ $realText = parent::realText($maxNbChars, $indexSize);
+
+ return iconv('UTF-8', 'UTF-8//IGNORE', $realText);
+ }
+
/**
* From ru.wikisource.org
*
@@ -21,7 +28,6 @@ class Text extends \Faker\Provider\Text
*
* Language: Russian
*
- * @licence Creative Commons Attribution-ShareAlike https://creativecommons.org/licenses/by-sa/3.0/deed.ru
* @see https://wikimediafoundation.org/wiki/Terms_of_Use/
* @link http://ru.wikisource.org/wiki/%D0%9C%D1%91%D1%80%D1%82%D0%B2%D1%8B%D0%B5_%D0%B4%D1%83%D1%88%D0%B8_(%D0%93%D0%BE%D0%B3%D0%BE%D0%BB%D1%8C)/%D0%A2%D0%BE%D0%BC_I/%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_I
* @var string
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Company.php
index 1f5fad2e..53091d55 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Company.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Company.php
@@ -46,7 +46,7 @@ class Company extends \Faker\Provider\Company
$result[] = static::randomElement($word);
}
- return join($result, ' ');
+ return join(' ', $result);
}
/**
@@ -59,6 +59,6 @@ class Company extends \Faker\Provider\Company
$result[] = static::randomElement($word);
}
- return join($result, ' ');
+ return join(' ', $result);
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php
index 2a3e658c..2ed758ac 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/sk_SK/Person.php
@@ -74,9 +74,9 @@ class Person extends \Faker\Provider\Person
'Cyprich', 'Cíger', 'Dacej', 'Danko', 'Debnár', 'Dej', 'Dekýš', 'Doležal', 'Dostál', 'Dočolomanský', 'Drajna', 'Droppa', 'Dubovský',
'Dudek', 'Dula', 'Dulla', 'Dusík', 'Dvonč', 'Dzurjanin', 'Dávid', 'Fabian', 'Fabián', 'Fajnor', 'Farkašovský', 'Feldek', 'Fico', 'Filc',
'Filip', 'Finka', 'Ftorek', 'Galis', 'Gallo', 'Gašpar', 'Gašparovič', 'Gocník', 'Golonka', 'Greguš', 'Grznár', 'Hablák', 'Habšuda',
- 'Haluška', 'Halák', 'Hanko', 'Hanzal', 'Hanzel', 'Hanzel', 'Haščák', 'Heretik', 'Hečko', 'Hečková', 'Hlaváček', 'Hlinka', 'Hochschorner',
+ 'Haluška', 'Halák', 'Hanko', 'Hanzal', 'Hanzel', 'Hanzel', 'Haščák', 'Heretik', 'Hečko', 'Hlaváček', 'Hlinka', 'Hochschorner',
'Holub', 'Holuby', 'Horváth', 'Hossa', 'Hraško', 'Hric', 'Hrmo', 'Hrušovský', 'Huba', 'Hudáček', 'Hála', 'Ihnačák', 'Janoška', 'Jantošovič',
- 'Janík', 'Jonata', 'Jurina', 'Jurinová', 'Jurík', 'Jáni', 'Jánošík', 'Kaliský', 'Karul', 'Karvaš', 'Keníž', 'Klapka', 'Klaus', 'Kolník',
+ 'Janík', 'Jonata', 'Jurina', 'Jurík', 'Jáni', 'Jánošík', 'Kaliský', 'Karul', 'Karvaš', 'Keníž', 'Klapka', 'Klaus', 'Kolník',
'Konstantinidis', 'Korec', 'Kostrec', 'Kováč', 'Kováčik', 'Koza', 'Kubík', 'Kučera', 'Labuda', 'Langoš', 'Lepšík', 'Lexa', 'Lintner',
'Lubina', 'Lukáč', 'Lupták', 'Líška', 'Majeský', 'Malachovský', 'Malíšek', 'Marián', 'Masaryk', 'Maslo', 'Matiaško', 'Medveď', 'Menyhért',
'Mečiar', 'Mečíř', 'Mikloško', 'Mikulík', 'Mikuš', 'Mikúš', 'Mišík', 'Mojžiš', 'Mokroš', 'Molnár', 'Moravčík', 'Musil', 'Mydlo', 'Nagy',
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Address.php
old mode 100755
new mode 100644
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Company.php
new file mode 100644
index 00000000..0e899bfe
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/sl_SI/Company.php
@@ -0,0 +1,14 @@
+middleNameMale();
+ } elseif ($gender === static::GENDER_FEMALE) {
+ return $this->middleNameFemale();
+ }
+
+ return $this->middleName(static::randomElement(array(
+ static::GENDER_MALE,
+ static::GENDER_FEMALE,
+ )));
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php
index b18a9b53..24187f33 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/PhoneNumber.php
@@ -4,26 +4,48 @@ namespace Faker\Provider\uk_UA;
class PhoneNumber extends \Faker\Provider\PhoneNumber
{
+ /**
+ * @see list of Ukraine mobile formats (2017-08-08), source: https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BB%D0%B5%D1%84%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BB%D0%B0%D0%BD_%D0%BD%D1%83%D0%BC%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8_%D0%A3%D0%BA%D1%80%D0%B0%D0%B8%D0%BD%D1%8B
+ */
protected static $formats = array(
// International format (mobile)
'+38050#######',
+ '+38066#######',
+ '+38068#######',
'+38096#######',
'+38067#######',
+ '+38091#######',
+ '+38092#######',
'+38093#######',
+ '+38094#######',
+ '+38095#######',
+ '+38096#######',
+ '+38097#######',
+ '+38098#######',
'+38063#######',
'+38099#######',
// Internal country format (mobile)
'050#######',
+ '066#######',
+ '068#######',
'096#######',
'067#######',
+ '091#######',
+ '092#######',
'093#######',
+ '094#######',
+ '095#######',
+ '096#######',
+ '097#######',
+ '098#######',
'063#######',
'099#######',
// More generic formats
'+38(0##)#######',
- '+38(0###)######'
+ '+38(0###)######',
+ '+38(0####)#####'
);
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php
index 38f686bf..337df3e5 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/uk_UA/Text.php
@@ -21,7 +21,6 @@ class Text extends \Faker\Provider\Text
*
* Language: Ukrainian
*
- * @licence Creative Commons Attribution-ShareAlike https://creativecommons.org/licenses/by-sa/3.0/deed.ru
* @see https://wikimediafoundation.org/wiki/Terms_of_Use/
* @link http://uk.wikisource.org/wiki/%D0%97%D0%B0%D1%85%D0%B0%D1%80_%D0%91%D0%B5%D1%80%D0%BA%D1%83%D1%82
* @var string
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/Address.php
index a520dcef..47414f1f 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/Address.php
@@ -104,7 +104,7 @@ class Address extends \Faker\Provider\Address
'Macao', 'Macedonia', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Martinique', 'Mauritania', 'Mauritius', 'Mayotte', 'Mexico', 'Micronesia', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Montserrat', 'Morocco', 'Mozambique', 'Myanmar',
'Namibia', 'Nauru', 'Nepal', 'Netherlands Antilles', 'Netherlands', 'New Caledonia', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'Niue', 'Norfolk Island', 'Northern Mariana Islands', 'Norway',
'Oman',
- 'Pakistan', 'Palau', 'Palestinian Territory', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico',
+ 'Pakistan', 'Palau', 'Palestinian Territories', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Pitcairn Islands', 'Poland', 'Portugal', 'Puerto Rico',
'Qatar',
'Reunion', 'Romania', 'Russian Federation', 'Rwanda',
'Saint Barthelemy', 'Saint Helena', 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Martin', 'Saint Pierre and Miquelon', 'Saint Vincent and the Grenadines', 'Samoa', 'San Marino', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovakia (Slovak Republic)', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Georgia and the South Sandwich Islands', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Svalbard & Jan Mayen Islands', 'Swaziland', 'Sweden', 'Switzerland', 'Syrian Arab Republic',
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php b/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php
index 694e3951..5f9f60a1 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/vi_VN/PhoneNumber.php
@@ -46,7 +46,7 @@ class PhoneNumber extends \Faker\Provider\PhoneNumber
),
);
- public static function phoneNumber()
+ public function phoneNumber()
{
$areaCode = static::randomElement(static::$areaCodes);
$areaCodeLength = strlen($areaCode);
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php
index f36a49a6..19d1c941 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Address.php
@@ -5,12 +5,108 @@ namespace Faker\Provider\zh_CN;
class Address extends \Faker\Provider\Address
{
- protected static $cites = array('北京', '上海', '天津', '重庆', '哈尔滨', '长春', '沈阳', '呼和浩特', '石家庄', '乌鲁木齐', '兰州', '西宁', '西安', '银川', '郑州', '济南', '太原', '合肥', '武汉', '长沙', '南京', '成都', '贵阳', '昆明', '南宁', '拉萨', '杭州', '南昌', '广州', '福州', '海口', '香港', '澳门');
+ protected static $cites = array(
+ '北京', '上海', '天津', '重庆',
+ '哈尔滨', '长春', '沈阳', '呼和浩特',
+ '石家庄', '乌鲁木齐', '兰州', '西宁',
+ '西安', '银川', '郑州', '济南',
+ '太原', '合肥', '武汉', '长沙',
+ '南京', '成都', '贵阳', '昆明',
+ '南宁', '拉萨', '杭州', '南昌',
+ '广州', '福州', '海口',
+ '香港', '澳门'
+ );
- protected static $areas = array('西夏区', '永川区', '秀英区', '高港区', '清城区', '兴山区', '锡山区', '清河区', '龙潭区', '华龙区', '海陵区', '滨城区', '东丽区', '高坪区', '沙湾区', '平山区', '城北区', '海港区', '沙市区', '双滦区', '长寿区', '山亭区', '南湖区', '浔阳区', '南长区', '友好区', '安次区', '翔安区', '沈河区', '魏都区', '西峰区', '萧山区', '金平区', '沈北新区', '孝南区', '上街区', '城东区', '牧野区', '大东区', '白云区', '花溪区', '吉利区', '新城区', '怀柔区', '六枝特区', '涪城区', '清浦区', '南溪区', '淄川区', '高明区');
+ protected static $states = array(
+ '北京市', '天津市', '河北省', '山西省',
+ '内蒙古自治区', '辽宁省', '吉林省',
+ '黑龙江省', '上海市', '江苏省',
+ '浙江省', '安徽省', '福建省', '江西省',
+ '山东省', '河南省', '湖北省', '湖南省',
+ '广东省', '广西壮族自治区', '海南省',
+ '重庆市', '四川省', '贵州省', '云南省',
+ '西藏自治区', '陕西省', '甘肃省', '青海省',
+ '宁夏回族自治区', '新疆维吾尔自治区',
+ '香港特别行政区', '澳门特别行政区', '台湾省'
+ );
+
+ protected static $stateAbbr = array(
+ '京', '皖', '渝', '闽',
+ '甘', '粤', '桂', '黔',
+ '琼', '冀', '豫', '黑',
+ '鄂', '湘', '吉', '苏',
+ '赣', '辽', '蒙', '宁',
+ '青', '鲁', '晋', '陕',
+ '沪', '川', '津', '藏',
+ '新', '滇', '浙', '港',
+ '澳', '台'
+ );
+
+ protected static $areas = array(
+ '西夏区', '永川区', '秀英区', '高港区',
+ '清城区', '兴山区', '锡山区', '清河区',
+ '龙潭区', '华龙区', '海陵区', '滨城区',
+ '东丽区', '高坪区', '沙湾区', '平山区',
+ '城北区', '海港区', '沙市区', '双滦区',
+ '长寿区', '山亭区', '南湖区', '浔阳区',
+ '南长区', '友好区', '安次区', '翔安区',
+ '沈河区', '魏都区', '西峰区', '萧山区',
+ '金平区', '沈北新区', '孝南区', '上街区',
+ '城东区', '牧野区', '大东区', '白云区',
+ '花溪区', '吉利区', '新城区', '怀柔区',
+ '六枝特区', '涪城区', '清浦区', '南溪区',
+ '淄川区', '高明区', '金水区', '中原区',
+ '高新开发区', '经济开发新区', '新区'
+ );
protected static $country = array(
- '阿富汗', '阿拉斯加', '阿尔巴尼亚', '阿尔及利亚', '安道尔', '安哥拉', '安圭拉岛英', '安提瓜和巴布达', '阿根廷', '亚美尼亚', '阿鲁巴岛', '阿森松', '澳大利亚', '奥地利', '阿塞拜疆', '巴林', '孟加拉国', '巴巴多斯', '白俄罗斯', '比利时', '伯利兹', '贝宁', '百慕大群岛', '不丹', '玻利维亚', '波斯尼亚和黑塞哥维那', '博茨瓦纳', '巴西', '保加利亚', '布基纳法索', '布隆迪', '喀麦隆', '加拿大', '加那利群岛', '佛得角', '开曼群岛', '中非', '乍得', '智利', '圣诞岛', '科科斯岛', '哥伦比亚', '巴哈马国', '多米尼克国', '科摩罗', '刚果', '科克群岛', '哥斯达黎加', '克罗地亚', '古巴', '塞浦路斯', '捷克', '丹麦', '迪戈加西亚岛', '吉布提', '多米尼加共和国', '厄瓜多尔', '埃及', '萨尔瓦多', '赤道几内亚', '厄立特里亚', '爱沙尼亚', '埃塞俄比亚', '福克兰群岛', '法罗群岛', '斐济', '芬兰', '法国', '法属圭亚那', '法属波里尼西亚', '加蓬', '冈比亚', '格鲁吉亚', '德国', '加纳', '直布罗陀', '希腊', '格陵兰岛', '格林纳达', '瓜德罗普岛', '关岛', '危地马拉', '几内亚', '几内亚比绍', '圭亚那', '海地', '夏威夷', '洪都拉斯', '匈牙利', '冰岛', '印度', '印度尼西亚', '伊郎', '伊拉克', '爱尔兰', '以色列', '意大利', '科特迪瓦', '牙买加', '日本', '约旦', '柬埔塞', '哈萨克斯坦', '肯尼亚', '基里巴斯', '朝鲜', '韩国', '科威特', '吉尔吉斯斯坦', '老挝', '拉脱维亚', '黎巴嫩', '莱索托', '利比里亚', '利比亚', '列支敦士登', '立陶宛', '卢森堡', '马其顿', '马达加斯加', '马拉维', '马来西亚', '马尔代夫', '马里', '马耳他', '马里亚纳群岛', '马绍尔群岛', '马提尼克', '毛里塔尼亚', '毛里求斯', '马约特岛', '墨西哥', '密克罗尼西亚', '中途岛', '摩尔多瓦', '摩纳哥', '蒙古', '蒙特塞拉特岛', '摩洛哥', '莫桑比克', '缅甸', '纳米比亚', '瑙鲁', '尼泊尔', '荷兰', '荷属安的列斯群岛', '新喀里多尼亚群岛', '新西兰', '尼加拉瓜', '尼日尔', '尼日利亚', '纽埃岛', '诺福克岛', '挪威', '阿曼', '帕劳', '巴拿马', '巴布亚新几内亚', '巴拉圭', '秘鲁', '菲律宾', '波兰', '葡萄牙', '巴基斯坦', '波多黎各', '卡塔尔', '留尼汪岛', '罗马尼亚', '俄罗斯', '卢旺达', '东萨摩亚', '西萨摩亚', '圣马力诺', '圣皮埃尔岛及密克隆岛', '圣多美和普林西比', '沙特阿拉伯', '塞内加尔', '塞舌尔', '新加坡', '斯洛伐克', '斯洛文尼亚', '所罗门群岛', '索马里', '南非', '西班牙', '斯里兰卡', '圣克里斯托弗和尼维斯', '圣赫勒拿', '圣卢西亚', '圣文森特岛', '苏丹', '苏里南', '斯威士兰', '瑞典', '瑞士', '叙利亚', '塔吉克斯坦', '坦桑尼亚', '泰国', '阿拉伯联合酋长国', '多哥', '托克劳群岛', '汤加', '特立尼达和多巴哥', '突尼斯', '土耳其', '土库曼斯坦', '特克斯和凯科斯群岛(', '图瓦卢', '美国', '乌干达', '乌克兰', '英国', '乌拉圭', '乌兹别克斯坦', '瓦努阿图', '梵蒂冈', '委内瑞拉', '越南', '维尔京群岛', '维尔京群岛和圣罗克伊', '威克岛', '瓦里斯和富士那群岛', '西撒哈拉', '也门', '南斯拉夫', '扎伊尔', '赞比亚', '桑给巴尔', '津巴布韦', '中华人民共和国', '中国'
+ '阿富汗', '阿拉斯加', '阿尔巴尼亚', '阿尔及利亚',
+ '安道尔', '安哥拉', '安圭拉岛英', '安提瓜和巴布达',
+ '阿根廷', '亚美尼亚', '阿鲁巴岛', '阿森松', '澳大利亚',
+ '奥地利', '阿塞拜疆', '巴林', '孟加拉国', '巴巴多斯',
+ '白俄罗斯', '比利时', '伯利兹', '贝宁', '百慕大群岛',
+ '不丹', '玻利维亚', '波斯尼亚和黑塞哥维那', '博茨瓦纳',
+ '巴西', '保加利亚', '布基纳法索', '布隆迪', '喀麦隆',
+ '加拿大', '加那利群岛', '佛得角', '开曼群岛', '中非',
+ '乍得', '智利', '圣诞岛', '科科斯岛', '哥伦比亚',
+ '巴哈马国', '多米尼克国', '科摩罗', '刚果', '科克群岛',
+ '哥斯达黎加', '克罗地亚', '古巴', '塞浦路斯', '捷克',
+ '丹麦', '迪戈加西亚岛', '吉布提', '多米尼加共和国',
+ '厄瓜多尔', '埃及', '萨尔瓦多', '赤道几内亚',
+ '厄立特里亚', '爱沙尼亚', '埃塞俄比亚', '福克兰群岛',
+ '法罗群岛', '斐济', '芬兰', '法国', '法属圭亚那',
+ '法属波里尼西亚', '加蓬', '冈比亚', '格鲁吉亚', '德国',
+ '加纳', '直布罗陀', '希腊', '格陵兰岛', '格林纳达',
+ '瓜德罗普岛', '关岛', '危地马拉', '几内亚', '几内亚比绍',
+ '圭亚那', '海地', '夏威夷', '洪都拉斯', '匈牙利', '冰岛',
+ '印度', '印度尼西亚', '伊郎', '伊拉克', '爱尔兰', '以色列',
+ '意大利', '科特迪瓦', '牙买加', '日本', '约旦', '柬埔塞',
+ '哈萨克斯坦', '肯尼亚', '基里巴斯', '朝鲜', '韩国', '科威特',
+ '吉尔吉斯斯坦', '老挝', '拉脱维亚', '黎巴嫩', '莱索托',
+ '利比里亚', '利比亚', '列支敦士登', '立陶宛', '卢森堡',
+ '马其顿', '马达加斯加', '马拉维', '马来西亚', '马尔代夫',
+ '马里', '马耳他', '马里亚纳群岛', '马绍尔群岛', '马提尼克',
+ '毛里塔尼亚', '毛里求斯', '马约特岛', '墨西哥', '密克罗尼西亚',
+ '中途岛', '摩尔多瓦', '摩纳哥', '蒙古', '蒙特塞拉特岛',
+ '摩洛哥', '莫桑比克', '缅甸', '纳米比亚', '瑙鲁', '尼泊尔',
+ '荷兰', '荷属安的列斯群岛', '新喀里多尼亚群岛', '新西兰',
+ '尼加拉瓜', '尼日尔', '尼日利亚', '纽埃岛', '诺福克岛',
+ '挪威', '阿曼', '帕劳', '巴拿马', '巴布亚新几内亚', '巴拉圭',
+ '秘鲁', '菲律宾', '波兰', '葡萄牙', '巴基斯坦', '波多黎各',
+ '卡塔尔', '留尼汪岛', '罗马尼亚', '俄罗斯', '卢旺达',
+ '东萨摩亚', '西萨摩亚', '圣马力诺', '圣皮埃尔岛及密克隆岛',
+ '圣多美和普林西比', '沙特阿拉伯', '塞内加尔', '塞舌尔',
+ '新加坡', '斯洛伐克', '斯洛文尼亚', '所罗门群岛', '索马里',
+ '南非', '西班牙', '斯里兰卡', '圣克里斯托弗和尼维斯',
+ '圣赫勒拿', '圣卢西亚', '圣文森特岛', '苏丹', '苏里南',
+ '斯威士兰', '瑞典', '瑞士', '叙利亚', '塔吉克斯坦', '坦桑尼亚',
+ '泰国', '阿拉伯联合酋长国', '多哥', '托克劳群岛', '汤加',
+ '特立尼达和多巴哥', '突尼斯', '土耳其', '土库曼斯坦',
+ '特克斯和凯科斯群岛(', '图瓦卢', '美国', '乌干达', '乌克兰',
+ '英国', '乌拉圭', '乌兹别克斯坦', '瓦努阿图', '梵蒂冈',
+ '委内瑞拉', '越南', '维尔京群岛', '维尔京群岛和圣罗克伊',
+ '威克岛', '瓦里斯和富士那群岛', '西撒哈拉', '也门', '南斯拉夫',
+ '扎伊尔', '赞比亚', '桑给巴尔', '津巴布韦', '中华人民共和国', '中国'
);
public function city()
@@ -18,6 +114,16 @@ class Address extends \Faker\Provider\Address
return static::randomElement(static::$cites);
}
+ public function state()
+ {
+ return static::randomElement(static::$states);
+ }
+
+ public function stateAbbr()
+ {
+ return static::randomElement(static::$stateAbbr);
+ }
+
public static function area()
{
return static::randomElement(static::$areas);
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Color.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Color.php
new file mode 100644
index 00000000..12d29e32
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Color.php
@@ -0,0 +1,66 @@
+format('a') === 'am' ? '上午' : '下午';
+ }
+
+ public static function dayOfWeek($max = 'now')
+ {
+ $map = array(
+ 'Sunday' => '星期日',
+ 'Monday' => '星期一',
+ 'Tuesday' => '星期二',
+ 'Wednesday' => '星期三',
+ 'Thursday' => '星期四',
+ 'Friday' => '星期五',
+ 'Saturday' => '星期六',
+ );
+ $week = static::dateTime($max)->format('l');
+ return isset($map[$week]) ? $map[$week] : $week;
+ }
+
+ public static function monthName($max = 'now')
+ {
+ $map = array(
+ 'January' => '一月',
+ 'February' => '二月',
+ 'March' => '三月',
+ 'April' => '四月',
+ 'May' => '五月',
+ 'June' => '六月',
+ 'July' => '七月',
+ 'August' => '八月',
+ 'September' => '九月',
+ 'October' => '十月',
+ 'November' => '十一月',
+ 'December' => '十二月',
+ );
+ $month = static::dateTime($max)->format('F');
+ return isset($map[$month]) ? $map[$month] : $month;
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php
index 10251dd2..ca10822c 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Internet.php
@@ -4,8 +4,13 @@ namespace Faker\Provider\zh_CN;
class Internet extends \Faker\Provider\Internet
{
- protected static $freeEmailDomain = array('gmail.com', 'yahoo.com', 'hotmail.com');
- protected static $tld = array('com', 'com', 'com', 'com', 'com', 'com', 'biz', 'info', 'net', 'org');
+ protected static $freeEmailDomain = array(
+ 'gmail.com', 'yahoo.com', 'hotmail.com', '126.com', '163.com', 'qq.com', 'sohu.com', 'sina.com'
+ );
+ protected static $tld = array(
+ 'com', 'com', 'com', 'com', 'com', 'com', 'biz', 'info', 'net', 'org', 'cn',
+ 'com.cn', 'edu.cn', 'net.cn', 'biz.cn', 'gov.cn', 'org.cn'
+ );
protected static $userNameFormats = array(
'{{word}}.{{word}}',
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Payment.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Payment.php
new file mode 100644
index 00000000..183fff13
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_CN/Payment.php
@@ -0,0 +1,41 @@
+ array(
- '桃園市', '中壢市', '大溪鎮', '楊梅鎮', '蘆竹鄉',
- '大園鄉', '龜山鄉', '八德市', '龍潭鄉', '平鎮市',
- '新屋鄉', '觀音鄉', '復興鄉',
+ '桃園市' => array(
+ '桃園區', '中壢區', '大溪區', '楊梅區', '蘆竹區',
+ '大園區', '龜山區', '八德區', '龍潭區', '平鎮區',
+ '新屋區', '觀音區', '復興區',
),
'新竹縣' => array(
'竹北市', '竹東鎮', '新埔鎮', '關西鎮', '湖口鄉',
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Company.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Company.php
index 2cefdcb4..26704ab5 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Company.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Company.php
@@ -250,4 +250,16 @@ class Company extends \Faker\Provider\Company
}
return $result;
}
+
+ /**
+ * return standard VAT / Tax ID / Uniform Serial Number
+ *
+ * @example 28263822
+ *
+ * @return int
+ */
+ public function VAT()
+ {
+ return static::randomNumber(8, true);
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Person.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Person.php
index 71f248b3..e0071bef 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Person.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Person.php
@@ -4,6 +4,39 @@ namespace Faker\Provider\zh_TW;
class Person extends \Faker\Provider\Person
{
+ /**
+ * @see https://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E5%9C%8B%E6%B0%91%E8%BA%AB%E5%88%86%E8%AD%89
+ */
+ public static $idBirthplaceCode = array(
+ 'A' => 10,
+ 'B' => 11,
+ 'C' => 12,
+ 'D' => 13,
+ 'E' => 14,
+ 'F' => 15,
+ 'G' => 16,
+ 'H' => 17,
+ 'I' => 34,
+ 'J' => 18,
+ 'K' => 19,
+ 'M' => 21,
+ 'N' => 22,
+ 'O' => 35,
+ 'P' => 23,
+ 'Q' => 24,
+ 'T' => 27,
+ 'U' => 28,
+ 'V' => 29,
+ 'W' => 32,
+ 'X' => 30,
+ 'Z' => 33
+ );
+
+ /**
+ * @see https://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E5%9C%8B%E6%B0%91%E8%BA%AB%E5%88%86%E8%AD%89
+ */
+ public static $idDigitValidator = array(1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1);
+
protected static $maleNameFormats = array(
'{{lastName}}{{firstNameMale}}',
);
@@ -129,4 +162,40 @@ class Person extends \Faker\Provider\Person
{
return '';
}
+
+ /**
+ * @param string $gender Person::GENDER_MALE || Person::GENDER_FEMALE
+ *
+ * @see https://en.wikipedia.org/wiki/National_Identification_Card_(Republic_of_China)
+ *
+ * @return string Length 10 alphanumeric characters, begins with 1 latin character (birthplace),
+ * 1 number (gender) and then 8 numbers (the last one is check digit).
+ */
+ public function personalIdentityNumber($gender = null)
+ {
+ $birthPlace = self::randomKey(self::$idBirthplaceCode);
+ $birthPlaceCode = self::$idBirthplaceCode[$birthPlace];
+
+ $gender = ($gender != null) ? $gender : self::randomElement(array(self::GENDER_FEMALE, self::GENDER_MALE));
+ $genderCode = ($gender === self::GENDER_MALE) ? 1 : 2;
+
+ $randomNumberCode = self::randomNumber(7, true);
+
+ $codes = str_split($birthPlaceCode . $genderCode . $randomNumberCode);
+ $total = 0;
+
+ foreach ($codes as $key => $code) {
+ $total += $code * self::$idDigitValidator[$key];
+ }
+
+ $checkSumDigit = 10 - ($total % 10);
+
+ if ($checkSumDigit == 10) {
+ $checkSumDigit = 0;
+ }
+
+ $id = $birthPlace . $genderCode . $randomNumberCode . $checkSumDigit;
+
+ return $id;
+ }
}
diff --git a/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php b/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php
index b35903f6..887d12bb 100644
--- a/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php
+++ b/vendor/fzaninotto/faker/src/Faker/Provider/zh_TW/Text.php
@@ -15,110 +15,884 @@ class Text extends \Faker\Provider\Text
protected static $notBeginPunct = array('、', '。', '」', '』', '!', '?', 'ー', ',', ':', ';');
/**
- * Title: 三國演義 Romance of the Three Kingdoms
- * Author: 羅貫中 Luo Guanzhong
- * Language: Chinese
- *
- * @see http://www.gutenberg.org/cache/epub/11/pg11.txt
+ * Title: 吶喊 Call to Arms (1922)
+ * Author: 魯迅 Lu Xun
+ * Language: Traditional Chinese
+ * @see https://zh.wikisource.org/wiki/%E5%90%B6%E5%96%8A
* @var string
*/
protected static $baseText = <<<'EOT'
-第一回:宴桃園豪傑三結義,斬黃巾英雄首立功
+我在年青時候也曾經做過許多夢,後來大半忘卻了,但自己也並不以爲可惜。所謂回憶者,雖說可以使人歡欣,有時也不免使人寂寞,使精神的絲縷還牽著已逝的寂寞的時光,又有什麼意味呢,而我偏苦于不能全忘卻,這不能全忘的一部分,到現在便成了《吶喊》的來由。
+我有四年多,曾經常常,——幾乎是每天,出入于質鋪和藥店裏,年紀可是忘卻了,總之是藥店的櫃臺正和我一樣高,質鋪的是比我高一倍,我從一倍高的櫃臺外送上衣服或首飾去,在侮蔑裡接了錢,再到一樣高的櫃臺上給我久病的父親去買藥。回家之後,又須忙別的事了,因爲開方的醫生是最有名的,以此所用的藥引也奇特:冬天的蘆根,經霜三年的甘蔗,蟋蟀要原對的,結子的平地木,……多不是容易辦到的東西。然而我的父親終于日重一日的亡故了。
+有誰從小康人家而墜入困頓的麼,我以爲在這途路中,大概可以看見世人的真面目;我要到N進K學堂去了,仿佛是想走異路,逃異地,去尋求別樣的人們。我的母親沒有法,辦了八元的川資,說是由我的自便;然而伊哭了,這正是情理中的事,因爲那時讀書應試是正路,所謂學洋務,社會上便以爲是一種走投無路的人,只得將靈魂賣給鬼子,要加倍的奚落而且排斥的,而況伊又看不見自己的兒子了。然而我也顧不得這些事,終于到N去進了K學堂了,在這學堂裏,我纔知道世上還有所謂格致,算學,地理,歷史,繪圖和體操。生理學並不教,但我們卻看到些木版的《全體新論》和《化學衛生論》之類了。我還記得先前的醫生的議論和方藥,和現在所知道的比較起來,便漸漸的悟得中醫不過是一種有意的或無意的騙子,同時又很起了對于被騙的病人和他的家族的同情;而且從譯出的歷史上,又知道了日本維新是大半發端于西方醫學的事實。
+因爲這些幼稚的知識,後來便使我的學籍列在日本一個鄉間的醫學專門學校裏了。我的夢很美滿,預備卒業回來,救治像我父親似的被誤的病人的疾苦,戰爭時候便去當軍醫,一面又促進了國人對于維新的信仰。我已不知道教授微生物學的方法,現在又有了怎樣的進步了,總之那時是用了電影,來顯示微生物的形狀的,因此有時講義的一段落已完,而時間還沒有到,教師便映些風景或時事的畫片給學生看,以用去這多餘的光陰。其時正當日俄戰爭的時候,關于戰事的畫片自然也就比較的多了,我在這一個講堂中,便須常常隨喜我那同學們的拍手和喝采。有一回,我竟在畫片上忽然會見我久違的許多中國人了,一個綁在中間,許多站在左右,一樣是強壯的體格,而顯出麻木的神情。據解說,則綁著的是替俄國做了軍事上的偵探,正要被日軍砍下頭顱來示衆,而圍著的便是來賞鑑這示衆的盛舉的人們。
+這一學年沒有完畢,我已經到了東京了,因爲從那一回以後,我便覺得醫學並非一件緊要事,凡是愚弱的國民,卽使體格如何健全,如何茁壯,也只能做毫無意義的示衆的材料和看客,病死多少是不必以爲不幸的。所以我們的第一要著,是在改變他們的精神,而善于改變精神的是,我那時以爲當然要推文藝,于是想提倡文藝運動了。在東京的留學生很有學法政理化以至警察工業的,但沒有人治文學和美術;可是在冷淡的空氣中,也幸而尋到幾個同志了,此外又邀集了必須的幾個人,商量之後,第一步當然是出雜誌,名目是取“新的生命”的意思,因爲我們那時大抵帶些復古的傾向,所以只謂之《新生》。
+《新生》的出版之期接近了,但最先就隱去了若干擔當文字的人,接着又逃走了資本,結果只剩下不名一錢的三個人。創始時候旣已背時,失敗時候當然無可吿語,而其後卻連這三個人也都爲各自的運命所驅策,不能在一處縱談將來的好夢了,這就是我們的並未產生的《新生》的結局。
+我感到未嘗經驗的無聊,是自此以後的事。我當初是不知其所以然的;後來想,凡有一人的主張,得了贊和,是促其前進的,得了反對,是促其奮鬭的,獨有叫喊于生人中,而生人並無反應,既非贊同,也無反對,如置身毫無邊際的荒原,無可措手的了,這是怎樣的悲哀呵,我于是以我所感到者爲寂寞。
+這寂寞又一天一天的長大起來,如大毒蛇,纏住了我的靈魂了。
+然而我雖然自有無端的悲哀,卻也並不憤懣,因爲這經驗使我反省,看見自己了:就是我決不是一個振臂一呼應者雲集的英雄。
+只是我自己的寂寞是不可不驅除的,因爲這于我太痛苦。我于是用了種種法,來麻醉自己的靈魂,使我沈入于國民中,使我回到古代去,後來也親歷或旁觀過幾樣更寂寞更悲哀的事,都爲我所不願追懷,甘心使他們和我的腦一同消滅在泥土裏的,但我的麻醉法卻也似乎已經奏了功,再沒有青年時候的慷慨激昂的意思了。
+S會館裏有三間屋,相傳是往昔曾在院子裏的槐樹上縊死過一個女人的,現在槐樹已經高不可攀了,而這屋還沒有人住;許多年,我便寓在這屋裏鈔古碑。客中少有人來,古碑中也遇不到什麼問題和主義,而我的生命卻居然暗暗的消去了,這也就是我惟一的願望。夏夜,蚊子多了,便搖著蒲扇坐在槐樹下,從密葉縫裡看那一點一點的青天,晚出的槐蠶又每每冰冷的落在頭頸上。
+那時偶或來談的是一個老朋友金心異,將手提的大皮夾放在破桌上,脫下長衫,對面坐下了,因爲怕狗,似乎心房還在怦怦的跳動。
+“你鈔了這些有什麼用?”有一夜,他翻著我那古碑的鈔本,發了研究的質問了。“沒有什麼用。”“那麼,你鈔他是什麼意思呢?”“沒有什麼意思。”“我想,你可以做點文章……”
+我懂得他的意思了,他們正辦《新青年》,然而那時仿佛不特沒有人來贊同,並且也還沒有人來反對,我想,他們許是感到寂寞了,但是說:
+“假如一間鐵屋子,是絕無窗戶而萬難破毀的,裏面有許多熟睡的人們,不久都要悶死了,然而是從昏睡入死滅,並不感到就死的悲哀。現在你大嚷起來,驚起了較爲清醒的幾個人,使這不幸的少數者來受無可挽救的臨終的苦楚,你倒以爲對得起他們麼?”
+“然而幾個人旣然起來,你不能說決沒有毀壞這鐵屋的希望。”
+是的,我雖然自有我的確信,然而說到希望,卻是不能抹殺的,因爲希望是在于將來,決不能以我之必無的證明,來折服了他之所謂可有,于是我終于答應他也做文章了,這便是最初的一篇《狂人日記》。從此以後,便一發而不可收,每寫些小說模樣的文章,以敷衍朋友們的囑托,積久就有了十餘篇。
+在我自己,本以爲現在是已經並非一個切迫而不能已于言的人了,但或者也還未能忘懷于當日自己的寂寞的悲哀罷,所以有時候仍不免吶喊幾聲,聊以慰藉那在寂寞裏奔馳的猛士,使他不憚于前驅。至于我的喊聲是勇猛或是悲哀,是可憎或是可笑,那倒是不暇顧及的;但旣然是吶喊,則當然須聽將令的了,所以我往往不恤用了曲筆,在《藥》的瑜兒的墳上平空添上一個花環,在《明天》裏也不敍單四嫂子竟沒有做到看見兒子的夢,因爲那時的主將是不主張消極的。至于自己,卻也並不願將自以爲苦的寂寞,再來傳染給也如我那年青時候似的正做著好夢的青年。
+這樣說來,我的小說和藝術的距離之遠,也就可想而知了,然而到今日還能蒙着小說的名,甚而至于且有成集的機會,無論如何總不能不說是一件徼幸的事,但徼幸雖使我不安于心,而懸揣人間暫時還有讀者,則究竟也仍然是高興的。
+所以我竟將我的短篇小說結集起來,而且付印了,又因爲上面所說的緣由,便稱之爲《吶喊》。
+魯鎭的酒店的格局,是和別處不同的:都是當街一個曲尺形的大櫃臺,櫃裏面豫備着熱水,可以隨時溫酒。做工的人,傍午傍晚散了工,每每花四文銅錢,買一碗酒,——這是二十多年前的事,現在每碗要漲到十文,——靠櫃外站着,熱熱的喝了休息;倘肯多花一文,便可以買一碟鹽煮筍,或者茴香豆,做下酒物了,如果出到十幾文,那就能買一樣葷菜,但這些顧客,多是短衣幫,大抵沒有這樣闊綽。只有穿長衫的,纔踱進店面隔壁的房子裏,要酒要菜,慢慢地坐喝。
+我從十二歲起,便在鎭口的咸亨酒店裏當夥計,掌櫃說,樣子太傻,怕侍候不了長衫主顧,就在外面做點事罷。外面的短衣主顧,雖然容易說話,但嘮嘮叨叨纏夾不清的也很不少。他們往往要親眼看着黃酒從罎子裏舀出,看過壺子底裏有水沒有,又親看將壺子放在熱水裏,然後放心:在這嚴重監督下,羼水也很爲難。所以過了幾天,掌櫃又說我幹不了這事。幸虧薦頭的情面大,辭退不得,便改爲專管溫酒的一種無聊職務了。
+我從此便整天的站在櫃臺裏,專管我的職務。雖然沒有什麼失職,但總覺得有些單調,有些無聊。掌櫃是一副凶臉孔,主顧也沒有好聲氣,教人活潑不得;只有孔乙己到店,纔可以笑幾聲,所以至今還記得。
+孔乙己是站着喝酒而穿長衫的唯一的人。他身材很高大;青白臉色,皺紋間時常夾些傷痕;一部亂蓬蓬的花白的鬍子。穿的雖然是長衫,可是又髒又破,似乎十多年沒有補,也沒有洗。他對人說話,總是滿口之乎者也,教人半懂不懂的。因爲他姓孔,別人便從描紅紙上的「上大人孔乙己」這半懂不懂的話裏,替他取下一個綽號,叫作孔乙己。孔乙己一到店,所有喝酒的人便都看着他笑,有的叫道,「孔乙己,你臉上又添上新傷疤了!」他不回答,對櫃裏說,「溫兩碗酒,要一碟茴香豆。」便排出九文大錢。他們又故意的高聲嚷道,「你一定又偷了人家的東西了!」孔乙己睜大眼睛說,「你怎麼這樣憑空汚人清白……」「什麼清白?我前天親眼見你偷了何家的書,弔着打。」孔乙己便漲紅了臉,額上的青筋條條綻出,爭辯道,「竊書不能算偷……竊書!……讀書人的事,能算偷麼?」接連便是難懂的話,什麼「君子固窮」,什麼「者乎」之類,引得衆人都哄笑起來:店內外充滿了快活的空氣。
+聽人家背地裏談論,孔乙己原來也讀過書,但終于沒有進學,又不會營生;于是愈過愈窮,弄到將要討飯了。幸而寫得一筆好字,便替人家鈔鈔書,換一碗飯喫。可惜他又有一樣壞脾氣,便是好喝嬾做。坐不到幾天,便連人和書籍紙張筆硯,一齊失蹤。如是幾次,叫他鈔書的人也沒有了。孔乙己沒有法,便免不了偶然做些偷竊的事。但他在我們店裏,品行卻比別人都好,就是從不拖欠;雖然間或沒有現錢,暫時記在粉板上,但不出一月,定然還清,從粉板上拭去了孔乙己的名字。
+孔乙己喝過半碗酒,漲紅的臉色漸漸復了原,旁人便又問道,「孔乙己,你當眞認識字麼?」孔乙己看着問他的人,顯出不屑置辯的神氣。他們便接着說道,「你怎的連半個秀才也撈不到呢?」孔乙己立刻顯出頹唐不安模樣,臉上籠上了一層灰色,嘴裏說些話;這回可是全是之乎者也之類,一些不懂了。在這時候,衆人也都哄笑起來:店內外充滿了快活的空氣。
+在這些時候,我可以附和着笑,掌櫃是決不責備的。而且掌櫃見了孔乙己,也每每這樣問他,引人發笑。孔乙己自己知道不能和他們談天,便只好向孩子說話。有一回對我說道,「你讀過書麼?」我略略點一點頭。他說,「讀過書,……我便考你一考。茴香豆的茴字,怎樣寫的?」我想,討飯一樣的人,也配考我麼?便回過臉去,不再理會。孔乙己等了許久,很懇切的說道,「不能寫罷?……我教給你,記着!這些字應該記着。將來做掌櫃的時候,寫賬要用。」我暗想我和掌櫃的等級還很遠呢,而且我們掌櫃也從不將茴香豆上賬;又好笑,又不耐煩,嬾嬾的答他道,「誰要你教,不是草頭底下一個來回的回字麼?」孔乙己顯出極高興的樣子,將兩個指頭的長指甲敲着櫃臺,點頭說,「對呀對呀!……回字有四樣寫法,你知道麼?」我愈不耐煩了,努着嘴走遠。孔乙己剛用指甲蘸了酒,想在櫃上寫字,見我毫不熱心,便又歎一口氣,顯出極惋惜的樣子。
+有幾回,鄰舍孩子聽得笑聲,也趕熱鬧,圍住了孔乙己。他便給他們茴香豆喫,一人一顆。孩子喫完豆,仍然不散,眼睛都望着碟子。孔乙己着了慌,伸開五指將碟子罩住,彎腰下去說道,「不多了,我已經不多了。」直起身又看一看豆,自己搖頭說,「不多不多!多乎哉?不多也。」於是這一羣孩子都在笑聲裏走散了。
+孔乙己是這樣的使人快活,可是沒有他,別人也便這麼過。
+有一天,大約是中秋前的兩三天,掌櫃正在慢慢的結賬,取下粉板,忽然說,「孔乙己長久沒有來了。還欠十九個錢呢!」我纔也覺得他的確長久沒有來了。一個喝酒的人說道,「他怎麼會來?……他打折了腿了。」掌櫃說,「哦!」「他總仍舊是偷。這一回,是自己發昏,竟偷到丁舉人家裏去了。他家的東西,偷得的麼?」「後來怎麼樣?」「怎麼樣?先寫服辯,後來是打,打了大半夜,再打折了腿。」「後來呢?」「後來打折了腿了。」「打折了怎樣呢?」「怎樣?……誰曉得?許是死了。」掌櫃也不再問,仍然慢慢的算他的賬。
+中秋之後,秋風是一天涼比一天,看看將近初冬;我整天的靠着火,也須穿上棉襖了。一天的下半天,沒有一個顧客,我正合了眼坐着。忽然間聽得一個聲音,「溫一碗酒。」這聲音雖然極低,卻很耳熟。看時又全沒有人。站起來向外一望,那孔乙己便在櫃臺下對了門檻坐着。他臉上黑而且瘦,已經不成樣子;穿一件破夾襖,盤着兩腿,下面墊一個蒲包,用草繩在肩上掛住;見了我,又說道,「溫一碗酒。」掌櫃也伸出頭去,一面說,「孔乙己麼?你還欠十九個錢呢!」孔乙己很頹唐的仰面答道,「這……下回還清罷。這一回是現錢,酒要好。」掌櫃仍然同平常一樣,笑着對他說,「孔乙己,你又偷了東西了!」但他這回卻不十分分辯,單說了一句「不要取笑!」「取笑?要是不偷,怎麼會打斷腿?」孔乙己低聲說道,「跌斷,跌,跌……」他的眼色,很像懇求掌櫃,不要再提。此時已經聚集了幾個人,便和掌櫃都笑了。我溫了酒,端出去,放在門檻上。他從破衣袋裏摸出四文大錢,放在我手裏,見他滿手是泥,原來他便用這手走來的。不一會,他喝完酒,便又在旁人的說笑聲中,坐着用這手慢慢走去了。
+自此以後,又長久沒有看見孔乙己。到了年關,掌櫃取下粉板說,「孔乙己還欠十九個錢呢!」到第二年的端午,又說「孔乙己還欠十九個錢呢!」到中秋可是沒有說,再到年關也沒有看見他。
+我到現在終于沒有見——大約孔乙己的確死了。
+秋天的後半夜,月亮下去了,太陽還沒有出,只剩下一片烏藍的天;除了夜遊的東西,什麽都睡著。華老栓忽然坐起身,擦着火柴,點上遍身油膩的燈盞,茶館的兩間屋子裏,便彌滿了青白的光。
+「小栓的爹,你就去麽?」是一個老女人的聲音。裏邊的小屋子裏,也發出一陣咳嗽。「唔。」老栓一面聽,一面應,一面扣上衣服;伸手過去說,「你給我罷。」
+華大媽在枕頭底下掏了半天,掏出一包洋錢,交給老栓,老栓接了,抖抖的裝入衣袋,又在外面按了兩下;便點上燈籠,吹熄燈盞,走向裏屋子去了。那屋子裏面,正在窸窸窣窣的響,接著便是一通咳嗽。老栓候他平靜下去,才低低的叫道,「小栓……你不要起來。……店麽?你娘會安排的。」
+老栓聽得兒子不再說話,料他安心睡了;便出了門,走到街上。街上黑沈沈的一無所有,只有一條灰白的路,看得分明。燈光照着他的兩腳,一前一後的走。有時也遇到幾隻狗,可是一隻也沒有叫。天氣比屋子裏冷多了;老栓倒覺爽快,彷彿一旦變了少年,得了神通,有給人生命的本領似的,跨步格外高遠。而且路也愈走愈分明,天也愈走愈亮了。
+老栓正在專心走路,忽然吃了一驚,遠遠裏看見一條丁字街,明明白白橫著。他便退了幾步,尋到一家關着門的鋪子,蹩進簷下,靠門立住了。好一會,身上覺得有些發冷。「哼,老頭子。」「倒高興……。」
+老栓又喫一驚,睜眼看時,幾個人從他面前過去了。一個還回頭看他,樣子不甚分明,但很像久餓的人見了食物一般,眼裏閃出一種攫取的光。老栓看看燈籠,已經熄了。按一按衣袋,硬硬的還在。仰起頭兩面一望,只見許多古怪的人,三三兩兩,鬼似的在那裏徘徊;定睛再看,卻也看不出什麼別的奇怪。
+沒有多久,又見幾個兵,在那邊走動;衣服前後的一個大白圓圈,遠地裏也看得清楚,走過面前的,並且看出號衣上暗紅的鑲邊。——一陣腳步聲響,一眨眼,已經擁過了一大簇人。那三三兩兩的人,也忽然合作一堆,潮一般向前趕;將到丁字街口,便突然立住,簇成一個半圓。
+老栓也向那邊看,卻只見一堆人的後背;頸項都伸得很長,彷彿許多鴨,被無形的手揑住了的,向上提着。靜了一會,似乎有點聲音,便又動搖起來,轟的一聲,都向後退;一直散到老栓立着的地方,幾乎將他擠倒了。
+「喂!一手交錢,一手交貨!」一個渾身黑色的人,站在老栓面前,眼光正像兩把刀,刺得老栓縮小了一半。那人一隻大手,向他攤着;一隻手卻撮着一個鮮紅的饅頭,那紅的還是一點一點的往下滴。
+老栓慌忙摸出洋錢,抖抖的想交給他,卻又不敢去接他的東西。那人便焦急起來,嚷道,「怕什麼?怎的不拿!」老栓還躊躇着;黑的人便搶過燈籠,一把扯下紙罩,裹了饅頭,塞與老栓;一手抓過洋錢,揑一揑,轉身去了。嘴裏哼着說,「這老東西……。」
+「這給誰治病的呀?」老栓也似乎聽得有人問他,但他並不答應;他的精神,現在只在一個包上,彷彿抱着一個十世單傳的嬰兒,別的事情,都已置之度外了。他現在要將這包裏的新的生命,移植到他家裏,收穫許多幸福。太陽也出來了;在他面前,顯出一條大道,直到他家中,後面也照見丁字街頭破匾上「古口亭口」這四個黯淡的金字。
+老栓走到家,店面早經收拾乾淨,一排一排的茶桌,滑溜溜的發光。但是沒有客人;只有小栓坐在裏排的桌前吃飯,大粒的汗,從額上滾下,夾襖也帖住了脊心,兩塊肩胛骨高高凸出,印成一個陽文的「八字」。老栓見這樣子,不免皺一皺展開的眉心。他的女人,從竈下急急走出,睜着眼睛,嘴唇有些發抖。「得了麼?」「得了。」
+兩個人一齊走進竈下,商量了一會;華大媽便出去了,不多時,拏着一片老荷葉回來,攤在桌上。老栓也打開燈籠罩,用荷葉重新包了那紅的饅頭。小栓也吃完飯,他的母親慌忙說:「小栓——你坐着,不要到這裏來。」一面整頓了竈火,老栓便把一個碧綠的包,一個紅紅白白的破燈籠,一同塞在竈裏;一陣紅黑的火焰過去時,店屋裏散滿了一種奇怪的香味。
+「好香!你們吃什麼點心呀?」這是駝背五少爺到了。這人每天總在茶館裏過日,來得最早,去得最遲,此時恰恰蹩到臨街的壁角的桌邊,便坐下問話,然而沒有人答應他。「炒米粥麽?」仍然沒有人應。老栓匆匆走出,給他泡上茶。
+「小栓進來罷!」華大媽叫小栓進了裏面的屋子,中間放好一條凳,小栓坐了。他的母親端過一碟烏黑的圓東西,輕輕說:——「喫下去罷,——病便好了。」
+小栓撮起這黑東西,看了一會,似乎拏着自己的性命一般,心裏說不出的奇怪。十分小心的拗開了,焦皮裏面竄出一道白氣,白氣散了,是兩半個白麵的饅頭。——不多工夫,已經全在肚裏了,卻全忘了什麼味;面前只剩下一張空盤。他的旁邊,一面立着他的父親,一面立着他的母親,兩人的眼光,都彷彿要在他身裏注進什麽又要取出什麽似的;便禁不住心跳起來,按着胸膛,又是一陣咳嗽。
+「睡一會罷,——便好了。」
+小栓依他母親的話,咳着睡了。華大媽候他喘氣平靜,才輕輕的給他蓋上了滿幅補釘的夾被。
+店裏坐着許多人,老栓也忙了,提着大銅壺,一趟一趟的給客人沖茶;兩個眼眶,都圍着一圈黑線。
+「老栓,你有些不舒服麽?——你生病麽?」一個花白鬍子的人說。「沒有。」
+「沒有?——我想笑嘻嘻的,原也不像……」花白鬍子便取消了自己的話。
+「老栓只是忙。要是他的兒子……」駝背五少爺話還未完,突然闖進了一個滿臉橫肉的人,披一件玄色布衫,散着紐扣,用很寬的玄色腰帶,胡亂捆在腰間。剛進門,便對老栓嚷道:
+「吃了麽?好了麽?老栓,就是運氣了你!你運氣,要不是我信息靈……。」
+老栓一手提了茶壺,一手恭恭敬敬的垂着;笑嘻嘻的聽。滿座的人,也都恭恭敬敬的聽。華大媽也黑着眼眶,笑嘻嘻的送出茶碗茶葉來,加上一個橄欖,老栓便去沖了水。
+「這是包好!這是與眾不同的。你想,趁熱的拏來,趁熱吃下。」橫肉的人只是嚷。
+「真的呢,要沒有康大叔照顧,怎麽會這樣……」華大媽也很感激的謝他。
+「包好,包好!這樣的趁熱吃下。這樣的人血饅頭,什麽癆病都包好!」
+華大媽聽到「癆病」這兩個字,變了一點臉色,似乎有些不高興;但又立刻堆上笑,搭訕着走開了。這康大叔卻沒有覺察,仍然提高了喉嚨只是嚷,嚷得裏面睡着的小栓也合夥咳嗽起來。
+「原來你家小栓碰到了這樣的好運氣了。這病自然一定全好;怪不得老栓整天的笑着呢。」花白鬍子一面說,一面走到康大叔面前,低聲下氣的問道,「康大叔——聽說今天結果的一個犯人,便是夏家的孩子,那是誰的孩子?究竟是什麼事?」
+「誰的?不就是夏四奶奶的兒子麽?那個小傢伙!」康大叔見眾人都聳起耳朵聽他,便格外高興,橫肉塊塊飽綻,越發大聲說,「這小東西不要命,不要就是了。我可是這一回一點沒有得到好處;連剝下來的衣服,都給管牢的紅眼睛阿義拏去了。——第一要算我們栓叔運氣;第二是夏三爺賞了二十五兩雪白的銀子,獨自落腰包,一文不花。」
+小栓慢慢的從小屋子裏走出,兩手按了胸口,不住的咳嗽;走到竈下,盛出一碗冷飯,泡上熱水,坐下便吃。華大媽跟着他走,輕輕的問道,「小栓,你好些麽?——你仍舊只是肚餓?……」
+「包好,包好!」康大叔瞥了小栓一眼,仍然回過臉,對眾人說,「夏三爺真是乖角兒,要是他不先告官,連他滿門抄斬。現在怎樣?銀子!——這小東西也真不成東西!關在牢裏,還要勸牢頭造反。」
+「阿呀,那還了得。」坐在後排的一個二十多歲的人,很現出氣憤模樣。
+「你要曉得紅眼睛阿義是去盤盤底細的,他卻和他攀談了。他說:這大清的天下是我們大家的。你想:這是人話麽?紅眼睛原知道他家裏只有一個老娘,可是沒有料到他竟會那麽窮,搾不出一點油水,已經氣破肚皮了。他還要老虎頭上搔癢,便給他兩個嘴巴!」
+「義哥是一手好拳棒,這兩下,一定夠他受用了。」壁角的駝背忽然高興起來。
+「他這賤骨頭打不怕,還要說可憐可憐哩。」
+花白鬍子的人說,「打了這種東西,有什麽可憐呢?」
+康大叔顯出看他不上的樣子,冷笑着說,「你沒有聽清我的話;看他神氣,是說阿義可憐哩!」
+聽着的人的眼光,忽然有些板滯;話也停頓了。小栓已經吃完飯,吃得滿身流汗,頭上都冒出蒸氣來。
+「阿義可憐——瘋話,簡直是發了瘋了。」花白鬍子恍然大悟似的說。
+「發了瘋了。」二十多歲的人也恍然大悟的說。
+店裏的坐客,便又現出活氣,談笑起來。小栓也趁着熱鬧,拚命咳嗽;康大叔走上前,拍他肩膀說:
+「包好!小栓——你不要這麼咳。包好!」
+「瘋了。」駝背五少爺點着頭說。
+西關外靠着城根的地面,本是一塊官地;中間歪歪斜斜一條細路,是貪走便道的人,用鞋底造成的,但卻成了自然的界限。路的左邊,都埋着死刑和瘐斃的人,右邊是窮人的叢塚。兩面都已埋到層層疊疊,宛然闊人家裏祝壽時候的饅頭。
+這一年的清明,分外寒冷;楊柳才吐出半粒米大的新芽。天明未久,華大媽已在右邊的一坐新墳前面,排出四碟菜,一碗飯,哭了一場。化過紙,呆呆的坐在地上;彷彿等候什麽似的,但自己也說不出等候什麽。微風起來,吹動他短髮,確乎比去年白得多了。
+小路上又來了一個女人,也是半白頭髮,襤褸的衣裙;提一個破舊的朱漆圓籃,外掛一串紙錠,三步一歇的走。忽然見華大媽坐在地上看他,便有些躊躇,慘白的臉上,現出些羞愧的顏色;但終於硬着頭皮,走到左邊的一坐墳前,放下了籃子。
+那墳與小栓的墳,一字兒排着,中間只隔一條小路。華大媽看他排好四碟菜,一碗飯,立着哭了一通,化過紙錠;心裏暗暗地想,「這墳裏的也是兒子了。」那老女人徘徊觀望了一回,忽然手腳有些發抖,蹌蹌踉踉退下幾步,瞪着眼只是發怔。
+華大媽見這樣子,生怕他傷心到快要發狂了;便忍不住立起身,跨過小路,低聲對他說,「你這位老奶奶不要傷心了,——我們還是回去罷。」
+那人點一點頭,眼睛仍然向上瞪着;也低聲吃吃的說道,「你看,——看這是什麽呢?」
+華大媽跟了他指頭看去,眼光便到了前面的墳,這墳上草根還沒有全合,露出一塊一塊的黃土,煞是難看。再往上仔細看時,卻不覺也吃一驚;——分明有一圈紅白的花,圍着那尖圓的墳頂。
+他們的眼睛都已老花多年了,但望這紅白的花,卻還能明白看見。花也不很多,圓圓的排成一個圈,不很精神,倒也整齊。華大媽忙看他兒子和別人的墳,卻只有不怕冷的幾點青白小花,零星開着;便覺得心裏忽然感到一種不足和空虛,不願意根究。那老女人又走近幾步,細看了一遍,自言自語的說,「這沒有根,不像自己開的。——這地方有誰來呢?孩子不會來玩;——親戚本家早不來了。——這是怎麼一回事呢?」他想了又想,忽又流下淚來,大聲說道:
+「瑜兒,他們都冤枉了你,你還是忘不了,傷心不過,今天特意顯點靈,要我知道麽?」他四面一看,只見一隻烏鴉,站在一株沒有葉的樹上,便接着說,「我知道了。——瑜兒,可憐他們坑了你,他們將來總有報應,天都知道;你閉了眼睛就是了。——你如果真在這裏,聽到我的話,——便教這烏鴉飛上你的墳頂,給我看罷。」
+微風早經停息了;枯草支支直立,有如銅絲。一絲發抖的聲音,在空氣中愈顫愈細,細到沒有,周圍便都是死一般靜。兩人站在枯草叢裏,仰面看那烏鴉;那烏鴉也在筆直的樹枝間,縮着頭,鐵鑄一般站著。
+許多的工夫過去了;上墳的人漸漸增多,幾個老的小的,在土墳間出沒。
+華大媽不知怎的,似乎卸下了一挑重擔,便想到要走;一面勸着說,「我們還是回去罷。」
+那老女人嘆一口氣,無精打采的收起飯菜;又遲疑了一刻,終於慢慢地走了。嘴裏自言自語的說,「這是怎麼一回事呢?……」
+他們走不上二三十步遠,忽聽得背後「啞——」的一聲大叫;兩個人都竦然的回過頭,只見那烏鴉張開兩翅,一挫身,直向着遠處的天空,箭也似的飛去了。
+住在我們後進院子裏的三太太,在夏間買了一對白兔,是給伊的孩子們看的。
+這一對白兔,似乎離娘並不久,雖然是異類,也可以看出他們的天真爛熳來。但也豎直了小小的通紅的長耳朵,動著鼻子,眼睛裏頗現些驚疑的神色,大約究竟覺得人地生疏,沒有在老家時候的安心了。這種東西,倘到廟會日期自己出去買,每個至多不過兩弔錢,而三太太卻花了一元,因為是叫小使上店買來的。
+孩子們自然大得意了,嚷著圍住了看;大人也都圍著看;還有一匹小狗名叫S的也跑來,闖過去一嗅,打了一個噴嚏,退了幾步。三太太吆喝道,「S,聽著,不准你咬他!」於是在他頭上打了一拳,S便退開了,從此並不咬。
+這一對兔總是關在後窗後面的小院子裏的時候多,聽說是因為太喜歡撕壁紙,也常常啃木器腳。這小院子裏有一株野桑樹,桑子落地,他們最愛吃,便連喂他們的菠菜也不吃了。烏鴉喜鵲想要下來時,他們便躬著身子用後腳在地上使勁的一彈,砉的一聲直跳上來,像飛起了一團雪,鴉鵲嚇得趕緊走,這樣的幾回,再也不敢近來了。三太太說,鴉鵲到不打緊,至多也不過搶吃一點食料,可惡的是一匹大黑貓,常在矮牆上惡狠狠的看,這卻要防的,幸而S和貓是對頭,或者還不至於有什麼罷。
+孩子們時時捉他們來玩耍;他們很和氣,豎起耳朵,動著鼻子,馴良的站在小手的圈子裏,但一有空,卻也就溜開去了。他們夜裏的臥榻是一個小木箱,裏面鋪些稻草,就在後窗的房檐下。
+這樣的幾個月之後,他們忽而自己掘土了,掘得非常快,前腳一抓,後腳一踢,不到半天,已經掘成一個深洞。大家都奇怪,後來仔細看時,原來一個的肚子比別一個的大得多了。他們第二天便將乾草和樹葉銜進洞裏去,忙了大半天。
+大家都高興,說又有小兔可看了;三太太便對孩子們下了戒嚴令,從此不許再去捉。我的母親也很喜歡他們家族的繁榮,還說待生下來的離了乳,也要去討兩匹來養在自己的窗外面。
+他們從此便住在自造的洞府裏,有時也出來吃些食,後來不見了,可不知道他們是預先運糧存在裏面呢還是竟不吃。過了十多天,三太太對我說,那兩匹又出來了,大約小兔是生下來又都死掉了,因為雌的一匹的奶非常多,卻並不見有進去哺養孩子的形跡。伊言語之間頗氣憤,然而也沒有法。
+有一天,太陽很溫暖,也沒有風,樹葉都不動,我忽聽得許多人在那裏笑,尋聲看時,卻見許多人都靠著三太太的後窗看:原來有一個小兔,在院子裏跳躍了。這比他的父母買來的時候還小得遠,但也已經能用後腳一彈地,迸跳起來了。孩子們爭著告訴我說,還看見一個小兔到洞口來探一探頭,但是即刻便縮回去了,那該是他的弟弟罷。
+那小的也撿些草葉吃,然而大的似乎不許他,往往夾口的搶去了,而自己並不吃。孩子們笑得響,那小的終於吃驚了,便跳著鑽進洞裏去;大的也跟到洞門口,用前腳推著他的孩子的脊樑,推進之後,又爬開泥土來封了洞。
+從此小院子裏更熱鬧,窗口也時時有人窺探了。
+然而竟又全不見了那小的和大的。這時是連日的陰天,三太太又慮到遭了那大黑貓的毒手的事去。我說不然,那是天氣冷,當然都躲著,太陽一齣,一定出來的。
+太陽出來了,他們卻都不見。於是大家就忘卻了。
+惟有三太太是常在那裏喂他們菠菜的,所以常想到。伊有一回走進窗後的小院子去,忽然在牆角發見了一個別的洞,再看舊洞口,卻依稀的還見有許多爪痕。這爪痕倘說是大兔的,爪該不會有這樣大,伊又疑心到那常在牆上的大黑貓去了,伊於是也就不能不定下發掘的決心了。伊終於出來取了鋤子,一路掘下去,雖然疑心,卻也希望著意外的見了小白兔的,但是待到底,卻只見一堆爛草夾些兔毛,怕還是臨蓐時候所鋪的罷,此外是冷清清的,全沒有什麼雪白的小兔的蹤跡,以及他那隻一探頭未出洞外的弟弟了。
+氣憤和失望和淒涼,使伊不能不再掘那牆角上的新洞了。一動手,那大的兩匹便先竄出洞外面。伊以為他們搬了家了,很高興,然而仍然掘,待見底,那裏面也鋪著草葉和兔毛,而上面卻睡著七個很小的兔,遍身肉紅色,細看時,眼睛全都沒有開。
+一切都明白了,三太太先前的預料果不錯。伊為預防危險起見,便將七個小的都裝在木箱中,搬進自己的房裏,又將大的也捺進箱裏面,勒令伊去哺乳。
+三太太從此不但深恨黑貓,而且頗不以大兔為然了。據說當初那兩個被害之先,死掉的該還有,因為他們生一回,決不至於只兩個,但為了哺乳不勻,不能爭食的就先死了。這大概也不錯的,現在七個之中,就有兩個很瘦弱。所以三太太一有閑空,便捉住母兔,將小兔一個一個輪流的擺在肚子上來喝奶,不准有多少。
+母親對我說,那樣麻煩的養兔法,伊歷來連聽也未曾聽到過,恐怕是可以收入《無雙譜》的。
+白兔的家族更繁榮;大家也又都高興了。
+但自此之後,我總覺得淒涼。夜半在燈下坐著想,那兩條小性命,竟是人不知鬼不覺的早在不知什麼時候喪失了,生物史上不著一些痕跡,並S也不叫一聲。我於是記起舊事來,先前我住在會館裏,清早起身,只見大槐樹下一片散亂的鴿子毛,這明明是膏於鷹吻的了,上午長班來一打掃,便什麼都不見,誰知道曾有一個生命斷送在這裏呢?我又曾路過西四牌樓,看見一匹小狗被馬車軋得快死,待回來時,什麼也不見了,搬掉了罷,過往行人憧憧的走著,誰知道曾有一個生命斷送在這裏呢?夏夜,窗外面,常聽到蒼蠅的悠長的吱吱的叫聲,這一定是給蠅虎咬住了,然而我向來無所容心於其間,而別人並且不聽到……
+假使造物也可以責備,那麼,我以為他實在將生命造得太濫了,毀得太濫了。
+嗥的一聲,又是兩條貓在窗外打起架來。「迅兒!你又在那裏打貓了?」「不,他們自己咬。他那裏會給我打呢。」
+我的母親是素來很不以我的虐待貓為然的,現在大約疑心我要替小兔抱不平,下什麼辣手,便起來探問了。而我在全家的口碑上,卻的確算一個貓敵。我曾經害過貓,平時也常打貓,尤其是在他們配合的時候。但我之所以打的原因並非因為他們配合,是因為他們嚷,嚷到使我睡不著,我以為配合是不必這樣大嚷而特嚷的。
+況且黑貓害了小兔,我更是「師出有名」的了。我覺得母親實在太修善,於是不由的就說出模棱的近乎不以為然的答話來。
+造物太胡鬧,我不能不反抗他了,雖然也許是倒是幫他的忙……
+那黑貓是不能久在矮牆上高視闊步的了,我決定的想,於是又不由的一瞥那藏在書箱裏的一瓶青酸鉀。
+我在倒數上去的二十年中,只看過兩回中國戲,前十年是絕不看,因為沒有看戲的意思和機會,那兩回全在後十年,然而都沒有看出什麼來就走了。
+第一回是民國元年我初到北京的時候,當時一個朋友對我說,北京戲最好,你不去見見世面麽?我想,看戲是有味的,而況在北京呢。於是都興緻勃勃的跑到什麼園,戲文已經開場了,在外面也早聽到鼕鼕地響。我們挨進門,幾個紅的綠的在我的眼前一閃爍,便又看見戲臺下滿是許多頭,再定神四面看,卻見中間也還有幾個空座,擠過去要坐時,又有人對我發議論,我因為耳朵已經喤的響著了,用了心,纔聽到他是說「有人,不行!」。
+我們退到後面,一個辮子很光的卻來領我們到了側面,指出一個地位來。這所謂地位者,原來是一條長凳,然而他那坐板比我的上腿要狹到四分之三,他的腳比我的下腿要長過三分之二。我先是沒有爬上去的勇氣,接著便聯想到私刑拷打的刑具,不由的毛骨悚然的走出了。
+走了許多路,忽聽得我的朋友的聲音道,「究竟怎的?」我回過臉去,原來他也被我帶出來了。他很詫異的說,「怎麼總是走,不答應?」我說,「朋友,對不起,我耳朵只在鼕鼕喤喤的響,並沒有聽到你的話。」
+後來我每一想到,便很以為奇怪,似乎這戲太不好,——否則便是我近來在戲臺下不適於生存了。
+第二回忘記了那一年,總之是募集湖北水災捐而譚叫天還沒有死。捐法是兩元錢買一張戲票,可以到第一舞臺去看戲,扮演的多是名角,其一就是小叫天。我買了一張票,本是對於勸募人聊以塞責的,然而似乎又有好事家乘機對我說了些叫天不可不看的大法要了。我於是忘了前幾年的鼕鼕喤喤之災,竟到第一舞臺去了,但大約一半也因為重價購來的寶票,總得使用了纔舒服。我打聽得叫天出臺是遲的,而第一舞臺卻是新式構造,用不著爭座位,便放了心,延宕到九點鐘纔去,誰料照例,人都滿了,連立足也難,我只得擠在遠處的人叢中看一個老旦在臺上唱。那老旦嘴邊插著兩個點火的紙撚子,旁邊有一個鬼卒,我費盡思量,纔疑心他或者是目連的母親,因為後來又出來了一個和尚。然而我又不知道那名角是誰,就去問擠小在我的左邊的一位胖紳士。他很看不起似的斜瞥了我一眼,說道, 「龔雲甫!」我深愧淺陋而且粗疏,臉上一熱,同時腦裡也制出了決不再問的定章,於是看小旦唱,看花旦唱,看老生唱,看不知什麼角色唱,看一大班人亂打,看兩三個人互打,從九點多到十點,從十點到十一點,從十一點到十一點半,從十一點半到十二點,——然而叫天竟還沒有來。
+我向來沒有這樣忍耐的等待過什麼事物,而況這身邊的胖紳士的吁吁的喘氣,這臺上的鼕鼕喤喤的敲打,紅紅綠綠的晃蕩,加之以十二點,忽而使我省誤到在這裡不適於生存了。我同時便機械的擰轉身子,用力往外只一擠,覺得背後便已滿滿的,大約那彈性的胖紳士早在我的空處胖開了他的右半身了。我後無迴路,自然擠而又擠,終於出了大門。街上除了專等看客的車輛之外,幾乎沒有什麼行人了,大門口卻還有十幾個人昂著頭看戲目,別有一堆人站著並不看什麼,我想:他們大概是看散戲之後出來的女人們的,而叫天卻還沒有來……
+然而夜氣很清爽,真所謂「沁人心脾」,我在北京遇著這樣的好空氣,仿佛這是第一遭了。
+這一夜,就是我對於中國戲告了別的一夜,此後再沒有想到他,即使偶而經過戲園,我們也漠不相關,精神上早已一在天之南一在地之北了。
+但是前幾天,我忽在無意之中看到一本日本文的書,可惜忘記了書名和著者,總之是關於中國戲的。其中有一篇,大意仿佛說,中國戲是大敲,大叫,大跳,使看客頭昏腦眩,很不適於劇場,但若在野外散漫的所在,遠遠的看起來,也自有他的風致。我當時覺著這正是說了在我意中而未曾想到的話,因為我確記得在野外看過很好的戲,到北京以後的連進兩回戲園去,也許還是受了那時的影響哩。可惜我不知道怎麼一來,竟將書名忘卻了。
+至於我看好戲的時候,卻實在已經是「遠哉遙遙」的了,其時恐怕我還不過十一二歲。我們魯鎮的習慣,本來是凡有出嫁的女兒,倘自己還未當家,夏間便大抵回到母家去消夏。那時我的祖母雖然還康建,但母親也已分擔了些家務,所以夏期便不能多日的歸省了,只得在掃墓完畢之後,抽空去住幾天,這時我便每年跟了我的母親住在外祖母的家裡。那地方叫平橋村,是一個離海邊不遠,極偏僻的,臨河的小村莊;住戶不滿三十家,都種田,打魚,只有一家很小的雜貨店。但在我是樂土:因為我在這裡不但得到優待,又可以免念「秩秩斯乾幽幽南山」了。
+和我一同玩的是許多小朋友,因為有了遠客,他們也都從父母那裡得了減少工作的許可,伴我來遊戲。在小村裡,一家的客,幾乎也就是公共的。我們年紀都相仿,但論起行輩來,卻至少是叔子,有幾個還是太公,因為他們合村都同姓,是本家。然而我們是朋友,即使偶而吵鬧起來,打了太公,一村的老老少少,也決沒有一個會想出「犯上」這兩個字來,而他們也百分之九十九不識字。
+我們每天的事情大概是掘蚯蚓,掘來穿在銅絲做的小鉤上,伏在河沿上去釣蝦。蝦是水世界裡的呆子,決不憚用了自己的兩個鉗捧著鉤尖送到嘴裡去的,所以不半天便可以釣到一大碗。這蝦照例是歸我吃的。其次便是一同去放牛,但或者因為高等動物了的緣故罷,黃牛水牛都欺生,敢於欺侮我,因此我也總不敢走近身,只好遠遠地跟著,站著。這時候,小朋友們便不再原諒我會讀「秩秩斯干」,卻全都嘲笑起來了。
+至於我在那裡所第一盼望的,卻在到趙莊去看戲。趙莊是離平橋村五里的較大的村莊;平橋村太小,自己演不起戲,每年總付給趙莊多少錢,算作合做的。當時我並不想到他們為什麼年年要演戲。現在想,那或者是春賽,是社戲了。
+就在我十一二歲時候的這一年,這日期也看看等到了。不料這一年真可惜,在早上就叫不到船。平橋村只有一隻早出晚歸的航船是大船,決沒有留用的道理。其餘的都是小船,不合用;央人到鄰村去問,也沒有,早都給別人定下了。外祖母很氣惱,怪家裡的人不早定,絮叨起來。母親便寬慰伊,說我們魯鎮的戲比小村裡的好得多,一年看幾回,今天就算了。只有我急得要哭,母親卻竭力的囑咐我,說萬不能裝模裝樣,怕又招外祖母生氣,又不准和別人一同去,說是怕外祖母要擔心。
+總之,是完了。到下午,我的朋友都去了,戲已經開場了,我似乎聽到鑼鼓的聲音,而且知道他們在戲臺下買豆漿喝。
+這一天我不釣蝦,東西也少吃。母親很為難,沒有法子想。到晚飯時候,外祖母也終於覺察了,並且說我應當不高興,他們太怠慢,是待客的禮數裡從來沒有的。吃飯之後,看過戲的少年們也都聚攏來了,高高興興的來講戲。只有我不開口;他們都嘆息而且表同情。忽然間,一個最聰明的雙喜大悟似的提議了,他說,「大船?八叔的航船不是回來了麽?」十幾個別的少年也大悟,立刻攛掇起來,說可以坐了這航船和我一同去。我高興了。然而外祖母又怕都是孩子,不可靠;母親又說是若叫大人一同去,他們白天全有工作,要他熬夜,是不合情理的。在這遲疑之中,雙喜可又看出底細來了,便又大聲的說道,「我寫包票!船又大;迅哥兒向來不亂跑;我們又都是識水性的!」
+誠然!這十多個少年,委實沒有一個不會鳧水的,而且兩三個還是弄潮的好手。
+外祖母和母親也相信,便不再駁回,都微笑了。我們立刻一哄的出了門。
+我的很重的心忽而輕鬆了,身體也似乎舒展到說不出的大。一出門,便望見月下的平橋內泊著一隻白篷的航船,大家跳下船,雙喜拔前篙,阿發拔後篙,年幼的都陪我坐在艙中,較大的聚在船尾。母親送出來吩咐「要小心」的時候,我們已經點開船,在橋石上一磕,退後幾尺,即又上前出了橋。於是架起兩支櫓,一支兩人,一里一換,有說笑的,有嚷的,夾著潺潺的船頭激水的聲音,在左右都是碧綠的豆麥田地的河流中,飛一般徑向趙莊前進了。
+兩岸的豆麥和河底的水草所發散出來的清香,夾雜在水氣中撲面的吹來;月色便朦朧在這水氣裡。淡黑的起伏的連山,仿佛是踴躍的鐵的獸脊似的,都遠遠的向船尾跑去了,但我卻還以為船慢。他們換了四回手,漸望見依稀的趙莊,而且似乎聽到歌吹了,還有幾點火,料想便是戲臺,但或者也許是漁火。
+那聲音大概是橫笛,宛轉,悠揚,使我的心也沉靜,然而又自失起來,覺得要和他彌散在含著豆麥蘊藻之香的夜氣裡。
+那火接近了,果然是漁火;我纔記得先前望見的也不是趙莊。那是正對船頭的一叢松柏林,我去年也曾經去遊玩過,還看見破的石馬倒在地下,一個石羊蹲在草裡呢。過了那林,船便彎進了叉港,於是趙莊便真在眼前了。
+最惹眼的是屹立在莊外臨河的空地上的一座戲臺,模胡在遠處的月夜中,和空間幾乎分不出界限,我疑心畫上見過的仙境,就在這裡出現了。這時船走得更快,不多時,在臺上顯出人物來,紅紅綠綠的動,近臺的河裡一望烏黑的是看戲的人家的船篷。
+「近臺沒有什麼空了,我們遠遠的看罷。」阿發說。
+這時船慢了,不久就到,果然近不得台旁,大家只能下了篙,比那正對戲臺的神棚還要遠。其實我們這白篷的航船,本也不願意和烏篷的船在一處,而況沒有空地呢……
+在停船的匆忙中,看見臺上有一個黑的長鬍子的背上插著四張旗,捏著長槍,和一群赤膊的人正打仗。雙喜說,那就是有名的鐵頭老生,能連翻八十四個筋斗,他日裡親自數過的。
+我們便都擠在船頭上看打仗,但那鐵頭老生卻又並不翻筋斗,只有幾個赤膊的人翻,翻了一陣,都進去了,接著走出一個小旦來,咿咿呀呀的唱。雙喜說,「晚上看客少,鐵頭老生也懈了,誰肯顯本領給白地看呢?」我相信這話對,因為其時臺下已經不很有人,鄉下人為了明天的工作,熬不得夜,早都睡覺去了,疏疏朗朗的站著的不過是幾十個本村和鄰村的閑漢。烏篷船裡的那些土財主的家眷固然在,然而他們也不在乎看戲,多半是專到戲臺下來吃糕餅水果和瓜子的。所以簡直可以算白地。
+然而我的意思卻也並不在乎看翻筋斗。我最願意看的是一個人蒙了白布,兩手在頭上捧著一支棒似的蛇頭的蛇精,其次是套了黃布衣跳老虎。但是等了許多時都不見,小旦雖然進去了,立刻又出來了一個很老的小生。我有些疲倦了,託桂生買豆漿去。他去了一刻,回來說,「沒有。賣豆漿的聾子也回去了。日裡倒有,我還喝了兩碗呢。現在去舀一瓢水來給你喝罷。」
+我不喝水,支撐著仍然看,也說不出見了些什麼,只覺得戲子的臉都漸漸的有些稀奇了,那五官漸不明顯,似乎融成一片的再沒有什麼高低。年紀小的幾個多打呵欠了,大的也各管自己談話。忽而一個紅衫的小丑被綁在臺柱子上,給一個花白鬍子的用馬鞭打起來了,大家纔又振作精神的笑著看。在這一夜裡,我以為這實在要算是最好的一折。
+然而老旦終於出臺了。老旦本來是我所最怕的東西,尤其是怕他坐下了唱。這時候,看見大家也都很掃興,纔知道他們的意見是和我一致的。那老旦當初還只是踱來踱去的唱,後來竟在中間的一把交椅上坐下了。我很擔心;雙喜他們卻就破口喃喃的罵。我忍耐的等著,許多工夫,只見那老旦將手一抬,我以為就要站起來了,不料他卻又慢慢的放下在原地方,仍舊唱。全船裡幾個人不住的吁氣,其餘的也打起哈欠來。雙喜終於熬不住了,說道,怕他會唱到天明還不完,還是我們走的好罷。大家立刻都贊成,和開船時候一樣踴躍,三四人徑奔船尾,拔了篙,點退幾丈,迴轉船頭,駕起櫓,罵著老旦,又向那松柏林前進了。
+月還沒有落,仿佛看戲也並不很久似的,而一離趙莊,月光又顯得格外的皎潔。回望戲臺在燈火光中,卻又如初來未到時候一般,又漂渺得像一座仙山樓閣,滿被紅霞罩著了。吹到耳邊來的又是橫笛,很悠揚;我疑心老旦已經進去了,但也不好意思說再回去看。
+不多久,松柏林早在船後了,船行也並不慢,但周圍的黑暗只是濃,可知已經到了深夜。他們一面議論著戲子,或罵,或笑,一面加緊的搖船。這一次船頭的激水聲更其響亮了,那航船,就像一條大白魚背著一群孩子在浪花裡躥,連夜漁的幾個老漁父,也停了艇子看著喝采起來。
+離平橋村還有一里模樣,船行卻慢了,搖船的都說很疲乏,因為太用力,而且許久沒有東西吃。這回想出來的是桂生,說是羅漢豆正旺相,柴火又現成,我們可以偷一點來煮吃。大家都贊成,立刻近岸停了船;岸上的田裡,烏油油的都是結實的羅漢豆。
+「阿阿,阿發,這邊是你家的,這邊是老六一家的,我們偷那一邊的呢?」雙喜先跳下去了,在岸上說。
+我們也都跳上岸。阿發一面跳,一面說道,「且慢,讓我來看一看罷,」他於是往來的摸了一回,直起身來說道,「偷我們的罷,我們的大得多呢。」一聲答應,大家便散開在阿發家的豆田裡,各摘了一大捧,拋入船艙中。雙喜以為再多偷,倘給阿發的娘知道是要哭罵的,於是各人便到六一公公的田裡又各偷了一大捧。
+我們中間幾個年長的仍然慢慢的搖著船,幾個到後艙去生火,年幼的和我都剝豆。不久豆熟了,便任憑航船浮在水面上,都圍起來用手撮著吃。吃完豆,又開船,一面洗器具,豆莢豆殼全拋在河水裡,什麼痕跡也沒有了。雙喜所慮的是用了八公公船上的鹽和柴,這老頭子很細心,一定要知道,會罵的。然而大家議論之後,歸結是不怕。他如果罵,我們便要他歸還去年在岸邊拾去的一枝枯桕樹,而且當面叫他「八癩子」。
+「都回來了!那裡會錯。我原說過寫包票的!」雙喜在船頭上忽而大聲的說。
+我向船頭一望,前面已經是平橋。橋腳上站著一個人,卻是我的母親,雙喜便是對伊說著話。我走出前艙去,船也就進了平橋了,停了船,我們紛紛都上岸。母親頗有些生氣,說是過了三更了,怎麼回來得這樣遲,但也就高興了,笑著邀大家去吃炒米。
+大家都說已經吃了點心,又渴睡,不如及早睡的好,各自回去了。
+第二天,我向午纔起來,並沒有聽到什麼關係八公公鹽柴事件的糾葛,下午仍然去釣蝦。
+「雙喜,你們這班小鬼,昨天偷了我的豆了罷?又不肯好好的摘,蹋壞了不少。」 我抬頭看時,是六一公公棹著小船,賣了豆回來了,船肚裡還有剩下的一堆豆。
+「是的。我們請客。我們當初還不要你的呢。你看,你把我的蝦嚇跑了!」雙喜說。
+六一公公看見我,便停了楫,笑道,「請客?——這是應該的。」於是對我說, 「迅哥兒,昨天的戲可好麽?」
+我點一點頭,說道,「好。」「豆可中吃呢?」我又點一點頭,說道,「很好。」
+不料六一公公竟非常感激起來,將大拇指一翹,得意的說道,「這真是大市鎮裡出來的讀過書的人纔識貨!我的豆種是粒粒挑選過的,鄉下人不識好歹,還說我的豆比不上別人的呢。我今天也要送些給我們的姑奶奶嘗嘗去……」他於是打著楫子過去了。
+待到母親叫我回去吃晚飯的時候,桌上便有一大碗煮熟了的羅漢豆,就是六一公公送給母親和我吃的。聽說他還對母親極口誇獎我,說「小小年紀便有見識,將來一定要中狀元。姑奶奶,你的福氣是可以寫包票的了。」但我吃了豆,卻並沒有昨夜的豆那麼好。
+真的,一直到現在,我實在再沒有吃到那夜似的好豆,——也不再看到那夜似的好戲了。
+方玄綽近來愛說「差不多」這一句話,幾乎成了「口頭禪」似的;而且不但說,的確也盤據在他腦裏了。他最初說的是「都一樣」,後來大約覺得欠穩當了,便改為「差不多」,一直使用到現在。
+他自從發見了這一句平凡的警句以後,雖然引起了不少的新感慨,同時卻也到許多新慰安。譬如看見老輩威壓青年,在先是要憤憤的,但現在卻就轉念道,將來這少年有了兒孫時,大抵也要擺這架子的罷,便再沒有什麼不平了。又如看見兵士打車夫,在先也要憤憤的,但現在也就轉念道,倘使這車夫當了兵,這兵拉了車,大抵也就這麼打,便再也不放在心上了。他這樣想著的時候,有時也疑心是因為自己沒有和惡社會奮鬥的勇氣,所以瞞心昧己的故意造出來的一條逃路,很近於「無是非之心」,遠不如改正了好。然而這意見總反而在他腦裏生長起來。
+他將這「差不多說」最初公表的時候是在北京首善學校的講堂上,其時大概是提起關於歷史上的事情來,於是說到「古今人不相遠」,說到各色人等的「性相近」,終於牽扯到學生和官僚身上,大發其議論道:
+「現在社會上時髦的都通行罵官僚,而學生罵得尤利害。然而官僚並不是天生的特別種族,就是平民變就的。現在學生出身的官僚就不少,和老官僚有什麼兩樣呢?『易地則皆然』,思想言論舉動豐采都沒有什麼大區別……便是學生團體新辦的許多事業,不是也已經難免出弊病,大半煙消火滅了麽?差不多的。但中國將來之可慮就在此……」
+散坐在講堂裏的二十多個聽講者,有的悵然了,或者是以為這話對;有的勃然了,大約是以為侮辱了神聖的青年;有幾個卻對他微笑了,大約以為這是他替自己的辯解:因為方玄綽就是兼做官僚的。
+而其實卻是都錯誤。這不過是他的一種新不平;雖說不平,又只是他的一種安分的空論。他自己雖然不知道是因為懶,還是因為無用,總之覺得是一個不肯運動,十分安分守己的人。總長冤他有神經病,只要地位還不至於動搖,他決不開一開口;教員的薪水欠到大半年了,只要別有官俸支持,他也決不開一開口。不但不開口,當教員聯合索薪的時候,他還暗地裏以為欠斟酌,太嚷嚷;直到聽得同寮過分的奚落他們了,這纔略有些小感慨,後來一轉念,這或者因為自己正缺錢,而別的官並不兼做教員的緣故罷,於是就釋然了。
+他雖然也缺錢,但從沒有加入教員的團體內,大家議決罷課,可是不去上課了。政府說「上了課纔給錢」,他纔略恨他們的類乎用果子耍猴子;一個大教育家說道「教員一手挾書包一手要錢不高尚」,他纔對於他的太太正式的發牢騷了。
+「喂,怎麼只有兩盤?」聽了「不高尚說」這一日的晚餐時候,他看著菜蔬說。
+他們是沒有受過新教育的,太太並無學名或雅號,所以也就沒有什麼稱呼了,照老例雖然也可以叫「太太」但他又不願意太守舊,於是就發明瞭一個「喂」字。太太對他卻連「喂」字也沒有,只要臉向著他說話,依據習慣法,他就知道這話是對他而發的。
+「可是上月領來的一成半都完了……昨天的米,也還是好容易纔賒來的呢。」伊站在桌旁臉對著他說。
+「你看,還說教書的要薪水是卑鄙哩。這種東西似乎連人要吃飯,飯要米做,米要錢買這一點粗淺事情都不知道……」
+「對啦。沒有錢怎麼買米,沒有米怎麼煮……」
+他兩頰都鼓起來了,仿佛氣惱這答案正和他的議論「差不多」,近乎隨聲附和模樣;接著便將頭轉向別一面去了,依據習慣法,這是宣告討論中止的表示。
+待到淒風冷雨這一天,教員們因為向政府去索欠薪,在新華門前爛泥裏被國軍打得頭破血出之後,倒居然也發了一點薪水。方玄綽不費舉手之勞的領了錢,酌還些舊債,卻還缺一大筆款,這是因為官俸也頗有些拖欠了。當是時,便是廉吏清官們也漸以為薪之不可不索,而況兼做教員的方玄綽,自然更表同情於學界起來,所以大家主張繼續罷課的時候,他雖然仍未到場,事後卻尤其心悅誠服的確守了公共的決議。
+然而政府竟又付錢,學校也就開課了。但在前幾天,卻有學生總會上一個呈文給政府,說「教員倘若不上課,便要付欠薪。」這雖然並無效,而方玄綽卻忽而記起前回政府所說的「上了課纔給錢」的話來,「差不多」這一個影子在他眼前又一幌,而且並不消滅,於是他便在講堂上公表了。
+準此,可見如果將「差不多說」鍛煉羅織起來,自然也可以判作一種挾帶私心的不平,但總不能說是專為自己做官的辯解。只是每到這些時,他又常常喜歡拉上中國將來的命運之類的問題,一不小心,便連自己也以為是一個憂國的志士;人們是每苦於沒有「自知之明」的。
+但是「差不多」的事實又發生了,政府當初雖只不理那些招人頭痛的教員,後來竟不理到無關痛癢的官吏,欠而又欠,終於逼得先前鄙薄教員要錢的好官,也很有幾員化為索薪大會裏的驍將了。惟有幾種日報上卻很發了些鄙薄譏笑他們的文字。方玄綽也毫不為奇,毫不介意,因為他根據了他的「差不多說」,知道這是新聞記者還未缺少潤筆的緣故,萬一政府或是闊人停了津貼,他們多半也要開大會的。
+他既已表同情於教員的索薪,自然也贊成同寮的索俸,然而他仍安坐在衙門中,照例的並不一同去討債。至於有人疑心他孤高,那可也不過是一種誤解罷了。他自己說,他是自從出世以來,只有人向他來要債,他從沒有向人去討過債,所以這一端是「非其所長」。而且他是不敢見手握經經濟之權的人物,這種人待到失了權勢之後,捧著一本《大乘起信論》講佛學的時候,固然也很是「藹然可親」的了,但還在寶座上時,卻總是一副閻王臉,將別人都當奴才看自以為手操著你們這些窮小子們的生殺之權。他因此不敢見,也不願見他們。這種脾氣,雖然有時連自己也覺得是孤高,但往往同時也疑心這其實是沒本領。
+大家左索右索,總自一節一節的挨過去了,但比起先前來,方玄綽究竟是萬分的拮据,所以使用的小廝和交易的店家不消說,便是方太太對於他也漸漸的缺了敬意,只要看伊近來不很附和,而且常常提出獨創的意見,有些唐突的舉動,也就可以瞭然了。到了陰曆五月初四的午前,他一回來,伊便將一疊賬單塞在他的鼻子跟前,這也是往常所沒有的。
+「一總總得一百八十塊錢纔夠開消……發了麽?」伊並不對著他看的說。
+「哼,我明天不做官了。錢的支票是領來的了,可是索薪大會的代表不發放,先說是沒有同去的人都不發,後來又說是要到他們跟前去親領。他們今天單捏著支票,就變了閻王臉了,我實在怕看見……我錢也不要了,官也不做了,這樣無限量的卑屈……」
+方太太見了這少見的義憤,倒有些愕然了,但也就沉靜下來。
+「我想,還不如去親領罷,這算什麼呢。」伊看著他的臉說。
+「我不去!這是官俸,不是賞錢,照例應該由會計科送來的。」
+「可是不送來又怎麼好呢……哦,昨夜忘記說了,孩子們說那學費,學校裏已經催過好幾次了,說是倘若再不繳……」
+「胡說!做老子的辦事教書都不給錢,兒子去念幾句書倒要錢?」
+伊覺得他已經不很顧忌道理,似乎就要將自己當作校長來出氣,犯不上,便不再言語了。
+兩個默默的吃了午飯。他想了一會,又懊惱的出去了。
+照舊例,近年是每逢節根或年關的前一天,他一定須在夜裏的十二點鐘纔回家,一面走,一面掏著懷中,一面大聲的叫道,「喂,領來了!」於是遞給伊一疊簇新的中交票,臉上很有些得意的形色。誰知道初四這一天卻破了例,他不到七點鐘便回家來。方太太很驚疑,以為他竟已辭了職了,但暗暗地察看他臉上,卻也並不見有什麼格外倒運的神情。「怎麼了?……這樣早?……」伊看定了他說。「發不及了,領不出了,銀行已經關了門,得等初八。」「親領?……」伊惴惴的問。
+「親領這一層也已經取消了,聽說仍舊由會計科分送。可是銀行今天已經關了門,休息三天,得等到初八的上午。」他坐下,眼睛看著地面了,喝過一口茶,纔又慢慢的開口說,「幸而衙門裏也沒有什麼問題了,大約到初八就準有錢……向不相干的親戚朋友去借錢,實在是一件煩難事。我午後硬著頭皮去尋金永生,談了一會,他先恭維我不去索薪,不肯親領,非常之清高,一個人正應該這樣做;待到知道我想要向他通融五十元,就像我在他嘴裏塞了一大把鹽似的,凡有臉上可以打皺的地迫都打起皺來,說房租怎樣的收不起,買賣怎樣的賠本,在同事面前親身領款,也不算什麼的,即刻將我支使出來了。」
+「這樣緊急的節根,誰還肯借出錢去呢。」方太太卻只淡淡的說,並沒有什麼慨然。
+方玄綽低下頭來了,覺得這也無怪其然的,況且自己和金永生本來很疏遠。他接著就記起去年年關的事來,那時有一個同鄉來借十塊錢,他其時明明已經收到了衙門的領款憑單的了,因為死怕這人將來未必會還錢,便裝了副為難的神色,說道衙門裏既然領不到俸錢,學校裏又不發薪水,實在「愛莫能助」,將他空手送走了。他雖然自已並不看見裝了怎樣的臉,但此時卻覺得很局促,嘴唇微微一動,又搖一搖頭。
+然而不多久,他忽而恍然大悟似的發命令了:叫小廝即刻上街去賒一瓶蓮花白。他知道店家希圖明天多還帳,大抵是不敢不賒的,假如不賒,則明天分文不還,正是他們應得的懲罰。蓮花白竟賒來了,他喝了兩杯,青白色的臉上泛了紅,吃完飯,又頗有些高興了,他點上一枝大號哈德門香煙,從桌上抓起一本《嘗試集》來,躺在床上就要看。
+「那麼明天怎麼對付店家呢?」方太太追上去,站在床面前看著他的臉說。「店家?……教他們初八的下半天來。」「我可不能這麼說。他們不相信,不答應的。」「有什麼不相信。他們可以問去,全衙門裏什麼人也沒有領到,都得初八!」他戟著第二個指頭在帳子裏的空中畫了一個半圓,方太太跟著指頭也看了一個半圓,只見這手便去翻開了《嘗試集》。
+方太太見他強橫到出乎情理之外了,也暫時開不得口。
+「我想,這模樣是鬧不下去的,將來總得想點法,做點什麼別的事……」伊終於尋到了別的路,說。「什麼法呢?我『文不像謄錄生,武不像救火兵』,別的做什麼?」「你不是給上海的書鋪子做過文章麽?」
+「上海的書鋪子?買稿要一個一個的算字,空格不算數。你看我做在那裏的白話詩去,空白有多少,怕只值三百大錢一本罷。收版權稅又半年六月沒消息,『遠水救不得近火』,誰耐煩。」「那麼,給這裏的報館裏……」
+「給報館裏?便在這裏很大的報館裏,我靠著一個學生在那裏做編輯的大情面,一千字也就是這幾個錢,即使一早做到夜,能夠養活你們麽?況且我肚子裏也沒有這許多文章。」
+「那麼,過了節怎麼辦呢?」「過了節麽?——仍舊做官……明天店家來要錢,你只要說初八的下午。」
+他又要看《嘗試集》了。方太太怕失了機會,連忙吞吞吐吐的說:「我想,過了節,到了初八,我們……倒不如去買一張彩票……」「胡說!會說出這樣無教育的……」
+這時候,他忽而又記起被金永生支使出來以後的事了。那時他惘惘的走過稻香村,看店門口豎著許多斗大的字的廣告道「頭彩幾萬元」,仿佛記得心裏也一動,或者也許放慢了腳步的罷,但似乎因為捨不得皮夾裏僅存的六角錢,所以竟也毅然決然的走遠了。他臉色一變,方太太料想他是在惱著伊的無教育,便趕緊退開,沒有說完話。方玄綽也沒有說完話,將腰一伸,咿咿嗚嗚的就念《嘗試集》。
+我冒了嚴寒,回到相隔二千餘里,別了二十餘年的故鄉去。
+時候既然是深冬;漸近故鄉時,天氣又陰晦了,冷風吹進船艙中,嗚嗚的響,從蓬隙向外一望,蒼黃的天底下,遠近橫著幾個蕭索的荒村,沒有一些活氣。我的心禁不住悲涼起來了。
+阿!這不是我二十年來時時記得的故鄉?
+我所記得的故鄉全不如此。我的故鄉好得多了。但要我記起他的美麗,說出他的佳處來,卻又沒有影像,沒有言辭了。仿佛也就如此。於是我自己解釋說:故鄉本也如此,——雖然沒有進步,也未必有如我所感的悲涼,這只是我自己心情的改變罷了,因為我這次回鄉,本沒有什麼好心緒。
+我這次是專為了別他而來的。我們多年聚族而居的老屋,已經公同賣給別姓了,交屋的期限,只在本年,所以必須趕在正月初一以前,永別了熟識的老屋,而且遠離了熟識的故鄉,搬家到我在謀食的異地去。
+第二日清早晨我到了我家的門口了。瓦楞上許多枯草的斷莖當風抖著,正在說明這老屋難免易主的原因。幾房的本家大約已經搬走了,所以很寂靜。我到了自家的房外,我的母親早已迎著出來了,接著便飛出了八歲的侄兒宏兒。
+我的母親很高興,但也藏著許多淒涼的神情,教我坐下,歇息,喝茶,且不談搬家的事。宏兒沒有見過我,遠遠的對面站著只是看。
+但我們終於談到搬家的事。我說外間的寓所已經租定了,又買了幾件傢具,此外須將家裡所有的木器賣去,再去增添。母親也說好,而且行李也略已齊集,木器不便搬運的,也小半賣去了,只是收不起錢來。
+「你休息一兩天,去拜望親戚本家一回,我們便可以走了。」母親說。
+「是的。」
+「還有閏土,他每到我家來時,總問起你,很想見你一回面。我已經將你到家的大約日期通知他,他也許就要來了。」
+這時候,我的腦裡忽然閃出一幅神異的圖畫來:深藍的天空中掛著一輪金黃的圓月,下麵是海邊的沙地,都種著一望無際的碧綠的西瓜,其間有一個十一二歲的少年,項帶銀圈,手捏一柄鋼叉,向一匹猹盡力的刺去,那猹卻將身一扭,反從他的胯下逃走了。
+這少年便是閏土。我認識他時,也不過十多歲,離現在將有三十年了;那時我的父親還在世,家景也好,我正是一個少爺。那一年,我家是一件大祭祀的值年。這祭祀,說是三十多年才能輪到一回,所以很鄭重;正月裡供祖像,供品很多,祭器很講究,拜的人也很多,祭器也很要防偷去。我家只有一個忙月(我們這裡給人做工的分三種:整年給一定人家做工的叫長工;按日給人做工的叫短工;自己也種地,只在過年過節以及收租時候來給一定人家做工的稱忙月),忙不過來,他便對父親說,可以叫他的兒子閏土來管祭器的。
+我的父親允許了;我也很高興,因為我早聽到閏土這名字,而且知道他和我仿佛年紀,閏月生的,五行缺土,所以他的父親叫他閏土。他是能裝弶捉小鳥雀的。
+我於是日日盼望新年,新年到,閏土也就到了。好容易到了年末,有一日,母親告訴我,閏土來了,我便飛跑的去看。他正在廚房裡,紫色的圓臉,頭戴一頂小氈帽,頸上套一個明晃晃的銀項圈,這可見他的父親十分愛他,怕他死去,所以在神佛面前許下願心,用圈子將他套住了。他見人很怕羞,只是不怕我,沒有旁人的時候,便和我說話,於是不到半日,我們便熟識了。
+我們那時候不知道談些什麼,只記得閏土很高興,說是上城之後,見了許多沒有見過的東西。
+第二日,我便要他捕鳥。他說:
+"這不能。須大雪下了才好。我們沙地上,下了雪,我掃出一塊空地來,用短棒支起一個大竹匾,撒下秕穀,看鳥雀來吃時,我遠遠地將縛在棒上的繩子只一拉,那鳥雀就罩在竹匾下了。什麼都有:稻雞,角雞,鵓鴣,藍背……"
+我於是又很盼望下雪。
+閏土又對我說:
+"現在太冷,你夏天到我們這裡來。我們日裡到海邊撿貝殼去,紅的綠的都有,鬼見怕也有,觀音手也有。晚上我和爹管西瓜去,你也去。"
+"管賊麽?"
+"不是。走路的人口渴了摘一個瓜吃,我們這裡是不算偷的。要管的是獾豬,刺蝟,猹。月亮底下,你聽,啦啦的響了,猹在咬瓜了。你便捏了胡叉,輕輕地走去……"
+我那時並不知道這所謂猹的是怎麼一件東西——便是現在也沒有知道——只是無端的覺得狀如小狗而很兇猛。
+"他不人麽?"
+"有胡叉呢。走到了,看見猹了,你便刺。這畜生很伶俐,倒向你奔來,反從胯下竄了。他的皮毛是油一般的滑……"
+我素不知道天下有這許多新鮮事:海邊有如許五色的貝殼;西瓜有這樣危險的經歷,我先前單知道他在水果店裡出賣罷了。
+"我們沙地裡,潮汛要來的時候,就有許多跳魚兒只是跳,都有青蛙似的兩個腳……"
+阿!閏土的心裡有無窮無盡的希奇的事,都是我往常的朋友所不知道的。他們不知道一些事,閏土在海邊時,他們都和我一樣只看見院子裡高牆上的四角的天空。
+可惜正月過去了,閏土須回家裡去,我急得大哭,他也躲到廚房裡,哭著不肯出門,但終於被他父親帶走了。他後來還托他的父親帶給我一包貝殼和幾支很好看的鳥毛,我也曾送他一兩次東西,但從此沒有再見面。
+現在我的母親提起了他,我這兒時的記憶,忽而全都閃電似的蘇生過來,似乎看到了我的美麗的故鄉了。我應聲說:
+"這好極!他,——怎樣?……"
+"他?……他景況也很不如意……"母親說著,便向房外看,"這些人又來了。說是買木器,順手也就隨便拿走的,我得去看看。"
+母親站起身,出去了。門外有幾個女人的聲音。我便招宏兒走近面前,和他閑話:問他可會寫字,可願意出門。
+"我們坐火車去麽?"
+"我們坐火車去。"
+"船呢?"
+"先坐船,……"
+"哈!這模樣了!鬍子這麼長了!"一種尖利的怪聲突然大叫起來。
+我吃了一嚇,趕忙抬起頭,卻見一個凸顴骨,薄嘴唇,五十歲上下的女人站在我面前,兩手搭在髀間,沒有系裙,張著兩腳,正像一個畫圖儀器裡細腳伶仃的圓規。
+我愕然了。
+"不認識了麽?我還抱過你咧!"
+我愈加愕然了。幸而我的母親也就進來,從旁說:
+"他多年出門,統忘卻了。你該記得罷,"便向著我說,"這是斜對門的楊二嫂,……開豆腐店的。"
+哦,我記得了。我孩子時候,在斜對門的豆腐店裡確乎終日坐著一個楊二嫂,人都叫伊"豆腐西施"⑹。但是擦著白粉,顴骨沒有這麼高,嘴唇也沒有這麼薄,而且終日坐著,我也從沒有見過這圓規式的姿勢。那時人說:因為伊,這豆腐店的買賣非常好。但這大約因為年齡的關係,我卻並未蒙著一毫感化,所以竟完全忘卻了。然而圓規很不平,顯出鄙夷的神色,仿佛嗤笑法國人不知道拿破侖,美國人不知道華盛頓似的,冷笑說:
+"忘了?這真是貴人眼高……"
+"那有這事……我……"我惶恐著,站起來說。
+"那麼,我對你說。迅哥兒,你闊了,搬動又笨重,你還要什麼這些破爛木器,讓我拿去罷。我們小戶人家,用得著。"
+"我並有闊哩。我須賣了這些,再去……"
+"阿呀呀,你放了道台了,還說不闊?你現在有三房姨太太;出門便是八抬的大轎,還說不闊?嚇,什麼都瞞不過我。"
+我知道無話可說了,便閉了口,默默的站著。
+"阿呀阿呀,真是愈有錢,便愈是一毫不肯放鬆,愈是一毫不肯放鬆,便愈有錢……"圓規一面憤憤的迴轉身,一面絮絮的說,慢慢向外走,順便將我母親的一副手套塞在褲腰裡,出去了。
+此後又有近處的本家和親戚來訪問我。我一面應酬,偷空便收拾些行李,這樣的過了三四天。
+一日是天氣很冷的午後,我吃過午飯,坐著喝茶,覺得外面有人進來了,便回頭去看。我看時,不由的非常出驚,慌忙站起身,迎著走去。
+這來的便是閏土。雖然我一見便知道是閏土,但又不是我這記憶上的閏土了。他身材增加了一倍;先前的紫色的圓臉,已經變作灰黃,而且加上了很深的皺紋;眼睛也像他父親一樣,周圍都腫得通紅,這我知道,在海邊種地的人,終日吹著海風,大抵是這樣的。他頭上是一頂破氈帽,身上只一件極薄的棉衣,渾身瑟索著;手裡提著一個紙包和一支長煙管,那手也不是我所記得的紅活圓實的手,卻又粗又笨而且開裂,像是松樹皮了。
+我這時很興奮,但不知道怎麼說才好,只是說:
-詞曰:滾滾長江東逝水,浪花淘盡英雄。是非成敗轉頭空:青山依舊在,幾度夕陽紅。白髮漁樵江渚上,慣看秋月春風。一壺濁酒喜相逢:古今多少事,都付笑談中。
+"阿!閏土哥,——你來了?……"
-話說天下大勢,分久必合,合久必分:周末七國分爭,并入於秦。及秦滅之後,楚、漢分爭,又并入於漢。漢朝自高祖斬白蛇而起義,一統天下。後來光武中興,傳至獻帝,遂分為三國。推其致亂之由,殆始於桓、靈二帝。桓帝禁錮善類,崇信宦官。及桓帝崩,靈帝即位,大將軍竇武、太傅陳蕃,共相輔佐。時有宦官曹節等弄權,竇武、陳蕃謀誅之,作事不密,反為所害。中涓自此愈橫。
+我接著便有許多話,想要連珠一般湧出:角雞,跳魚兒,貝殼,猹,……但又總覺得被什麼擋著似的,單在腦裡面迴旋,吐不出口外去。
-建寧二年四月望日,帝御溫德殿。方陞座,殿角狂風驟起,只見一條大青蛇,從梁上飛將下來,蟠於椅上。帝驚倒,左右急救入宮,百官俱奔避。須臾,蛇不見了。忽然大雷大雨,加以冰雹,落到半夜方止,壞卻房屋無數。建寧四年二月,洛陽地震;又海水泛溢,沿海居民,盡被大浪捲入海中。光和元年,雌雞化雄。六月朔,黑氣十餘丈,飛入溫德殿中。秋七月,有虹見於玉堂;五原山岸,盡皆崩裂。種種不祥,非止一端。
-
-帝下詔問群臣以災異之由,議郎蔡邕上疏,以為蜺墮雞化,乃婦寺干政之所致,言頗切直。帝覽奏歎息,因起更衣。曹節在後竊視,悉宣告左右,遂以他事陷邕於罪,放歸田里。後張讓,趙忠,封諝,段珪,曹節,候覽,蹇碩,程曠,夏惲,郭勝十人朋比為奸,號為「十常侍」。帝尊信張讓,呼為「阿父」,朝政日非,以致天下人心思亂,盜賊蜂起。
-
-時鉅鹿郡有兄弟三人:一名張角,一名張寶,一名張梁。那張角本是個不第秀才。因入山採藥,遇一老人,碧眼童顏,手執藜杖,喚角至一洞中,以天書三卷授之,曰:「此名太平要術。汝得之,當代天宣化,普救世人;若萌異心,必獲惡報。」角拜問姓名。老人曰:「吾乃南華老仙也。」言訖,化陣清風而去。
-
-角得此書,曉夜攻習,能呼風喚雨,號為太平道人。中平元年正月內,疫氣流行,張角散施符水,為人治病,自稱大賢良師。角有徒弟五百餘人,雲游四方,皆能書符念咒。次後徒眾日多,角乃立三十六方,ー大方萬餘人,小方六七千ー,各立渠帥,稱為將軍。訛言「蒼天已死,黃天當立。」又云「歲在甲子,天下大吉。」令人各以白土,書「甲子」二字於家中大門上。青、幽、徐、冀、荊、揚、兗、豫八州之人,家家侍奉大賢良師張角名字。角遣其黨馬元義,暗齎金帛,結交中涓封諝,以為內應。角與二弟商議曰:「至難得者,民心也。今民心已順,若不乘勢取天下,誠為可惜。」遂一面私造黃旗,約期舉事;一面使弟子唐州,馳書報封諝。唐州乃逕赴省中告變。帝召大將軍何進調兵擒馬元義,斬之;次收封諝等一干人下獄。
-
-張角聞知事露,星夜舉兵,自稱天公將軍,ー張寶稱地公將軍,張梁稱人公將軍ー。申言於眾曰:「今漢運將終,大聖人出;汝等皆宜順從天意,以槳太平。」四方百姓,裹黃巾從張角反者,四五十萬。賊勢浩大,官軍望風而靡。何進奏帝火速降詔,令各處備禦,討賊立功;一面遣中郎將盧植,皇甫嵩,朱雋,各引精兵,分三路討之。
-
-且說張角一軍,前犯幽州界分。幽州太守劉焉,乃江夏竟陵人氏,漢魯恭王之後也;當時聞得賊兵將至,召校尉鄒靖計議。靖曰:「賊兵眾,我兵寡,明公宜作速招軍應敵。」劉焉然其說,隨即出榜招募義兵。榜文行到涿縣,乃引出涿縣中一個英雄。
-
-那人不甚好讀書;性寬和,寡言語,喜怒不形於色;素有大志,專好結交天下豪傑;生得身長七尺五寸,兩耳垂肩,雙手過膝,目能自顧其耳,面如冠玉,脣若塗脂;中山靖王劉勝之後,漢景帝閣下玄孫;姓劉,名備,字玄德。昔劉勝之子劉貞,漢武時封涿鹿亭侯,後坐酬金失侯,因此遺這一枝在涿縣。玄德祖劉雄,父劉弘。弘曾舉孝廉,亦嘗作吏,早喪。玄德幼孤,事母至孝;家貧,販屨織蓆為業。家住本縣樓桑村。其家之東南,有一大桑樹,高五丈餘,遙望之,童童如車蓋。相者云:「此家必出貴人。」
-
-玄德幼時,與鄉中小兒戲於樹下,曰:「我為天子,當乘此車蓋。」叔父劉元起奇其言,曰:「此兒非常人也!」因見玄德家貧,常資給之。年十五歲,母使游學,嘗師事鄭玄、盧植;與公孫瓚等為友。及劉焉發榜招軍時,玄德年己二十八歲矣。當日見了榜文,慨然長歎。隨後一人厲聲言曰:「大丈夫不與國家出力,何故長歎?」
-
-玄德回視其人:身長八尺,豹頭環眼,燕頷虎鬚,聲若巨雷,勢如奔馬。玄德見他形貌異常,問其姓名。其人曰:「某姓張,名飛,字翼德。世居涿郡,頗有莊田,賣酒屠豬,專好結交天下豪傑。適纔見公看榜而歎,故此相問。」玄德曰:「我本漢室宗親,姓劉,名備。今聞黃巾倡亂,有志欲破賊安民;恨力不能,故長歎耳。」飛曰:「吾頗有資財,當招募鄉勇,與公同舉大事,如何?」玄德甚喜,遂與同入村店中飲酒。
-
-正飲間,見一大漢,推著一輛車子,到店門首歇了;入店坐下,便喚酒保:「快斟酒來吃,我待趕入城去投軍。」玄德看其人:身長九尺,髯長二尺:面如重棗,脣若塗脂;丹鳳眼,臥蠶眉:相貌堂堂,威風凜凜。玄德就邀他同坐,叩其姓名。其人曰:「吾姓關,名羽,字壽長,後改雲長,河東解良人也。因本處勢豪,倚勢凌人,被吾殺了;逃難江湖,五六年矣。今聞此處招軍破賊,特來應募。」玄德遂以己志告之。雲長大喜。同到張飛莊上,共議大事。
-
-飛曰:「吾莊後有一桃園,花開正盛;明日當於園中祭告天地,我三人結為兄弟,協力同心,然後可圖大事。」玄德、雲長、齊聲應曰:「如此甚好。」次日,於桃園中,備下烏牛白馬祭禮等項,三人焚香,再拜而說誓曰:「念劉備、關羽、張飛,雖然異姓,既結為兄弟,則同心協力,救困扶危;上報國家,下安黎庶;不求同年同月同日生,但願同年同月同日死。皇天后土,實鑒此心。背義忘恩,天人共戮。」誓畢,拜玄德為兄,關羽次之,張飛為弟。祭罷天地,復宰牛設酒,聚鄉中勇士,得三百餘人,就桃園中痛飲一醉。來日收拾軍器,但恨無馬匹可乘。
-
-正思慮間,人報「有兩個客人,引一夥伴儅,趕一群馬,投莊上來。」玄德曰:「此天佑我也!」三人出莊迎接。原來二客乃中山大商:一名張世平,一名蘇雙,每年往北販馬,近因寇發而回。玄德請二人到莊,置酒管待,訴說欲討賊安民之意。二客大喜,願將良馬五十匹相送;又贈金銀五百兩,鑌鐵一千斤,以資器用。玄德謝別二客,便命良匠打造雙股劍。雲長造青龍偃月刀,又名冷豔鋸,重八十二斤。張飛造丈八點鋼矛。各置全身鎧甲。共聚鄉勇五百餘人,來見鄒靖。鄒靖引見太守劉焉。三人參見畢,各通姓名。玄德說起宗派,劉焉大喜,遂認玄德為姪。
-
-不數日,人報黃巾賊將程遠志統兵五萬來犯涿郡。劉焉令鄒靖引玄德等三人,統兵五百,前去破敵。玄德等欣然領軍前進,直至大興山下,與賊相見。賊眾皆披髮,以黃巾抹額。當下兩軍相對,玄德出馬,ー左有雲長,右有翼德ー,揚鞭大罵:「反國逆賊,何不早降!」
-
-程遠志大怒,遣副將鄧茂出戰。張飛挺丈八蛇矛直出,手起處,刺中鄧茂心窩,翻身落馬。程遠志見折了鄧茂,拍馬舞刀,直取張飛。雲長舞動大刀,縱馬飛迎。程遠志見了,早吃一驚;措手不及,被雲長刀起處,揮為兩段。後人有詩讚二人曰:
-
-英雄發穎在今朝,一試矛兮一試刀。初出便將威力展,三分好把姓名標。
-
-眾賊見程遠志被斬,皆倒戈而走。玄德揮軍追趕,投降者不計其數,大勝而回。劉焉親自迎接,賞勞軍士。次日,接得青州太守龔景牒文,言黃巾賊圍城將陷,乞賜救援。劉焉與玄德商議。玄德曰:「備願往救之。」劉焉令鄒靖將兵五千,同玄德,關,張,投青州來。賊眾見救軍至,分兵混戰。玄德兵寡不勝,退三十里下寨。玄德謂關、張曰、「賊眾我寡,必出奇兵,方可取勝。」乃分關公引一千軍伏山左,張飛引一千軍伏山右,鳴金為號,齊出接應。
-
-次日,玄德與鄒靖,引軍鼓譟而進。賊眾迎戰,玄德引軍便退。賊眾乘勢追趕,方過山嶺,玄德軍中一齊鳴金,左右兩軍齊出,玄德麾軍回身復殺。三路夾攻,賊眾大潰。直趕至青州城下,太守龔景亦率民兵出城助戰。賊勢大敗,剿戮極多,遂解青州之圍。後人有詩讚玄德曰:
-
-運籌決算有神功,二虎還須遜一龍。初出便能垂偉績,自應分鼎在孤窮。
-
-龔景犒軍畢,鄒靖欲回。玄德曰:「近聞中郎將盧植與賊首張角戰於廣宗,備昔曾師事盧植,欲往助之。」於是鄒靖引軍自回,玄德與關、張引本部五百人投廣宗來。至盧植軍中,入帳施禮,具道來意。盧植大喜,留在帳前聽調。
-
-時張角賊眾十五萬,植兵五萬,相拒於廣宗,未見勝負。植謂玄德曰:「我今圍賊在此,賊弟張梁,張寶在潁川,與皇甫嵩、朱雋對壘。汝可引本部人馬,我更助汝一千官軍,前去潁川打探消息,約期剿捕。」玄德領命,引軍星夜投潁川來。時皇甫嵩、朱雋領軍拒賊,賊戰不利,退入長社,依草結營。嵩與雋計曰:「賊依草結營,當用火攻之。」遂令軍士,每人束草一把,暗地埋伏。其夜大風忽起。二更以後,一齊縱火,嵩與雋各引兵攻擊賊寨,火燄張天,賊眾驚慌,馬不及鞍,人不及甲,四散奔走。殺到天明,張梁、張寶引敗殘軍士,奪路而走。
-
-忽見一彪軍馬,盡打紅旗,當頭來到,截往去路。為首閃出一將,身長七尺,細眼長髯;官拜騎都尉;沛國譙郡人也:姓曹,名操,字孟德。操父曹嵩,本姓夏侯氏;因為中常侍曹騰之養子,故冒姓曹。曹嵩生操,小字阿瞞,一名吉利。操幼時,好游獵,喜歌舞;有權謀,多機變。操有叔父,見操游蕩無度,嘗怒之,言於曹嵩。嵩責操。操忽心生一計:見叔父來,詐倒於地,作中風之狀。叔父驚告嵩,嵩急視之,操故無恙。嵩曰:「叔言汝中風,今己愈乎?」操曰:「兒自來無此病;因失愛於叔父,故見罔耳。」嵩信其言。後叔父但言操過,嵩並不聽。因此,操得恣意放蕩。
-
-時人有橋玄者,謂操曰:「天下將亂,非命世之才,不能濟。能安之者,其在君乎?」南陽何顒見操,言:「漢室將亡,安天下者,必此人也。」汝南許劭,有知人之名。操往見之,問曰:「我何如人?」劭不答。又問,劭曰:「子治世之能臣,亂世之奸雄也。」操聞言大喜。年二十,舉孝廉,為郎,除洛陽北都尉。初到任,即設五色棒十餘條於縣之四門。有犯禁者,不避豪貴,皆責之。中常侍蹇碩之叔,提刀夜行,操巡夜拏住,就棒責之。由是,內外莫敢犯者,威名頗震。後為頓丘令。因黃巾起,拜為騎都尉,引馬步軍五千,前來潁川助戰。正值張梁、張寶敗走,曹操攔住,大殺一陣,斬首萬餘級,奪得旗旛、金鼓馬匹極多。張梁、張寶死戰得脫。操見過皇甫嵩,朱雋,隨即引兵追襲張梁、張寶去了。
-
-卻說玄德引關、張來潁川,聽得喊殺之聲,又望見火光燭天,急引兵來時,賊已敗散。玄德見皇甫嵩,朱雋,其道盧植之意。嵩曰:「張梁、張寶勢窮力乏,必投廣宗去依張角。玄德可即星夜往助。」
-
-玄德領命,遂引兵復回。到得半路,只見一簇軍馬,護送一輛檻車,車中之囚,乃盧植也。玄德大驚,滾鞍下馬,問其緣故。植曰:「我圍張角,將次可破;因角用妖術,未能即勝。朝廷差黃門左豐前來體探,問我索取賄賂。我答曰:『軍糧尚缺,安有餘錢奉承天使?』左豐挾恨,回奏朝廷,說我高壘不戰,惰慢軍心;因此朝廷震怒,遣中郎將董卓來代將我兵,取我回京問罪。」
-
-張飛聽罷,大怒,要斬護送軍人,以救盧植。玄德急止之曰:「朝廷自有公論,汝豈可造次?」軍士簇擁盧植去了。關公曰:「盧中郎已被逮,別人領兵,我等去無所依,不如且回涿郡。」玄德從其言,遂引軍北行。
-
-行無二日,忽聞山後喊聲大震。玄德引關、張縱馬上高岡望之,見漢軍大敗,後面漫山塞野,黃巾蓋地而來,旗上大書「天公將軍」。玄德曰:「此張角也!可速戰!」
-
-三人飛馬引軍而出。張角正殺敗董卓,乘勢趕來,忽遇三人衝殺,角軍大亂,敗走五十餘里。三人救了董卓回寨。卓問三人現居何職。玄德曰:「白身。」卓甚輕之,不為禮。玄德出,張飛大怒曰:「我等親赴血戰,救了這廝,他卻如此無禮;若不殺之,難消我氣!」便要提刀入帳來殺董卓。正是:人情勢利古猶今,誰識英雄是白身?安得快人如翼德,盡誅世上負心人!畢竟董卓性命如何,且看下文分解。
+他站住了,臉上現出歡喜和淒涼的神情;動著嘴唇,卻沒有作聲。他的態度終於恭敬起來了,分明的叫道:
+"老爺!……"
+我似乎打了一個寒噤;我就知道,我們之間已經隔了一層可悲的厚障壁了。我也說不出話。
+他回過頭去說,"水生,給老爺磕頭。"便拖出躲在背後的孩子來,這正是一個廿年前的閏土,只是黃瘦些,頸子上沒有銀圈罷了。"這是第五個孩子,沒有見過世面,躲躲閃閃……"
+母親和宏兒樓來了,他們大約也聽到了聲音。
+"老太太。信是早收到了。我實在喜歡的不得了,知道老爺回來……"閏土說。
+"阿,你怎的這樣客氣起來。你們先前不是哥弟稱呼麽?還是照舊:迅哥兒。"母親高興的說。
+"阿呀,老太太真是……這成什麼規矩。那時是孩子,不懂事……"閏土說著,又叫水生上來打拱,那孩子卻害羞,緊緊的只貼在他背後。
+"他就是水生?第五個?都是生人,怕生也難怪的;還是宏兒和他去走走。"母親說。
+宏兒聽得這話,便來招水生,水生卻鬆鬆爽爽同他一路出去了。母親叫閏土坐,他遲疑了一回,終於就了坐,將長煙管靠在桌旁,遞過紙包來,說:
+"冬天沒什麼東西了。這一點乾青豆倒是自家曬在那裡的,請老爺……"
+我問問他的景況。他只是搖頭。
+"非常難。第六個孩子也會幫忙了,卻總是吃不夠……又不太平……什麼地方都要錢,沒有規定……收成又壞。種出東西來,挑去賣,總要捐幾回錢,折了本;不去賣,又只能爛掉……"
+他只是搖頭;臉上雖然刻著許多皺紋,卻全然不動,仿佛石像一般。他大約只是覺得苦,卻又形容不出,沉默了片時,便拿起煙管來默默的吸煙了。
+母親問他,知道他的家裡事務忙,明天便得回去;又沒有吃過午飯,便叫他自己到廚下炒飯吃去。
+他出去了;母親和我都嘆息他的景況:多子,饑荒,苛稅,兵,匪,官,紳,都苦得他像一個木偶人了。母親對我說,凡是不必搬走的東西,盡可以送他,可以聽他自己去揀擇。
+下午,他揀好了幾件東西:兩條長桌,四個椅子,一副香爐和燭臺,一桿抬秤。他又要所有的草灰(我們這裡煮飯是燒稻草的,那灰,可以做沙地的肥料),待我們啟程的時候,他用船來載去。
+夜間,我們又談些閑天,都是無關緊要的話;第二天早晨,他就領了水生回去了。
+又過了九日,是我們啟程的日期。閏土早晨便到了,水生沒有同來,卻只帶著一個五歲的女兒管船隻。我們終日很忙碌,再沒有談天的工夫。來客也不少,有送行的,有拿東西的,有送行兼拿東西的。待到傍晚我們上船的時候,這老屋裡的所有破舊大小粗細東西,已經一掃而空了。
+我們的船向前走,兩岸的青山在黃昏中,都裝成了深黛顏色,連著退向船後梢去。
+宏兒和我靠著船窗,同看外面模糊的風景,他忽然問道:
+"大伯!我們什麼時候回來?"
+"回來?你怎麼還沒有走就想回來了。"
+"可是,水生約我到他家玩去咧……"他睜著大的黑眼睛,癡癡的想。
+我和母親也都有些惘然,於是又提起閏土來。母親說,那豆腐西施的楊二嫂,自從我家收拾行李以來,本是每日必到的,前天伊在灰堆裡,掏出十多個碗碟來,議論之後,便定說是閏土埋著的,他可以在運灰的時候,一齊搬回家裡去;楊二嫂發見了這件事,自己很以為功,便拿了那狗氣殺(這是我們這裡養雞的器具,木盤上面有著柵欄,內盛食料,雞可以伸進頸子去啄,狗卻不能,只能看著氣死),飛也似的跑了,虧伊裝著這麼高低的小腳,竟跑得這樣快。
+老屋離我愈遠了;故鄉的山水也都漸漸遠離了我,但我卻並不感到怎樣的留戀。我只覺得我四面有看不見的高牆,將我隔成孤身,使我非常氣悶;那西瓜地上的銀項圈的小英雄的影像,我本來十分清楚,現在卻忽地模糊了,又使我非常的悲哀。
+母親和宏兒都睡著了。
+我躺著,聽船底潺潺的水聲,知道我在走我的路。我想:我竟與閏土隔絕到這地步了,但我們的後輩還是一氣,宏兒不是正在想念水生麽。我希望他們不再像我,又大家隔膜起來……然而我又不願意他們因為要一氣,都如我的辛苦展轉而生活,也不願意他們都如閏土的辛苦麻木而生活,也不願意都如別人的辛苦恣睢而生活。他們應該有新的生活,為我們所未經生活過的。
+我想到希望,忽然害怕起來了。閏土要香爐和燭臺的時候,我還暗地裡笑他,以為他總是崇拜偶像,什麼時候都不忘卻。現在我所謂希望,不也是我自己手製的偶像麽?只是他的願望切近,我的願望茫遠罷了。
+我在朦朧中,眼前展開一片海邊碧綠的沙地來,上面深藍的天空中掛著一輪金黃的圓月。我想:希望本是無所謂有,無所謂無的。這正如地上的路;其實地上本沒有路,走的人多了,也便成了路。
+臨河的土場上,太陽漸漸的收了他通黃的光線了。場邊靠河的烏桕樹葉,乾巴巴的纔喘過氣來,幾個花腳蚊子在下面哼著飛舞。面河的農家的煙突裏,逐漸減少了炊煙,女人孩子們都在自己門口的土場上波些水,放下小桌子和矮凳;人知道,這已經是晚飯的時候了。
+老人男人坐在矮凳上,搖著大芭蕉扇閑談,孩子飛也似的跑,或者蹲在烏桕樹下賭玩石子。女人端出烏黑的蒸乾菜和松花黃的米飯,熱蓬蓬冒煙。河裏駛過文人的酒船,文豪見了,大發詩興,說:「無思無慮,這真是田家樂呵!」
+但文豪的話有些不合事實,就因為他們沒有聽到九斤老太的話。這時候,九斤老太正在大怒,拿破芭蕉扇敲著凳腳說:
+「我活到七十九歲了,活夠了,不願意眼見這些敗家相,——還是死的好。立刻就要喫飯了,還喫炒豆子,喫窮了一家子!」
+伊的曾孫女兒六斤捏著一把豆,正從對面跑來,見這情形,便直奔河邊,藏在烏桕樹後,伸出雙丫角的小頭,大聲說,「這老不死的!」
+九斤老太雖然高壽,耳朵卻還不很聾,但也沒有聽到孩子的話,仍舊自己說,「這真是一代不如一代!」
+這村莊的習慣有點特別,女人生下孩子,多喜歡用秤稱了輕重,便用斤數當作小名。九斤老太自從慶祝了五十大壽以後,便漸漸的變了不平家,常說伊年青的時候,天氣沒有現在這般熱,豆子也沒有現在這般硬;總之現在的時世是不對了。何況六斤比伊的曾祖,少了三斤,比伊父親七斤,又少了一斤,這真是一條顛撲不破的實例。所以伊又用勁說,「這真是一代不如一代!」
+伊的兒媳七斤嫂子正捧著飯籃走到桌邊,便將飯籃在桌上一摔,憤憤的說,「你老人家又這麼說了。六斤生下來的時候,不是六斤五兩麽?你家的秤又是私秤,加重稱,十八兩秤;用了準十六,我們的六斤該有七斤多哩。我想便是太公和公公,也不見得正是九斤八斤十足,用的秤也許是十四兩……」
+「一代不如一代!」
+七斤嫂還沒有答話,忽然看見七斤從小巷口轉出,便移了方向,對他嚷道,「你這死屍怎麼這時候纔回來,死到那裏去了!不管人家等著你開飯!」
+七斤雖然住在農村,卻早有些飛黃騰達的意思。從他的祖父到他,三代不捏鋤頭柄了;他也照例的幫人撐著航船,每日一回,早晨從魯鎮進城,傍晚又回到魯鎮,因此很知道些時事:例如什麼地方,雷公劈死了蜈蚣精;什麼地方,閨女生了一個夜叉之類。他在村人裏面,的確已經是一名出場人物了。但夏天喫飯不點燈,卻還守著農家習慣,所以回家太遲,是該罵的。
+七斤一手捏著象牙嘴白銅斗六尺多長的湘妃竹煙管,低著頭,慢慢地走來,坐在矮凳上。六斤也趁勢溜出,坐在他身邊,叫他爹爹。七斤沒有應。
+「一代不如一代!」九斤老太說。
+七斤慢慢地抬起頭來,嘆一口氣說,「皇帝坐了龍庭了。」
+七斤嫂呆了一刻,忽而恍然大悟的道,「這可好了,這不是又要皇恩大赦了麽!」
+七斤又嘆一口氣,說,「我沒有辮子。」
+「皇帝要辮子麽?」
+「皇帝要辮子。」
+「你怎麼知道呢?」七斤嫂有些著急,趕忙的問。
+「咸亨酒店裏的人,都說要的。」
+七斤嫂這時從直覺上覺得事情似乎有些不妙了,因為咸亨酒店是消息靈通的所在。伊一轉眼瞥見七斤的光頭,便忍不住動怒,怪他恨他怨他;忽然又絕望起來,裝好一碗飯,搡在七斤的面前道,「還是趕快喫你的飯罷!哭喪著臉,就會長出辮子來麽?」
+太陽收盡了他最末的光線了,水面暗暗地回覆過涼氣來;土場上一片碗筷聲響,人人的脊樑上又都吐出汗粒。七斤嫂喫完三碗飯,偶然抬起頭,心坎裏便禁不住突突地發跳。伊透過烏桕葉,看見又矮又胖的趙七爺正從獨木橋上走來,而且穿著寶藍色竹布的長衫。
+趙七爺是鄰村茂源酒店的主人,又是這三十裏方圓以內的唯一的出色人物兼學問家;因為有學問,所以又有些遺老的臭味。他有十多本金聖嘆批評的《三國志》,時常坐著一個字一個字的讀;他不但能說出五虎將姓名,甚而至於還知道黃忠表字漢昇和馬超表字孟起。革命以後,他便將辮子盤在頂上,像道士一般;常常嘆息說,倘若趙子龍在世,天下便不會亂到這地步了。七斤嫂眼睛好,早望見今天的趙七爺已經不是道士,卻變成光滑頭皮,烏黑髮頂;伊便知道這一定是皇帝坐了龍庭,而且一定須有辮子,而且七斤一定是非常危險。因為趙七爺的這件竹布長衫,輕易是不常穿的,三年以來,只穿過兩次:一次是和他嘔氣的麻子阿四病了的時候,一次是曾經砸爛他酒店的魯大爺死了的時候;現在是第三次了,這一定又是於他有慶,於他的仇家有殃了。
+七斤嫂記得,兩年前七斤喝醉了酒,曾經罵過趙七爺是「賤胎」,所以這時便立刻直覺到七斤的危險,心坎裏突突地發起跳來。
+趙七爺一路走來,坐著喫飯的人都站起身,拿筷子點著自己的飯碗說,「七爺,請在我們這裏用飯!」七爺也一路點頭,說道「請請」,卻一徑走到七斤家的桌旁。七斤們連忙招呼,七爺也微笑著說「請請」,一面細細的研究他們的飯菜。
+「好香的菜乾,——聽到了風聲了麽?」趙七爺站在七斤的後面七斤嫂的對面說。
+「皇帝坐了龍庭了。」七斤說。
+七斤嫂看著七爺的臉,竭力陪笑道,「皇帝已經坐了龍庭,幾時皇恩大赦呢?」
+「皇恩大赦?——大赦是慢慢的總要大赦罷。」七爺說到這裏,聲色忽然嚴厲起來,「但是你家七斤的辮子呢,辮子?這倒是要緊的事。你們知道:長毛時候,留髮不留頭,留頭不留髮,……」
+七斤和他的女人沒有讀過書,不很懂得這古典的奧妙,但覺得有學問的七爺這麼說,事情自然非常重大,無可輓回,便仿佛受了死刑宣告似的,耳朵裏嗡的一聲,再也說不出一句話。
+「一代不如一代,——」九斤老太正在不平,趁這機會,便對趙七爺說,「現在的長毛,只是剪人家的辮子,僧不僧,道不道的。從前的長毛,這樣的麽?我活到七十九歲了,活夠了。從前的長毛是——整匹的紅緞子裹頭,拖下去,拖下去,一直拖到腳跟;王爺是黃緞子,拖下去,黃緞子;紅緞子,黃緞子,—— 我活夠了,七十九歲了。」
+七斤嫂站起身,自言自語的說,「這怎麼好呢?這樣的一班老小,都靠他養活的人,……」
+趙七爺搖頭道,「那也沒法。沒有辮子,該當何罪,書上都一條一條明明白白寫著的。不管他家裏有些什麼人。」
+七斤嫂聽到書上寫著,可真是完全絕望了;自己急得沒法,便忽然又恨到七斤。伊用筷子指著他的鼻尖說,「這死屍自作自受!造反的時候,我本來說,不要撐船了,不要上城了。他偏要死進城去,滾進城去,進城便被人剪去了辮子。從前是絹光烏黑的辮子,現在弄得僧不僧道不道的。這囚徒自作自受,帶累了我們又怎麼說呢?這活死屍的囚徒……」
+村人看見趙七爺到村,都趕緊喫完飯,聚在七斤家飯桌的周圍。七斤自己知道是出場人物,被女人當大眾這樣辱罵,很不雅觀,便只得抬起頭,慢慢地說道:
+「你今天說現成話,那時你……」
+「你這活死屍的囚徒……」
+看客中間,八一嫂是心腸最好的人,抱著伊的兩周歲的遺腹子,正在七斤嫂身邊看熱鬧;這時過意不去,連忙解勸說,「七斤嫂,算了罷。人不是神仙,誰知道未來事呢?便是七斤嫂,那時不也說,沒有辮子倒也沒有什麼醜麽?況且衙門裏的大老爺也還沒有告示,……」
+七斤嫂沒有聽完,兩個耳朵早通紅了;便將筷子轉過向來,指著八一嫂的鼻子,說,「阿呀,這是什麼話呵!八一嫂,我自己看來倒還是一個人,會說出這樣昏誕胡塗話麽?那時我是,整整哭了三天,誰都看見;連六斤這小鬼也都哭,……」六斤剛喫完一大碗飯,拿了空碗,伸手去嚷著要添。七斤嫂正沒好氣,便用筷子在伊的雙丫角中間,直紮下去,大喝道,「誰要你來多嘴!你這偷漢的小寡婦!」
+撲的一聲,六斤手裏的空碗落在地上了,恰巧又碰著一塊磚角,立刻破成一個很大的缺口。七斤直跳起來,撿起破碗,合上檢查一回,也喝道,「入娘的!」一巴掌打倒了六斤。六斤躺著哭,九斤老太拉了伊的手,連說著「一代不如一代」,一同走了。
+八一嫂也發怒,大聲說,「七斤嫂,你『恨棒打人』……」
+趙七爺本來是笑著旁觀的;但自從八一嫂說了「衙門裏的大老爺沒有告示」這話以後,卻有些生氣了。這時他已經繞出桌旁,接著說,「『恨棒打人』,算什麼呢。大兵是就要到的。你可知道,這回保駕的是張大帥,張大帥就是燕人張翼德的後代,他一支丈八蛇矛,就有萬夫不當之勇,誰能抵擋他?」他兩手同時捏起空拳,仿佛握著無形的蛇矛模樣,向八一嫂搶進幾步道,「你能抵擋他麽!」
+八一嫂正氣得抱著孩子發抖,忽然見趙七爺滿臉油汗,瞪著眼,準對伊衝過來,便十分害怕,不敢說完話,回身走了。趙七爺也跟著走去,眾人一面怪八一嫂多事,一面讓開路,幾個剪過辮子重新留起的便趕快躲在人叢後面,怕他看見。趙七爺也不細心察訪,通過人叢,忽然轉入烏桕樹後,說道「你能抵擋他麽!」 跨上獨木橋,揚長去了。
+村人們呆呆站著,心裏計算,都覺得自己確乎抵不住張翼德,因此也決定七斤便要沒有性命。七斤既然犯了皇法,想起他往常對人談論城中的新聞的時候,就不該含著長煙管顯出那般驕傲模樣,所以對七斤的犯法,也覺得有些暢快。他們也仿佛想發些議論,卻又覺得沒有什麼議論可發。嗡嗡的一陣亂嚷,蚊子都撞過赤膊身子,闖到烏桕樹下去做市;他們也就慢慢地走散回家,關上門去睡覺。七斤嫂咕噥著,也收了傢伙和桌子矮凳回家,關上門睡覺了。
+七斤將破碗拿回家裏,坐在門檻上吸煙;但非常憂愁,忘卻了吸煙,象牙嘴六尺多長湘妃竹煙管的白銅鬥裏的火光,漸漸發黑了。他心裏但覺得事情似乎十分危急,也想想些方法,想些計畫,但總是非常模糊,貫穿不得:「辮子呢辮子?丈八蛇矛。一代不如一代!皇帝坐龍庭。破的碗須得上城去釘好。誰能抵擋他?書上一條一條寫著。入娘的!……」
+第二日清晨,七斤依舊從魯鎮撐航船進城,傍晚回到魯鎮,又拿著六尺多長的湘妃竹煙管和一個飯碗回村。他在晚飯席上,對九斤老太說,這碗是在城內釘合的,因為缺口大,所以要十六個銅釘,三文一個,一總用了四十八文小錢。
+九斤老太很不高興的說,「一代不如一代,我是活夠了。三文錢一個釘;從前的釘,這樣的麽?從前的釘是……我活了七十九歲了,——」
+此後七斤雖然是照例日日進城,但家景總有些黯淡,村人大抵迴避著,不再來聽他從城內得來的新聞。七斤嫂也沒有好聲氣,還時常叫他「囚徒」。
+過了十多日,七斤從城內回家,看見他的女人非常高興,問他說,「你在城裏可聽到些什麼?」
+「沒有聽到些什麼。」
+「皇帝坐了龍庭沒有呢?」
+「他沒有說。」
+「咸亨酒店裏也沒有人說麽?」
+「也沒人說。」
+「我想皇帝一定是不坐龍庭了。我今天走過趙七爺的店前,看見他又坐著念書了,辮子又盤在頂上了,也沒有穿長衫。」
+「…………」
+「你想,不坐龍庭了罷?」
+「我想,不坐了罷。」
+現在的七斤,是七斤嫂和村人又都早給他相當的尊敬,相當的待遇了。到夏天,他們仍舊在自家門口的土場上喫飯;大家見了,都笑嘻嘻的招呼。九斤老太早已做過八十大壽,仍然不平而且健康。六斤的雙丫角,已經變成一支大辮子了;伊雖然新近裹腳,卻還能幫同七斤嫂做事,捧著十八個銅釘的飯碗,在土場上一瘤一拐的往來。
+星期日的早晨,我揭去一張隔夜的日曆,向著新的那一張上看了又看的說:
+“啊,十月十日,——今天原來正是雙十節。這裏卻一點沒有記載!”
+我的一位前輩先生N,正走到我的寓裏來談閑天,一聽這話,便很不高興的對我說:
+“他們對!他們不記得,你怎樣他;你記得,又怎樣呢?”
+這位N先生本來脾氣有點乖張,時常生些無謂的氣,說些不通世故的話。當這時候,我大抵任他自言自語,不贊一辭;他獨自發完議論,也就算了。
+他說:
+“我最佩服北京雙十節的情形。早晨,員警到門,吩咐道:『掛旗!』『是,掛旗!』”各家大半懶洋洋的踱出一個國民來,撅起一塊斑駁陸離的洋布。這樣一直到夜,——收了旗關門;幾家偶然忘卻的,便掛到第二天的上午。
+“他們忘卻了紀念,紀念也忘卻了他們!”
+“我也是忘卻了紀念的一個人。倘使紀念起來,那第一個雙十節前後的事,便都上我的心頭,使我坐立不穩了。”
+“多少故人的臉,都浮在我眼前。幾個少年辛苦奔走了十多年,暗地裏一顆彈丸要了他的性命;幾個少年一擊不中,在監牢裏身受一個多月的苦刑;幾個少年懷著遠志,忽然蹤影全無,連屍首也不知那裏去了。——”
+“他們都在社會的冷笑惡罵迫害傾陷裏過了一生;現在他們的墳墓也早在忘卻裏漸漸平塌下去了。”
+“我不堪紀念這些事。”
+“我們還是記起一點得意的事來談談吧。”
+N忽然現出笑容,伸手在自己頭上一摸,高聲說:
+“我最得意的是自從第一個雙十節以後,我在路上走,不再被人笑駡了。”
+“老兄,你可知道頭髮是我們中國人的寶貝和冤家,古今來多少人在這上頭吃些毫無價值的苦呵!”
+“我們的很古的古人,對於頭髮似乎也還看輕。據刑法看來,最要緊的自然是腦袋,所以大辟是上刑;次要便是生殖器了,所以宮刑和幽閉也是一件嚇人的罰;至於髡,那是微乎其微了,然而推想起來,正不知道曾有多少人們因為光著頭皮便被社會踐踏了一生世。”
+“我們講革命的時候,大談什麼揚州三日,嘉定屠城,其實也不過一種手段;老實說:那時中國人的反抗,何嘗因為亡國,只是因為拖辮子。”
+“頑殺盡了,遺老都壽終了,辮子早留定了,洪楊又鬧起來了。我的祖母曾對我說,那時做百姓才難哩,全留著頭髮的被官兵殺,還是辮子的便被長毛殺!”
+“我不知道有多少中國人只因為這不痛不癢的頭髮而吃苦,受難,滅亡。”
+N兩眼望著屋樑,似乎想些事,仍然說:
+“誰知道頭髮的苦輪到我了。”
+“我出去留學,便剪掉了辮子,這並沒有別的奧妙,只為他不太便當罷了。不料有幾位辮子盤在頭頂上的同學們便很厭惡我;監督也大怒,說要停了我的官費,送回中國去。”
+“不幾天,這位監督卻自己被人剪去辮子逃走了。去剪的人們裏面,一個便是做《革命軍》的鄒容,這人也因此不能再留學,回到上海來,後來死在西牢裏。你也早忘卻了罷?”
+“過了幾年,我的家景大不如前了,非謀點事做便要受餓,只得也回到中國來。我一到上海,便買定一條假辮子,那時是二元的市價,帶著回家。我的母親倒也不說什麼,然而旁人一見面,便都首先研究這辮子,待到知道是假,就一聲冷笑,將我擬為殺頭的罪名;有一位本家,還預備去告官,但後來因為恐怕革命黨的造反或者要成功,這才中止了。”
+“我想,假的不如真的直截爽快,我便索性廢了假辮子,穿著西裝在街上走。”
+“一路走去,一路便是笑駡的聲音,有的還跟在後面罵:『這冒失鬼!』『假洋鬼子!』”
+“我於是不穿洋服了,改了大衫,他們罵得更厲害。”
+“在這日暮途窮的時候,我的手裏才添出一支手杖來,拚命的打了幾回,他們漸漸的不罵了。只是走到沒有打過的生地方還是罵。”
+“這件事很使我悲哀,至今還時時記得哩。我在留學的時候,曾經看見日報上登載一個遊歷南洋和中國的本多博士的事;這位博士是不懂中國和馬來語的,人問他,你不懂話,怎麼走路呢?他拿起手杖來說,這便是他們的話,他們都懂!我因此氣憤了好幾天,誰知道我竟不知不覺的自己也做了,而且那些人都懂了。……”
+“宣統初年,我在本地的中學校做監學,同事是避之惟恐不遠,官僚是防之惟恐不嚴,我終日如坐在冰窖子裏,如站在刑場旁邊,其實並非別的,只因為缺少了一條辮子!”
+“有一日,幾個學生忽然走到我的房裏來,說:『先生,我們要剪辮子了。』我說:『不行!』『有辮子好呢,沒有辮子好呢?』『沒有辮子好……』『你怎麼說不行呢?』『犯不上,你們還是不剪上算,——等一等罷。』”他們不說什麼,撅著嘴唇走出房去,然而終於剪掉了。
+“呵!不得了了,人言嘖嘖了;我卻只裝作不知道,一任他們光著頭皮,和許多辮子一齊上講堂。”
+“然而這剪辮病傳染了;第三天,師範學堂的學生忽然也剪下了六條辮子,晚上便開除了六個學生。這六個人,留校不能,回家不得,一直挨到第一個雙十節之後又一個多月,才消去了犯罪的火烙印。”
+“我呢?也一樣,只是元年冬天到北京,還被人罵過幾次,後來罵我的人也被員警剪去了辮子,我就不再被人辱駡了;但我沒有到鄉間去。”N顯出非常得意模樣,忽而又沉下臉來:“現在你們這些理想家,又在那裏嚷什麼女子剪髮了,又要造出許多毫無所得而痛苦的人!”“現在不是已經有剪掉頭發的女人,因此考不進學校去,或者被學校除了名麼?”“改革嘛,武器在那裏?工讀麼,工廠在那裏?”“仍然留起,嫁給人家做媳婦去:忘卻了一切還是幸福,倘使伊記著些平等自由的話,便要苦痛一生世!”“我要借了阿爾志跋綏夫的話問你們:『你們將黃金時代的出現豫約給這些人們的子孫了,但有什麼給這些人們自己呢?』”“啊,造物的皮鞭沒有到中國的脊樑上時,中國便永遠是這一樣的中國,絕不肯自己改變一隻毫毛!”“你們的嘴裏既然並無毒牙,何以偏要在額上帖起『蝮蛇』兩個大字,引乞丐來打殺?……”N愈說愈離奇了,但一見到我不很願聽的神情,便立刻閉了口,站起來取帽子。我說:“回去麼?”他答道:“是的,天要下雨了。”我默默的送他到門口。他戴上帽子說:“再見!請你恕我打攪,好在明天便不是雙十節,我們統可以忘卻了。”
+我從鄉下跑到京城裏,一轉眼已經六年了。其間耳聞目睹的所謂國家大事,算起來也很不少;但在我心裏,都不留什麼痕跡,倘要我尋出這些事的影響來說,便只是增長了我的壞脾氣,——老實說,便是教我一天比一天的看不起人。
+但有一件小事,卻於我有意義,將我從壞脾氣裏拖開,使我至今忘記不得。
+這是民國六年的冬天,大北風颳得正猛,我因為生計關係,不得不一早在路上走。一路幾乎遇不見人,好容易才雇定了一輛人力車,教他拉到S門去。不一會,北風小了,路上浮塵早已刮淨,剩下一條潔白的大道來,車夫也跑得更快。剛近S門,忽而車把上帶著一個人,慢慢地倒了。
+跌倒的是一個女人,花白頭髮,衣服都很破爛。伊從馬路上突然向車前橫截過來;車夫已經讓開道,但伊的破棉背心沒有上扣,微風吹著,向外展開,所以終於兜著車把。幸而車夫早有點停步,否則伊定要栽一個大斤斗,跌到頭破血出了。
+伊伏在地上;車夫便也立住腳。我料定這老女人並沒有傷,又沒有別人看見,便很怪他多事,要自己惹出是非,也誤了我的路。
+我便對他說,"沒有什麼的。走你的罷!"
+車夫毫不理會,——或者並沒有聽到,——卻放下車子,扶那老女人慢慢起來,攙著臂膊立定,問伊說:"你怎麼啦?""我摔壞了。"
+我想,我眼見你慢慢倒地,怎麼會摔壞呢,裝腔作勢罷了,這真可憎惡。車夫多事,也正是自討苦吃,現在你自己想法去。
+車夫聽了這老女人的話,卻毫不躊躇,仍然攙著伊的臂膊,便一步一步的向前走。我有些詫異,忙看前面,是一所巡警分駐所,大風之後,外面也不見人。這車夫扶著那老女人,便正是向那大門走去。
+我這時突然感到一種異樣的感覺,覺得他滿身灰塵的後影,剎時高大了,而且愈走愈大,須仰視才見。而且他對於我,漸漸的又幾乎變成一種威壓,甚而至於要榨出皮袍下面藏著的"小"來。
+我的活力這時大約有些凝滯了,坐著沒有動,也沒有想,直到看見分駐所裏走出一個巡警,才下了車。
+巡警走近我說,"你自己雇車罷,他不能拉你了。"
+我沒有思索的從外套袋裏抓出一大把銅元,交給巡警,說,"請你給他……"
+風全住了,路上還很靜。我走著,一面想,幾乎怕敢想到自己。以前的事姑且擱起,這一大把銅元又是什麼意思?獎他麼?我還能裁判車夫麼?我不能回答自己。
+這事到了現在,還是時時記起。我因此也時時煞了苦痛,努力的要想到我自己。幾年來的文治武力,在我早如幼小時候所讀過的"子曰詩云"一般,背不上半句了。獨有這一件小事,卻總是浮在我眼前,有時反更分明,教我慚愧,催我自新,並且增長我的勇氣和希望。
+「沒有聲音,——小東西怎了?」紅鼻子老拱手裏擎了一碗黃酒,說著,向間壁努一努嘴。藍皮阿五便放下酒碗,在他脊梁上用死勁的打了一掌,含含糊糊嚷道:「你……你你又在想心思。……」
+原來魯鎮是僻靜地方,還有些古風:不上一更,大家便都關門睡覺。深更半夜沒有睡的只有兩家:一家是咸亨酒店,幾個酒肉朋友圍著櫃臺,吃喝得正高興;一家便是間壁的單四嫂子,他自從前年守了寡,便須專靠著自己的一雙手紡出綿紗來,養活他自己和他三歲的兒子,所以睡的也遲。
+這幾天,確鑿沒有紡紗的聲音了。但夜深沒有睡的既然只有兩家,這單四嫂子家有聲音,便自然只有老拱們聽到,沒有聲音,也只有老拱們聽到。
+老拱挨了打,仿佛很舒服似的喝了一大口酒,嗚嗚的唱起小曲來。
+這時候,單四嫂子正抱著他的寶兒,坐在床沿上,紡車靜靜的立在地上。黑沉沉的燈光,照著寶兒的臉,緋紅裏帶一點青。單四嫂子心裏計算:神簽也求過了,願心也許過了,單方也吃過了,要是還不見效,怎麼好?——那隻有去診何小仙了。但寶兒也許是日輕夜重,到了明天,太陽一出,熱也會退,氣喘也會平的:這實在是病人常有的事。
+單四嫂子是一個粗笨女人,不明白這「但」字的可怕:許多壞事固然幸虧有了他才變好,許多好事卻也因為有了他都弄糟。夏天夜短,老拱們嗚嗚的唱完了不多時,東方已經發白;不一會,窗縫裏透進了銀白色的曙光。
+單四嫂子等候天明,卻不像別人這樣容易,覺得非常之慢,寶兒的一呼吸,幾乎長過一年。現在居然明亮了;天的明亮,壓倒了燈光,——看見寶兒的鼻翼,已經一放一收的扇動。
+單四嫂子知道不妙,暗暗叫一聲「阿呀!」心裏計算:怎麼好?只有去診何小仙這一條路了。他雖然是粗笨女人,心裏卻有決斷,便站起身,從木柜子里掏出每天節省下來的十三個小銀元和一百八十銅錢,都裝在衣袋里,鎖上門,抱著寶兒直向何家奔過去。
+天氣還早,何家已經坐著四個病人了。他摸出四角銀元,買了號簽,第五個輪到寶兒。何小仙伸開兩個指頭按脈,指甲足有四寸多長,單四嫂子暗地納罕,心裏計算:寶兒該有活命了。但總免不了著急,忍不住要問,便局局促促的說:
+「先生,——我家的寶兒什麼病呀?」「他中焦塞著。」「不妨事麽?他……」「先去吃兩帖。」「他喘不過氣來,鼻翅子都扇著呢。」這是火克金……」
+何小仙說了半句話,便閉上眼睛;單四嫂子也不好意思再問。在何小仙對面坐著的一個三十多歲的人,此時已經開好一張藥方,指著紙角上的幾個字說道:
+「這第一味保嬰活命丸,須是賈家濟世老店才有!」單四嫂子接過藥方,一面走,一面想。他雖是粗笨女人,卻知道何家與濟世老店與自己的家,正是一個三角點;自然是買了藥回去便宜了。於是又徑向濟世老店奔過去。店夥也翹了長指甲慢慢的看方,慢慢的包藥。單四嫂子抱了寶兒等著;寶兒忽然擎起小手來,用力拔他散亂著的一綹頭髮,這是從來沒有的舉動,單四嫂子怕得發怔。
+太陽早出了。單四嫂子抱了孩子,帶著藥包,越走覺得越重;孩子又不住的掙扎,路也覺得越長。沒奈何坐在路旁一家公館的門檻上,休息了一會,衣服漸漸的冰著肌膚,才知道自己出了一身汗;寶兒卻仿佛睡著了。他再起來慢慢地走,仍然支撐不得,耳朵邊忽然聽得人說:
+「單四嫂子,我替你抱勃羅!」似乎是藍皮阿五的聲音。
+他抬頭看時,正是藍皮阿五,睡眼朦朧的跟著他走。
+單四嫂子在這時候,雖然很希望降下一員天將,助他一臂之力,卻不願是阿五。但阿五有些俠氣,無論如何,總是偏要幫忙,所以推讓了一會,終於得了許可了。他便伸開臂膊,從單四嫂子的乳房和孩子之間,直伸下去,抱去了孩子。單四嫂子便覺乳房上發了一條熱,剎時間直熱到臉上和耳根。
+他們兩人離開了二尺五寸多地,一同走著。阿五說些話,單四嫂子卻大半沒有答。走了不多時候,阿五又將孩子還給他,說是昨天與朋友約定的吃飯時候到了;單四嫂子便接了孩子。幸而不遠便是家,早看見對門的王九媽在街邊坐著,遠遠地說話:
+「單四嫂子,孩子怎了?——看過先生了麽?」「看是看了。——王九媽,你有年紀,見的多,不如請你老法眼看一看,怎樣……」「唔……」「怎樣……?」「唔……」王九媽端詳了一番,把頭點了兩點,搖了兩搖。
+寶兒吃下藥,已經是午後了。單四嫂子留心看他神情,似乎仿佛平穩了不少;到得下午,忽然睜開眼叫一聲「媽!」又仍然合上眼,像是睡去了。他睡了一刻,額上鼻尖都沁出一粒一粒的汗珠,單四嫂子輕輕一摸,膠水般粘著手;慌忙去摸胸口,便禁不住嗚咽起來。
+寶兒的呼吸從平穩到沒有,單四嫂子的聲音也就從嗚咽變成號啕。這時聚集了幾堆人:門內是王九媽藍皮阿五之類,門外是咸亨的掌柜和紅鼻老拱之類。王九媽便發命令,燒了一串紙錢;又將兩條板凳和五件衣服作抵,替單四嫂子借了兩塊洋錢,給幫忙的人備飯。
+第一個問題是棺木。單四嫂子還有一副銀耳環和一支裹金的銀簪,都交給了咸亨的掌柜,托他作一個保,半現半賒的買一具棺木。藍皮阿五也伸出手來,很願意自告奮勇;王九媽卻不許他,只准他明天抬棺材的差使,阿五罵了一聲「老畜生」,怏怏的努了嘴站著。掌柜便自去了;晚上回來,說棺木須得現做,後半夜才成功。
+掌柜回來的時候,幫忙的人早吃過飯;因為魯鎮還有些古風,所以不上一更,便都回家睡覺了。只有阿五還靠著咸亨的櫃臺喝酒,老拱也嗚嗚的唱。
+這時候,單四嫂子坐在床沿上哭著,寶兒在床上躺著,紡車靜靜的在地上立著。許多工夫,單四嫂子的眼淚宣告完結了,眼睛張得很大,看看四面的情形,覺得奇怪:所有的都是不會有的事。他心裏計算:不過是夢罷了,這些事都是夢。明天醒過來,自己好好的睡在床上,寶兒也好好的睡在自己身邊。他也醒過來,叫一聲「媽」,生龍活虎似的跳去玩了。
+老拱的歌聲早經寂靜,咸亨也熄了燈。單四嫂子張著眼,總不信所有的事。——雞也叫了;東方漸漸發白,窗縫裏透進了銀白色的曙光。
+銀白的曙光又漸漸顯出緋紅,太陽光接著照到屋脊。單四嫂子張著眼,呆呆坐著;聽得打門聲音,才吃了一嚇,跑出去開門。門外一個不認識的人,背了一件東西;後面站著王九媽。
+哦,他們背了棺材來了。
+下半天,棺木才合上蓋:因為單四嫂子哭一回,看一回,總不肯死心塌地的蓋上;幸虧王九媽等得不耐煩,氣憤憤的跑上前,一把拖開他,才七手八腳的蓋上了。
+但單四嫂子待他的寶兒,實在已經盡了心,再沒有什麼缺陷。昨天燒過一串紙錢,上午又燒了四十九捲《大悲咒》;收斂的時候,給他穿上頂新的衣裳,平日喜歡的玩意兒,——一個泥人,兩個小木碗,兩個玻璃瓶,——都放在枕頭旁邊。後來王九媽掐著指頭子細推敲,也終於想不出一些什麼缺陷。
+這日里,藍皮阿五簡直整天沒有到;咸亨掌柜便替單四嫂子雇了兩名腳夫,每名二百另十個大錢,抬棺木到義冢地上安放。王九媽又幫他煮了飯,凡是動過手開過口的人都吃了飯。太陽漸漸顯出要落山的顏色;吃過飯的人也不覺都顯出要回家的顏色,——於是他們終於都回了家。
+單四嫂子很覺得頭眩,歇息了一會,倒居然有點平穩了。但他接連著便覺得很異樣:遇到了平生沒有遇到過的事,不像會有的事,然而的確出現了。他越想越奇,又感到一件異樣的事——這屋子忽然太靜了。
+他站起身,點上燈火,屋子越顯得靜。他昏昏的走去關上門,回來坐在床沿上,紡車靜靜的立在地上。他定一定神,四面一看,更覺得坐立不得,屋子不但太靜,而且也太大了,東西也太空了。太大的屋子四麵包圍著他,太空的東西四面壓著他,叫他喘氣不得。
+他現在知道他的寶兒確乎死了;不願意見這屋子,吹熄了燈,躺著。他一面哭,一面想:想那時候,自己紡著棉紗,寶兒坐在身邊吃茴香豆,瞪著一雙小黑眼睛想了一刻,便說,「媽!爹賣餛飩,我大了也賣餛飩,賣許多許多錢,——我都給你。」那時候,真是連紡出的棉紗,也仿佛寸寸都有意思,寸寸都活著。但現在怎麼了?現在的事,單四嫂子卻實在沒有想到什麼。——我早經說過:他是粗笨女人。他能想出什麼呢?他單覺得這屋子太靜,太大,太空罷了。
+但單四嫂子雖然粗笨,卻知道還魂是不能有的事,他的寶兒也的確不能再見了。嘆一口氣,自言自語的說,「寶兒,你該還在這裏,你給我夢裏見見罷。」於是合上眼,想趕快睡去,會他的寶兒,苦苦的呼吸通過了靜和大和空虛,自己聽得明白。
+單四嫂子終於朦朦朧朧的走入睡鄉,全屋子都很靜。這時紅鼻子老拱的小曲,也早經唱完;蹌蹌踉踉出了咸亨,卻又提尖了喉嚨,唱道:
+「我的冤家呀!——可憐你,——孤另另的……」
+藍皮阿五便伸手揪住了老拱的肩頭,兩個人七歪八斜的笑著擠著走去。
+單四嫂子早睡著了,老拱們也走了,咸亨也關上門了。這時的魯鎮,便完全落在寂靜里。只有那暗夜為想變成明天,卻仍在這寂靜里奔波;另有幾條狗,也躲在暗地裏嗚嗚的叫。
+陳士成看過縣考的榜、回到家裏的時候,已經是下午了。他去得本很早,一見榜,便先在這上面尋陳字。陳字也不少,似乎也都爭先恐後的跳進他眼睛裏來,然而接著的卻全不是士成這兩個字。他於是重新再在十二張榜的圓圖裏細細地搜尋,看的人全已散盡了,而陳士成在榜上終於沒有見,單站在試院的照壁的面前。
+涼風雖然拂拂的吹動他斑白的短髮,初冬的太陽卻還是很溫和的來曬他。但他似乎被太陽曬得頭暈了,臉色越加變成灰白,從勞乏的紅腫的兩眼裏,發出古怪的閃光。這時他其實早已不看到什麼牆上的榜文了,只見有許多烏黑的圓圈,在眼前泛泛的遊走。
+雋了秀才,上省去鄉試,一徑聯捷上去,……紳士們既然千方百計的來攀親,人們又都像看見神明似的敬畏,深悔先前的輕薄,發昏,……趕走了租住在自己破宅門裏的雜姓——那是不勞說趕,自己就搬的,——屋宇全新了,門口是旗竿和扁額,……要清高可以做京官,否則不如謀外放。……他平日安排停當的前程,這時候又像受潮的糖塔一般,剎時倒塌,只剩下一堆碎片了。他不自覺的旋轉了覺得渙散了身軀,惘惘的走向歸家的路。
+他剛到自己的房門口,七個學童便一齊放開喉嚨,吱的念起書來。他大吃一驚,耳朵邊似乎敲了一聲磬,只見七個頭拖了小辮子在眼前幌,幌得滿房,黑圈子也夾著跳舞。他坐下了,他們送上晚課來,臉上都顯出小覷他的神色。
+「回去罷。」他遲疑了片時,這才悲慘的說。
+他們胡亂的包了書包,挾著,一溜煙跑走了。
+陳士成還看見許多小頭夾著黑圓圈在眼前跳舞,有時雜亂,有時也擺成異樣的陣圖,然而漸漸的減少了,模胡了。
+「這回又完了!」
+他大吃一驚,直跳起來,分明就在耳邊的話,回過頭去卻並沒有什麼人,仿佛又聽得嗡的敲了一聲磬,自己的嘴也說道:
+「這回又完了!」
+他忽而舉起一隻手來,屈指計數著想,十一,十三回,連今年是十六回,竟沒有一個考官懂得文章,有眼無珠,也是可憐的事,便不由嘻嘻的失了笑。然而他憤然了,驀地從書包布底下抽出謄真的制藝和試帖來,拿著往外走,剛近房門,卻看見滿眼都明亮,連一群雞也正在笑他,便禁不住心頭突突的狂跳,只好縮回裏面了。
+他又就了坐,眼格外的閃爍;他目睹著許多東西,然而很模胡,——是倒塌了的糖塔一般的前程躺在他面前,這前程又只是廣大起來,阻住了他的一切路。
+別家的炊煙早消歇了,碗筷也洗過了,而陳士成還不去做飯。寓在這裏的雜姓是知道老例的,凡遇到縣考的年頭,看見發榜後的這樣的眼光,不如及早關了門,不要多管事。最先就絕了人聲,接著是陸續的熄了燈火,獨有月亮,卻緩緩的出現在寒夜的空中。
+空中青碧到如一片海,略有些浮雲,仿佛有誰將粉筆洗在筆洗裏似的搖曳。月亮對著陳士成註下寒冷的光波來,當初也不過像是一面新磨的鐵鏡罷了,而這鏡卻詭秘的照透了陳士成的全身,就在他身上映出鐵的月亮的影。
+他還在房外的院子裏徘徊,眼裏頗清靜了,四近也寂靜。但這寂靜忽又無端的紛擾起來,他耳邊又確鑿聽到急促的低聲說:
+「左彎右彎……」
+他聳然了,傾耳聽時,那聲音卻又提高的複述道:「右彎!」
+他記得了。這院子,是他家還未如此雕零的時候,一到夏天的夜間,夜夜和他的祖母在此納涼的院子。那時他不過十歲有零的孩子,躺在竹榻上,祖母便坐在榻旁邊,講給他有趣的故事聽。伊說是曾經聽得伊的祖母說,陳氏的祖宗是巨富的,這屋子便是祖基,祖宗埋著無數的銀子,有福氣的子孫一定會得到的罷,然而至今還沒有現。至於處所,那是藏在一個謎語的中間:
+「左彎右彎,前走後走,量金量銀不論斗。」
+對於這謎語,陳士成便在平時,本也常常暗地裏加以揣測的,可惜大抵剛以為可以通,卻又立刻覺得不合了。有一回,他確有把握,知道這是在租給唐家的房底下的了,然而總沒有前去發掘的勇氣;過了幾時,可又覺得太不相像了。至於他自己房子裏的幾個掘過的舊痕跡,那卻全是先前幾回下第以後的發了怔忡的舉動,後來自己一看到,也還感到慚愧而且羞人。
+但今天鐵的光罩住了陳士成,又軟軟的來勸他了,他或者偶一遲疑,便給他正經的證明,又加上陰森的摧逼,使他不得不又向自己的房裏轉過眼光去。
+白光如一柄白團扇,搖搖擺擺的閃起在他房裏了。
+「也終於在這裏!」
+他說著,獅子似的趕快走進那房裏去,但跨進裏面的時候,便不見了白光的影蹤,只有莽蒼蒼的一間舊房,和幾個破書桌都沒在昏暗裏。他爽然的站著,慢慢的再定睛,然而白光卻分明的又起來了,這回更廣大,比硫黃火更白凈,比朝霧更霏微,而且便在靠東牆的一張書桌下。
+陳士成獅子似的奔到門後邊,伸手去摸鋤頭,撞著一條黑影。他不知怎的有些怕了,張惶的點了燈,看鋤頭無非倚著。他移開桌子,用鋤頭一氣掘起四塊大方磚,蹲身一看,照例是黃澄澄的細沙,揎了袖爬開細沙,便露出下面的黑土來。他極小心的,幽靜的,一鋤一鋤往下掘,然而深夜究竟太寂靜了,尖鐵觸土的聲音,總是鈍重的不肯瞞人的發響。
+土坑深到二尺多了,並不見有甕口,陳士成正心焦,一聲脆響,頗震得手腕痛,鋤尖碰到什麼堅硬的東西了;他急忙拋下鋤頭,摸索著看時,一塊大方磚在下麵。他的心抖得很利害,聚精會神的挖起那方磚來,下麵也滿是先前一樣的黑土,爬鬆了許多土,下麵似乎還無窮。但忽而又觸著堅硬的小東西了,圓的,大約是一個銹銅錢;此外也還有幾片破碎的磁片。
+陳士成心裏仿佛覺得空虛了,渾身流汗,急躁的只爬搔;這其間,心在空中一抖動,又觸著一種古怪的小東西了,這似乎約略有些馬掌形的,但觸手很鬆脆。他又聚精會神的挖起那東西來,謹慎的撮著,就燈光下仔細看時,那東西斑斑剝剝的像是爛骨頭,上面還帶著一排零落不全的牙齒。他已經誤到這許是下巴骨了,而那下巴骨也便在他手裏索索的動彈起來,而且笑吟吟的顯出笑影,終於聽得他開口道:
+「這回又完了!」
+他慄然的發了大冷,同時也放了手,下巴骨輕飄飄的回到坑底裏不多久,他也就逃到院子裏了。他偷看房裏面,燈火如此輝煌,下巴骨如此嘲笑,異乎尋常的怕人,便再不敢向那邊看。他躲在遠處的簷下的陰影裏,覺得較為安全了;但在這平安中,忽而耳朵邊又聽得竊竊的低聲說:
+「這裏沒有……到山裏去……」
+陳士成似乎記得白天在街上也曾聽得有人說這種話,他不待再聽完,已經恍然大悟了。他突然仰面向天,月亮已向西高峰這方面隱去,遠想離城三十五里的西高峰正在眼前,朝笏一般黑魆魆的挺立著,周圍便放出浩大閃爍的白光來。
+而且這白光又遠遠的就在前面了。
+「是的,到山裏去!」
+他決定的想,慘然的奔出去了。幾回的開門之後,門裏面便再不聞一些聲息。燈火結了大燈花照著空屋和坑洞,畢畢剝剝的炸了幾聲之後,便漸漸的縮小以至於無有,那是殘油已經燒盡了。
+「開城門來~~」
+含著大希望的恐怖的悲聲,遊絲似的在西關門前的黎明中,戰戰兢兢的叫喊。
+第二天的日中,有人在離西門十五里的萬流湖裏看見一個浮屍,當即傳揚開去,終於傳到地保的耳朵裏了,便叫鄉下人撈將上來。那是一個男屍,五十多歲,「身中面白無鬚」,渾身也沒有什麼衣褲。或者說這就是陳士成。但鄰居懶得去看,也並無屍親認領,於是經縣委員相驗之後,便由地保埋了。至於死因,那當然是沒有問題的,剝取死屍的衣服本來是常有的事,夠不上疑心到謀害去:而且仵作也證明是生前的落水,因為他確鑿曾在水底裏掙命,所以十個指甲裏都滿嵌著河底泥。
+有鬼似的。
+然而要做這一篇速朽的文章,纔下筆,便感到萬分的困難了。第一是文章的名目。孔子曰,“名不正則言不順”。這原是應該極註意的。傳的名目很繁多:列傳,自傳,內傳,外傳,別傳,家傳,小傳……,而可惜都不合。“列傳”麽,這一篇並非和許多闊人排在“正史”裏;“自傳”麽,我又並非就是阿Q。說是“外傳”,“內傳”在那裏呢?倘用“內傳”,阿Q又決不是神仙。“別傳”呢,阿Q實在未曾有大總統上諭宣付國史館立“本傳”——雖說英國正史上並無“博徒列傳”,而文豪迭更司也做過《博徒別傳》這一部書,但文豪則可,在我輩卻不可。其次是“家傳”,則我既不知與阿Q是否同宗,也未曾受他子孫的拜託;或“小傳”,則阿Q又更無別的“大傳”了。總而言之,這一篇也便是“本傳”,但從我的文章著想,因為文體卑下,是“引車賣漿者流”所用的話,所以不敢僭稱,便從不入三教九流的小說家所謂“閑話休題言歸正傳”這一句套話裏,取出“正傳”兩個字來,作為名目,即使與古人所撰《書法正傳》的“正傳”字面上很相混,也顧不得了。
+第二,立傳的通例,開首大抵該是“某,字某,某地人也”,而我並不知道阿Q姓什麼。有一回,他似乎是姓趙,但第二日便模糊了。那是趙太爺的兒子進了秀才的時候,鑼聲鏜鏜的報到村裏來,阿Q正喝了兩碗黃酒,便手舞足蹈的說,這於他也很光采,因為他和趙太爺原來是本家,細細的排起來他還比秀才長三輩呢。其時幾個旁聽人倒也肅然的有些起敬了。那知道第二天,地保便叫阿Q到趙太爺家裏去;太爺一見,滿臉濺朱,喝道:
+“阿Q,你這渾小子!你說我是你的本家麽?”阿Q不開口。趙太爺愈看愈生氣了,搶進幾步說:“你敢胡說!我怎麼會有你這樣的本家?你姓趙麽?”阿Q不開口,想往後退了;趙太爺跳過去,給了他一個嘴巴。
+“你怎麼會姓趙!——你那裏配姓趙!”
+阿Q並沒有抗辯他確鑿姓趙,只用手摸著左頰,和地保退出去了;外面又被地保訓斥了一番,謝了地保二百文酒錢。知道的人都說阿Q太荒唐,自己去招打;他大約未必姓趙,即使真姓趙,有趙太爺在這裏,也不該如此胡說的。此後便再沒有人提起他的氏族來,所以我終於不知道阿Q究竟什麼姓。
+第三,我又不知道阿Q的名字是怎麼寫的。他活著的時候,人都叫他阿Quei,死了以後,便沒有一個人再叫阿Quei了,那裏還會有“著之竹帛”的事。若論“著之竹帛”,這篇文章要算第一次,所以先遇著了這第一個難關。我曾仔細想:阿Quei,阿桂還是阿貴呢?倘使他號月亭,或者在八月間做過生日,那一定是阿桂了;而他既沒有號——也許有號,只是沒有人知道他,——又未嘗散過生日徵文的帖子:寫作阿桂,是武斷的。又倘使他有一位老兄或令弟叫阿富,那一定是阿貴了;而他又只是一個人:寫作阿貴,也沒有佐證的。其餘音Quei的偏僻字樣,更加湊不上了。先前,我也曾問過趙太爺的兒子茂才先生,誰料博雅如此公,竟也茫然,但據結論說,是因為陳獨秀辦了《新青年》提倡洋字,所以國粹淪亡,無可查考了。我的最後的手段,只有托一個同鄉去查阿Q犯事的案卷,八個月之後纔有回信,說案卷裏並無與阿Quei的聲音相近的人。我雖不知道是真沒有,還是沒有查,然而也再沒有別的方法了。生怕註音字母還未通行,只好用了“洋字”,照英國流行的拼法寫他為阿Quei,略作阿Q。這近於盲從《新青年》,自己也很抱歉,但茂才公尚且不知,我還有什麼好辦法呢。
+第四,是阿Q的籍貫了。倘他姓趙,則據現在好稱郡望的老例,可以照《郡名百家姓》上的註解,說是“隴西天水人也”,但可惜這姓是不甚可靠的,因此籍貫也就有些決不定。他雖然多住未莊,然而也常常宿在別處,不能說是未莊人,即使說是“未莊人也”,也仍然有乖史法的。
+我所聊以自慰的,是還有一個“阿”字非常正確,絕無附會假借的缺點,頗可以就正於通人。至於其餘,卻都非淺學所能穿鑿,只希望有“歷史癖與考據癖”的胡適之先生的門人們,將來或者能夠尋出許多新端緒來,但是我這《阿Q正傳》到那時卻又怕早經消滅了。
+阿Q不獨是姓名籍貫有些渺茫,連他先前的“行狀”也渺茫。因為未莊的人們之於阿Q,只要他幫忙,只拿他玩笑,從來沒有留心他的“行狀”的。而阿Q自己也不說,獨有和別人口角的時候,間或瞪著眼睛道:
+“我先前——比你闊的多啦!你算是什麼東西!”
+阿Q沒有家,住在未莊的土穀祠裏;也沒有固定的職業,只給人家做短工,割麥便割麥,舂米便舂米,撐船便撐船。工作略長久時,他也或住在臨時主人的家裏,但一完就走了。所以,人們忙碌的時候,也還記起阿Q來,然而記起的是做工,並不是“行狀”;一閑空,連阿Q都早忘卻,更不必說“行狀”了。只是有一回,有一個老頭子頌揚說:“阿Q真能做!”這時阿Q赤著膊,懶洋洋的瘦伶仃的正在他面前,別人也摸不著這話是真心還是譏笑,然而阿Q很喜歡。
+阿Q又很自尊,所有未莊的居民,全不在他眼神裏,甚而至於對於兩位“文童”也有以為不值一笑的神情。夫文童者,將來恐怕要變秀才者也;趙太爺錢太爺大受居民的尊敬,除有錢之外,就因為都是文童的爹爹,而阿Q在精神上獨不表格外的崇奉,他想:我的兒子會闊得多啦!加以進了幾回城,阿Q自然更自負,然而他又很鄙薄城裏人,譬如用三尺三寸寬的木板做成的凳子,未莊人叫“長凳”,他也叫“長凳”,城裏人卻叫“條凳”,他想:這是錯的,可笑!油煎大頭魚,未莊都加上半寸長的蔥葉,城裏卻加上切細的蔥絲,他想:這也是錯的,可笑!然而未莊人真是不見世面的可笑的鄉下人呵,他們沒有見過城裏的煎魚!
+阿Q“先前闊”,見識高,而且“真能做”,本來幾乎是一個“完人”了,但可惜他體質上還有一些缺點。最惱人的是在他頭皮上,頗有幾處不知於何時的癩瘡疤。這雖然也在他身上,而看阿Q的意思,倒也似乎以為不足貴的,因為他諱說“癩”以及一切近於“賴”的音,後來推而廣之,“光”也諱,“亮”也諱,再後來,連“燈”“燭”都諱了。一犯諱,不問有心與無心,阿Q便全疤通紅的發起怒來,估量了對手,口訥的他便罵,氣力小的他便打;然而不知怎麼一回事,總還是阿Q吃虧的時候多。於是他漸漸的變換了方針,大抵改為怒目而視了。
+誰知道阿Q採用怒目主義之後,未莊的閑人們便愈喜歡玩笑他。一見面,他們便假作吃驚的說:
+“噲,亮起來了。”
+阿Q照例的發了怒,他怒目而視了。
+“原來有保險燈在這裏!”他們並不怕。
+阿Q沒有法,只得另外想出報複的話來:
+“你還不配……”這時候,又仿佛在他頭上的是一種高尚的光容的癩頭瘡,並非平常的癩頭瘡了;但上文說過,阿Q是有見識的,他立刻知道和“犯忌”有點抵觸,便不再往底下說。
+閒人還不完,只撩他,於是終而至於打。阿Q在形式上打敗了,被人揪住黃辮子,在壁上碰了四五個響頭,閒人這纔心滿意足的得勝的走了,阿Q站了一刻,心裏想,“我總算被兒子打了,現在的世界真不像樣……”於是也心滿意足的得勝的走了。
+阿Q想在心裏的,後來每每說出口來,所以凡是和阿Q玩笑的人們,幾乎全知道他有這一種精神上的勝利法,此後每逢揪住他黃辮子的時候,人就先一著對他說:
+“阿Q,這不是兒子打老子,是人打畜生。自己說:人打畜生!”
+阿Q兩隻手都捏住了自己的辮根,歪著頭,說道:
+“打蟲豸,好不好?我是蟲豸——還不放麽?”
+但雖然是蟲豸,閒人也並不放,仍舊在就近什麼地方給他碰了五六個響頭,這纔心滿意足的得勝的走了,他以為阿Q這回可遭了瘟。然而不到十秒鐘,阿Q也心滿意足的得勝的走了,他覺得他是第一個能夠自輕自賤的人,除了“自輕自賤”不算外,餘下的就是“第一個”。狀元不也是“第一個”麽?“你算是什麼東西”呢!?
+阿Q以如是等等妙法剋服怨敵之後,便愉快的跑到酒店裏喝幾碗酒,又和別人調笑一通,口角一通,又得了勝,愉快的回到土穀祠,放倒頭睡著了。假使有錢,他便去押牌寶,一堆人蹲在地面上,阿Q即汗流滿面的夾在這中間,聲音他最響:
+“青龍四百!”
+“咳~~開~~啦!”樁家揭開盒子蓋,也是汗流滿面的唱。“天門啦~~角回啦~~!人和穿堂空在那裏啦~~!阿Q的銅錢拿過來~~!
+“穿堂一百——一百五十!”
+阿Q的錢便在這樣的歌吟之下,漸漸的輸入別個汗流滿面的人物的腰間。他終於只好擠出堆外,站在後面看,替別人著急,一直到散場,然後戀戀的回到土穀祠,第二天,腫著眼睛去工作。
+但真所謂“塞翁失馬安知非福”罷,阿Q不幸而贏了一回,他倒幾乎失敗了。
+這是未莊賽神的晚上。這晚上照例有一臺戲,戲臺左近,也照例有許多的賭攤。做戲的鑼鼓,在阿Q耳朵裏仿佛在十里之外;他只聽得樁家的歌唱了。他贏而又贏,銅錢變成角洋,角洋變成大洋,大洋又成了疊。他興高采烈得非常:“天門兩塊!”
+他不知道誰和誰為什麼打起架來了。罵聲打聲腳步聲,昏頭昏腦的一大陣,他纔爬起來,賭攤不見了,人們也不見了,身上有幾處很似乎有些痛,似乎也挨了幾拳幾腳似的,幾個人詫異的對他看。他如有所失的走進土穀祠,定一定神,知道他的一堆洋錢不見了。趕賽會的賭攤多不是本村人,還到那裏去尋根柢呢?
+很白很亮的一堆洋錢!而且是他的——現在不見了!說是算被兒子拿去了罷,總還是忽忽不樂;說自己是蟲豸罷,也還是忽忽不樂:他這回纔有些感到失敗的苦痛了。
+但他立刻轉敗為勝了。他擎起右手,用力的在自己臉上連打了兩個嘴巴,熱剌剌的有些痛;打完之後,便心平氣和起來,似乎打的是自己,被打的是別一個自己,不久也就仿佛是自己打了別個一般,——雖然還有些熱剌剌,——心滿意足的得勝的躺下了。他睡著了。
+然而阿Q雖然常優勝,卻直待蒙趙太爺打他嘴巴之後,這纔出了名。
+他付過地保二百文酒錢,憤憤的躺下了,後來想:“現在的世界太不成話,兒子打老子……”於是忽而想到趙太爺的威風,而現在是他的兒子了,便自己也漸漸的得意起來,爬起身,唱著《小孤孀上墳》到酒店去。這時候,他又覺得趙太爺高人一等了。
+說也怪,從此之後,果然大家也仿佛格外尊敬他。這在阿Q,或者以為因為他是趙太爺的父親,而其實也不然。未莊通例,倘如阿七打阿八,或者李四打張三,向來本不算口碑。一上口碑,則打的既有名,被打的也就托庇有了名。至於錯在阿Q,那自然是不必說。所以者何?就因為趙太爺是不會錯的。但他既然錯,為什麼大家又仿佛格外尊敬他呢?這可難解,穿鑿起來說,或者因為阿Q說是趙太爺的本家,雖然挨了打,大家也還怕有些真,總不如尊敬一些穩當。否則,也如孔廟裏的太牢一般,雖然與豬羊一樣,同是畜生,但既經聖人下箸,先儒們便不敢妄動了。
+阿Q此後倒得意了許多年。
+有一年的春天,他醉醺醺的在街上走,在牆根的日光下,看見王胡在那裏赤著膊捉蝨子,他忽然覺得身上也癢起來了。這王胡,又癩又胡,別人都叫他王癩胡,阿Q卻刪去了一個癩字,然而非常渺視他。阿Q的意思,以為癩是不足為奇的,只有這一部絡腮鬍子,實在太新奇,令人看不上眼。他於是併排坐下去了。倘是別的閑人們,阿Q本不敢大意坐下去。但這王胡旁邊,他有什麼怕呢?老實說:他肯坐下去,簡直還是抬舉他。
+阿Q也脫下破夾襖來,翻檢了一回,不知道因為新洗呢還是因為粗心,許多工夫,只捉到三四個。他看那王胡,卻是一個又一個,兩個又三個,只放在嘴裏畢畢剝剝的響。
+阿Q最初是失望,後來卻不平了:看不上眼的王胡尚且那麼多,自己倒反這樣少,這是怎樣的大失體統的事呵!他很想尋一兩個大的,然而竟沒有,好容易纔捉到一個中的,恨恨的塞在厚嘴唇裏,狠命一咬,劈的一聲,又不及王胡的響。
+他癩瘡疤塊塊通紅了,將衣服摔在地上,吐一口唾沫,說:
+“這毛蟲!”
+“癩皮狗,你罵誰?”王胡輕蔑的抬起眼來說。
+阿Q近來雖然比較的受人尊敬,自己也更高傲些,但和那些打慣的閑人們見面還膽怯,獨有這回卻非常武勇了。這樣滿臉鬍子的東西,也敢出言無狀麽?
+“誰認便罵誰!”他站起來,兩手叉在腰間說。
+“你的骨頭癢了麽?”王胡也站起來,披上衣服說。
+阿Q以為他要逃了,搶進去就是一拳。這拳頭還未達到身上,已經被他抓住了,只一拉,阿Q蹌蹌踉踉的跌進去,立刻又被王胡扭住了辮子,要拉到牆上照例去碰頭。
+“‘君子動口不動手’!”阿Q歪著頭說。
+王胡似乎不是君子,並不理會,一連給他碰了五下,又用力的一推,至於阿Q跌出六尺多遠,這纔滿足的去了。
+在阿Q的記憶上,這大約要算是生平第一件的屈辱,因為王胡以絡腮鬍子的缺點,向來只被他奚落,從沒有奚落他,更不必說動手了。而他現在竟動手,很意外,難道真如市上所說,皇帝已經停了,不要秀才和舉人了,因此趙家減了威風,因此他們也便小覷了他麽?
+阿Q無可適從的站著。
+遠遠的走來了一個人,他的對頭又到了。這也是阿Q最厭惡的一個人,就是錢太爺的大兒子。他先前跑上城裏去進洋學堂,不知怎麼又跑到東洋去了,半年之後他回到家裏來,腿也直了,辮子也不見了,他的母親大哭了十幾場,他的老婆跳了三回井。後來,他的母親到處說,“這辮子是被壞人灌醉了酒剪去了。本來可以做大官,現在只好等留長再說了。”然而阿Q不肯信,偏稱他“假洋鬼子”,也叫作“裏通外國的人”,一見他,一定在肚子裏暗暗的咒罵。
+阿Q尤其“深惡而痛絕之”的,是他的一條假辮子。辮子而至於假,就是沒有了做人的資格;他的老婆不跳第四回井,也不是好女人。
+這“假洋鬼子”近來了。
+“禿兒。驢……”阿Q歷來本只在肚子裏罵,沒有出過聲,這回因為正氣忿,因為要報仇,便不由的輕輕的說出來了。
+不料這禿兒卻拿著一支黃漆的棍子——就是阿Q所謂哭喪棒——大蹋步走了過來。阿Q在這剎那,便知道大約要打了,趕緊抽緊筋骨,聳了肩膀等候著,果然,拍的一聲,似乎確鑿打在自己頭上了。
+“我說他!”阿Q指著近旁的一個孩子,分辯說。
+拍!拍拍!
+在阿Q的記憶上,這大約要算是生平第二件的屈辱。幸而拍拍的響了之後,於他倒似乎完結了一件事,反而覺得輕鬆些,而且“忘卻”這一件祖傳的寶貝也發生了效力,他慢慢的走,將到酒店門口,早已有些高興了。
+但對面走來了靜修庵裏的小尼姑。阿Q便在平時,看見伊也一定要唾罵,而況在屈辱之後呢?他於是發生了回憶,又發生了敵愾了。
+“我不知道我今天為什麼這樣晦氣,原來就因為見了你!”他想。
+他迎上去,大聲的吐一口唾沫:
+“咳,呸!”
+小尼姑全不睬,低了頭只是走。阿Q走近伊身旁,突然伸出手去摩著伊新剃的頭皮,呆笑著,說:
+“禿兒!快回去,和尚等著你……”
+“你怎麼動手動腳……”尼姑滿臉通紅的說,一面趕快走。
+酒店裏的人大笑了。阿Q看見自己的勛業得了賞識,便愈加興高采烈起來:
+“和尚動得,我動不得?”他扭住伊的面頰。
+酒店裏的人大笑了。阿Q更得意,而且為了滿足那些賞鑒家起見,再用力的一擰,纔放手。
+他這一戰,早忘卻了王胡,也忘卻了假洋鬼子,似乎對於今天的一切“晦氣”都報了仇;而且奇怪,又仿佛全身比拍拍的響了之後輕鬆,飄飄然的似乎要飛去了。
+“這斷子絕孫的阿Q!”遠遠地聽得小尼姑的帶哭的聲音。
+“哈哈哈!”阿Q十分得意的笑。
+“哈哈哈!”酒店裏的人也九分得意的笑。
+有人說:有些勝利者,願意敵手如虎,如鷹,他纔感得勝利的歡喜;假使如羊,如小雞,他便反覺得勝利的無聊。又有些勝利者,當剋服一切之後,看見死的死了,降的降了,“臣誠惶誠恐死罪死罪”,他於是沒有了敵人,沒有了對手,沒有了朋友,只有自己在上,一個,孤另另,淒涼,寂寞,便反而感到了勝利的悲哀。然而我們的阿Q卻沒有這樣乏,他是永遠得意的:這或者也是中國精神文明冠於全球的一個證據了。
+看那,他飄飄然的似乎要飛去了!
+然而這一次的勝利,卻又使他有些異樣。他飄飄然的飛了大半天,飄進土穀祠,照例應該躺下便打鼾。誰知道這一晚,他很不容易合眼,他覺得自己的大拇指和第二指有點古怪:仿佛比平常滑膩些。不知道是小尼姑的臉上有一點滑膩的東西粘在他指上,還是他的指頭在小尼姑臉上磨得滑膩了?……
+“斷子絕孫的阿Q!”
+阿Q的耳朵裏又聽到這句話。他想:不錯,應該有一個女人,斷子絕孫便沒有人供一碗飯,……應該有一個女人。夫“不孝有三無後為大”,而“若敖之鬼餒而”,也是一件人生的大哀,所以他那思想,其實是樣樣合於聖經賢傳的,只可惜後來有些“不能收其放心”了。
+“女人,女人!……”他想。
+“……和尚動得……女人,女人!……女人!”他又想。
+我們不能知道這晚上阿Q在什麼時候纔打鼾。但大約他從此總覺得指頭有些滑膩,所以他從此總有些飄飄然;“女……”他想。
+即此一端,我們便可以知道女人是害人的東西。
+中國的男人,本來大半都可以做聖賢,可惜全被女人毀掉了。商是妲己鬧亡的;周是褒姒弄壞的;秦……雖然史無明文,我們也假定他因為女人,大約未必十分錯;而董卓可是的確給貂蟬害死了。
+阿Q本來也是正人,我們雖然不知道他曾蒙什麼明師指授過,但他對於“男女之大防”卻歷來非常嚴;也很有排斥異端——如小尼姑及假洋鬼子之類——的正氣。他的學說是:凡尼姑,一定與和尚私通;一個女人在外面走,一定想引誘野男人;一男一女在那裏講話,一定要有勾當了。為懲治他們起見,所以他往往怒目而視,或者大聲說幾句“誅心”話,或者在冷僻處,便從後面擲一塊小石頭。
+誰知道他將到“而立”之年,竟被小尼姑害得飄飄然了。這飄飄然的精神,在禮教上是不應該有的,——所以女人真可惡,假使小尼姑的臉上不滑膩,阿Q便不至於被蠱,又假使小尼姑的臉上蓋一層布,阿Q便也不至於被蠱了,——他五六年前,曾在戲臺下的人叢中擰過一個女人的大腿,但因為隔一層褲,所以此後並不飄飄然,——而小尼姑並不然,這也足見異端之可惡。
+“女……”阿Q想。
+他對於以為“一定想引誘野男人”的女人,時常留心看,然而伊並不對他笑。他對於和他講話的女人,也時常留心聽,然而伊又並不提起關於什麼勾當的話來。哦,這也是女人可惡之一節:伊們全都要裝“假正經”的。
+這一天,阿Q在趙太爺家裏舂了一天米,吃過晚飯,便坐在廚房裏吸旱煙。倘在別家,吃過晚飯本可以回去的了,但趙府上晚飯早,雖說定例不准掌燈,一吃完便睡覺,然而偶然也有一些例外:其一,是趙大爺未進秀才的時候,准其點燈讀文章;其二,便是阿Q來做短工的時候,准其點燈舂米。因為這一條例外,所以阿Q在動手舂米之前,還坐在廚房裏吸旱煙。
+吳媽,是趙太爺家裏唯一的女僕,洗完了碗碟,也就在長凳上坐下了,而且和阿Q談閑天:
+“太太兩天沒有吃飯哩,因為老爺要買一個小的……”
+女人……吳媽……這小孤孀……”阿Q想。
+“我們的少奶奶是八月裏要生孩子了……”
+“女人……”阿Q想。
+阿Q放下煙管,站了起來。
+“我們的少奶奶……”吳媽還嘮叨說。
+“我和你困覺,我和你困覺!”阿Q忽然搶上去,對伊跪下了。
+一剎時中很寂然。
+“阿呀!”吳媽楞了一息,突然發抖,大叫著往外跑,且跑且嚷,似乎後來帶哭了。
+阿Q對了牆壁跪著也發楞,於是兩手扶著空板凳,慢慢的站起來,仿佛覺得有些糟。他這時確也有些忐忑了,慌張的將煙管插在褲帶上,就想去舂米。蓬的一聲,頭上著了很粗的一下,他急忙迴轉身去,那秀才便拿了一支大竹杠站在他面前。
+“你反了,……你這……”
+大竹杠又向他劈下來了。阿Q兩手去抱頭,拍的正打在指節上,這可很有些痛。他衝出廚房門,仿佛背上又著了一下似的。
+“忘八蛋!”秀才在後面用了官話這樣罵。
+阿Q奔入舂米場,一個人站著,還覺得指頭痛,還記得“忘八蛋”,因為這話是未莊的鄉下人從來不用,專是見過官府的闊人用的,所以格外怕,而印象也格外深。但這時,他那“女……”的思想卻也沒有了。而且打罵之後,似乎一件事也已經收束,倒反覺得一無掛礙似的,便動手去舂米。舂了一會,他熱起來了,又歇了手脫衣服。
+脫下衣服的時候,他聽得外面很熱鬧,阿Q生平本來最愛看熱鬧,便即尋聲走出去了。尋聲漸漸的尋到趙太爺的內院裏,雖然在昏黃中,卻辨得出許多人,趙府一家連兩日不吃飯的太太也在內,還有間壁的鄒七嫂,真正本家的趙白眼,趙司晨。
+少奶奶正拖著吳媽走出下房來,一面說:
+“你到外面來,……不要躲在自己房裏想……”
+“誰不知道你正經,……短見是萬萬尋不得的。”鄒七嫂也從旁說。
+吳媽只是哭,夾些話,卻不甚聽得分明。
+阿Q想:“哼,有趣,這小孤孀不知道鬧著什麼玩意兒了?”他想打聽,走近趙司晨的身邊。這時他猛然間看見趙大爺向他奔來,而且手裏捏著一支大竹杠。他看見這一支大竹杠,便猛然間悟到自己曾經被打,和這一場熱鬧似乎有點相關。他翻身便走,想逃回舂米場,不圖這支竹杠阻了他的去路,於是他又翻身便走,自然而然的走出後門,不多工夫,已在土穀祠內了。
+阿Q坐了一會,皮膚有些起粟,他覺得冷了,因為雖在春季,而夜間頗有餘寒,尚不宜於赤膊。他也記得布衫留在趙家,但倘若去取,又深怕秀才的竹杠。然而地保進來了。
+“阿Q,你的媽媽的!你連趙家的用人都調戲起來,簡直是造反。害得我晚上沒有覺睡,你的媽媽的!……”
+如是云云的教訓了一通,阿Q自然沒有話。臨末,因為在晚上,應該送地保加倍酒錢四百文,阿Q正沒有現錢,便用一頂氈帽做抵押,並且訂定了五條件:
+一 明天用紅燭——要一斤重的——一對,香一封,到趙府上去賠罪。
+二 趙府上請道士祓除縊鬼,費用由阿Q負擔。
+三 阿Q從此不准踏進趙府的門檻。四 吳媽此後倘有不測,惟阿Q是問。
+五 阿Q不准再去索取工錢和布衫。
+阿Q自然都答應了,可惜沒有錢。幸而已經春天,棉被可以無用,便質了二千大錢,履行條約。赤膊磕頭之後,居然還剩幾文,他也不再贖氈帽,統統喝了酒了。但趙家也並不燒香點燭,因為太太拜佛的時候可以用,留著了。那破布衫是大半做了少奶奶八月間生下來的孩子的襯尿布,那小半破爛的便都做了吳媽的鞋底。
+第五章 生計問題[编辑
+阿Q禮畢之後,仍舊回到土穀祠,太陽下去了,漸漸覺得世上有些古怪。他仔細一想,終於省悟過來:其原因蓋在自己的赤膊。他記得破夾襖還在,便披在身上,躺倒了,待張開眼睛,原來太陽又已經照在西牆上頭了。他坐起身,一面說道,“媽媽的……”
+他起來之後,也仍舊在街上逛,雖然不比赤膊之有切膚之痛,卻又漸漸的覺得世上有些古怪了。仿佛從這一天起,未莊的女人們忽然都怕了羞,伊們一見阿Q走來,便個個躲進門裏去。甚而至於將近五十歲的鄒七嫂,也跟著別人亂鑽,而且將十一歲的女兒都叫進去了。阿Q很以為奇,而且想:“這些東西忽然都學起小姐模樣來了。這娼婦們……”
+,卻是許多日以後的事。其一,酒店不肯賒欠了;其二,管土穀祠的老頭子說些廢話,似乎叫他走;其三,他雖然記不清多少日,但確乎有許多日,沒有一個人來叫他做短工。酒店不賒,熬著也罷了;老頭子催他走,嚕囌一通也就算了;只是沒有人來叫他做短工,卻使阿Q肚子餓:這委實是一件非常“媽媽的”的事情。
+阿Q忍不下去了,他只好到老主顧的家裏去探問,——但獨不許踏進趙府的門檻,——然而情形也異樣:一定走出一個男人來,現了十分煩厭的相貌,像回覆乞丐一般的搖手道:
+“沒有沒有!你出去!”
+阿Q愈覺得稀奇了。他想,這些人家向來少不了要幫忙,不至於現在忽然都無事,這總該有些蹊蹺在裏面了。他留心打聽,纔知道他們有事都去叫小Don。這小D,是一個窮小子,又瘦又乏,在阿Q的眼睛裏,位置是在王胡之下的,誰料這小子竟謀了他的飯碗去。所以阿Q這一氣,更與平常不同,當氣憤憤的走著的時候,忽然將手一揚,唱道:
+“我手執鋼鞭將你打!……”
+幾天之後,他竟在錢府的照壁前遇見了小D。“仇人相見分外眼明”,阿Q便迎上去,小D也站住了。
+“畜生!”阿Q怒目而視的說,嘴角上飛出唾沫來。
+“我是蟲豸,好麽?……”小D說。
+這謙遜反使阿Q更加憤怒起來,但他手裏沒有鋼鞭,於是只得撲上去,伸手去拔小D的辮子。小D一手護住了自己的辮根,一手也來拔阿Q的辮子,阿Q便也將空著的一隻手護住了自己的辮根。從先前的阿Q看來,,小D本來是不足齒數的,但他近來挨了餓,又瘦又乏已經不下於小D,所以便成了勢均力敵的現象,四隻手拔著兩顆頭,都彎了腰,在錢家粉牆上映出一個藍色的虹形,至於半點鐘之久了。
+“好了,好了!”看的人們說,大約是解勸的。
+“好,好!”看的人們說,不知道是解勸,是頌揚,還是煽動。
+然而他們都不聽。阿Q進三步,小D便退三步,都站著;小D進三步,阿Q便退三步,又都站著。大約半點鐘,——未莊少有自鳴鐘,所以很難說,或者二十分,——他們的頭髮裏便都冒煙,額上便都流汗,阿Q的手放鬆了,在同一瞬間,小D的手也正放鬆了,同時直起,同時退開,都擠出人叢去。
+“記著罷,媽媽的……”阿Q回過頭去說。
+“媽媽的,記著罷……”小D也回過頭來說。
+這一場“龍虎鬥”似乎並無勝敗,也不知道看的人可滿足,都沒有發什麼議論,而阿Q卻仍然沒有人來叫他做短工。
+有一日很溫和,微風拂拂的頗有些夏意了,阿Q卻覺得寒冷起來,但這還可擔當,第一倒是肚子餓。棉被,氈帽,布衫,早已沒有了,其次就賣了棉襖;現在有褲子,卻萬不可脫的;有破夾襖,又除了送人做鞋底之外,決定賣不出錢。他早想在路上拾得一註錢,但至今還沒有見;他想在自己的破屋裏忽然尋到一註錢,慌張的四顧,但屋內是空虛而且瞭然。於是他決計出門求食去了。
+他在路上走著要“求食”,看見熟識的酒店,看見熟識的饅頭,但他都走過了,不但沒有暫停,而且並不想要。他所求的不是這類東西了;他求的是什麼東西,他自己不知道。
+未莊本不是大村鎮,不多時便走盡了。村外多是水田,滿眼是新秧的嫩綠,夾著幾個圓形的活動的黑點,便是耕田的農夫。阿Q並不賞鑒這田家樂,卻只是走,因為他直覺的知道這與他的“求食”之道是很遼遠的。但他終於走到靜修庵的牆外了。
+庵周圍也是水田,粉牆突出在新綠裏,後面的低土牆裏是菜園。阿Q遲疑了一會,四面一看,並沒有人。他便爬上這矮牆去,扯著何首烏藤,但泥土仍然簌簌的掉,阿Q的腳也索索的抖;終於攀著桑樹枝,跳到裏面了。裏面真是鬱鬱蔥蔥,但似乎並沒有黃酒饅頭,以及此外可吃的之類。靠西牆是竹叢,下麵許多筍,只可惜都是並未煮熟的,還有油菜早經結子,芥菜已將開花,小白菜也很老了。
+阿Q仿佛文童落第似的覺得很冤屈,他慢慢走近園門去,忽而非常驚喜了,這分明是一畦老蘿蔔。他於是蹲下便拔,而門口突然伸出一個很圓的頭來,又即縮回去了,這分明是小尼姑。小尼姑之流是阿Q本來視若草芥的,但世事須“退一步想”,所以他便趕緊拔起四個蘿蔔,擰下青葉,兜在大襟裏。然而老尼姑已經出來了。
+“阿彌陀佛,阿Q,你怎麼跳進園裏來偷蘿蔔!……阿呀,罪過呵,阿唷,阿彌陀佛!……”
+“我什麼時候跳進你的園裏來偷蘿蔔?”阿Q且看且走的說。
+“現在……這不是?”老尼姑指著他的衣兜。
+“這是你的?你能叫得他答應你麽?你……”
+阿Q沒有說完話,拔步便跑;追來的是一匹很肥大的黑狗。這本來在前門的,不知怎的到後園來了。黑狗哼而且追,已經要咬著阿Q的腿,幸而從衣兜裏落下一個蘿蔔來,那狗給一嚇,略略一停,阿Q已經爬上桑樹,跨到土牆,連人和蘿蔔都滾出牆外面了。只剩著黑狗還在對著桑樹嗥,老尼姑念著佛。
+阿Q怕尼姑又放出黑狗來,拾起蘿蔔便走,沿路又撿了幾塊小石頭,但黑狗卻並不再現。阿Q於是拋了石塊,一面走一面吃,而且想道,這裏也沒有什麼東西尋,不如進城去……
+待三個蘿蔔吃完時,他已經打定了進城的主意了。
+第六章 從中興到末路[编辑]
+在未莊再看見阿Q出現的時候,是剛過了這年的中秋。人們都驚異,說是阿Q回來了,於是又回上去想道,他先前那裏去了呢?阿Q前幾回的上城,大抵早就興高采烈的對人說,但這一次卻並不,所以也沒有一個人留心到。他或者也曾告訴過管土穀祠的老頭子,然而未莊老例,只有趙太爺、錢太爺和秀才大爺上城纔算一件事。假洋鬼子尚且不足數,何況是阿Q:因此老頭子也就不替他宣傳,而未莊的社會上也就無從知道了。
+但阿Q這回的回來,卻與先前大不同,確乎很值得驚異。天色將黑,他睡眼蒙朧的在酒店門前出現了,他走近櫃臺,從腰間伸出手來,滿把是銀的和銅的,在櫃上一扔說,“現錢!打酒來!”穿的是新夾襖,看去腰間還掛著一個大搭連,沉鈿鈿的將褲帶墜成了很彎很彎的弧線。未莊老例,看見略有些醒目的人物,是與其慢也寧敬的,現在雖然明知道是阿Q,但因為和破夾襖的阿Q有些兩樣了,古人云,“士別三日便當刮目相待”,所以堂倌,掌櫃,酒客,路人,便自然顯出一種凝而且敬的形態來。掌櫃既先之以點頭,又繼之以談話:
+“豁,阿Q,你回來了!”
+“回來了。”
+“發財發財,你是——在……”
+“上城去了!”
+這一件新聞,第二天便傳遍了全未莊。人人都願意知道現錢和新夾襖的阿Q的中興史,所以在酒店裏,茶館裏,廟簷下,便漸漸的探聽出來了。這結果,是阿Q得了新敬畏。
+據阿Q說,他是在舉人老爺家裏幫忙。這一節,聽的人都肅然了。這老爺本姓白,但因為合城裏只有他一個舉人,所以不必再冠姓,說起舉人來就是他。這也不獨在未莊是如此,便是一百里方圓之內也都如此,人們幾乎多以為他的姓名就叫舉人老爺的了。在這人的府上幫忙,那當然是可敬的。但據阿Q又說,他卻不高興再幫忙了,因為這舉人老爺實在太“媽媽的”了。這一節,聽的人都嘆息而且快意,因為阿Q本不配在舉人老爺家裏幫忙,而不幫忙是可惜的。
+據阿Q說,他的回來,似乎也由於不滿意城裏人,這就在他們將長凳稱為條凳,而且煎魚用蔥絲,加以最近觀察所得的缺點,是女人的走路也扭得不很好。然而也偶有大可佩服的地方,即如未莊的鄉下人不過打三十二張的竹牌,只有假洋鬼子能夠叉“麻醬”,城裏卻連小烏龜子都叉得精熟的。什麼假洋鬼子,只要放在城裏的十幾歲的小烏龜子的手裏,也就立刻是“小鬼見閻王”。這一節,聽的人都赧然了。
+“你們可看見過殺頭麽?”阿Q說,“咳,好看。殺革命黨。唉,好看好看,……”他搖搖頭,將唾沫飛在正對面的趙司晨的臉上。這一節,聽的人都凜然了。但阿Q又四面一看,忽然揚起右手,照著伸長脖子聽得出神的王胡的後項窩上直劈下去道:
+“嚓!”
+王胡驚得一跳,同時電光石火似的趕快縮了頭,而聽的人又都悚然而且欣然了。從此王胡瘟頭瘟腦的許多日,並且再不敢走近阿Q的身邊;別的人也一樣。
+阿Q這時在未莊人眼睛裏的地位,雖不敢說超過趙太爺,但謂之差不多,大約也就沒有什麼語病的了。
+然而不多久,這阿Q的大名忽又傳遍了未莊的閨中。雖然未莊只有錢趙兩姓是大屋,此外十之九都是淺閨,但閨中究竟是閨中,所以也算得一件神異。女人們見面時一定說,鄒七嫂在阿Q那裏買了一條藍綢裙,舊固然是舊的,但只化了九角錢。還有趙白眼的母親,——一說是趙司晨的母親,待考,——也買了一件孩子穿的大紅洋紗衫,七成新,只用三百大錢九二串。於是伊們都眼巴巴的想見阿Q,缺綢裙的想問他買綢裙,要洋紗衫的想問他買洋紗衫,不但見了不逃避,有時阿Q已經走過了,也還要追上去叫住他,問道:
+“阿Q,你還有綢裙麽?沒有?紗衫也要的,有罷?”
+後來這終於從淺閨傳進深閨裏去了。因為鄒七嫂得意之餘,將伊的綢裙請趙太太去鑒賞,趙太太又告訴了趙太爺而且著實恭維了一番。趙太爺便在晚飯桌上,和秀才大爺討論,以為阿Q實在有些古怪,我們門窗應該小心些;但他的東西,不知道可還有什麼可買,也許有點好東西罷。加以趙太太也正想買一件價廉物美的皮背心。於是家族決議,便托鄒七嫂即刻去尋阿Q,而且為此新闢了第三種的例外:這晚上也姑且特准點油燈。
+油燈幹了不少了,阿Q還不到。趙府的全眷都很焦急,打著呵欠,或恨阿Q太飄忽,或怨鄒七嫂不上緊。趙太太還怕他因為春天的條件不敢來,而趙太爺以為不足慮:因為這是“我”去叫他的。果然,到底趙太爺有見識,阿Q終於跟著鄒七嫂進來了。“他只說沒有沒有,我說你自己當面說去,他還要說,我說……”鄒七嫂氣喘吁吁的走著說。
+“太爺!”阿Q似笑非笑的叫了一聲,在簷下站住了。
+“阿Q,聽說你在外面發財,”趙太爺踱開去,眼睛打量著他的全身,一面說。“那很好,那很好的。這個,……聽說你有些舊東西,……可以都拿來看一看,……這也並不是別的,因為我倒要……”“我對鄒七嫂說過了。都完了。”“完了?”趙太爺不覺失聲的說,“那裏會完得這樣快呢?”“那是朋友的,本來不多。他們買了些,……”“總該還有一點罷。”“現在,只剩了一張門幕了。”“就拿門幕來看看罷。”趙太太慌忙說。
+“那麼,明天拿來就是,”趙太爺卻不甚熱心了。“阿Q,你以後有什麼東西的時候,你儘先送來給我們看,……”
+“價錢決不會比別家出得少!”秀才說。秀才娘子忙一瞥阿Q的臉,看他感動了沒有。
+“我要一件皮背心。”趙太太說。
+阿Q雖然答應著,卻懶洋洋的出去了,也不知道他是否放在心上。這使趙太爺很失望,氣憤而且擔心,至於停止了打呵欠。秀才對於阿Q的態度也很不平,於是說,這忘八蛋要提防,或者不如吩咐地保,不許他住在未莊。但趙太爺以為不然,說這也怕要結怨,況且做這路生意的大概是“老鷹不吃窩下食”,本村倒不必擔心的;只要自己夜裏警醒點就是了。秀才聽了這“庭訓”,非常之以為然,便即刻撤銷了驅逐阿Q的提議,而且叮囑鄒七嫂,請伊千萬不要向人提起這一段話。
+但第二日,鄒七嫂便將那藍裙去染了皂,又將阿Q可疑之點傳揚出去了,可是確沒有提起秀才要驅逐他這一節。然而這已經於阿Q很不利。最先,地保尋上門了,取了他的門幕去,阿Q說是趙太太要看的,而地保也不還並且要議定每月的孝敬錢。其次,是村人對於他的敬畏忽而變相了,雖然還不敢來放肆,卻很有遠避的神情,而這神情和先前的防他來“嚓”的時候又不同,頗混著“敬而遠之”的分子了。
+只有一班閑人們卻還要尋根究底的去探阿Q的底細。阿Q也並不諱飾,傲然的說出他的經驗來。從此他們纔知道,他不過是一個小腳色,不但不能上牆,並且不能進洞,只站在洞外接東西。有一夜,他剛纔接到一個包,正手再進去,不一會,只聽得裏面大嚷起來,他便趕緊跑,連夜爬出城,逃回未莊來了,從此不敢再去做。然而這故事卻於阿Q更不利,村人對於阿Q的“敬而遠之”者,本因為怕結怨,誰料他不過是一個不敢再偷的偷兒呢?這實在是“斯亦不足畏也矣”。
+第七章 革命[编辑]
+宣統三年九月十四日——即阿Q將搭連賣給趙白眼的這一天——三更四點,有一隻大烏篷船到了趙府上的河埠頭。這船從黑魆魆中盪來,鄉下人睡得熟,都沒有知道;出去時將近黎明,卻很有幾個看見的了。據探頭探腦的調查來的結果,知道那竟是舉人老爺的船!
+那船便將大不安載給了未莊,不到正午,全村的人心就很動搖。船的使命,趙家本來是很秘密的,但茶坊酒肆裏卻都說,革命黨要進城,舉人老爺到我們鄉下來逃難了。惟有鄒七嫂不以為然,說那不過是幾口破衣箱,舉人老爺想來寄存的,卻已被趙太爺回覆轉去。其實舉人老爺和趙秀才素不相能,在理本不能有“共患難”的情誼,況且鄒七嫂又和趙家是鄰居,見聞較為切近,所以大概該是伊對的。
+阿Q的耳朵裏,本來早聽到過革命黨這一句話,今年又親眼見過殺掉革命黨。但他有一種不知從那裏來的意見,以為革命黨便是造反,造反便是與他為難,所以一向是“深惡而痛絕之”的。殊不料這卻使百里聞名的舉人老爺有這樣怕,於是他未免也有些“神往”了,況且未莊的一群鳥男女的慌張的神情,也使阿Q更快意。
+“革命也好罷,”阿Q想,“革這夥媽媽的的命,太可惡!太可恨!……便是我,也要投降革命黨了。”
+阿Q近來用度窘,大約略略有些不平;加以午間喝了兩碗空肚酒,愈加醉得快,一面想一面走,便又飄飄然起來。不知怎麼一來,忽而似乎革命黨便是自己,未莊人卻都是他的俘虜了。他得意之餘,禁不住大聲的嚷道:
+“造反了!造反了!”
+未莊人都用了驚懼的眼光對他看。這一種可憐的眼光,是阿Q從來沒有見過的,一見之下,又使他舒服得如六月裏喝了雪水。他更加高興的走而且喊道:
+“好,……我要什麼就是什麼,我歡喜誰就是誰。得得,鏘鏘!悔不該,酒醉錯斬了鄭賢弟,悔不該,呀呀呀……得得,鏘鏘,得,鏘令鏘!我手執鋼鞭將你打……”
+趙府上的兩位男人和兩個真本家,也正站在大門口論革命。阿Q沒有見,昂了頭直唱過去。“得得,……”
+“老Q,”趙太爺怯怯的迎著低聲的叫。“鏘鏘,”阿Q料不到他的名字會和“老”字聯結起來,以為是一句別的話,與己無幹,只是唱。“得,鏘,鏘令鏘,鏘!”“老Q。”“悔不該……”
+“阿Q!”秀才只得直呼其名了。
+阿Q這纔站住,歪著頭問道,“什麼?”
+“老Q,…現在……”趙太爺卻又沒有話,“現在……發財麽?”
+“發財?自然。要什麼就是什麼……”
+“阿……Q哥,像我們這樣窮朋友是不要緊的……”趙白眼惴惴的說,似乎想探革命黨的口風。
+“窮朋友?你總比我有錢。”阿Q說著自去了。
+大家都憮然,沒有話。趙太爺父子回家,晚上商量到點燈。趙白眼回家,便從腰間扯下搭連來,交給他女人藏在箱底裏。
+阿Q飄飄然的飛了一通,回到土穀祠,酒已經醒透了。這晚上,管祠的老頭子也意外的和氣,請他喝茶;阿Q便向他要了兩個餅,吃完之後,又要了一支點過的四兩燭和一個樹燭臺,點起來,獨自躺在自己的小屋裏。他說不出的新鮮而且高興,燭火像元夜似的閃閃的跳,他的思想也迸跳起來了:
+“造反?有趣,……來了一陣白盔白甲的革命黨,都拿著板刀,鋼鞭,炸彈,洋炮,三尖兩刃刀,鉤鐮槍,走過土穀祠,叫道,‘阿Q!同去同去!’於是一同去。……
+“這時未莊的一夥鳥男女纔好笑哩,跪下叫道,‘阿Q,饒命!’誰聽他!第一個該死的是小D和趙太爺,還有秀才,還有假洋鬼子,……留幾條麽?王胡本來還可留,但也不要了。……
+“東西,……直走進去打開箱子來:元寶,洋錢,洋紗衫,……秀才娘子的一張寧式床先搬到土穀祠,此外便擺了錢家的桌椅,——或者也就用趙家的罷。自己是不動手的了,叫小D來搬,要搬得快,搬得不快打嘴巴。……
+“趙司晨的妹子真醜。鄒七嫂的女兒過幾年再說。假洋鬼子的老婆會和沒有辮子的男人睡覺,嚇,不是好東西!秀才的老婆是眼胞上有疤的。……吳媽長久不見了,不知道在那裏,——可惜腳太大。”
+阿Q沒有想得十分停當,已經發了鼾聲,四兩燭還只點去了小半寸,紅焰焰的光照著他張開的嘴。
+“荷荷!”阿Q忽而大叫起來,抬了頭倉皇的四顧,待到看見四兩燭,卻又倒頭睡去了。
+第二天他起得很遲,走出街上看時,樣樣都照舊。他也仍然肚餓,他想著,想不起什麼來;但他忽而似乎有了主意了,慢慢的跨開步,有意無意的走到靜修庵。
+庵和春天時節一樣靜,白的牆壁和漆黑的門。他想了一想,前去打門,一隻狗在裏面叫。他急急拾了幾塊斷磚,再上去較為用力的打,打到黑門上生出許多麻點的時候,纔聽得有人來開門。
+阿Q連忙捏好磚頭,擺開馬步,準備和黑狗來開戰。但庵門只開了一條縫,並無黑狗從中衝出,望進去只有一個老尼姑。
+“你又來什麼事?”伊大吃一驚的說。
+“革命了……你知道?……”阿Q說得很含糊。
+“革命革命,革過一革的,……你們要革得我們怎麼樣呢?”老尼姑兩眼通紅的說。
+“什麼?……”阿Q詫異了。
+“你不知道,他們已經來革過了!”
+“誰?……”阿Q更其詫異了。
+“那秀才和洋鬼子!”
+阿Q很出意外,不由的一錯愕;老尼姑見他失了銳氣,便飛速的關了門,阿Q再推時,牢不可開,再打時,沒有回答了。
+那還是上午的事。趙秀才消息靈,一知道革命黨已在夜間進城,便將辮子盤在頂上,一早去拜訪那歷來也不相能的錢洋鬼子。這是“咸與維新”的時候了,所以他們便談得很投機,立刻成了情投意合的同志,也相約去革命。他們想而又想,纔想出靜修庵裏有一塊“皇帝萬歲萬萬歲”的龍牌,是應該趕緊革掉的,於是又立刻同到庵裏去革命。因為老尼姑來阻擋,說了三句話,他們便將伊當作滿政府,在頭上很給了不少的棍子和栗鑿。尼姑待他們走後,定了神來檢點,龍牌固然已經碎在地上了,而且又不見了觀音娘娘座前的一個宣德爐。
+這事阿Q後來纔知道。他頗悔自己睡著,但也深怪他們不來招呼他。他又退一步想道:
+“難道他們還沒有知道我已經投降了革命黨麽?”
+第八章 不准革命[编辑]
+未莊的人心日見其安靜了。據傳來的消息,知道革命黨雖然進了城,倒還沒有什麼大異樣。知縣大老爺還是原官,不過改稱了什麼,而且舉人老爺也做了什麼——這些名目,未莊人都說不明白——官,帶兵的也還是先前的老把總。只有一件可怕的事是另有幾個不好的革命黨夾在裏面搗亂,第二天便動手剪辮子,聽說那鄰村的航船七斤便著了道兒,弄得不像人樣子了。但這卻還不算大恐怖,因為未莊人本來少上城,即使偶有想進城的,也就立刻變了計,碰不著這危險。阿Q本也想進城去尋他的老朋友,一得這消息,也只得作罷了。
+但未莊也不能說是無改革。幾天之後,將辮子盤在頂上的逐漸增加起來了,早經說過,最先自然是茂才公,其次便是趙司晨和趙白眼,後來是阿Q。倘在夏天,大家將辮子盤在頭頂上或者打一個結,本不算什麼稀奇事,但現在是暮秋,所以這“秋行夏令”的情形,在盤辮家不能不說是萬分的英斷,而在未莊也不能說無關於改革了。
+趙司晨腦後空蕩盪的走來,看見的人大嚷說,
+“豁,革命黨來了!”
+阿Q聽到了很羡慕。他雖然早知道秀才盤辮的大新聞,但總沒有想到自己可以照樣做,現在看見趙司晨也如此,纔有了學樣的意思,定下實行的決心。他用一支竹筷將辮子盤在頭頂上,遲疑多時,這纔放膽的走去。
+他在街上走,人也看他,然而不說什麼話,阿Q當初很不快,後來便很不平。他近來很容易鬧脾氣了;其實他的生活,倒也並不比造反之前反艱難,人見他也客氣,店鋪也不說要現錢。而阿Q總覺得自己太失意:既然革了命,不應該只是這樣的。況且有一回看見小D,愈使他氣破肚皮了。
+小D也將辮子盤在頭頂上了,而且也居然用一支竹筷。阿Q萬料不到他也敢這樣做,自己也決不准他這樣做!小D是什麼東西呢?他很想即刻揪住他,拗斷他的竹筷,放下他的辮子,並且批他幾個嘴巴,聊且懲罰他忘了生辰八字,也敢來做革命黨的罪。但他終於饒放了,單是怒目而視的吐一口唾沫道“呸!”
+這幾日裏,進城去的只有一個假洋鬼子。趙秀才本也想靠著寄存箱子的淵源,親身去拜訪舉人老爺的,但因為有剪辮的危險,所以也中止了。他寫了一封“黃傘格”的信,托假洋鬼子帶上城,而且托他給自己紹介紹介,去進自由黨。假洋鬼子回來時,向秀才討還了四塊洋錢,秀才便有一塊銀桃子掛在大襟上了;未莊人都驚服,說這是柿油黨的頂子,抵得一個翰林;趙太爺因此也驟然大闊,遠過於他兒子初雋秀才的時候,所以目空一切,見了阿Q,也就很有些不放在眼裏了。
+阿Q正在不平,又時時刻刻感著冷落,一聽得這銀桃子的傳說,他立即悟出自己之所以冷落的原因了:要革命,單說投降,是不行的;盤上辮子,也不行的;第一著仍然要和革命黨去結識。他生平所知道的革命黨只有兩個,城裏的一個早已“嚓”的殺掉了,現在只剩了一個假洋鬼子。他除卻趕緊去和假洋鬼子商量之外,再沒有別的道路了。
+錢府的大門正開著,阿Q便怯怯的躄進去。他一到裏面,很吃了驚,只見假洋鬼子正站在院子的中央,一身烏黑的大約是洋衣,身上也掛著一塊銀桃子,手裏是阿Q曾經領教過的棍子,已經留到一尺多長的辮子都拆開了披在肩背上,蓬頭散髮的像一個劉海仙。對面挺直的站著趙白眼和三個閑人,正在必恭必敬的聽說話。
+阿Q輕輕的走近了,站在趙白眼的背後,心裏想招呼,卻不知道怎麼說纔好:叫他假洋鬼子固然是不行的了,洋人也不妥,革命黨也不妥,或者就應該叫洋先生了罷。
+洋先生卻沒有見他,因為白著眼睛講得正起勁:
+“我是性急的,所以我們見面,我總是說:洪哥!我們動手罷!他卻總說道No!——這是洋話,你們不懂的。否則早已成功了。然而這正是他做事小心的地方。他再三再四的請我上湖北,我還沒有肯。誰願意在這小縣城裏做事情。……”
+“唔,……這個……”阿Q候他略停,終於用十二分的勇氣開口了,但不知道因為什麼,又並不叫他洋先生。
+聽著說話的四個人都吃驚的回顧他。洋先生也纔看見:
+“什麼?”
+“我……”
+“出去!”
+“我要投……”
+“滾出去!”洋先生揚起哭喪棒來了。
+趙白眼和閑人們便都吆喝道:“先生叫你滾出去,你還不聽麽!”
+阿Q將手向頭上一遮,不自覺的逃出門外;洋先生倒也沒有追。他快跑了六十多步,這纔慢慢的走,於是心裏便湧起了憂愁:洋先生不准他革命,他再沒有別的路;從此決不能望有白盔白甲的人來叫他,他所有的抱負,志向,希望,前程,全被一筆勾銷了。至於閑人們傳揚開去,給小D王胡等輩笑話,倒是還在其次的事。
+他似乎從來沒有經驗過這樣的無聊。他對於自己的盤辮子,仿佛也覺得無意味,要侮蔑;為報仇起見,很想立刻放下辮子來,但也沒有竟放。他遊到夜間,賒了兩碗酒,喝下肚去,漸漸的高興起來了,思想裏纔又出現白盔白甲的碎片。
+有一天,他照例的混到夜深,待酒店要關門,纔踱回土穀祠去。
+拍,吧~~!
+他忽而聽得一種異樣的聲音,又不是爆竹。阿Q本來是愛看熱鬧,愛管閑事的,便在暗中直尋過去。似乎前面有些腳步聲;他正聽,猛然間一個人從對面逃來了。阿Q一看見,便趕緊翻身跟著逃。那人轉彎,阿Q也轉彎,那人站住了,阿Q也站住。他看後面並無什麼,看那人便是小D。
+“什麼?”阿Q不平起來了。
+“趙……趙家遭搶了!”小D氣喘吁吁的說。
+阿Q的心怦怦的跳了。小D說了便走;阿Q卻逃而又停的兩三回。但他究竟是做過“這路生意”,格外膽大,於是躄出路角,仔細的聽,似乎有些嚷嚷,又仔細的看,似乎許多白盔白甲的人,絡繹的將箱子抬出了,器具抬出了,秀才娘子的寧式床也抬出了,但是不分明,他還想上前,兩隻腳卻沒有動。
+這一夜沒有月,未莊在黑暗裏很寂靜,寂靜到像羲皇時候一般太平。阿Q站著看到自己發煩,也似乎還是先前一樣,在那裏來來往往的搬,箱子抬出了,器具抬出了,秀才娘子的寧式床也抬出了,……抬得他自己有些不信他的眼睛了。但他決計不再上前,卻回到自己的祠裏去了。
+土穀祠裏更漆黑;他關好大門,摸進自己的屋子裏。他躺了好一會,這纔定了神,而且發出關於自己的思想來:白盔白甲的人明明到了,並不來打招呼,搬了許多好東西,又沒有自己的份,——這全是假洋鬼子可惡,不准我造反,否則,這次何至於沒有我的份呢?阿Q越想越氣,終於禁不住滿心痛恨起來,毒毒的點一點頭:“不准我造反,只准你造反?媽媽的假洋鬼子,——好,你造反!造反是殺頭的罪名呵,我總要告一狀,看你抓進縣裏去殺頭,——滿門抄斬,——嚓!嚓!”
+第九章 大團圓[编辑]
+趙家遭搶之後,未莊人大抵很快意而且恐慌,阿Q也很快意而且恐慌。但四天之後,阿Q在半夜裏忽被抓進縣城裏去了。那時恰是暗夜,一隊兵,一隊團丁,一隊員警,五個偵探,悄悄地到了未莊,乘昏暗圍住土穀祠,正對門架好機關槍;然而阿Q不衝出。許多時沒有動靜,把總焦急起來了,懸了二十千的賞,纔有兩個團丁冒了險,逾垣進去,裏應外合,一擁而入,將阿Q抓出來;直待擒出祠外面的機關槍左近,他纔有些清醒了。
+到進城,已經是正午,阿Q見自己被攙進一所破衙門,轉了五六個彎,便推在一間小屋裏。他剛剛一蹌踉,那用整株的木料做成的柵欄門便跟著他的腳跟闔上了,其餘的三面都是牆壁,仔細看時,屋角上還有兩個人。
+阿Q雖然有些忐忑,卻並不很苦悶,因為他那土穀祠裏的臥室,也並沒有比這間屋子更高明。那兩個也仿佛是鄉下人,漸漸和他兜搭起來了,一個說是舉人老爺要追他祖父欠下來的陳租,一個不知道為了什麼事。他們問阿Q,阿Q爽利的答道,“因為我想造反。”
+他下半天便又被抓出柵欄門去了,到得大堂,上面坐著一個滿頭剃得精光的老頭子。阿Q疑心他是和尚,但看見下麵站著一排兵,兩旁又站著十幾個長衫人物,也有滿頭剃得精光像這老頭子的,也有將一尺來長的頭髮披在背後像那假洋鬼子的,都是一臉橫肉,怒目而視的看他;他便知道這人一定有些來歷,膝關節立刻自然而然的寬鬆,便跪了下去了。
+“站著說!不要跪!”長衫人物都吆喝說。
+阿Q雖然似乎懂得,但總覺得站不住,身不由己的蹲了下去,而且終於趁勢改為跪下了。
+“奴隸性!……”長衫人物又鄙夷似的說,但也沒有叫他起來。
+“你從實招來罷,免得吃苦。我早都知道了。招了可以放你。”那光頭的老頭子看定了阿Q的臉,沉靜的清楚的說。
+“招罷!”長衫人物也大聲說。
+“我本來要……來投……”阿Q胡裏胡塗的想了一通,這纔斷斷續續的說。
+“那麼,為什麼不來的呢?”老頭子和氣的問。
+“假洋鬼子不准我!”
+“胡說此刻說,也遲了。現在你的同黨在那裏?”
+“什麼?……
+“那一晚打劫趙家的一夥人。”
+“他們沒有來叫我。他們自己搬走了。”阿Q提起來便憤憤。
+“走到那裏去了呢?說出來便放你了。”老頭子更和氣了。
+“我不知道,……他們沒有來叫我……”
+然而老頭子使了一個眼色,阿Q便又被抓進柵欄門裏了。他第二次抓出柵欄門,是第二天的上午。
+大堂的情形都照舊。上面仍然坐著光頭的老頭子,阿Q也仍然下了跪。
+老頭子和氣的問道,“你還有什麼話說麽?”
+阿Q一想,沒有話,便回答說,“沒有。”
+於是一個長衫人物拿了一張紙,並一支筆送到阿Q的面前,要將筆塞在他手裏。阿Q這時很吃驚,幾乎“魂飛魄散”了:因為他的手和筆相關,這回是初次。他正不知怎樣拿;那人卻又指著一處地方教他畫花押。
+“我……我……不認得字。”阿Q一把抓住了筆,惶恐而且慚愧的說。
+“那麼,便宜你,畫一個圓圈!”
+阿Q要畫圓圈了,那手捏著筆卻只是抖。於是那人替他將紙鋪在地上,阿Q伏下去,使盡了平生的力氣畫圓圈。他生怕被人笑話,立志要畫得圓,但這可惡的筆不但很沉重,並且不聽話,剛剛一抖一抖的幾乎要合縫,卻又向外一聳,畫成瓜子模樣了。
+阿Q正羞愧自己畫得不圓,那人卻不計較,早已掣了紙筆去,許多人又將他第二次抓進柵欄門。
+他第二次進了柵欄,倒也並不十分懊惱。他以為人生天地之間,大約本來有時要抓進抓出,有時要在紙上畫圓圈的,惟有圈而不圓,卻是他“行狀”上的一個汙點。但不多時也就釋然了,他想:孫子纔畫得很圓的圓圈呢。於是他睡著了。
+然而這一夜,舉人老爺反而不能睡:他和把總嘔了氣了。舉人老爺主張第一要追贓,把總主張第一要示眾。把總近來很不將舉人老爺放在眼裏了,拍案打凳的說道,“懲一儆百!你看,我做革命黨還不上二十天,搶案就是十幾件,全不破案,我的面子在那裏?破了案,你又來迂。不成!這是我管的!”舉人老爺窘急了,然而還堅持,說是倘若不追贓,他便立刻辭了幫辦民政的職務。而把總卻道,“請便罷!”於是舉人老爺在這一夜竟沒有睡,但幸第二天倒也沒有辭。
+阿Q第三次抓出柵欄門的時候,便是舉人老爺睡不著的那一夜的明天的上午了。他到了大堂,上面還坐著照例的光頭老頭子;阿Q也照例的下了跪。
+老頭子很和氣的問道,“你還有什麼話麽?”
+阿Q一想,沒有話,便回答說,“沒有。”
+許多長衫和短衫人物,忽然給他穿上一件洋布的白背心,上面有些黑字。阿Q很氣苦:因為這很像是帶孝,而帶孝是晦氣的。然而同時他的兩手反縛了,同時又被一直抓出衙門外去了。
+阿Q被抬上了一輛沒有蓬的車,幾個短衣人物也和他同坐在一處。這車立刻走動了,前面是一班背著洋炮的兵們和團丁,兩旁是許多張著嘴的看客,後面怎樣,阿Q沒有見。但他突然覺到了:這豈不是去殺頭麽?他一急,兩眼發黑,耳朵裏喤的一聲,似乎發昏了。然而他又沒有全發昏,有時雖然著急,有時卻也泰然;他意思之間,似乎覺得人生天地間,大約本來有時也未免要殺頭的。
+他還認得路,於是有些詫異了:怎麼不向著法場走呢?他不知道這是在遊街,在示眾。但即使知道也一樣,他不過便以為人生天地間,大約本來有時也未免要遊街要示眾罷了
+他省悟了,這是繞到法場去的路,這一定是“嚓”的去殺頭。他惘惘的向左右看,全跟著馬蟻似的人,而在無意中,卻在路旁的人叢中發見了一個吳媽。很久違,伊原來在城裏做工了。阿Q忽然很羞愧自己沒志氣:竟沒有唱幾句戲。他的思想仿佛旋風似的在腦裏一迴旋:《小孤孀上墳》欠堂皇,《龍虎鬥》裏的“悔不該……”也太乏,還是“手執鋼鞭將你打”罷。他同時想手一揚,纔記得這兩手原來都捆著,於是“手執鋼鞭”也不唱了。
+“過了二十年又是一個……”阿Q在百忙中,“無師自通”的說出半句從來不說的話。
+“好!!!”從人叢裏,便發出豺狼的嗥叫一般的聲音來。
+車子不住的前行,阿Q在喝采聲中,輪轉眼睛去看吳媽,似乎伊一向並沒有見他,卻只是出神的看著兵們背上的洋炮。
+阿Q於是再看那些喝采的人們
+這剎那中,他的思想又仿佛旋風似的在腦裏一迴旋了。四年之前,他曾在山腳下遇見一隻餓狼,永是不近不遠的跟定他,要吃他的肉。他那時嚇得幾乎要死,幸而手裏有一柄斫柴刀,纔得仗這壯了膽,支持到未莊;可是永遠記得那狼眼睛,又凶又怯,閃閃的像兩顆鬼火,似乎遠遠的來穿透了他的皮肉。而這回他又看見從來沒有見過的更可怕的眼睛了,又鈍又鋒利,不但已經咀嚼了他的話,並且還要咀嚼他皮肉以外的東西,永是不近不遠的跟他走。
+這些睛們似乎連成一氣,已經在那裏咬他的靈魂。
+“救命,……”
+然而阿Q沒有說。他早就兩眼發黑,耳朵裏嗡的一聲,覺得全身仿佛微塵似的迸散了。
+至於當時的影響,最大的倒反在舉人老爺,因為終於沒有追贓,他全家都號啕了。其次是趙府,非特秀才因為上城去報官,被不好的革命黨剪了辮子,而且又破費了二十千的賞錢,所以全家也號啕了。從這一天以來,他們便漸漸的都發生了遺老的氣味。
+至於輿論,在未莊是無異議,自然都說阿Q壞,被槍斃便是他的壞的證據:不壞又何至於被槍斃呢?而城裏的輿論卻不佳,他們多半不滿足,以為槍斃並無殺頭這般好看;而且那是怎樣的一個可笑的死囚呵,游了那麼久的街,竟沒有唱一句戲:他們白跟一趟了。
EOT;
+ protected static $encoding = 'UTF-8';
+
protected static function explode($text)
{
$chars = array();
- foreach (preg_split('//u', preg_replace('/\s+/', '', $text)) as $char) {
- if ($char !== '') {
+
+ foreach (preg_split('//u', str_replace(PHP_EOL, '', $text)) as $char) {
+ if (! empty($char)) {
$chars[] = $char;
}
}
+
return $chars;
}
protected static function strlen($text)
{
- return function_exists('mb_strlen') ? mb_strlen($text, 'UTF-8') : count(static::explode($text));
+ return function_exists('mb_strlen')
+ ? mb_strlen($text, static::$encoding)
+ : count(static::explode($text));
}
protected static function validStart($word)
{
- return !in_array($word, static::$notBeginPunct);
+ return ! in_array($word, static::$notBeginPunct);
}
protected static function appendEnd($text)
{
+ $mbAvailable = extension_loaded('mbstring');
+
// extract the last char of $text
- if (function_exists('mb_substr')) {
- $last = mb_substr($text, mb_strlen($text)-1, 'UTF-8');
+ if ($mbAvailable) {
+ // in order to support php 5.3, third param use 1 instead of null
+ // https://secure.php.net/manual/en/function.mb-substr.php#refsect1-function.mb-substr-changelog
+ $last = mb_substr($text, mb_strlen($text, static::$encoding) - 1, 1, static::$encoding);
} else {
- $chars = static::split($text);
- $last = end($chars);
+ $chars = static::utf8Encoding($text);
+ $last = $chars[count($chars) - 1];
}
+
// if the last char is a not-valid-end punctuation, remove it
if (in_array($last, static::$notEndPunct)) {
- $text = preg_replace('/.$/u', '', $text);
+ if ($mbAvailable) {
+ $text = mb_substr($text, 0, mb_strlen($text, static::$encoding) - 1, static::$encoding);
+ } else {
+ array_pop($chars);
+ $text = implode('', $chars);
+ }
}
+
// if the last char is not a valid punctuation, append a default one.
- return in_array($last, static::$endPunct) ? $text : $text.'。';
+ return in_array($last, static::$endPunct) ? $text : $text . '。';
+ }
+
+ /**
+ * Convert original string to utf-8 encoding.
+ *
+ * @param string $text
+ * @return array
+ */
+ protected static function utf8Encoding($text)
+ {
+ $encoding = array();
+
+ $chars = str_split($text);
+
+ $countChars = count($chars);
+
+ for ($i = 0; $i < $countChars; ++$i) {
+ $temp = $chars[$i];
+
+ $ord = ord($chars[$i]);
+
+ switch (true) {
+ case $ord > 251:
+ $temp .= $chars[++$i];
+ // no break
+ case $ord > 247:
+ $temp .= $chars[++$i];
+ // no break
+ case $ord > 239:
+ $temp .= $chars[++$i];
+ // no break
+ case $ord > 223:
+ $temp .= $chars[++$i];
+ // no break
+ case $ord > 191:
+ $temp .= $chars[++$i];
+ // no break
+ }
+
+ $encoding[] = $temp;
+ }
+
+ return $encoding;
}
}
diff --git a/vendor/fzaninotto/faker/src/Faker/UniqueGenerator.php b/vendor/fzaninotto/faker/src/Faker/UniqueGenerator.php
index 335882dd..431f7653 100644
--- a/vendor/fzaninotto/faker/src/Faker/UniqueGenerator.php
+++ b/vendor/fzaninotto/faker/src/Faker/UniqueGenerator.php
@@ -12,7 +12,11 @@ class UniqueGenerator
protected $maxRetries;
protected $uniques = array();
- public function __construct(Generator $generator, $maxRetries)
+ /**
+ * @param Generator $generator
+ * @param integer $maxRetries
+ */
+ public function __construct(Generator $generator, $maxRetries = 10000)
{
$this->generator = $generator;
$this->maxRetries = $maxRetries;
@@ -20,6 +24,8 @@ class UniqueGenerator
/**
* Catch and proxy all generator calls but return only unique values
+ * @param string $attribute
+ * @return mixed
*/
public function __get($attribute)
{
@@ -28,6 +34,9 @@ class UniqueGenerator
/**
* Catch and proxy all generator calls with arguments but return only unique values
+ * @param string $name
+ * @param array $arguments
+ * @return mixed
*/
public function __call($name, $arguments)
{
@@ -41,8 +50,8 @@ class UniqueGenerator
if ($i > $this->maxRetries) {
throw new \OverflowException(sprintf('Maximum retries of %d reached without finding a unique value', $this->maxRetries));
}
- } while (array_key_exists($res, $this->uniques[$name]));
- $this->uniques[$name][$res]= null;
+ } while (array_key_exists(serialize($res), $this->uniques[$name]));
+ $this->uniques[$name][serialize($res)]= null;
return $res;
}
diff --git a/vendor/fzaninotto/faker/src/Faker/ValidGenerator.php b/vendor/fzaninotto/faker/src/Faker/ValidGenerator.php
new file mode 100644
index 00000000..1352dfc0
--- /dev/null
+++ b/vendor/fzaninotto/faker/src/Faker/ValidGenerator.php
@@ -0,0 +1,65 @@
+valid()
+ */
+class ValidGenerator
+{
+ protected $generator;
+ protected $validator;
+ protected $maxRetries;
+
+ /**
+ * @param Generator $generator
+ * @param callable|null $validator
+ * @param integer $maxRetries
+ */
+ public function __construct(Generator $generator, $validator = null, $maxRetries = 10000)
+ {
+ if (is_null($validator)) {
+ $validator = function () {
+ return true;
+ };
+ } elseif (!is_callable($validator)) {
+ throw new \InvalidArgumentException('valid() only accepts callables as first argument');
+ }
+ $this->generator = $generator;
+ $this->validator = $validator;
+ $this->maxRetries = $maxRetries;
+ }
+
+ /**
+ * Catch and proxy all generator calls but return only valid values
+ * @param string $attribute
+ *
+ * @return mixed
+ */
+ public function __get($attribute)
+ {
+ return $this->__call($attribute, array());
+ }
+
+ /**
+ * Catch and proxy all generator calls with arguments but return only valid values
+ * @param string $name
+ * @param array $arguments
+ *
+ * @return mixed
+ */
+ public function __call($name, $arguments)
+ {
+ $i = 0;
+ do {
+ $res = call_user_func_array(array($this->generator, $name), $arguments);
+ $i++;
+ if ($i > $this->maxRetries) {
+ throw new \OverflowException(sprintf('Maximum retries of %d reached without finding a valid value', $this->maxRetries));
+ }
+ } while (!call_user_func($this->validator, $res));
+
+ return $res;
+ }
+}
diff --git a/vendor/fzaninotto/faker/src/autoload.php b/vendor/fzaninotto/faker/src/autoload.php
index 69324ba3..f55914de 100644
--- a/vendor/fzaninotto/faker/src/autoload.php
+++ b/vendor/fzaninotto/faker/src/autoload.php
@@ -10,7 +10,6 @@
spl_autoload_register(function ($className) {
$className = ltrim($className, '\\');
$fileName = '';
- $namespace = '';
if ($lastNsPos = strripos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
diff --git a/vendor/fzaninotto/faker/test/Faker/Calculator/LuhnTest.php b/vendor/fzaninotto/faker/test/Faker/Calculator/LuhnTest.php
deleted file mode 100644
index c2170172..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Calculator/LuhnTest.php
+++ /dev/null
@@ -1,62 +0,0 @@
-assertInternalType('string', $checkDigit);
- $this->assertEquals($checkDigit, Luhn::computeCheckDigit($partialNumber));
- }
-
- public function validatorProvider()
- {
- return array(
- array('79927398710', false),
- array('79927398711', false),
- array('79927398712', false),
- array('79927398713', true),
- array('79927398714', false),
- array('79927398715', false),
- array('79927398716', false),
- array('79927398717', false),
- array('79927398718', false),
- array('79927398719', false),
- array(79927398713, true),
- array(79927398714, false),
- );
- }
-
- /**
- * @dataProvider validatorProvider
- */
- public function testIsValid($number, $isValid)
- {
- $this->assertEquals($isValid, Luhn::isValid($number));
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/DefaultGeneratorTest.php b/vendor/fzaninotto/faker/test/Faker/DefaultGeneratorTest.php
deleted file mode 100644
index 262243d1..00000000
--- a/vendor/fzaninotto/faker/test/Faker/DefaultGeneratorTest.php
+++ /dev/null
@@ -1,27 +0,0 @@
-assertSame(null, $generator->value);
- }
-
- public function testGeneratorReturnsDefaultValueForAnyPropertyGet()
- {
- $generator = new DefaultGenerator(123);
- $this->assertSame(123, $generator->foo);
- $this->assertNotSame(null, $generator->bar);
- }
-
- public function testGeneratorReturnsDefaultValueForAnyMethodCall()
- {
- $generator = new DefaultGenerator(123);
- $this->assertSame(123, $generator->foobar());
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/GeneratorTest.php b/vendor/fzaninotto/faker/test/Faker/GeneratorTest.php
deleted file mode 100644
index 9fea4f86..00000000
--- a/vendor/fzaninotto/faker/test/Faker/GeneratorTest.php
+++ /dev/null
@@ -1,144 +0,0 @@
-addProvider(new FooProvider());
- $generator->addProvider(new BarProvider());
- $this->assertEquals('barfoo', $generator->format('fooFormatter'));
- }
-
- public function testGetFormatterReturnsCallable()
- {
- $generator = new Generator;
- $provider = new FooProvider();
- $generator->addProvider($provider);
- $this->assertTrue(is_callable($generator->getFormatter('fooFormatter')));
- }
-
- public function testGetFormatterReturnsCorrectFormatter()
- {
- $generator = new Generator;
- $provider = new FooProvider();
- $generator->addProvider($provider);
- $expected = array($provider, 'fooFormatter');
- $this->assertEquals($expected, $generator->getFormatter('fooFormatter'));
- }
-
- /**
- * @expectedException InvalidArgumentException
- */
- public function testGetFormatterThrowsExceptionOnIncorrectProvider()
- {
- $generator = new Generator;
- $generator->getFormatter('fooFormatter');
- }
-
- /**
- * @expectedException InvalidArgumentException
- */
- public function testGetFormatterThrowsExceptionOnIncorrectFormatter()
- {
- $generator = new Generator;
- $provider = new FooProvider();
- $generator->addProvider($provider);
- $generator->getFormatter('barFormatter');
- }
-
- public function testFormatCallsFormatterOnProvider()
- {
- $generator = new Generator;
- $provider = new FooProvider();
- $generator->addProvider($provider);
- $this->assertEquals('foobar', $generator->format('fooFormatter'));
- }
-
- public function testFormatTransfersArgumentsToFormatter()
- {
- $generator = new Generator;
- $provider = new FooProvider();
- $generator->addProvider($provider);
- $this->assertEquals('bazfoo', $generator->format('fooFormatterWithArguments', array('foo')));
- }
-
- public function testParseReturnsSameStringWhenItContainsNoCurlyBraces()
- {
- $generator = new Generator();
- $this->assertEquals('fooBar#?', $generator->parse('fooBar#?'));
- }
-
- public function testParseReturnsStringWithTokensReplacedByFormatters()
- {
- $generator = new Generator();
- $provider = new FooProvider();
- $generator->addProvider($provider);
- $this->assertEquals('This is foobar a text with foobar', $generator->parse('This is {{fooFormatter}} a text with {{ fooFormatter }}'));
- }
-
- public function testMagicGetCallsFormat()
- {
- $generator = new Generator;
- $provider = new FooProvider();
- $generator->addProvider($provider);
- $this->assertEquals('foobar', $generator->fooFormatter);
- }
-
- public function testMagicCallCallsFormat()
- {
- $generator = new Generator;
- $provider = new FooProvider();
- $generator->addProvider($provider);
- $this->assertEquals('foobar', $generator->fooFormatter());
- }
-
- public function testMagicCallCallsFormatWithArguments()
- {
- $generator = new Generator;
- $provider = new FooProvider();
- $generator->addProvider($provider);
- $this->assertEquals('bazfoo', $generator->fooFormatterWithArguments('foo'));
- }
-
- public function testSeed()
- {
- $generator = new Generator;
-
- $generator->seed(0);
- $mtRandWithSeedZero = mt_rand();
- $generator->seed(0);
- $this->assertEquals($mtRandWithSeedZero, mt_rand(), 'seed(0) should be deterministic.');
-
- $generator->seed();
- $mtRandWithoutSeed = mt_rand();
- $this->assertNotEquals($mtRandWithSeedZero, $mtRandWithoutSeed, 'seed() should be different than seed(0)');
- $generator->seed();
- $this->assertNotEquals($mtRandWithoutSeed, mt_rand(), 'seed() should not be deterministic.');
- }
-}
-
-class FooProvider
-{
- public function fooFormatter()
- {
- return 'foobar';
- }
-
- public function fooFormatterWithArguments($value = '')
- {
- return 'baz' . $value;
- }
-}
-
-class BarProvider
-{
- public function fooFormatter()
- {
- return 'barfoo';
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/AddressTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/AddressTest.php
deleted file mode 100644
index cbabce56..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/AddressTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-addProvider(new Address($faker));
- $this->faker = $faker;
- }
-
- public function testLatitude()
- {
- $latitude = $this->faker->latitude();
- $this->assertInternalType('float', $latitude);
- $this->assertGreaterThanOrEqual(-90, $latitude);
- $this->assertLessThanOrEqual(90, $latitude);
- }
-
- public function testLongitude()
- {
- $longitude = $this->faker->longitude();
- $this->assertInternalType('float', $longitude);
- $this->assertGreaterThanOrEqual(-180, $longitude);
- $this->assertLessThanOrEqual(180, $longitude);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/BarcodeTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/BarcodeTest.php
deleted file mode 100644
index a7ee6d98..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/BarcodeTest.php
+++ /dev/null
@@ -1,45 +0,0 @@
-addProvider(new Barcode($faker));
- $faker->seed(0);
- $this->faker = $faker;
- }
-
- public function testEan8()
- {
- $code = $this->faker->ean8();
- $this->assertRegExp('/^\d{8}$/i', $code);
- $codeWitoutChecksum = substr($code, 0, -1);
- $checksum = substr($code, -1);
- $this->assertEquals(TestableBarcode::eanChecksum($codeWitoutChecksum), $checksum);
- }
-
- public function testEan13()
- {
- $code = $this->faker->ean13();
- $this->assertRegExp('/^\d{13}$/i', $code);
- $codeWitoutChecksum = substr($code, 0, -1);
- $checksum = substr($code, -1);
- $this->assertEquals(TestableBarcode::eanChecksum($codeWitoutChecksum), $checksum);
- }
-}
-
-class TestableBarcode extends Barcode
-{
- public static function eanChecksum($input)
- {
- return parent::eanChecksum($input);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/BaseTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/BaseTest.php
deleted file mode 100644
index 95e694ab..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/BaseTest.php
+++ /dev/null
@@ -1,446 +0,0 @@
-assertTrue(is_integer(BaseProvider::randomDigit()));
- }
-
- public function testRandomDigitReturnsDigit()
- {
- $this->assertTrue(BaseProvider::randomDigit() >= 0);
- $this->assertTrue(BaseProvider::randomDigit() < 10);
- }
-
- public function testRandomDigitNotNullReturnsNotNullDigit()
- {
- $this->assertTrue(BaseProvider::randomDigitNotNull() > 0);
- $this->assertTrue(BaseProvider::randomDigitNotNull() < 10);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testRandomNumberThrowsExceptionWhenCalledWithAMax()
- {
- BaseProvider::randomNumber(5, 200);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testRandomNumberThrowsExceptionWhenCalledWithATooHighNumberOfDigits()
- {
- BaseProvider::randomNumber(10);
- }
-
- public function testRandomNumberReturnsInteger()
- {
- $this->assertTrue(is_integer(BaseProvider::randomNumber()));
- $this->assertTrue(is_integer(BaseProvider::randomNumber(5, false)));
- }
-
- public function testRandomNumberReturnsDigit()
- {
- $this->assertTrue(BaseProvider::randomNumber(3) >= 0);
- $this->assertTrue(BaseProvider::randomNumber(3) < 1000);
- }
-
- public function testRandomNumberAcceptsStrictParamToEnforceNumberSize()
- {
- $this->assertEquals(5, strlen((string) BaseProvider::randomNumber(5, true)));
- }
-
- public function testNumberBetween()
- {
- $min = 5;
- $max = 6;
-
- $this->assertGreaterThanOrEqual($min, BaseProvider::numberBetween($min, $max));
- $this->assertGreaterThanOrEqual(BaseProvider::numberBetween($min, $max), $max);
- }
-
- public function testNumberBetweenAcceptsZeroAsMax()
- {
- $this->assertEquals(0, BaseProvider::numberBetween(0, 0));
- }
-
- public function testRandomFloat()
- {
- $min = 4;
- $max = 10;
- $nbMaxDecimals = 8;
-
- $result = BaseProvider::randomFloat($nbMaxDecimals, $min, $max);
-
- $parts = explode('.', $result);
-
- $this->assertInternalType('float', $result);
- $this->assertGreaterThanOrEqual($min, $result);
- $this->assertLessThanOrEqual($max, $result);
- $this->assertLessThanOrEqual($nbMaxDecimals, strlen($parts[1]));
- }
-
- public function testRandomLetterReturnsString()
- {
- $this->assertTrue(is_string(BaseProvider::randomLetter()));
- }
-
- public function testRandomLetterReturnsSingleLetter()
- {
- $this->assertEquals(1, strlen(BaseProvider::randomLetter()));
- }
-
- public function testRandomLetterReturnsLowercaseLetter()
- {
- $lowercaseLetters = 'abcdefghijklmnopqrstuvwxyz';
- $this->assertTrue(strpos($lowercaseLetters, BaseProvider::randomLetter()) !== false);
- }
-
- public function testRandomAsciiReturnsString()
- {
- $this->assertTrue(is_string(BaseProvider::randomAscii()));
- }
-
- public function testRandomAsciiReturnsSingleCharacter()
- {
- $this->assertEquals(1, strlen(BaseProvider::randomAscii()));
- }
-
- public function testRandomAsciiReturnsAsciiCharacter()
- {
- $lowercaseLetters = '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~';
- $this->assertTrue(strpos($lowercaseLetters, BaseProvider::randomAscii()) !== false);
- }
-
- public function testRandomElementReturnsNullWhenArrayEmpty()
- {
- $this->assertNull(BaseProvider::randomElement(array()));
- }
-
- public function testRandomElementReturnsElementFromArray()
- {
- $elements = array('23', 'e', 32, '#');
- $this->assertContains(BaseProvider::randomElement($elements), $elements);
- }
-
- public function testRandomElementReturnsElementFromAssociativeArray()
- {
- $elements = array('tata' => '23', 'toto' => 'e', 'tutu' => 32, 'titi' => '#');
- $this->assertContains(BaseProvider::randomElement($elements), $elements);
- }
-
- public function testShuffleReturnsStringWhenPassedAStringArgument()
- {
- $this->assertInternalType('string', BaseProvider::shuffle('foo'));
- }
-
- public function testShuffleReturnsArrayWhenPassedAnArrayArgument()
- {
- $this->assertInternalType('array', BaseProvider::shuffle(array(1, 2, 3)));
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testShuffleThrowsExceptionWhenPassedAnInvalidArgument()
- {
- BaseProvider::shuffle(false);
- }
-
- public function testShuffleArraySupportsEmptyArrays()
- {
- $this->assertEquals(array(), BaseProvider::shuffleArray(array()));
- }
-
- public function testShuffleArrayReturnsAnArrayOfTheSameSize()
- {
- $array = array(1, 2, 3, 4, 5);
- $this->assertSameSize($array, BaseProvider::shuffleArray($array));
- }
-
- public function testShuffleArrayReturnsAnArrayWithSameElements()
- {
- $array = array(2, 4, 6, 8, 10);
- $shuffleArray = BaseProvider::shuffleArray($array);
- $this->assertContains(2, $shuffleArray);
- $this->assertContains(4, $shuffleArray);
- $this->assertContains(6, $shuffleArray);
- $this->assertContains(8, $shuffleArray);
- $this->assertContains(10, $shuffleArray);
- }
-
- public function testShuffleArrayReturnsADifferentArrayThanTheOriginal()
- {
- $arr = array(1, 2, 3, 4, 5);
- $shuffledArray = BaseProvider::shuffleArray($arr);
- $this->assertNotEquals($arr, $shuffledArray);
- }
-
- public function testShuffleArrayLeavesTheOriginalArrayUntouched()
- {
- $arr = array(1, 2, 3, 4, 5);
- BaseProvider::shuffleArray($arr);
- $this->assertEquals($arr, array(1, 2, 3, 4, 5));
- }
-
- public function testShuffleStringSupportsEmptyStrings()
- {
- $this->assertEquals('', BaseProvider::shuffleString(''));
- }
-
- public function testShuffleStringReturnsAnStringOfTheSameSize()
- {
- $string = 'abcdef';
- $this->assertEquals(strlen($string), strlen(BaseProvider::shuffleString($string)));
- }
-
- public function testShuffleStringReturnsAnStringWithSameElements()
- {
- $string = 'acegi';
- $shuffleString = BaseProvider::shuffleString($string);
- $this->assertContains('a', $shuffleString);
- $this->assertContains('c', $shuffleString);
- $this->assertContains('e', $shuffleString);
- $this->assertContains('g', $shuffleString);
- $this->assertContains('i', $shuffleString);
- }
-
- public function testShuffleStringReturnsADifferentStringThanTheOriginal()
- {
- $string = 'abcdef';
- $shuffledString = BaseProvider::shuffleString($string);
- $this->assertNotEquals($string, $shuffledString);
- }
-
- public function testShuffleStringLeavesTheOriginalStringUntouched()
- {
- $string = 'abcdef';
- BaseProvider::shuffleString($string);
- $this->assertEquals($string, 'abcdef');
- }
-
- public function testNumerifyReturnsSameStringWhenItContainsNoHashSign()
- {
- $this->assertEquals('fooBar?', BaseProvider::numerify('fooBar?'));
- }
-
- public function testNumerifyReturnsStringWithHashSignsReplacedByDigits()
- {
- $this->assertRegExp('/foo\dBa\dr/', BaseProvider::numerify('foo#Ba#r'));
- }
-
- public function testNumerifyReturnsStringWithPercentageSignsReplacedByDigits()
- {
- $this->assertRegExp('/foo\dBa\dr/', BaseProvider::numerify('foo%Ba%r'));
- }
-
- public function testNumerifyReturnsStringWithPercentageSignsReplacedByNotNullDigits()
- {
- $this->assertNotEquals('0', BaseProvider::numerify('%'));
- }
-
- public function testNumerifyCanGenerateALargeNumberOfDigits()
- {
- $largePattern = str_repeat('#', 20); // definitely larger than PHP_INT_MAX on all systems
- $this->assertEquals(20, strlen(BaseProvider::numerify($largePattern)));
- }
-
- public function testLexifyReturnsSameStringWhenItContainsNoQuestionMark()
- {
- $this->assertEquals('fooBar#', BaseProvider::lexify('fooBar#'));
- }
-
- public function testLexifyReturnsStringWithQuestionMarksReplacedByLetters()
- {
- $this->assertRegExp('/foo[a-z]Ba[a-z]r/', BaseProvider::lexify('foo?Ba?r'));
- }
-
- public function testBothifyCombinesNumerifyAndLexify()
- {
- $this->assertRegExp('/foo[a-z]Ba\dr/', BaseProvider::bothify('foo?Ba#r'));
- }
-
- public function testAsciifyReturnsSameStringWhenItContainsNoStarSign()
- {
- $this->assertEquals('fooBar?', BaseProvider::asciify('fooBar?'));
- }
-
- public function testAsciifyReturnsStringWithStarSignsReplacedByAsciiChars()
- {
- $this->assertRegExp('/foo.Ba.r/', BaseProvider::asciify('foo*Ba*r'));
- }
-
- public function regexifyBasicDataProvider()
- {
- return array(
- array('azeQSDF1234', 'azeQSDF1234', 'does not change non regex chars'),
- array('foo(bar){1}', 'foobar', 'replaces regex characters'),
- array('', '', 'supports empty string'),
- array('/^foo(bar){1}$/', 'foobar', 'ignores regex delimiters')
- );
- }
-
- /**
- * @dataProvider regexifyBasicDataProvider
- */
- public function testRegexifyBasicFeatures($input, $output, $message)
- {
- $this->assertEquals($output, BaseProvider::regexify($input), $message);
- }
-
- public function regexifyDataProvider()
- {
- return array(
- array('\d', 'numbers'),
- array('\w', 'letters'),
- array('(a|b)', 'alternation'),
- array('[aeiou]', 'basic character class'),
- array('[a-z]', 'character class range'),
- array('[a-z1-9]', 'multiple character class range'),
- array('a*b+c?', 'single character quantifiers'),
- array('a{2}', 'brackets quantifiers'),
- array('a{2,3}', 'min-max brackets quantifiers'),
- array('[aeiou]{2,3}', 'brackets quantifiers on basic character class'),
- array('[a-z]{2,3}', 'brackets quantifiers on character class range'),
- array('(a|b){2,3}', 'brackets quantifiers on alternation'),
- array('\.\*\?\+', 'escaped characters'),
- array('[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}', 'complex regex')
- );
- }
-
- /**
- * @dataProvider regexifyDataProvider
- */
- public function testRegexifySupportedRegexSyntax($pattern, $message)
- {
- $this->assertRegExp('/' . $pattern . '/', BaseProvider::regexify($pattern), 'Regexify supports ' . $message);
- }
-
- public function testOptionalReturnsProviderValueWhenCalledWithWeight1()
- {
- $faker = new \Faker\Generator();
- $faker->addProvider(new \Faker\Provider\Base($faker));
- $this->assertNotNull($faker->optional(1)->randomDigit);
- }
-
- public function testOptionalReturnsNullWhenCalledWithWeight0()
- {
- $faker = new \Faker\Generator();
- $faker->addProvider(new \Faker\Provider\Base($faker));
- $this->assertNull($faker->optional(0)->randomDigit);
- }
-
- public function testOptionalAllowsChainingPropertyAccess()
- {
- $faker = new \Faker\Generator();
- $faker->addProvider(new \Faker\Provider\Base($faker));
- $faker->addProvider(new \ArrayObject(array(1))); // hack because method_exists forbids stubs
- $this->assertEquals(1, $faker->optional(1)->count);
- $this->assertNull($faker->optional(0)->count);
- }
-
- public function testOptionalAllowsChainingMethodCall()
- {
- $faker = new \Faker\Generator();
- $faker->addProvider(new \Faker\Provider\Base($faker));
- $faker->addProvider(new \ArrayObject(array(1))); // hack because method_exists forbids stubs
- $this->assertEquals(1, $faker->optional(1)->count());
- $this->assertNull($faker->optional(0)->count());
- }
-
- public function testOptionalAllowsChainingProviderCallRandomlyReturnNull()
- {
- $faker = new \Faker\Generator();
- $faker->addProvider(new \Faker\Provider\Base($faker));
- $values = array();
- for ($i=0; $i < 10; $i++) {
- $values[]= $faker->optional()->randomDigit;
- }
- $this->assertContains(null, $values);
- }
-
- public function testUniqueAllowsChainingPropertyAccess()
- {
- $faker = new \Faker\Generator();
- $faker->addProvider(new \Faker\Provider\Base($faker));
- $faker->addProvider(new \ArrayObject(array(1))); // hack because method_exists forbids stubs
- $this->assertEquals(1, $faker->unique()->count);
- }
-
- public function testUniqueAllowsChainingMethodCall()
- {
- $faker = new \Faker\Generator();
- $faker->addProvider(new \Faker\Provider\Base($faker));
- $faker->addProvider(new \ArrayObject(array(1))); // hack because method_exists forbids stubs
- $this->assertEquals(1, $faker->unique()->count());
- }
-
- public function testUniqueReturnsOnlyUniqueValues()
- {
- $faker = new \Faker\Generator();
- $faker->addProvider(new \Faker\Provider\Base($faker));
- $values = array();
- for ($i=0; $i < 10; $i++) {
- $values[]= $faker->unique()->randomDigit;
- }
- sort($values);
- $this->assertEquals(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), $values);
- }
-
- /**
- * @expectedException OverflowException
- */
- public function testUniqueThrowsExceptionWhenNoUniqueValueCanBeGenerated()
- {
- $faker = new \Faker\Generator();
- $faker->addProvider(new \Faker\Provider\Base($faker));
- for ($i=0; $i < 11; $i++) {
- $faker->unique()->randomDigit;
- }
- }
-
- public function testUniqueCanResetUniquesWhenPassedTrueAsArgument()
- {
- $faker = new \Faker\Generator();
- $faker->addProvider(new \Faker\Provider\Base($faker));
- $values = array();
- for ($i=0; $i < 10; $i++) {
- $values[]= $faker->unique()->randomDigit;
- }
- $values[]= $faker->unique(true)->randomDigit;
- for ($i=0; $i < 9; $i++) {
- $values[]= $faker->unique()->randomDigit;
- }
- sort($values);
- $this->assertEquals(array(0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9), $values);
- }
-
- /**
- * @expectedException LengthException
- * @expectedExceptionMessage Cannot get 2 elements, only 1 in array
- */
- public function testRandomElementsThrowsWhenRequestingTooManyKeys()
- {
- BaseProvider::randomElements(array('foo'), 2);
- }
-
- public function testRandomElements()
- {
- $this->assertCount(1, BaseProvider::randomElements(), 'Should work without any input');
-
- $empty = BaseProvider::randomElements(array(), 0);
- $this->assertInternalType('array', $empty);
- $this->assertCount(0, $empty);
-
- $shuffled = BaseProvider::randomElements(array('foo', 'bar', 'baz'), 3);
- $this->assertContains('foo', $shuffled);
- $this->assertContains('bar', $shuffled);
- $this->assertContains('baz', $shuffled);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/BiasedTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/BiasedTest.php
deleted file mode 100644
index 1f7a99ac..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/BiasedTest.php
+++ /dev/null
@@ -1,73 +0,0 @@
-generator = new Generator();
- $this->generator->addProvider(new Biased($this->generator));
-
- $this->results = array_fill(1, self::MAX, 0);
- }
-
- public function performFake($function)
- {
- for($i = 0; $i < self::NUMBERS; $i++) {
- $this->results[$this->generator->biasedNumberBetween(1, self::MAX, $function)]++;
- }
- }
-
- public function testUnbiased()
- {
- $this->performFake(array('\Faker\Provider\Biased', 'unbiased'));
-
- // assert that all numbers are near the expected unbiased value
- foreach ($this->results as $number => $amount) {
- // integral
- $assumed = (1 / self::MAX * $number) - (1 / self::MAX * ($number - 1));
- // calculate the fraction of the whole area
- $assumed /= 1;
- $this->assertGreaterThan(self::NUMBERS * $assumed * .95, $amount, "Value was more than 5 percent under the expected value");
- $this->assertLessThan(self::NUMBERS * $assumed * 1.05, $amount, "Value was more than 5 percent over the expected value");
- }
- }
-
- public function testLinearHigh()
- {
- $this->performFake(array('\Faker\Provider\Biased', 'linearHigh'));
-
- foreach ($this->results as $number => $amount) {
- // integral
- $assumed = 0.5 * pow(1 / self::MAX * $number, 2) - 0.5 * pow(1 / self::MAX * ($number - 1), 2);
- // calculate the fraction of the whole area
- $assumed /= pow(1, 2) * .5;
- $this->assertGreaterThan(self::NUMBERS * $assumed * .9, $amount, "Value was more than 10 percent under the expected value");
- $this->assertLessThan(self::NUMBERS * $assumed * 1.1, $amount, "Value was more than 10 percent over the expected value");
- }
- }
-
- public function testLinearLow()
- {
- $this->performFake(array('\Faker\Provider\Biased', 'linearLow'));
-
- foreach ($this->results as $number => $amount) {
- // integral
- $assumed = -0.5 * pow(1 / self::MAX * $number, 2) - -0.5 * pow(1 / self::MAX * ($number - 1), 2);
- // shift the graph up
- $assumed += 1 / self::MAX;
- // calculate the fraction of the whole area
- $assumed /= pow(1, 2) * .5;
- $this->assertGreaterThan(self::NUMBERS * $assumed * .9, $amount, "Value was more than 10 percent under the expected value");
- $this->assertLessThan(self::NUMBERS * $assumed * 1.1, $amount, "Value was more than 10 percent over the expected value");
- }
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/ColorTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/ColorTest.php
deleted file mode 100644
index cdb4ab1a..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/ColorTest.php
+++ /dev/null
@@ -1,46 +0,0 @@
-assertRegExp('/^#[a-f0-9]{6}$/i', Color::hexColor());
- }
-
- public function testSafeHexColor()
- {
- $this->assertRegExp('/^#[a-f0-9]{6}$/i', Color::safeHexColor());
- }
-
- public function testRgbColorAsArray()
- {
- $this->assertEquals(3, count(Color::rgbColorAsArray()));
- }
-
- public function testRgbColor()
- {
- $regexp = '([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])';
- $this->assertRegExp('/^' . $regexp . ',' . $regexp . ',' . $regexp . '$/i', Color::rgbColor());
- }
-
- public function testRgbCssColor()
- {
- $regexp = '([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])';
- $this->assertRegExp('/^rgb\(' . $regexp . ',' . $regexp . ',' . $regexp . '\)$/i', Color::rgbCssColor());
- }
-
- public function testSafeColorName()
- {
- $this->assertRegExp('/^[\w]+$/', Color::safeColorName());
- }
-
- public function testColorName()
- {
- $this->assertRegExp('/^[\w]+$/', Color::colorName());
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/DateTimeTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/DateTimeTest.php
deleted file mode 100644
index 60310bde..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/DateTimeTest.php
+++ /dev/null
@@ -1,122 +0,0 @@
-assertInternalType('int', $timestamp);
- $this->assertTrue($timestamp >= 0);
- $this->assertTrue($timestamp <= time());
- }
-
- public function testDateTime()
- {
- $date = DateTimeProvider::dateTime();
- $this->assertInstanceOf('\DateTime', $date);
- $this->assertGreaterThanOrEqual(new \DateTime('@0'), $date);
- $this->assertLessThanOrEqual(new \DateTime(), $date);
- }
-
- public function testDateTimeAD()
- {
- $date = DateTimeProvider::dateTimeAD();
- $this->assertInstanceOf('\DateTime', $date);
- $this->assertGreaterThanOrEqual(new \DateTime('0000-01-01 00:00:00'), $date);
- $this->assertLessThanOrEqual(new \DateTime(), $date);
- }
-
- public function testIso8601()
- {
- $date = DateTimeProvider::iso8601();
- $this->assertRegExp('/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-Z](\d{4})?$/', $date);
- $this->assertGreaterThanOrEqual(new \DateTime('@0'), new \DateTime($date));
- $this->assertLessThanOrEqual(new \DateTime(), new \DateTime($date));
- }
-
- public function testDate()
- {
- $date = DateTimeProvider::date();
- $this->assertRegExp('/^\d{4}-\d{2}-\d{2}$/', $date);
- $this->assertGreaterThanOrEqual(new \DateTime('@0'), new \DateTime($date));
- $this->assertLessThanOrEqual(new \DateTime(), new \DateTime($date));
- }
-
- public function testTime()
- {
- $date = DateTimeProvider::time();
- $this->assertRegExp('/^\d{2}:\d{2}:\d{2}$/', $date);
- }
-
- /**
- *
- * @dataProvider providerDateTimeBetween
- */
- public function testDateTimeBetween($start, $end)
- {
- $date = DateTimeProvider::dateTimeBetween($start, $end);
- $this->assertInstanceOf('\DateTime', $date);
- $this->assertGreaterThanOrEqual(new \DateTime($start), $date);
- $this->assertLessThanOrEqual(new \DateTime($end), $date);
- }
-
- public function providerDateTimeBetween()
- {
- return array(
- array('-1 year', false),
- array('-1 year', null),
- array('-1 day', '-1 hour'),
- array('-1 day', 'now'),
- );
- }
-
- public function testFixedSeedWithMaximumTimestamp()
- {
- $max = '2018-03-01 12:00:00';
-
- mt_srand(1);
- $unixTime = DateTimeProvider::unixTime($max);
- $datetimeAD = DateTimeProvider::dateTimeAD($max);
- $dateTime1 = DateTimeProvider::dateTime($max);
- $dateTimeBetween = DateTimeProvider::dateTimeBetween('2014-03-01 06:00:00', $max);
- $date = DateTimeProvider::date('Y-m-d', $max);
- $time = DateTimeProvider::time('H:i:s', $max);
- $iso8601 = DateTimeProvider::iso8601($max);
- $dateTimeThisCentury = DateTimeProvider::dateTimeThisCentury($max);
- $dateTimeThisDecade = DateTimeProvider::dateTimeThisDecade($max);
- $dateTimeThisMonth = DateTimeProvider::dateTimeThisMonth($max);
- $amPm = DateTimeProvider::amPm($max);
- $dayOfMonth = DateTimeProvider::dayOfMonth($max);
- $dayOfWeek = DateTimeProvider::dayOfWeek($max);
- $month = DateTimeProvider::month($max);
- $monthName = DateTimeProvider::monthName($max);
- $year = DateTimeProvider::year($max);
- $dateTimeThisYear = DateTimeProvider::dateTimeThisYear($max);
- mt_srand();
-
- //regenerate Random Date with same seed and same maximum end timestamp
- mt_srand(1);
- $this->assertEquals($unixTime, DateTimeProvider::unixTime($max));
- $this->assertEquals($datetimeAD, DateTimeProvider::dateTimeAD($max));
- $this->assertEquals($dateTime1, DateTimeProvider::dateTime($max));
- $this->assertEquals($dateTimeBetween, DateTimeProvider::dateTimeBetween('2014-03-01 06:00:00', $max));
- $this->assertEquals($date, DateTimeProvider::date('Y-m-d', $max));
- $this->assertEquals($time, DateTimeProvider::time('H:i:s', $max));
- $this->assertEquals($iso8601, DateTimeProvider::iso8601($max));
- $this->assertEquals($dateTimeThisCentury, DateTimeProvider::dateTimeThisCentury($max));
- $this->assertEquals($dateTimeThisDecade, DateTimeProvider::dateTimeThisDecade($max));
- $this->assertEquals($dateTimeThisMonth, DateTimeProvider::dateTimeThisMonth($max));
- $this->assertEquals($amPm, DateTimeProvider::amPm($max));
- $this->assertEquals($dayOfMonth, DateTimeProvider::dayOfMonth($max));
- $this->assertEquals($dayOfWeek, DateTimeProvider::dayOfWeek($max));
- $this->assertEquals($month, DateTimeProvider::month($max));
- $this->assertEquals($monthName, DateTimeProvider::monthName($max));
- $this->assertEquals($year, DateTimeProvider::year($max));
- $this->assertEquals($dateTimeThisYear, DateTimeProvider::dateTimeThisYear($max));
- mt_srand();
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/ImageTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/ImageTest.php
deleted file mode 100644
index 0535d4da..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/ImageTest.php
+++ /dev/null
@@ -1,62 +0,0 @@
-assertRegExp('#^http://lorempixel.com/640/480/#', Image::imageUrl());
- }
-
- public function testImageUrlAcceptsCustomWidthAndHeight()
- {
- $this->assertRegExp('#^http://lorempixel.com/800/400/#', Image::imageUrl(800, 400));
- }
-
- public function testImageUrlAcceptsCustomCategory()
- {
- $this->assertRegExp('#^http://lorempixel.com/800/400/nature/#', Image::imageUrl(800, 400, 'nature'));
- }
-
- public function testImageUrlAcceptsCustomText()
- {
- $this->assertRegExp('#^http://lorempixel.com/800/400/nature/Faker#', Image::imageUrl(800, 400, 'nature', false, 'Faker'));
- }
-
- public function testImageUrlAddsARandomGetParameterByDefault()
- {
- $url = Image::imageUrl(800, 400);
- $splitUrl = preg_split('/\?/', $url);
-
- $this->assertEquals(count($splitUrl), 2);
- $this->assertRegexp('#\d{5}#', $splitUrl[1]);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testUrlWithDimensionsAndBadCategory()
- {
- Image::imageUrl(800, 400, 'bullhonky');
- }
-
- public function testDownloadWithDefaults()
- {
- $file = Image::image(sys_get_temp_dir());
- $this->assertFileExists($file);
- if (function_exists('getimagesize')) {
- list($width, $height, $type, $attr) = getimagesize($file);
- $this->assertEquals(640, $width);
- $this->assertEquals(480, $height);
- $this->assertEquals(constant('IMAGETYPE_JPEG'), $type);
- } else {
- $this->assertEquals('jpg', pathinfo($file, PATHINFO_EXTENSION));
- }
- if (file_exists($file)) {
- unlink($file);
- }
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/InternetTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/InternetTest.php
deleted file mode 100644
index fcd750b1..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/InternetTest.php
+++ /dev/null
@@ -1,120 +0,0 @@
-addProvider(new Lorem($faker));
- $faker->addProvider(new Person($faker));
- $faker->addProvider(new Internet($faker));
- $faker->addProvider(new Company($faker));
- $this->faker = $faker;
- }
-
- public function localeDataProvider()
- {
- $providerPath = realpath(__DIR__ . '/../../../src/Faker/Provider');
- $localePaths = array_filter(glob($providerPath . '/*', GLOB_ONLYDIR));
- foreach ($localePaths as $path) {
- $parts = explode('/', $path);
- $locales[] = array($parts[count($parts) - 1]);
- }
-
- return $locales;
- }
-
- /**
- * @link http://stackoverflow.com/questions/12026842/how-to-validate-an-email-address-in-php
- *
- * @requires PHP 5.4
- * @dataProvider localeDataProvider
- */
- public function testEmailIsValid($locale)
- {
- $this->loadLocalProviders($locale);
- $pattern = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD';
- $emailAddress = $this->faker->email();
- $this->assertRegExp($pattern, $emailAddress);
- }
-
- /**
- * @requires PHP 5.4
- * @dataProvider localeDataProvider
- */
- public function testUsernameIsValid($locale)
- {
- $this->loadLocalProviders($locale);
- $pattern = '/^[A-Za-z0-9._]+$/';
- $username = $this->faker->username();
- $this->assertRegExp($pattern, $username);
- }
-
- public function loadLocalProviders($locale)
- {
- $providerPath = realpath(__DIR__ . '/../../../src/Faker/Provider');
- if (file_exists($providerPath.'/'.$locale.'/Internet.php')) {
- $internet = "\\Faker\\Provider\\$locale\\Internet";
- $this->faker->addProvider(new $internet($this->faker));
- }
- if (file_exists($providerPath.'/'.$locale.'/Person.php')) {
- $person = "\\Faker\\Provider\\$locale\\Person";
- $this->faker->addProvider(new $person($this->faker));
- }
- if (file_exists($providerPath.'/'.$locale.'/Company.php')) {
- $company = "\\Faker\\Provider\\$locale\\Company";
- $this->faker->addProvider(new $company($this->faker));
- }
- }
-
- public function testPasswordIsValid()
- {
- $this->assertRegexp('/^.{6}$/', $this->faker->password(6, 6));
- }
-
- public function testSlugIsValid()
- {
- $pattern = '/^[a-z0-9-]+$/';
- $slug = $this->faker->slug();
- $this->assertSame(preg_match($pattern, $slug), 1);
- }
-
- public function testUrlIsValid()
- {
- $url = $this->faker->url();
- $this->assertNotFalse(filter_var($url, FILTER_VALIDATE_URL));
- }
-
- public function testLocalIpv4()
- {
- $this->assertNotFalse(filter_var(Internet::localIpv4(), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4));
- }
-
- public function testIpv4()
- {
- $this->assertNotFalse(filter_var($this->faker->ipv4(), FILTER_VALIDATE_IP, FILTER_FLAG_IPV4));
- }
-
- public function testIpv6()
- {
- $this->assertNotFalse(filter_var($this->faker->ipv6(), FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));
- }
-
- public function testMacAddress()
- {
- $this->assertRegExp('/^([0-9A-F]{2}[:]){5}([0-9A-F]{2})$/i', Internet::macAddress());
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/LocalizationTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/LocalizationTest.php
deleted file mode 100644
index 347b1351..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/LocalizationTest.php
+++ /dev/null
@@ -1,26 +0,0 @@
-assertNotNull($faker->name(), 'Localized Name Provider ' . $matches[1] . ' does not throw errors');
- }
- }
-
- public function testLocalizedAddressProvidersDoNotThrowErrors()
- {
- foreach (glob(__DIR__ . '/../../../src/Faker/Provider/*/Address.php') as $localizedAddress) {
- preg_match('#/([a-zA-Z_]+)/Address\.php#', $localizedAddress, $matches);
- $faker = Factory::create($matches[1]);
- $this->assertNotNull($faker->address(), 'Localized Address Provider ' . $matches[1] . ' does not throw errors');
- }
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/LoremTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/LoremTest.php
deleted file mode 100644
index 62785d43..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/LoremTest.php
+++ /dev/null
@@ -1,108 +0,0 @@
-assertEquals('Word word word word.', TestableLorem::text(24));
- }
-
- public function testTextReturnsSentencesWhenAskedSizeLessThan100()
- {
- $this->assertEquals('This is a test sentence. This is a test sentence. This is a test sentence.', TestableLorem::text(99));
- }
-
- public function testTextReturnsParagraphsWhenAskedSizeGreaterOrEqualThanThan100()
- {
- $this->assertEquals('This is a test paragraph. It has three sentences. Exactly three.', TestableLorem::text(100));
- }
-
- public function testSentenceWithZeroNbWordsReturnsEmptyString()
- {
- $this->assertEquals('', Lorem::sentence(0));
- }
-
- public function testSentenceWithNegativeNbWordsReturnsEmptyString()
- {
- $this->assertEquals('', Lorem::sentence(-1));
- }
-
- public function testParagraphWithZeroNbSentencesReturnsEmptyString()
- {
- $this->assertEquals('', Lorem::paragraph(0));
- }
-
- public function testParagraphWithNegativeNbSentencesReturnsEmptyString()
- {
- $this->assertEquals('', Lorem::paragraph(-1));
- }
-
- public function testSentenceWithPositiveNbWordsReturnsAtLeastOneWord()
- {
- $sentence = Lorem::sentence(1);
-
- $this->assertGreaterThan(1, strlen($sentence));
- $this->assertGreaterThanOrEqual(1, count(explode(' ', $sentence)));
- }
-
- public function testParagraphWithPositiveNbSentencesReturnsAtLeastOneWord()
- {
- $paragraph = Lorem::paragraph(1);
-
- $this->assertGreaterThan(1, strlen($paragraph));
- $this->assertGreaterThanOrEqual(1, count(explode(' ', $paragraph)));
- }
-
- public function testWordssAsText()
- {
- $words = TestableLorem::words(2, true);
-
- $this->assertEquals('word word', $words);
- }
-
- public function testSentencesAsText()
- {
- $sentences = TestableLorem::sentences(2, true);
-
- $this->assertEquals('This is a test sentence. This is a test sentence.', $sentences);
- }
-
- public function testParagraphsAsText()
- {
- $paragraphs = TestableLorem::paragraphs(2, true);
-
- $expected = "This is a test paragraph. It has three sentences. Exactly three.\n\nThis is a test paragraph. It has three sentences. Exactly three.";
- $this->assertEquals($expected, $paragraphs);
- }
-}
-
-class TestableLorem extends Lorem
-{
-
- public static function word()
- {
- return 'word';
- }
-
- public static function sentence($nbWords = 5, $variableNbWords = true)
- {
- return 'This is a test sentence.';
- }
-
- public static function paragraph($nbSentences = 3, $variableNbSentences = true)
- {
- return 'This is a test paragraph. It has three sentences. Exactly three.';
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/MiscellaneousTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/MiscellaneousTest.php
deleted file mode 100644
index 6a4c5591..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/MiscellaneousTest.php
+++ /dev/null
@@ -1,54 +0,0 @@
-assertContains(Miscellaneous::boolean(), array(true, false));
- }
-
- public function testMd5()
- {
- $this->assertRegExp('/^[a-z0-9]{32}$/', Miscellaneous::md5());
- }
-
- public function testSha1()
- {
- $this->assertRegExp('/^[a-z0-9]{40}$/', Miscellaneous::sha1());
- }
-
- public function testSha256()
- {
- $this->assertRegExp('/^[a-z0-9]{64}$/', Miscellaneous::sha256());
- }
-
- public function testLocale()
- {
- $this->assertRegExp('/^[a-z]{2,3}_[A-Z]{2}$/', Miscellaneous::locale());
- }
-
- public function testCountryCode()
- {
- $this->assertRegExp('/^[A-Z]{2}$/', Miscellaneous::countryCode());
- }
-
- public function testCountryISOAlpha3()
- {
- $this->assertRegExp('/^[A-Z]{3}$/', Miscellaneous::countryISOAlpha3());
- }
-
- public function testLanguage()
- {
- $this->assertRegExp('/^[a-z]{2}$/', Miscellaneous::languageCode());
- }
-
- public function testCurrencyCode()
- {
- $this->assertRegExp('/^[A-Z]{3}$/', Miscellaneous::currencyCode());
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/PaymentTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/PaymentTest.php
deleted file mode 100644
index 0f20d91f..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/PaymentTest.php
+++ /dev/null
@@ -1,68 +0,0 @@
-addProvider(new BaseProvider($faker));
- $faker->addProvider(new DateTimeProvider($faker));
- $faker->addProvider(new PersonProvider($faker));
- $faker->addProvider(new PaymentProvider($faker));
- $this->faker = $faker;
- }
-
- public function testCreditCardTypeReturnsValidVendorName()
- {
- $this->assertTrue(in_array($this->faker->creditCardType, array('Visa', 'MasterCard', 'American Express', 'Discover Card')));
- }
-
- public function creditCardNumberProvider()
- {
- return array(
- array('Discover Card', '/^6011\d{12}$/'),
- array('Visa', '/^4\d{12,15}$/'),
- array('MasterCard', '/^5[1-5]\d{14}$/')
- );
- }
-
- /**
- * @dataProvider creditCardNumberProvider
- */
- public function testCreditCardNumberReturnsValidCreditCardNumber($type, $regexp)
- {
- $cardNumber = $this->faker->creditCardNumber($type);
- $this->assertRegExp($regexp, $cardNumber);
- $this->assertTrue(Luhn::isValid($cardNumber));
- }
-
- public function testCreditCardNumberCanFormatOutput()
- {
- $this->assertRegExp('/^6011-\d{4}-\d{4}-\d{4}$/', $this->faker->creditCardNumber('Discover Card', true));
- }
-
- public function testCreditCardExpirationDateReturnsValidDateByDefault()
- {
- $expirationDate = $this->faker->creditCardExpirationDate;
- $this->assertTrue(intval($expirationDate->format('U')) > strtotime('now'));
- $this->assertTrue(intval($expirationDate->format('U')) < strtotime('+36 months'));
- }
-
- public function testRandomCard()
- {
- $cardDetails = $this->faker->creditCardDetails;
- $this->assertEquals(count($cardDetails), 4);
- $this->assertEquals(array('type', 'number', 'name', 'expirationDate'), array_keys($cardDetails));
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/PersonTest.php
deleted file mode 100644
index a8d1c0f2..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/PersonTest.php
+++ /dev/null
@@ -1,86 +0,0 @@
-addProvider(new Person($faker));
- $this->assertContains($faker->firstName($gender), $expected);
- }
-
- public function firstNameProvider()
- {
- return array(
- array(null, array('John', 'Jane')),
- array('foobar', array('John', 'Jane')),
- array('male', array('John')),
- array('female', array('Jane')),
- );
- }
-
- public function testFirstNameMale()
- {
- $this->assertContains(Person::firstNameMale(), array('John'));
- }
-
- public function testFirstNameFemale()
- {
- $this->assertContains(Person::firstNameFemale(), array('Jane'));
- }
-
- /**
- * @dataProvider titleProvider
- */
- public function testTitle($gender, $expected)
- {
- $faker = new Generator();
- $faker->addProvider(new Person($faker));
- $this->assertContains($faker->title($gender), $expected);
- }
-
- public function titleProvider()
- {
- return array(
- array(null, array('Mr.', 'Mrs.', 'Ms.', 'Miss', 'Dr.', 'Prof.')),
- array('foobar', array('Mr.', 'Mrs.', 'Ms.', 'Miss', 'Dr.', 'Prof.')),
- array('male', array('Mr.', 'Dr.', 'Prof.')),
- array('female', array('Mrs.', 'Ms.', 'Miss', 'Dr.', 'Prof.')),
- );
- }
-
- public function testTitleMale()
- {
- $this->assertContains(Person::titleMale(), array('Mr.', 'Dr.', 'Prof.'));
- }
-
- public function testTitleFemale()
- {
- $this->assertContains(Person::titleFemale(), array('Mrs.', 'Ms.', 'Miss', 'Dr.', 'Prof.'));
- }
-
- public function testLastNameReturnsDoe()
- {
- $faker = new Generator();
- $faker->addProvider(new Person($faker));
- $this->assertEquals($faker->lastName(), 'Doe');
- }
-
- public function testNameReturnsFirstNameAndLastName()
- {
- $faker = new Generator();
- $faker->addProvider(new Person($faker));
- $this->assertContains($faker->name(), array('John Doe', 'Jane Doe'));
- $this->assertContains($faker->name('foobar'), array('John Doe', 'Jane Doe'));
- $this->assertContains($faker->name('male'), array('John Doe'));
- $this->assertContains($faker->name('female'), array('Jane Doe'));
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/ProviderOverrideTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/ProviderOverrideTest.php
deleted file mode 100644
index 68f75ae6..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/ProviderOverrideTest.php
+++ /dev/null
@@ -1,189 +0,0 @@
-
- */
-
-namespace Faker\Test\Provider;
-
-use Faker;
-
-/**
- * Class ProviderOverrideTest
- *
- * @package Faker\Test\Provider
- *
- * This class tests a large portion of all locale specific providers. It does not test the entire stack, because each
- * locale specific provider (can) has specific implementations. The goal of this test is to test the common denominator
- * and to try to catch possible invalid multi-byte sequences.
- */
-class ProviderOverrideTest extends \PHPUnit_Framework_TestCase
-{
- /**
- * Constants with regular expression patterns for testing the output.
- *
- * Regular expressions are sensitive for malformed strings (e.g.: strings with incorrect encodings) so by using
- * PCRE for the tests, even though they seem fairly pointless, we test for incorrect encodings also.
- */
- const TEST_STRING_REGEX = '/.+/u';
-
- /**
- * Slightly more specific for e-mail, the point isn't to properly validate e-mails.
- */
- const TEST_EMAIL_REGEX = '/^(.+)@(.+)$/ui';
-
- /**
- * @dataProvider localeDataProvider
- * @param string $locale
- */
- public function testAddress($locale = null)
- {
- $faker = Faker\Factory::create($locale);
-
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->city);
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->postcode);
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->address);
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->country);
- }
-
-
- /**
- * @dataProvider localeDataProvider
- * @param string $locale
- */
- public function testCompany($locale = null)
- {
- $faker = Faker\Factory::create($locale);
-
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->company);
- }
-
-
- /**
- * @dataProvider localeDataProvider
- * @param string $locale
- */
- public function testDateTime($locale = null)
- {
- $faker = Faker\Factory::create($locale);
-
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->century);
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->timezone);
- }
-
-
- /**
- * @dataProvider localeDataProvider
- * @param string $locale
- */
- public function testInternet($locale = null)
- {
- $faker = Faker\Factory::create($locale);
-
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->userName);
-
- $this->assertRegExp(static::TEST_EMAIL_REGEX, $faker->email);
- $this->assertRegExp(static::TEST_EMAIL_REGEX, $faker->safeEmail);
- $this->assertRegExp(static::TEST_EMAIL_REGEX, $faker->freeEmail);
- $this->assertRegExp(static::TEST_EMAIL_REGEX, $faker->companyEmail);
- }
-
-
- /**
- * @dataProvider localeDataProvider
- * @param string $locale
- */
- public function testPerson($locale = null)
- {
- $faker = Faker\Factory::create($locale);
-
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->name);
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->title);
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->firstName);
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->lastName);
- }
-
-
- /**
- * @dataProvider localeDataProvider
- * @param string $locale
- */
- public function testPhoneNumber($locale = null)
- {
- $faker = Faker\Factory::create($locale);
-
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->phoneNumber);
- }
-
-
- /**
- * @dataProvider localeDataProvider
- * @param string $locale
- */
- public function testUserAgent($locale = null)
- {
- $faker = Faker\Factory::create($locale);
-
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->userAgent);
- }
-
-
- /**
- * @dataProvider localeDataProvider
- *
- * @param null $locale
- * @param string $locale
- */
- public function testUuid($locale = null)
- {
- $faker = Faker\Factory::create($locale);
-
- $this->assertRegExp(static::TEST_STRING_REGEX, $faker->uuid);
- }
-
-
- /**
- * @return array
- */
- public function localeDataProvider()
- {
- $locales = $this->getAllLocales();
- $data = array();
-
- foreach ($locales as $locale) {
- $data[] = array(
- $locale
- );
- }
-
- return $data;
- }
-
-
- /**
- * Returns all locales as array values
- *
- * @return array
- */
- private function getAllLocales()
- {
- static $locales = array();
-
- if ( ! empty($locales)) {
- return $locales;
- }
-
- // Finding all PHP files in the xx_XX directories
- $providerDir = __DIR__ .'/../../../src/Faker/Provider';
- foreach (glob($providerDir .'/*_*/*.php') as $file) {
- $localisation = basename(dirname($file));
-
- if (isset($locales[ $localisation ])) {
- continue;
- }
-
- $locales[ $localisation ] = $localisation;
- }
-
- return $locales;
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/TextTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/TextTest.php
deleted file mode 100644
index 3baf49f3..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/TextTest.php
+++ /dev/null
@@ -1,54 +0,0 @@
-addProvider(new Text($generator));
- $generator->seed(0);
-
- $lengths = array(10, 20, 50, 70, 90, 120, 150, 200, 500);
-
- foreach ($lengths as $length) {
- $this->assertLessThan($length, $generator->realText($length));
- }
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testTextMaxIndex()
- {
- $generator = new Generator();
- $generator->addProvider(new Text($generator));
- $generator->seed(0);
- $generator->realText(200, 11);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testTextMinIndex()
- {
- $generator = new Generator();
- $generator->addProvider(new Text($generator));
- $generator->seed(0);
- $generator->realText(200, 0);
- }
-
- /**
- * @expectedException \InvalidArgumentException
- */
- public function testTextMinLength()
- {
- $generator = new Generator();
- $generator->addProvider(new Text($generator));
- $generator->seed(0);
- $generator->realText(9);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/UserAgentTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/UserAgentTest.php
deleted file mode 100644
index b45b9f86..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/UserAgentTest.php
+++ /dev/null
@@ -1,38 +0,0 @@
-assertNotNull(UserAgent::userAgent());
- }
-
- public function testFirefoxUserAgent()
- {
- $this->stringContains(' Firefox/', UserAgent::firefox());
- }
-
- public function testSafariUserAgent()
- {
- $this->stringContains('Safari/', UserAgent::safari());
- }
-
- public function testInternetExplorerUserAgent()
- {
- $this->assertStringStartsWith('Mozilla/5.0 (compatible; MSIE ', UserAgent::internetExplorer());
- }
-
- public function testOperaUserAgent()
- {
- $this->assertStringStartsWith('Opera/', UserAgent::opera());
- }
-
- public function testChromeUserAgent()
- {
- $this->stringContains('(KHTML, like Gecko) Chrome/', UserAgent::chrome());
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/UuidTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/UuidTest.php
deleted file mode 100644
index fceb8dfe..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/UuidTest.php
+++ /dev/null
@@ -1,26 +0,0 @@
-assertTrue($this->isUuid($uuid));
- }
-
- public function testUuidExpectedSeed()
- {
- mt_srand(123);
- $this->assertEquals("8e2e0c84-50dd-367c-9e66-f3ab455c78d6", BaseProvider::uuid());
- $this->assertEquals("073eb60a-902c-30ab-93d0-a94db371f6c8", BaseProvider::uuid());
- }
-
- protected function isUuid($uuid)
- {
- return is_string($uuid) && (bool) preg_match('/^[a-f0-9]{8,8}-(?:[a-f0-9]{4,4}-){3,3}[a-f0-9]{12,12}$/i', $uuid);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/at_AT/PaymentTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/at_AT/PaymentTest.php
deleted file mode 100644
index afc8c27b..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/at_AT/PaymentTest.php
+++ /dev/null
@@ -1,30 +0,0 @@
-addProvider(new Payment($faker));
- $this->faker = $faker;
- }
-
- public function testVatIsValid()
- {
- $vat = $this->faker->vat();
- $unspacedVat = $this->faker->vat(false);
- $this->assertRegExp('/^(AT U\d{8})$/', $vat);
- $this->assertRegExp('/^(ATU\d{8})$/', $unspacedVat);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/be_BE/PaymentTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/be_BE/PaymentTest.php
deleted file mode 100644
index d253b05c..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/be_BE/PaymentTest.php
+++ /dev/null
@@ -1,30 +0,0 @@
-addProvider(new Payment($faker));
- $this->faker = $faker;
- }
-
- public function testVatIsValid()
- {
- $vat = $this->faker->vat();
- $unspacedVat = $this->faker->vat(false);
- $this->assertRegExp('/^(BE 0\d{9})$/', $vat);
- $this->assertRegExp('/^(BE0\d{9})$/', $unspacedVat);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/bg_BG/PaymentTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/bg_BG/PaymentTest.php
deleted file mode 100644
index 31c6325c..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/bg_BG/PaymentTest.php
+++ /dev/null
@@ -1,30 +0,0 @@
-addProvider(new Payment($faker));
- $this->faker = $faker;
- }
-
- public function testVatIsValid()
- {
- $vat = $this->faker->vat();
- $unspacedVat = $this->faker->vat(false);
- $this->assertRegExp('/^(BG \d{9,10})$/', $vat);
- $this->assertRegExp('/^(BG\d{9,10})$/', $unspacedVat);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/de_AT/InternetTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/de_AT/InternetTest.php
deleted file mode 100644
index 91ce5ca5..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/de_AT/InternetTest.php
+++ /dev/null
@@ -1,32 +0,0 @@
-addProvider(new Person($faker));
- $faker->addProvider(new Internet($faker));
- $faker->addProvider(new Company($faker));
- $this->faker = $faker;
- }
-
- public function testEmailIsValid()
- {
- $email = $this->faker->email();
- $this->assertNotFalse(filter_var($email, FILTER_VALIDATE_EMAIL));
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/de_AT/PhoneNumberTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/de_AT/PhoneNumberTest.php
deleted file mode 100644
index 2d61ad5e..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/de_AT/PhoneNumberTest.php
+++ /dev/null
@@ -1,28 +0,0 @@
-addProvider(new PhoneNumber($faker));
- $this->faker = $faker;
- }
-
- public function testPhoneNumberFormat()
- {
- $number = $this->faker->phoneNumber;
- $this->assertRegExp('/^06\d{2} \d{7}|\+43 \d{4} \d{4}(-\d{2})?$/', $number);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/fr_FR/CompanyTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/fr_FR/CompanyTest.php
deleted file mode 100644
index 5486cf9d..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/fr_FR/CompanyTest.php
+++ /dev/null
@@ -1,74 +0,0 @@
-addProvider(new Company($faker));
- $this->faker = $faker;
- }
-
- public function testSiretReturnsAValidSiret()
- {
- $siret = $this->faker->siret(false);
- $this->assertRegExp("/^\d{14}$/", $siret);
- $this->assertTrue(Luhn::isValid($siret));
- }
-
- public function testSiretReturnsAWellFormattedSiret()
- {
- $siret = $this->faker->siret();
- $this->assertRegExp("/^\d{3}\s\d{3}\s\d{3}\s\d{5}$/", $siret);
- $siret = str_replace(' ', '', $siret);
- $this->assertTrue(Luhn::isValid($siret));
- }
-
- public function testSirenReturnsAValidSiren()
- {
- $siren = $this->faker->siren(false);
- $this->assertRegExp("/^\d{9}$/", $siren);
- $this->assertTrue(Luhn::isValid($siren));
- }
-
- public function testSirenReturnsAWellFormattedSiren()
- {
- $siren = $this->faker->siren();
- $this->assertRegExp("/^\d{3}\s\d{3}\s\d{3}$/", $siren);
- $siren = str_replace(' ', '', $siren);
- $this->assertTrue(Luhn::isValid($siren));
- }
-
- public function testCatchPhraseReturnsValidCatchPhrase()
- {
- $this->assertTrue(TestableCompany::isCatchPhraseValid($this->faker->catchPhrase()));
- }
-
- public function testIsCatchPhraseValidReturnsFalseWhenAWordsAppearsTwice()
- {
- $isCatchPhraseValid = TestableCompany::isCatchPhraseValid('La sécurité de rouler en toute sécurité');
- $this->assertFalse($isCatchPhraseValid);
- }
-
- public function testIsCatchPhraseValidReturnsTrueWhenNoWordAppearsTwice()
- {
- $isCatchPhraseValid = TestableCompany::isCatchPhraseValid('La sécurité de rouler en toute simplicité');
- $this->assertTrue($isCatchPhraseValid);
- }
-}
-
-class TestableCompany extends Company
-{
- public static function isCatchPhraseValid($catchPhrase)
- {
- return parent::isCatchPhraseValid($catchPhrase);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/id_ID/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/id_ID/PersonTest.php
deleted file mode 100644
index abd039f0..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/id_ID/PersonTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-addProvider(new Person($faker));
- $this->faker = $faker;
- }
-
- public function testIfFirstNameMaleCanReturnData()
- {
- $firstNameMale = $this->faker->firstNameMale();
- $this->assertNotEmpty($firstNameMale);
- }
-
- public function testIfLastNameMaleCanReturnData()
- {
- $lastNameMale = $this->faker->lastNameMale();
- $this->assertNotEmpty($lastNameMale);
- }
-
- public function testIfFirstNameFemaleCanReturnData()
- {
- $firstNameFemale = $this->faker->firstNameFemale();
- $this->assertNotEmpty($firstNameFemale);
- }
-
- public function testIfLastNameFemaleCanReturnData()
- {
- $lastNameFemale = $this->faker->lastNameFemale();
- $this->assertNotEmpty($lastNameFemale);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/ja_JP/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/ja_JP/PersonTest.php
deleted file mode 100755
index 97fc566c..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/ja_JP/PersonTest.php
+++ /dev/null
@@ -1,36 +0,0 @@
-addProvider(new Person($faker));
- $faker->seed(1);
-
- $this->assertEquals('アオタ ミノル', $faker->kanaName);
- }
-
- public function testFirstKanaNameReturnsHaruka()
- {
- $faker = new Generator();
- $faker->addProvider(new Person($faker));
- $faker->seed(1);
-
- $this->assertEquals('ハルカ', $faker->firstKanaName);
- }
-
- public function testLastKanaNameReturnsNakajima()
- {
- $faker = new Generator();
- $faker->addProvider(new Person($faker));
- $faker->seed(1);
-
- $this->assertEquals('ナカジマ', $faker->lastKanaName);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/pt_BR/CompanyTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/pt_BR/CompanyTest.php
deleted file mode 100644
index f59142bd..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/pt_BR/CompanyTest.php
+++ /dev/null
@@ -1,25 +0,0 @@
-addProvider(new Company($faker));
- $this->faker = $faker;
- }
-
- public function testCnpjFormatIsValid()
- {
- $cnpj = $this->faker->cnpj(false);
- $this->assertRegExp('/\d{8}\d{4}\d{2}/', $cnpj);
- $cnpj = $this->faker->cnpj(true);
- $this->assertRegExp('/\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}/', $cnpj);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/pt_BR/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/pt_BR/PersonTest.php
deleted file mode 100644
index 767c1887..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/pt_BR/PersonTest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-addProvider(new Person($faker));
- $this->faker = $faker;
- }
-
- public function testCpfFormatIsValid()
- {
- $cpf = $this->faker->cpf(false);
- $this->assertRegExp('/\d{9}\d{2}/', $cpf);
- $cpf = $this->faker->cpf(true);
- $this->assertRegExp('/\d{3}\.\d{3}\.\d{3}-\d{2}/', $cpf);
- }
-
- public function testRgFormatIsValid()
- {
- $rg = $this->faker->rg(false);
- $this->assertRegExp('/\d{8}\d/', $rg);
- $rg = $this->faker->rg(true);
- $this->assertRegExp('/\d{2}\.\d{3}\.\d{3}-[0-9X]/', $rg);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/AddressTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/AddressTest.php
deleted file mode 100644
index d2adc158..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/AddressTest.php
+++ /dev/null
@@ -1,30 +0,0 @@
-addProvider(new Address($faker));
- $this->faker = $faker;
- }
-
- public function testPostCodeIsValid()
- {
- $main = '[1-9]{1}[0-9]{2}[0,1,4,5,9]{1}';
- $pattern = "/^($main)|($main-[0-9]{3})+$/";
- $postcode = $this->faker->postcode();
- $this->assertSame(preg_match($pattern, $postcode), 1, $postcode);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/PersonTest.php
deleted file mode 100644
index 9bfb7a2f..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/PersonTest.php
+++ /dev/null
@@ -1,52 +0,0 @@
-addProvider(new Person($faker));
- $this->faker = $faker;
- }
-
- public function testTaxpayerIdentificationNumberIsValid()
- {
- $tin = $this->faker->taxpayerIdentificationNumber();
- $this->assertTrue($this->isValidTin($tin), $tin);
- }
-
- /**
- *
- * @link http://pt.wikipedia.org/wiki/N%C3%BAmero_de_identifica%C3%A7%C3%A3o_fiscal
- *
- * @param type $tin
- *
- * @return boolean
- */
- public static function isValidTin($tin)
- {
- $regex = '(([1,2,3,5,6,8]{1}[0-9]{8})|((45)|(70)|(71)|(72)|(77)|(79)|(90|(98|(99))))[0-9]{7})';
- if (is_null($tin) || !is_numeric($tin) || !strlen($tin) == 9 || preg_match("/$regex/", $tin) !== 1) {
- return false;
- }
- $n = str_split($tin);
- // cd - Control Digit
- $cd = ($n[0] * 9 + $n[1] * 8 + $n[2] * 7 + $n[3] * 6 + $n[4] * 5 + $n[5] * 4 + $n[6] * 3 + $n[7] * 2) % 11;
- if ($cd === 0 || $cd === 1) {
- $cd = 0;
- } else {
- $cd = 11 - $cd;
- }
- if ($cd === intval($n[8])) {
- return true;
- }
-
- return false;
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/PhoneNumberTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/PhoneNumberTest.php
deleted file mode 100644
index 04b2f63d..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/pt_PT/PhoneNumberTest.php
+++ /dev/null
@@ -1,25 +0,0 @@
-addProvider(new PhoneNumber($faker));
- $this->faker = $faker;
- }
-
- public function testPhoneNumberReturnsPhoneNumberWithOrWithoutPrefix()
- {
- $this->assertRegExp('/^(9[1,2,3,6][0-9]{7})|(2[0-9]{8})|(\+351 [2][0-9]{8})|(\+351 9[1,2,3,6][0-9]{7})/', $this->faker->phoneNumber());
- }
- public function testMobileNumberReturnsMobileNumberWithOrWithoutPrefix()
- {
- $this->assertRegExp('/^(9[1,2,3,6][0-9]{7})/', $this->faker->mobileNumber());
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/ro_RO/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/ro_RO/PersonTest.php
deleted file mode 100644
index 5816b63c..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/ro_RO/PersonTest.php
+++ /dev/null
@@ -1,95 +0,0 @@
-seed(1);
- $faker->addProvider(new DateTime($faker));
- $faker->addProvider(new Person($faker));
- $this->faker = $faker;
- }
-
- public function testCnpReturnsValidCnp()
- {
- $cnp = $this->faker->cnp;
- $this->assertTrue($this->isValidCnp($cnp));
- }
-
- public function testCnpReturnsMaleCnp()
- {
- $cnp = $this->faker->cnp('m');
- $this->assertRegExp('/^[1357]\d{12}$/', $cnp);
- }
-
- public function testCnpReturnsFemaleCnp()
- {
- $cnp = $this->faker->cnp('f');
- $this->assertRegExp('/^[2468]\d{12}$/', $cnp);
- }
-
- public function testCnpReturns1800sCnp()
- {
- $cnp = $this->faker->cnp(null, 1800);
- $this->assertRegExp('/^[34]\d{12}$/', $cnp);
- }
-
- public function testCnpReturns1900sCnp()
- {
- $cnp = $this->faker->cnp(null, 1900);
- $this->assertRegExp('/^[12]\d{12}$/', $cnp);
- }
-
- public function testCnpReturns2000sCnp()
- {
- $cnp = $this->faker->cnp(null, 2000);
- $this->assertRegExp('/^[56]\d{12}$/', $cnp);
- }
-
- public function testCnpReturnsBrasovCnp()
- {
- $cnp = $this->faker->cnp(null, null, 'BV');
- $this->assertRegExp('/^\d{7}08\d{4}$/', $cnp);
- }
-
- public function testCnpReturns2000sClujFemaleCnp()
- {
- $cnp = $this->faker->cnp('f', 2000, 'CJ');
- $this->assertRegExp('/^6\d{6}12\d{4}$/', $cnp);
- }
-
- protected function isValidCnp($cnp)
- {
- if (
- is_string($cnp)
- && (bool) preg_match(static::TEST_CNP_REGEX, $cnp)
- && checkdate(substr($cnp, 3, 2), substr($cnp, 5, 2), substr($cnp, 1, 2))
- ){
- $checkNumber = 279146358279;
-
- $checksum = 0;
- foreach (range(0, 11) as $digit) {
- $checksum += substr($cnp, $digit, 1) * substr($checkNumber, $digit, 1);
- }
- $checksum = $checksum % 11;
-
- if (
- ($checksum < 10 && $checksum == substr($cnp, -1))
- || ($checksum == 10 && substr($cnp, -1) == 1)
- ){
- return true;
- }
- }
-
- return false;
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/ro_RO/PhoneNumberTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/ro_RO/PhoneNumberTest.php
deleted file mode 100644
index 97314d5f..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/ro_RO/PhoneNumberTest.php
+++ /dev/null
@@ -1,31 +0,0 @@
-addProvider(new PhoneNumber($faker));
- $this->faker = $faker;
- }
-
- public function testPhoneNumberReturnsNormalPhoneNumber()
- {
- $this->assertRegExp('/^0(?:[23][13-7]|7\d)\d{7}$/', $this->faker->phoneNumber());
- }
-
- public function testTollFreePhoneNumberReturnsTollFreePhoneNumber()
- {
- $this->assertRegExp('/^08(?:0[1267]|70)\d{6}$/', $this->faker->tollFreePhoneNumber());
- }
-
- public function testPremiumRatePhoneNumberReturnsPremiumRatePhoneNumber()
- {
- $this->assertRegExp('/^090[036]\d{6}$/', $this->faker->premiumRatePhoneNumber());
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/sv_SE/PersonTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/sv_SE/PersonTest.php
deleted file mode 100644
index 623723a6..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/sv_SE/PersonTest.php
+++ /dev/null
@@ -1,60 +0,0 @@
-addProvider(new Person($faker));
- $this->faker = $faker;
- }
-
- public function provideSeedAndExpectedReturn()
- {
- return array(
- array(1, '720727', '720727-5798'),
- array(2, '710414', '710414-5664'),
- array(3, '591012', '591012-4519'),
- array(4, '180307', '180307-0356'),
- array(5, '820904', '820904-7748')
- );
- }
-
- /**
- * @dataProvider provideSeedAndExpectedReturn
- */
- public function testPersonalIdentityNumberUsesBirthDateIfProvided($seed, $birthdate, $expected)
- {
- $faker = $this->faker;
- $faker->seed($seed);
- $pin = $faker->personalIdentityNumber(\DateTime::createFromFormat('ymd', $birthdate));
- $this->assertEquals($expected, $pin);
- }
-
- public function testPersonalIdentityNumberGeneratesLuhnCompliantNumbers()
- {
- $pin = str_replace('-', '', $this->faker->personalIdentityNumber());
- $this->assertTrue(Luhn::isValid($pin));
- }
-
- public function testPersonalIdentityNumberGeneratesOddValuesForMales()
- {
- $pin = $this->faker->personalIdentityNumber(null, 'male');
- $this->assertEquals(1, $pin{9} % 2);
- }
-
- public function testPersonalIdentityNumberGeneratesEvenValuesForFemales()
- {
- $pin = $this->faker->personalIdentityNumber(null, 'female');
- $this->assertEquals(0, $pin{9} % 2);
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/uk_UA/AddressTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/uk_UA/AddressTest.php
deleted file mode 100644
index a3e38d73..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/uk_UA/AddressTest.php
+++ /dev/null
@@ -1,80 +0,0 @@
-addProvider(new Address($faker));
- $this->faker = $faker;
- }
-
- public function testPostCodeIsValid()
- {
- $main = '[0-9]{5}';
- $pattern = "/^($main)|($main-[0-9]{3})+$/";
- $postcode = $this->faker->postcode;
- $this->assertRegExp($pattern, $postcode, 'Post code ' . $postcode . ' is wrong!');
- }
-
- public function testEmptySuffixes()
- {
- $this->assertEmpty($this->faker->citySuffix, 'City suffix should be empty!');
- $this->assertEmpty($this->faker->streetSuffix, 'Street suffix should be empty!');
- }
-
- public function testStreetCyrOnly()
- {
- $pattern = "/[0-9А-ЩЯІЇЄЮа-щяіїєюьIVXCM][0-9А-ЩЯІЇЄЮа-щяіїєюь \'-.]*[А-Яа-я.]/u";
- $streetName = $this->faker->streetName;
- $this->assertSame(
- preg_match($pattern, $streetName),
- 1,
- 'Street name ' . $streetName . ' is wrong!'
- );
- }
-
- public function testCityNameCyrOnly()
- {
- $pattern = "/[А-ЩЯІЇЄЮа-щяіїєюь][0-9А-ЩЯІЇЄЮа-щяіїєюь \'-]*[А-Яа-я]/u";
- $city = $this->faker->city;
- $this->assertSame(
- preg_match($pattern, $city),
- 1,
- 'City name ' . $city . ' is wrong!'
- );
- }
-
- public function testRegionNameCyrOnly()
- {
- $pattern = "/[А-ЩЯІЇЄЮ][А-ЩЯІЇЄЮа-щяіїєюь]*а$/u";
- $regionName = $this->faker->region;
- $this->assertSame(
- preg_match($pattern, $regionName),
- 1,
- 'Region name ' . $regionName . ' is wrong!'
- );
- }
-
- public function testCountryCyrOnly()
- {
- $pattern = "/[А-ЩЯІЇЄЮа-щяіїєюьIVXCM][А-ЩЯІЇЄЮа-щяіїєюь \'-]*[А-Яа-я.]/u";
- $country = $this->faker->country;
- $this->assertSame(
- preg_match($pattern, $country),
- 1,
- 'Country name ' . $country . ' is wrong!'
- );
- }
-}
diff --git a/vendor/fzaninotto/faker/test/Faker/Provider/uk_UA/PhoneNumberTest.php b/vendor/fzaninotto/faker/test/Faker/Provider/uk_UA/PhoneNumberTest.php
deleted file mode 100644
index 13620c72..00000000
--- a/vendor/fzaninotto/faker/test/Faker/Provider/uk_UA/PhoneNumberTest.php
+++ /dev/null
@@ -1,35 +0,0 @@
-addProvider(new PhoneNumber($faker));
- $this->faker = $faker;
- }
-
- public function testPhoneNumberFormat()
- {
- $pattern = "/((\+38)(((\(\d{3}\))\d{7}|(\(\d{4}\))\d{6})|(\d{8})))|0\d{9}/";
- $phoneNumber = $this->faker->phoneNumber;
- $this->assertSame(
- preg_match($pattern, $phoneNumber),
- 1,
- 'Phone number format ' . $phoneNumber . ' is wrong!'
- );
-
- }
-
-}
diff --git a/vendor/fzaninotto/faker/test/documentor.php b/vendor/fzaninotto/faker/test/documentor.php
deleted file mode 100644
index 1051ea28..00000000
--- a/vendor/fzaninotto/faker/test/documentor.php
+++ /dev/null
@@ -1,16 +0,0 @@
-seed(1);
-$documentor = new Faker\Documentor($generator);
-?>
-getFormatters() as $provider => $formatters): ?>
-
-### ``
-
- $example): ?>
- //
-
-
-seed(5);
-
-echo '';
-?>
-
+ * + * @deprecated Since Symfony 5.4, use Doctrine\Common\Cache\Psr6\CacheAdapter instead + */ +class DoctrineAdapter extends AbstractAdapter +{ + private $provider; + + public function __construct(CacheProvider $provider, string $namespace = '', int $defaultLifetime = 0) + { + trigger_deprecation('symfony/cache', '5.4', '"%s" is deprecated, use "%s" instead.', __CLASS__, CacheAdapter::class); + + parent::__construct('', $defaultLifetime); + $this->provider = $provider; + $provider->setNamespace($namespace); + } + + /** + * {@inheritdoc} + */ + public function reset() + { + parent::reset(); + $this->provider->setNamespace($this->provider->getNamespace()); + } + + /** + * {@inheritdoc} + */ + protected function doFetch(array $ids) + { + $unserializeCallbackHandler = ini_set('unserialize_callback_func', parent::class.'::handleUnserializeCallback'); + try { + return $this->provider->fetchMultiple($ids); + } catch (\Error $e) { + $trace = $e->getTrace(); + + if (isset($trace[0]['function']) && !isset($trace[0]['class'])) { + switch ($trace[0]['function']) { + case 'unserialize': + case 'apcu_fetch': + case 'apc_fetch': + throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine()); + } + } + + throw $e; + } finally { + ini_set('unserialize_callback_func', $unserializeCallbackHandler); + } + } + + /** + * {@inheritdoc} + */ + protected function doHave(string $id) + { + return $this->provider->contains($id); + } + + /** + * {@inheritdoc} + */ + protected function doClear(string $namespace) + { + $namespace = $this->provider->getNamespace(); + + return isset($namespace[0]) + ? $this->provider->deleteAll() + : $this->provider->flushAll(); + } + + /** + * {@inheritdoc} + */ + protected function doDelete(array $ids) + { + $ok = true; + foreach ($ids as $id) { + $ok = $this->provider->delete($id) && $ok; + } + + return $ok; + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime) + { + return $this->provider->saveMultiple($values, $lifetime); + } +} diff --git a/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php b/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php index bc8cbb6b..73f0ea6b 100644 --- a/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php +++ b/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php @@ -27,16 +27,16 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface { protected $maxIdLength = 255; - private MarshallerInterface $marshaller; - private Connection $conn; - private string $platformName; - private string $serverVersion; - private string $table = 'cache_items'; - private string $idCol = 'item_id'; - private string $dataCol = 'item_data'; - private string $lifetimeCol = 'item_lifetime'; - private string $timeCol = 'item_time'; - private string $namespace; + private $marshaller; + private $conn; + private $platformName; + private $serverVersion; + private $table = 'cache_items'; + private $idCol = 'item_id'; + private $dataCol = 'item_data'; + private $lifetimeCol = 'item_lifetime'; + private $timeCol = 'item_time'; + private $namespace; /** * You can either pass an existing database Doctrine DBAL Connection or @@ -52,9 +52,11 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface * * db_lifetime_col: The column where to store the lifetime [default: item_lifetime] * * db_time_col: The column where to store the timestamp [default: item_time] * + * @param Connection|string $connOrDsn + * * @throws InvalidArgumentException When namespace contains invalid characters */ - public function __construct(Connection|string $connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null) + public function __construct($connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null) { if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) { throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0])); @@ -62,11 +64,13 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface if ($connOrDsn instanceof Connection) { $this->conn = $connOrDsn; - } else { + } elseif (\is_string($connOrDsn)) { if (!class_exists(DriverManager::class)) { throw new InvalidArgumentException(sprintf('Failed to parse the DSN "%s". Try running "composer require doctrine/dbal".', $connOrDsn)); } $this->conn = DriverManager::getConnection(['url' => $connOrDsn]); + } else { + throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be "%s" or string, "%s" given.', __METHOD__, Connection::class, get_debug_type($connOrDsn))); } $this->table = $options['db_table'] ?? $this->table; @@ -88,7 +92,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface * * @throws DBALException When the table already exists */ - public function createTable(): void + public function createTable() { $schema = new Schema(); $this->addTableToSchema($schema); @@ -132,7 +136,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface try { $this->conn->executeStatement($deleteSql, $params, $paramTypes); - } catch (TableNotFoundException) { + } catch (TableNotFoundException $e) { } return true; @@ -209,7 +213,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface try { $this->conn->executeStatement($sql); - } catch (TableNotFoundException) { + } catch (TableNotFoundException $e) { } return true; @@ -223,7 +227,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface $sql = "DELETE FROM $this->table WHERE $this->idCol IN (?)"; try { $this->conn->executeStatement($sql, [array_values($ids)], [Connection::PARAM_STR_ARRAY]); - } catch (TableNotFoundException) { + } catch (TableNotFoundException $e) { } return true; @@ -232,7 +236,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; @@ -274,7 +278,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface $lifetime = $lifetime ?: null; try { $stmt = $this->conn->prepare($sql); - } catch (TableNotFoundException) { + } catch (TableNotFoundException $e) { if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) { $this->createTable(); } @@ -312,7 +316,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface foreach ($values as $id => $data) { try { $rowCount = $stmt->executeStatement(); - } catch (TableNotFoundException) { + } catch (TableNotFoundException $e) { if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) { $this->createTable(); } @@ -321,7 +325,7 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface if (null === $platformName && 0 === $rowCount) { try { $insertStmt->executeStatement(); - } catch (DBALException) { + } catch (DBALException $e) { // A concurrent write won, let it be } } @@ -338,17 +342,28 @@ class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface $platform = $this->conn->getDatabasePlatform(); - return match (true) { - $platform instanceof \Doctrine\DBAL\Platforms\MySQLPlatform, - $platform instanceof \Doctrine\DBAL\Platforms\MySQL57Platform => $this->platformName = 'mysql', - $platform instanceof \Doctrine\DBAL\Platforms\SqlitePlatform => $this->platformName = 'sqlite', - $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQLPlatform, - $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQL94Platform => $this->platformName = 'pgsql', - $platform instanceof \Doctrine\DBAL\Platforms\OraclePlatform => $this->platformName = 'oci', - $platform instanceof \Doctrine\DBAL\Platforms\SQLServerPlatform, - $platform instanceof \Doctrine\DBAL\Platforms\SQLServer2012Platform => $this->platformName = 'sqlsrv', - default => $this->platformName = \get_class($platform), - }; + switch (true) { + case $platform instanceof \Doctrine\DBAL\Platforms\MySQLPlatform: + case $platform instanceof \Doctrine\DBAL\Platforms\MySQL57Platform: + return $this->platformName = 'mysql'; + + case $platform instanceof \Doctrine\DBAL\Platforms\SqlitePlatform: + return $this->platformName = 'sqlite'; + + case $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQLPlatform: + case $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQL94Platform: + return $this->platformName = 'pgsql'; + + case $platform instanceof \Doctrine\DBAL\Platforms\OraclePlatform: + return $this->platformName = 'oci'; + + case $platform instanceof \Doctrine\DBAL\Platforms\SQLServerPlatform: + case $platform instanceof \Doctrine\DBAL\Platforms\SQLServer2012Platform: + return $this->platformName = 'sqlsrv'; + + default: + return $this->platformName = \get_class($platform); + } } private function getServerVersion(): string diff --git a/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php b/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php index 2b5677d3..afde8437 100644 --- a/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php +++ b/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php @@ -44,7 +44,7 @@ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements Prune /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { $ok = $this->doClearCache($namespace); @@ -140,7 +140,7 @@ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements Prune continue; } - if (!@unlink($file)) { + if ((\PHP_VERSION_ID >= 70300 || '\\' !== \DIRECTORY_SEPARATOR) && !@unlink($file)) { fclose($h); continue; } @@ -159,12 +159,16 @@ class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements Prune try { yield $id => '' === $meta ? [] : $this->marshaller->unmarshall($meta); - } catch (\Exception) { + } catch (\Exception $e) { yield $id => []; } } fclose($h); + + if (\PHP_VERSION_ID < 70300 && '\\' === \DIRECTORY_SEPARATOR) { + @unlink($file); + } } } diff --git a/vendor/symfony/cache/Adapter/MemcachedAdapter.php b/vendor/symfony/cache/Adapter/MemcachedAdapter.php index 7730f7e0..5c2933fc 100644 --- a/vendor/symfony/cache/Adapter/MemcachedAdapter.php +++ b/vendor/symfony/cache/Adapter/MemcachedAdapter.php @@ -39,9 +39,9 @@ class MemcachedAdapter extends AbstractAdapter \Memcached::OPT_SERIALIZER => \Memcached::SERIALIZER_PHP, ]; - private MarshallerInterface $marshaller; - private \Memcached $client; - private \Memcached $lazyClient; + private $marshaller; + private $client; + private $lazyClient; /** * Using a MemcachedAdapter with a TagAwareAdapter for storing tags is discouraged. @@ -90,9 +90,11 @@ class MemcachedAdapter extends AbstractAdapter * * @param array[]|string|string[] $servers An array of servers, a DSN, or an array of DSNs * + * @return \Memcached + * * @throws \ErrorException When invalid options or servers are provided */ - public static function createConnection(array|string $servers, array $options = []): \Memcached + public static function createConnection($servers, array $options = []) { if (\is_string($servers)) { $servers = [$servers]; @@ -240,7 +242,7 @@ class MemcachedAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; @@ -261,7 +263,7 @@ class MemcachedAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doFetch(array $ids): iterable + protected function doFetch(array $ids) { try { $encodedIds = array_map([__CLASS__, 'encodeKey'], $ids); @@ -282,7 +284,7 @@ class MemcachedAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doHave(string $id): bool + protected function doHave(string $id) { return false !== $this->getClient()->get(self::encodeKey($id)) || $this->checkResultCode(\Memcached::RES_SUCCESS === $this->client->getResultCode()); } @@ -290,7 +292,7 @@ class MemcachedAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doDelete(array $ids): bool + protected function doDelete(array $ids) { $ok = true; $encodedIds = array_map([__CLASS__, 'encodeKey'], $ids); @@ -306,12 +308,12 @@ class MemcachedAdapter extends AbstractAdapter /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { return '' === $namespace && $this->getClient()->flush(); } - private function checkResultCode(mixed $result) + private function checkResultCode($result) { $code = $this->client->getResultCode(); @@ -324,7 +326,7 @@ class MemcachedAdapter extends AbstractAdapter private function getClient(): \Memcached { - if (isset($this->client)) { + if ($this->client) { return $this->client; } diff --git a/vendor/symfony/cache/Adapter/NullAdapter.php b/vendor/symfony/cache/Adapter/NullAdapter.php index 7827000b..15f7f8c4 100644 --- a/vendor/symfony/cache/Adapter/NullAdapter.php +++ b/vendor/symfony/cache/Adapter/NullAdapter.php @@ -40,7 +40,7 @@ class NullAdapter implements AdapterInterface, CacheInterface /** * {@inheritdoc} */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { $save = true; @@ -50,7 +50,7 @@ class NullAdapter implements AdapterInterface, CacheInterface /** * {@inheritdoc} */ - public function getItem(mixed $key): CacheItem + public function getItem($key) { return (self::$createCacheItem)($key); } @@ -58,63 +58,77 @@ class NullAdapter implements AdapterInterface, CacheInterface /** * {@inheritdoc} */ - public function getItems(array $keys = []): iterable + public function getItems(array $keys = []) { return $this->generateItems($keys); } /** * {@inheritdoc} + * + * @return bool */ - public function hasItem(mixed $key): bool + public function hasItem($key) { return false; } /** * {@inheritdoc} + * + * @return bool */ - public function clear(string $prefix = ''): bool + public function clear(string $prefix = '') { return true; } /** * {@inheritdoc} + * + * @return bool */ - public function deleteItem(mixed $key): bool + public function deleteItem($key) { return true; } /** * {@inheritdoc} + * + * @return bool */ - public function deleteItems(array $keys): bool + public function deleteItems(array $keys) { return true; } /** * {@inheritdoc} + * + * @return bool */ - public function save(CacheItemInterface $item): bool + public function save(CacheItemInterface $item) { return true; } /** * {@inheritdoc} + * + * @return bool */ - public function saveDeferred(CacheItemInterface $item): bool + public function saveDeferred(CacheItemInterface $item) { return true; } /** * {@inheritdoc} + * + * @return bool */ - public function commit(): bool + public function commit() { return true; } diff --git a/vendor/symfony/cache/Adapter/PdoAdapter.php b/vendor/symfony/cache/Adapter/PdoAdapter.php index 8bf72210..5d107244 100644 --- a/vendor/symfony/cache/Adapter/PdoAdapter.php +++ b/vendor/symfony/cache/Adapter/PdoAdapter.php @@ -12,6 +12,9 @@ namespace Symfony\Component\Cache\Adapter; use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Schema\Schema; +use Psr\Cache\CacheItemInterface; +use Psr\Log\LoggerInterface; use Symfony\Component\Cache\Exception\InvalidArgumentException; use Symfony\Component\Cache\Marshaller\DefaultMarshaller; use Symfony\Component\Cache\Marshaller\MarshallerInterface; @@ -21,20 +24,22 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface { protected $maxIdLength = 255; - private MarshallerInterface $marshaller; - private \PDO|Connection $conn; - private string $dsn; - private string $driver; - private string $serverVersion; - private mixed $table = 'cache_items'; - private mixed $idCol = 'item_id'; - private mixed $dataCol = 'item_data'; - private mixed $lifetimeCol = 'item_lifetime'; - private mixed $timeCol = 'item_time'; - private mixed $username = ''; - private mixed $password = ''; - private mixed $connectionOptions = []; - private string $namespace; + private $marshaller; + private $conn; + private $dsn; + private $driver; + private $serverVersion; + private $table = 'cache_items'; + private $idCol = 'item_id'; + private $dataCol = 'item_data'; + private $lifetimeCol = 'item_lifetime'; + private $timeCol = 'item_time'; + private $username = ''; + private $password = ''; + private $connectionOptions = []; + private $namespace; + + private $dbalAdapter; /** * You can either pass an existing database connection as PDO instance or @@ -51,14 +56,19 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface * * db_password: The password when lazy-connect [default: ''] * * db_connection_options: An array of driver-specific connection options [default: []] * + * @param \PDO|string $connOrDsn + * * @throws InvalidArgumentException When first argument is not PDO nor Connection nor string * @throws InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION * @throws InvalidArgumentException When namespace contains invalid characters */ - public function __construct(\PDO|string $connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null) + public function __construct($connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null) { - if (\is_string($connOrDsn) && str_contains($connOrDsn, '://')) { - throw new InvalidArgumentException(sprintf('Usage of Doctrine DBAL URL with "%s" is not supported. Use a PDO DSN or "%s" instead. Got "%s".', __CLASS__, DoctrineDbalAdapter::class, $connOrDsn)); + if ($connOrDsn instanceof Connection || (\is_string($connOrDsn) && str_contains($connOrDsn, '://'))) { + trigger_deprecation('symfony/cache', '5.4', 'Usage of a DBAL Connection with "%s" is deprecated and will be removed in symfony 6.0. Use "%s" instead.', __CLASS__, DoctrineDbalAdapter::class); + $this->dbalAdapter = new DoctrineDbalAdapter($connOrDsn, $namespace, $defaultLifetime, $options, $marshaller); + + return; } if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) { @@ -71,8 +81,10 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface } $this->conn = $connOrDsn; - } else { + } elseif (\is_string($connOrDsn)) { $this->dsn = $connOrDsn; + } else { + throw new InvalidArgumentException(sprintf('"%s" requires PDO or Doctrine\DBAL\Connection instance or DSN string as first argument, "%s" given.', __CLASS__, get_debug_type($connOrDsn))); } $this->table = $options['db_table'] ?? $this->table; @@ -89,6 +101,166 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface parent::__construct($namespace, $defaultLifetime); } + /** + * {@inheritDoc} + */ + public function getItem($key) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->getItem($key); + } + + return parent::getItem($key); + } + + /** + * {@inheritDoc} + */ + public function getItems(array $keys = []) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->getItems($keys); + } + + return parent::getItems($keys); + } + + /** + * {@inheritDoc} + */ + public function hasItem($key) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->hasItem($key); + } + + return parent::hasItem($key); + } + + /** + * {@inheritDoc} + */ + public function deleteItem($key) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->deleteItem($key); + } + + return parent::deleteItem($key); + } + + /** + * {@inheritDoc} + */ + public function deleteItems(array $keys) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->deleteItems($keys); + } + + return parent::deleteItems($keys); + } + + /** + * {@inheritDoc} + */ + public function clear(string $prefix = '') + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->clear($prefix); + } + + return parent::clear($prefix); + } + + /** + * {@inheritDoc} + */ + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->get($key, $callback, $beta, $metadata); + } + + return parent::get($key, $callback, $beta, $metadata); + } + + /** + * {@inheritDoc} + */ + public function delete(string $key): bool + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->delete($key); + } + + return parent::delete($key); + } + + /** + * {@inheritDoc} + */ + public function save(CacheItemInterface $item) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->save($item); + } + + return parent::save($item); + } + + /** + * {@inheritDoc} + */ + public function saveDeferred(CacheItemInterface $item) + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->saveDeferred($item); + } + + return parent::saveDeferred($item); + } + + /** + * {@inheritDoc} + */ + public function setLogger(LoggerInterface $logger): void + { + if (isset($this->dbalAdapter)) { + $this->dbalAdapter->setLogger($logger); + + return; + } + + parent::setLogger($logger); + } + + /** + * {@inheritDoc} + */ + public function commit() + { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->commit(); + } + + return parent::commit(); + } + + /** + * {@inheritDoc} + */ + public function reset() + { + if (isset($this->dbalAdapter)) { + $this->dbalAdapter->reset(); + + return; + } + + parent::reset(); + } + /** * Creates the table to store cache items which can be called once for setup. * @@ -100,31 +272,64 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface */ public function createTable() { + if (isset($this->dbalAdapter)) { + $this->dbalAdapter->createTable(); + + return; + } + // connect if we are not yet $conn = $this->getConnection(); - $sql = match ($this->driver) { - // We use varbinary for the ID column because it prevents unwanted conversions: - // - character set conversions between server and client - // - trailing space removal - // - case-insensitivity - // - language processing like é == e - 'mysql' => "CREATE TABLE $this->table ($this->idCol VARBINARY(255) NOT NULL PRIMARY KEY, $this->dataCol MEDIUMBLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8mb4_bin, ENGINE = InnoDB", - 'sqlite' => "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", - 'pgsql' => "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", - 'oci' => "CREATE TABLE $this->table ($this->idCol VARCHAR2(255) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", - 'sqlsrv' => "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)", - default => throw new \DomainException(sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $this->driver)), - }; + switch ($this->driver) { + case 'mysql': + // We use varbinary for the ID column because it prevents unwanted conversions: + // - character set conversions between server and client + // - trailing space removal + // - case-insensitivity + // - language processing like é == e + $sql = "CREATE TABLE $this->table ($this->idCol VARBINARY(255) NOT NULL PRIMARY KEY, $this->dataCol MEDIUMBLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8mb4_bin, ENGINE = InnoDB"; + break; + case 'sqlite': + $sql = "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)"; + break; + case 'pgsql': + $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)"; + break; + case 'oci': + $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR2(255) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)"; + break; + case 'sqlsrv': + $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)"; + break; + default: + throw new \DomainException(sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $this->driver)); + } $conn->exec($sql); } + /** + * Adds the Table to the Schema if the adapter uses this Connection. + * + * @deprecated since symfony/cache 5.4 use DoctrineDbalAdapter instead + */ + public function configureSchema(Schema $schema, Connection $forConnection): void + { + if (isset($this->dbalAdapter)) { + $this->dbalAdapter->configureSchema($schema, $forConnection); + } + } + /** * {@inheritdoc} */ - public function prune(): bool + public function prune() { + if (isset($this->dbalAdapter)) { + return $this->dbalAdapter->prune(); + } + $deleteSql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= :time"; if ('' !== $this->namespace) { @@ -135,7 +340,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface try { $delete = $connection->prepare($deleteSql); - } catch (\PDOException) { + } catch (\PDOException $e) { return true; } $delete->bindValue(':time', time(), \PDO::PARAM_INT); @@ -145,7 +350,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface } try { return $delete->execute(); - } catch (\PDOException) { + } catch (\PDOException $e) { return true; } } @@ -153,7 +358,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doFetch(array $ids): iterable + protected function doFetch(array $ids) { $connection = $this->getConnection(); @@ -199,7 +404,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doHave(string $id): bool + protected function doHave(string $id) { $connection = $this->getConnection(); @@ -216,7 +421,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { $conn = $this->getConnection(); @@ -232,7 +437,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface try { $conn->exec($sql); - } catch (\PDOException) { + } catch (\PDOException $e) { } return true; @@ -241,14 +446,14 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doDelete(array $ids): bool + protected function doDelete(array $ids) { $sql = str_pad('', (\count($ids) << 1) - 1, '?,'); $sql = "DELETE FROM $this->table WHERE $this->idCol IN ($sql)"; try { $stmt = $this->getConnection()->prepare($sql); $stmt->execute(array_values($ids)); - } catch (\PDOException) { + } catch (\PDOException $e) { } return true; @@ -257,7 +462,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { if (!$values = $this->marshaller->marshall($values, $failed)) { return $failed; @@ -301,7 +506,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface $lifetime = $lifetime ?: null; try { $stmt = $conn->prepare($sql); - } catch (\PDOException) { + } catch (\PDOException $e) { if (!$conn->inTransaction() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], true)) { $this->createTable(); } @@ -336,7 +541,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface foreach ($values as $id => $data) { try { $stmt->execute(); - } catch (\PDOException) { + } catch (\PDOException $e) { if (!$conn->inTransaction() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], true)) { $this->createTable(); } @@ -345,7 +550,7 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface if (null === $driver && !$stmt->rowCount()) { try { $insertStmt->execute(); - } catch (\PDOException) { + } catch (\PDOException $e) { // A concurrent write won, let it be } } @@ -356,17 +561,23 @@ class PdoAdapter extends AbstractAdapter implements PruneableInterface private function getConnection(): \PDO { - if (!isset($this->conn)) { + if (null === $this->conn) { $this->conn = new \PDO($this->dsn, $this->username, $this->password, $this->connectionOptions); $this->conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); } - $this->driver ??= $this->conn->getAttribute(\PDO::ATTR_DRIVER_NAME); + if (null === $this->driver) { + $this->driver = $this->conn->getAttribute(\PDO::ATTR_DRIVER_NAME); + } return $this->conn; } private function getServerVersion(): string { - return $this->serverVersion ??= $this->conn->getAttribute(\PDO::ATTR_SERVER_VERSION); + if (null === $this->serverVersion) { + $this->serverVersion = $this->conn->getAttribute(\PDO::ATTR_SERVER_VERSION); + } + + return $this->serverVersion; } } diff --git a/vendor/symfony/cache/Adapter/PhpArrayAdapter.php b/vendor/symfony/cache/Adapter/PhpArrayAdapter.php index 72a3692c..8c8fb916 100644 --- a/vendor/symfony/cache/Adapter/PhpArrayAdapter.php +++ b/vendor/symfony/cache/Adapter/PhpArrayAdapter.php @@ -34,12 +34,12 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte use ContractsTrait; use ProxyTrait; - private string $file; - private array $keys; - private array $values; + private $file; + private $keys; + private $values; - private static \Closure $createCacheItem; - private static array $valuesCache = []; + private static $createCacheItem; + private static $valuesCache = []; /** * @param string $file The PHP file were values are cached @@ -68,8 +68,10 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte * * @param string $file The PHP file were values are cached * @param CacheItemPoolInterface $fallbackPool A pool to fallback on when an item is not hit + * + * @return CacheItemPoolInterface */ - public static function create(string $file, CacheItemPoolInterface $fallbackPool): CacheItemPoolInterface + public static function create(string $file, CacheItemPoolInterface $fallbackPool) { if (!$fallbackPool instanceof AdapterInterface) { $fallbackPool = new ProxyAdapter($fallbackPool); @@ -81,9 +83,9 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } if (!isset($this->keys[$key])) { @@ -103,7 +105,7 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte if ($value instanceof \Closure) { return $value(); } - } catch (\Throwable) { + } catch (\Throwable $e) { unset($this->keys[$key]); goto get_from_pool; } @@ -114,12 +116,12 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} */ - public function getItem(mixed $key): CacheItem + public function getItem($key) { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } if (!isset($this->keys[$key])) { @@ -134,7 +136,7 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte } elseif ($value instanceof \Closure) { try { $value = $value(); - } catch (\Throwable) { + } catch (\Throwable $e) { $value = null; $isHit = false; } @@ -146,14 +148,14 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} */ - public function getItems(array $keys = []): iterable + public function getItems(array $keys = []) { foreach ($keys as $key) { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } } - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } @@ -162,13 +164,15 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} + * + * @return bool */ - public function hasItem(mixed $key): bool + public function hasItem($key) { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } @@ -177,13 +181,15 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} + * + * @return bool */ - public function deleteItem(mixed $key): bool + public function deleteItem($key) { if (!\is_string($key)) { throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); } - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } @@ -192,8 +198,10 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} + * + * @return bool */ - public function deleteItems(array $keys): bool + public function deleteItems(array $keys) { $deleted = true; $fallbackKeys = []; @@ -209,7 +217,7 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte $fallbackKeys[] = $key; } } - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } @@ -222,10 +230,12 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} + * + * @return bool */ - public function save(CacheItemInterface $item): bool + public function save(CacheItemInterface $item) { - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } @@ -234,10 +244,12 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} + * + * @return bool */ - public function saveDeferred(CacheItemInterface $item): bool + public function saveDeferred(CacheItemInterface $item) { - if (!isset($this->values)) { + if (null === $this->values) { $this->initialize(); } @@ -246,16 +258,20 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte /** * {@inheritdoc} + * + * @return bool */ - public function commit(): bool + public function commit() { return $this->pool->commit(); } /** * {@inheritdoc} + * + * @return bool */ - public function clear(string $prefix = ''): bool + public function clear(string $prefix = '') { $this->keys = $this->values = []; @@ -276,7 +292,7 @@ class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInte * * @return string[] A list of classes to preload on PHP 7.4+ */ - public function warmUp(array $values): array + public function warmUp(array $values) { if (file_exists($this->file)) { if (!is_file($this->file)) { @@ -401,7 +417,7 @@ EOF; } elseif ($value instanceof \Closure) { try { yield $key => $f($key, $value(), true); - } catch (\Throwable) { + } catch (\Throwable $e) { yield $key => $f($key, null, false); } } else { diff --git a/vendor/symfony/cache/Adapter/PhpFilesAdapter.php b/vendor/symfony/cache/Adapter/PhpFilesAdapter.php index 39468ce6..2fb08375 100644 --- a/vendor/symfony/cache/Adapter/PhpFilesAdapter.php +++ b/vendor/symfony/cache/Adapter/PhpFilesAdapter.php @@ -29,13 +29,13 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface doDelete as private doCommonDelete; } - private \Closure $includeHandler; - private bool $appendOnly; - private array $values = []; - private array $files = []; + private $includeHandler; + private $appendOnly; + private $values = []; + private $files = []; - private static int $startTime; - private static array $valuesCache = []; + private static $startTime; + private static $valuesCache = []; /** * @param $appendOnly Set to `true` to gain extra performance when the items stored in this pool never expire. @@ -61,7 +61,10 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface return \function_exists('opcache_invalidate') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) || filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOLEAN)); } - public function prune(): bool + /** + * @return bool + */ + public function prune() { $time = time(); $pruned = true; @@ -92,7 +95,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doFetch(array $ids): iterable + protected function doFetch(array $ids) { if ($this->appendOnly) { $now = 0; @@ -135,7 +138,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface foreach ($missingIds as $k => $id) { try { - $file = $this->files[$id] ??= $this->getFile($id); + $file = $this->files[$id] ?? $this->files[$id] = $this->getFile($id); if (isset(self::$valuesCache[$file])) { [$expiresAt, $this->values[$id]] = self::$valuesCache[$file]; @@ -168,7 +171,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doHave(string $id): bool + protected function doHave(string $id) { if ($this->appendOnly && isset($this->values[$id])) { return true; @@ -176,7 +179,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface set_error_handler($this->includeHandler); try { - $file = $this->files[$id] ??= $this->getFile($id); + $file = $this->files[$id] ?? $this->files[$id] = $this->getFile($id); $getExpiry = true; if (isset(self::$valuesCache[$file])) { @@ -190,7 +193,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface } elseif ($this->appendOnly) { $value = new LazyValue($file); } - } catch (\ErrorException) { + } catch (\ErrorException $e) { return false; } finally { restore_error_handler(); @@ -208,7 +211,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { $ok = true; $expiry = $lifetime ? time() + $lifetime : 'PHP_INT_MAX'; @@ -270,7 +273,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { $this->values = []; @@ -280,7 +283,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface /** * {@inheritdoc} */ - protected function doDelete(array $ids): bool + protected function doDelete(array $ids) { foreach ($ids as $id) { unset($this->values[$id]); @@ -318,7 +321,7 @@ class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface */ class LazyValue { - public string $file; + public $file; public function __construct(string $file) { diff --git a/vendor/symfony/cache/Adapter/ProxyAdapter.php b/vendor/symfony/cache/Adapter/ProxyAdapter.php index d2cd0b94..c715cade 100644 --- a/vendor/symfony/cache/Adapter/ProxyAdapter.php +++ b/vendor/symfony/cache/Adapter/ProxyAdapter.php @@ -28,25 +28,25 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa use ContractsTrait; use ProxyTrait; - private string $namespace = ''; - private int $namespaceLen; - private string $poolHash; - private int $defaultLifetime; + private $namespace = ''; + private $namespaceLen; + private $poolHash; + private $defaultLifetime; - private static \Closure $createCacheItem; - private static \Closure $setInnerItem; + private static $createCacheItem; + private static $setInnerItem; public function __construct(CacheItemPoolInterface $pool, string $namespace = '', int $defaultLifetime = 0) { $this->pool = $pool; - $this->poolHash = spl_object_hash($pool); + $this->poolHash = $poolHash = spl_object_hash($pool); if ('' !== $namespace) { \assert('' !== CacheItem::validateKey($namespace)); $this->namespace = $namespace; } $this->namespaceLen = \strlen($namespace); $this->defaultLifetime = $defaultLifetime; - self::$createCacheItem ??= \Closure::bind( + self::$createCacheItem ?? self::$createCacheItem = \Closure::bind( static function ($key, $innerItem, $poolHash) { $item = new CacheItem(); $item->key = $key; @@ -55,12 +55,20 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa return $item; } - $item->value = $innerItem->get(); + $item->value = $v = $innerItem->get(); $item->isHit = $innerItem->isHit(); $item->innerItem = $innerItem; $item->poolHash = $poolHash; - if (!$item->unpack() && $innerItem instanceof CacheItem) { + // Detect wrapped values that encode for their expiry and creation duration + // For compactness, these values are packed in the key of an array using + // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F + if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = (string) array_key_first($v)) && "\x9D" === $k[0] && "\0" === $k[5] && "\x5F" === $k[9]) { + $item->value = $v[$k]; + $v = unpack('Ve/Nc', substr($k, 1, -1)); + $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET; + $item->metadata[CacheItem::METADATA_CTIME] = $v['c']; + } elseif ($innerItem instanceof CacheItem) { $item->metadata = $innerItem->metadata; } $innerItem->set(null); @@ -70,10 +78,21 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa null, CacheItem::class ); - self::$setInnerItem ??= \Closure::bind( - static function (CacheItemInterface $innerItem, CacheItem $item, $expiry = null) { - $innerItem->set($item->pack()); - $innerItem->expiresAt(($expiry ?? $item->expiry) ? \DateTime::createFromFormat('U.u', sprintf('%.6F', $expiry ?? $item->expiry)) : null); + self::$setInnerItem ?? self::$setInnerItem = \Closure::bind( + /** + * @param array $item A CacheItem cast to (array); accessing protected properties requires adding the "\0*\0" PHP prefix + */ + static function (CacheItemInterface $innerItem, array $item) { + // Tags are stored separately, no need to account for them when considering this item's newly set metadata + if (isset(($metadata = $item["\0*\0newMetadata"])[CacheItem::METADATA_TAGS])) { + unset($metadata[CacheItem::METADATA_TAGS]); + } + if ($metadata) { + // For compactness, expiry and creation duration are packed in the key of an array, using magic numbers as separators + $item["\0*\0value"] = ["\x9D".pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME])."\x5F" => $item["\0*\0value"]]; + } + $innerItem->set($item["\0*\0value"]); + $innerItem->expiresAt(null !== $item["\0*\0expiry"] ? \DateTime::createFromFormat('U.u', sprintf('%.6F', $item["\0*\0expiry"])) : null); }, null, CacheItem::class @@ -83,7 +102,7 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} */ - public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { if (!$this->pool instanceof CacheInterface) { return $this->doGet($this, $key, $callback, $beta, $metadata); @@ -92,7 +111,7 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa return $this->pool->get($this->getId($key), function ($innerItem, bool &$save) use ($key, $callback) { $item = (self::$createCacheItem)($key, $innerItem, $this->poolHash); $item->set($value = $callback($item, $save)); - (self::$setInnerItem)($innerItem, $item); + (self::$setInnerItem)($innerItem, (array) $item); return $value; }, $beta, $metadata); @@ -101,7 +120,7 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} */ - public function getItem(mixed $key): CacheItem + public function getItem($key) { $item = $this->pool->getItem($this->getId($key)); @@ -111,7 +130,7 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} */ - public function getItems(array $keys = []): iterable + public function getItems(array $keys = []) { if ($this->namespaceLen) { foreach ($keys as $i => $key) { @@ -124,16 +143,20 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function hasItem(mixed $key): bool + public function hasItem($key) { return $this->pool->hasItem($this->getId($key)); } /** * {@inheritdoc} + * + * @return bool */ - public function clear(string $prefix = ''): bool + public function clear(string $prefix = '') { if ($this->pool instanceof AdapterInterface) { return $this->pool->clear($this->namespace.$prefix); @@ -144,16 +167,20 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function deleteItem(mixed $key): bool + public function deleteItem($key) { return $this->pool->deleteItem($this->getId($key)); } /** * {@inheritdoc} + * + * @return bool */ - public function deleteItems(array $keys): bool + public function deleteItems(array $keys) { if ($this->namespaceLen) { foreach ($keys as $i => $key) { @@ -166,50 +193,55 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa /** * {@inheritdoc} + * + * @return bool */ - public function save(CacheItemInterface $item): bool + public function save(CacheItemInterface $item) { return $this->doSave($item, __FUNCTION__); } /** * {@inheritdoc} + * + * @return bool */ - public function saveDeferred(CacheItemInterface $item): bool + public function saveDeferred(CacheItemInterface $item) { return $this->doSave($item, __FUNCTION__); } /** * {@inheritdoc} + * + * @return bool */ - public function commit(): bool + public function commit() { return $this->pool->commit(); } - private function doSave(CacheItemInterface $item, string $method): bool + private function doSave(CacheItemInterface $item, string $method) { if (!$item instanceof CacheItem) { return false; } - $castItem = (array) $item; - - if (null === $castItem["\0*\0expiry"] && 0 < $this->defaultLifetime) { - $castItem["\0*\0expiry"] = microtime(true) + $this->defaultLifetime; + $item = (array) $item; + if (null === $item["\0*\0expiry"] && 0 < $this->defaultLifetime) { + $item["\0*\0expiry"] = microtime(true) + $this->defaultLifetime; } - if ($castItem["\0*\0poolHash"] === $this->poolHash && $castItem["\0*\0innerItem"]) { - $innerItem = $castItem["\0*\0innerItem"]; + if ($item["\0*\0poolHash"] === $this->poolHash && $item["\0*\0innerItem"]) { + $innerItem = $item["\0*\0innerItem"]; } elseif ($this->pool instanceof AdapterInterface) { // this is an optimization specific for AdapterInterface implementations // so we can save a round-trip to the backend by just creating a new item - $innerItem = (self::$createCacheItem)($this->namespace.$castItem["\0*\0key"], null, $this->poolHash); + $innerItem = (self::$createCacheItem)($this->namespace.$item["\0*\0key"], null, $this->poolHash); } else { - $innerItem = $this->pool->getItem($this->namespace.$castItem["\0*\0key"]); + $innerItem = $this->pool->getItem($this->namespace.$item["\0*\0key"]); } - (self::$setInnerItem)($innerItem, $item, $castItem["\0*\0expiry"]); + (self::$setInnerItem)($innerItem, $item); return $this->pool->$method($innerItem); } @@ -227,7 +259,7 @@ class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterfa } } - private function getId(mixed $key): string + private function getId($key): string { \assert('' !== CacheItem::validateKey($key)); diff --git a/vendor/symfony/cache/Adapter/Psr16Adapter.php b/vendor/symfony/cache/Adapter/Psr16Adapter.php index 664c18bb..a56aa393 100644 --- a/vendor/symfony/cache/Adapter/Psr16Adapter.php +++ b/vendor/symfony/cache/Adapter/Psr16Adapter.php @@ -30,7 +30,7 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett */ protected const NS_SEPARATOR = '_'; - private object $miss; + private $miss; public function __construct(CacheInterface $pool, string $namespace = '', int $defaultLifetime = 0) { @@ -43,7 +43,7 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett /** * {@inheritdoc} */ - protected function doFetch(array $ids): iterable + protected function doFetch(array $ids) { foreach ($this->pool->getMultiple($ids, $this->miss) as $key => $value) { if ($this->miss !== $value) { @@ -55,7 +55,7 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett /** * {@inheritdoc} */ - protected function doHave(string $id): bool + protected function doHave(string $id) { return $this->pool->has($id); } @@ -63,7 +63,7 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett /** * {@inheritdoc} */ - protected function doClear(string $namespace): bool + protected function doClear(string $namespace) { return $this->pool->clear(); } @@ -71,7 +71,7 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett /** * {@inheritdoc} */ - protected function doDelete(array $ids): bool + protected function doDelete(array $ids) { return $this->pool->deleteMultiple($ids); } @@ -79,7 +79,7 @@ class Psr16Adapter extends AbstractAdapter implements PruneableInterface, Resett /** * {@inheritdoc} */ - protected function doSave(array $values, int $lifetime): array|bool + protected function doSave(array $values, int $lifetime) { return $this->pool->setMultiple($values, 0 === $lifetime ? null : $lifetime); } diff --git a/vendor/symfony/cache/Adapter/RedisAdapter.php b/vendor/symfony/cache/Adapter/RedisAdapter.php index 45bc3400..eb5950e5 100644 --- a/vendor/symfony/cache/Adapter/RedisAdapter.php +++ b/vendor/symfony/cache/Adapter/RedisAdapter.php @@ -20,7 +20,12 @@ class RedisAdapter extends AbstractAdapter { use RedisTrait; - public function __construct(\Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) + /** + * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis The redis client + * @param string $namespace The default namespace + * @param int $defaultLifetime The default lifetime + */ + public function __construct($redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) { $this->init($redis, $namespace, $defaultLifetime, $marshaller); } diff --git a/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php b/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php index ef2154d6..186b32e7 100644 --- a/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php +++ b/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php @@ -56,12 +56,17 @@ class RedisTagAwareAdapter extends AbstractTagAwareAdapter private const DEFAULT_CACHE_TTL = 8640000; /** - * detected eviction policy used on Redis server. + * @var string|null detected eviction policy used on Redis server */ - private string $redisEvictionPolicy; - private string $namespace; + private $redisEvictionPolicy; + private $namespace; - public function __construct(\Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) + /** + * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis The redis client + * @param string $namespace The default namespace + * @param int $defaultLifetime The default lifetime + */ + public function __construct($redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) { if ($redis instanceof \Predis\ClientInterface && $redis->getConnection() instanceof ClusterInterface && !$redis->getConnection() instanceof PredisCluster) { throw new InvalidArgumentException(sprintf('Unsupported Predis cluster connection: only "%s" is, "%s" given.', PredisCluster::class, get_debug_type($redis->getConnection()))); @@ -170,7 +175,7 @@ EOLUA; try { yield $id => !\is_string($result) || '' === $result ? [] : $this->marshaller->unmarshall($result); - } catch (\Exception) { + } catch (\Exception $e) { yield $id => []; } } @@ -292,7 +297,7 @@ EOLUA; private function getRedisEvictionPolicy(): string { - if (isset($this->redisEvictionPolicy)) { + if (null !== $this->redisEvictionPolicy) { return $this->redisEvictionPolicy; } diff --git a/vendor/symfony/cache/Adapter/TagAwareAdapter.php b/vendor/symfony/cache/Adapter/TagAwareAdapter.php index b12ebfef..ff22e5a8 100644 --- a/vendor/symfony/cache/Adapter/TagAwareAdapter.php +++ b/vendor/symfony/cache/Adapter/TagAwareAdapter.php @@ -19,73 +19,70 @@ use Symfony\Component\Cache\CacheItem; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\ResettableInterface; use Symfony\Component\Cache\Traits\ContractsTrait; +use Symfony\Component\Cache\Traits\ProxyTrait; use Symfony\Contracts\Cache\TagAwareCacheInterface; /** - * Implements simple and robust tag-based invalidation suitable for use with volatile caches. - * - * This adapter works by storing a version for each tags. When saving an item, it is stored together with its tags and - * their corresponding versions. When retrieving an item, those tag versions are compared to the current version of - * each tags. Invalidation is achieved by deleting tags, thereby ensuring that their versions change even when the - * storage is out of space. When versions of non-existing tags are requested for item commits, this adapter assigns a - * new random version to them. - * * @author Nicolas Grekas
- * @author Sergey Belyshkin
+ *
+ * @deprecated Use Doctrine\Common\Cache\Psr6\DoctrineProvider instead
+ */
+class DoctrineProvider extends CacheProvider implements PruneableInterface, ResettableInterface
+{
+ private $pool;
+
+ public function __construct(CacheItemPoolInterface $pool)
+ {
+ trigger_deprecation('symfony/cache', '5.4', '"%s" is deprecated, use "Doctrine\Common\Cache\Psr6\DoctrineProvider" instead.', __CLASS__);
+
+ $this->pool = $pool;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function prune()
+ {
+ return $this->pool instanceof PruneableInterface && $this->pool->prune();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reset()
+ {
+ if ($this->pool instanceof ResetInterface) {
+ $this->pool->reset();
+ }
+ $this->setNamespace($this->getNamespace());
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return mixed
+ */
+ protected function doFetch($id)
+ {
+ $item = $this->pool->getItem(rawurlencode($id));
+
+ return $item->isHit() ? $item->get() : false;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return bool
+ */
+ protected function doContains($id)
+ {
+ return $this->pool->hasItem(rawurlencode($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return bool
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ $item = $this->pool->getItem(rawurlencode($id));
+
+ if (0 < $lifeTime) {
+ $item->expiresAfter($lifeTime);
+ }
+
+ return $this->pool->save($item->set($data));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return bool
+ */
+ protected function doDelete($id)
+ {
+ return $this->pool->deleteItem(rawurlencode($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return bool
+ */
+ protected function doFlush()
+ {
+ return $this->pool->clear();
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @return array|null
+ */
+ protected function doGetStats()
+ {
+ return null;
+ }
+}
diff --git a/vendor/symfony/cache/LockRegistry.php b/vendor/symfony/cache/LockRegistry.php
index c263a1c5..65f20bb7 100644
--- a/vendor/symfony/cache/LockRegistry.php
+++ b/vendor/symfony/cache/LockRegistry.php
@@ -43,6 +43,7 @@ final class LockRegistry
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ChainAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'CouchbaseBucketAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'CouchbaseCollectionAdapter.php',
+ __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'DoctrineAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'DoctrineDbalAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'FilesystemAdapter.php',
__DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'FilesystemTagAwareAdapter.php',
@@ -96,8 +97,8 @@ final class LockRegistry
return $callback($item, $save);
}
- self::$signalingException ??= unserialize("O:9:\"Exception\":1:{s:16:\"\0Exception\0trace\";a:0:{}}");
- self::$signalingCallback ??= function () { throw self::$signalingException; };
+ self::$signalingException ?? self::$signalingException = unserialize("O:9:\"Exception\":1:{s:16:\"\0Exception\0trace\";a:0:{}}");
+ self::$signalingCallback ?? self::$signalingCallback = function () { throw self::$signalingException; };
while (true) {
try {
@@ -106,7 +107,7 @@ final class LockRegistry
$locked = flock($lock, \LOCK_EX | \LOCK_NB, $wouldBlock);
if ($locked || !$wouldBlock) {
- $logger?->info(sprintf('Lock %s, now computing item "{key}"', $locked ? 'acquired' : 'not supported'), ['key' => $item->getKey()]);
+ $logger && $logger->info(sprintf('Lock %s, now computing item "{key}"', $locked ? 'acquired' : 'not supported'), ['key' => $item->getKey()]);
self::$lockedFiles[$key] = true;
$value = $callback($item, $save);
@@ -123,7 +124,7 @@ final class LockRegistry
return $value;
}
// if we failed the race, retry locking in blocking mode to wait for the winner
- $logger?->info('Item "{key}" is locked, waiting for it to be released', ['key' => $item->getKey()]);
+ $logger && $logger->info('Item "{key}" is locked, waiting for it to be released', ['key' => $item->getKey()]);
flock($lock, \LOCK_SH);
} finally {
flock($lock, \LOCK_UN);
@@ -132,7 +133,7 @@ final class LockRegistry
try {
$value = $pool->get($item->getKey(), self::$signalingCallback, 0);
- $logger?->info('Item "{key}" retrieved after lock was released', ['key' => $item->getKey()]);
+ $logger && $logger->info('Item "{key}" retrieved after lock was released', ['key' => $item->getKey()]);
$save = false;
return $value;
@@ -140,7 +141,7 @@ final class LockRegistry
if (self::$signalingException !== $e) {
throw $e;
}
- $logger?->info('Item "{key}" not found while lock was released, now retrying', ['key' => $item->getKey()]);
+ $logger && $logger->info('Item "{key}" not found while lock was released, now retrying', ['key' => $item->getKey()]);
}
}
diff --git a/vendor/symfony/cache/Marshaller/DefaultMarshaller.php b/vendor/symfony/cache/Marshaller/DefaultMarshaller.php
index 5c34fb2e..3202dd69 100644
--- a/vendor/symfony/cache/Marshaller/DefaultMarshaller.php
+++ b/vendor/symfony/cache/Marshaller/DefaultMarshaller.php
@@ -20,15 +20,15 @@ use Symfony\Component\Cache\Exception\CacheException;
*/
class DefaultMarshaller implements MarshallerInterface
{
- private bool $useIgbinarySerialize = true;
- private bool $throwOnSerializationFailure = false;
+ private $useIgbinarySerialize = true;
+ private $throwOnSerializationFailure;
public function __construct(bool $useIgbinarySerialize = null, bool $throwOnSerializationFailure = false)
{
if (null === $useIgbinarySerialize) {
- $useIgbinarySerialize = \extension_loaded('igbinary') && version_compare('3.1.6', phpversion('igbinary'), '<=');
- } elseif ($useIgbinarySerialize && (!\extension_loaded('igbinary') || version_compare('3.1.6', phpversion('igbinary'), '>'))) {
- throw new CacheException(\extension_loaded('igbinary') ? 'Please upgrade the "igbinary" PHP extension to v3.1.6 or higher.' : 'The "igbinary" PHP extension is not loaded.');
+ $useIgbinarySerialize = \extension_loaded('igbinary') && (\PHP_VERSION_ID < 70400 || version_compare('3.1.6', phpversion('igbinary'), '<='));
+ } elseif ($useIgbinarySerialize && (!\extension_loaded('igbinary') || (\PHP_VERSION_ID >= 70400 && version_compare('3.1.6', phpversion('igbinary'), '>')))) {
+ throw new CacheException(\extension_loaded('igbinary') && \PHP_VERSION_ID >= 70400 ? 'Please upgrade the "igbinary" PHP extension to v3.1.6 or higher.' : 'The "igbinary" PHP extension is not loaded.');
}
$this->useIgbinarySerialize = $useIgbinarySerialize;
$this->throwOnSerializationFailure = $throwOnSerializationFailure;
@@ -62,7 +62,7 @@ class DefaultMarshaller implements MarshallerInterface
/**
* {@inheritdoc}
*/
- public function unmarshall(string $value): mixed
+ public function unmarshall(string $value)
{
if ('b:0;' === $value) {
return false;
@@ -71,7 +71,7 @@ class DefaultMarshaller implements MarshallerInterface
return null;
}
static $igbinaryNull;
- if ($value === $igbinaryNull ??= \extension_loaded('igbinary') ? igbinary_serialize(null) : false) {
+ if ($value === ($igbinaryNull ?? $igbinaryNull = \extension_loaded('igbinary') ? igbinary_serialize(null) : false)) {
return null;
}
$unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback');
diff --git a/vendor/symfony/cache/Marshaller/DeflateMarshaller.php b/vendor/symfony/cache/Marshaller/DeflateMarshaller.php
index 95e3d320..55448061 100644
--- a/vendor/symfony/cache/Marshaller/DeflateMarshaller.php
+++ b/vendor/symfony/cache/Marshaller/DeflateMarshaller.php
@@ -20,7 +20,7 @@ use Symfony\Component\Cache\Exception\CacheException;
*/
class DeflateMarshaller implements MarshallerInterface
{
- private MarshallerInterface $marshaller;
+ private $marshaller;
public function __construct(MarshallerInterface $marshaller)
{
@@ -42,7 +42,7 @@ class DeflateMarshaller implements MarshallerInterface
/**
* {@inheritdoc}
*/
- public function unmarshall(string $value): mixed
+ public function unmarshall(string $value)
{
if (false !== $inflatedValue = @gzinflate($value)) {
$value = $inflatedValue;
diff --git a/vendor/symfony/cache/Marshaller/MarshallerInterface.php b/vendor/symfony/cache/Marshaller/MarshallerInterface.php
index 5b81aad2..cdd6c402 100644
--- a/vendor/symfony/cache/Marshaller/MarshallerInterface.php
+++ b/vendor/symfony/cache/Marshaller/MarshallerInterface.php
@@ -32,7 +32,9 @@ interface MarshallerInterface
/**
* Unserializes a single value and throws an exception if anything goes wrong.
*
+ * @return mixed
+ *
* @throws \Exception Whenever unserialization fails
*/
- public function unmarshall(string $value): mixed;
+ public function unmarshall(string $value);
}
diff --git a/vendor/symfony/cache/Marshaller/SodiumMarshaller.php b/vendor/symfony/cache/Marshaller/SodiumMarshaller.php
index 4d8a04ee..dbf486a7 100644
--- a/vendor/symfony/cache/Marshaller/SodiumMarshaller.php
+++ b/vendor/symfony/cache/Marshaller/SodiumMarshaller.php
@@ -21,8 +21,8 @@ use Symfony\Component\Cache\Exception\InvalidArgumentException;
*/
class SodiumMarshaller implements MarshallerInterface
{
- private MarshallerInterface $marshaller;
- private array $decryptionKeys;
+ private $marshaller;
+ private $decryptionKeys;
/**
* @param string[] $decryptionKeys The key at index "0" is required and is used to decrypt and encrypt values;
@@ -66,7 +66,7 @@ class SodiumMarshaller implements MarshallerInterface
/**
* {@inheritdoc}
*/
- public function unmarshall(string $value): mixed
+ public function unmarshall(string $value)
{
foreach ($this->decryptionKeys as $k) {
if (false !== $decryptedValue = @sodium_crypto_box_seal_open($value, $k)) {
diff --git a/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php b/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php
index 576ccc11..f7eeb783 100644
--- a/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php
+++ b/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php
@@ -18,7 +18,7 @@ namespace Symfony\Component\Cache\Marshaller;
*/
class TagAwareMarshaller implements MarshallerInterface
{
- private MarshallerInterface $marshaller;
+ private $marshaller;
public function __construct(MarshallerInterface $marshaller = null)
{
@@ -67,7 +67,7 @@ class TagAwareMarshaller implements MarshallerInterface
/**
* {@inheritdoc}
*/
- public function unmarshall(string $value): mixed
+ public function unmarshall(string $value)
{
// detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F
if (13 >= \strlen($value) || "\x9D" !== $value[0] || "\0" !== $value[5] || "\x5F" !== $value[9]) {
diff --git a/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php b/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php
index 9b94c4f1..6f11b8b5 100644
--- a/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php
+++ b/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php
@@ -23,22 +23,22 @@ use Symfony\Component\Messenger\Stamp\HandledStamp;
*/
class EarlyExpirationDispatcher
{
- private MessageBusInterface $bus;
- private ReverseContainer $reverseContainer;
- private ?\Closure $callbackWrapper;
+ private $bus;
+ private $reverseContainer;
+ private $callbackWrapper;
public function __construct(MessageBusInterface $bus, ReverseContainer $reverseContainer, callable $callbackWrapper = null)
{
$this->bus = $bus;
$this->reverseContainer = $reverseContainer;
- $this->callbackWrapper = null === $callbackWrapper ? null : $callbackWrapper(...);
+ $this->callbackWrapper = $callbackWrapper;
}
public function __invoke(callable $callback, CacheItem $item, bool &$save, AdapterInterface $pool, \Closure $setMetadata, LoggerInterface $logger = null)
{
if (!$item->isHit() || null === $message = EarlyExpirationMessage::create($this->reverseContainer, $callback, $item, $pool)) {
// The item is stale or the callback cannot be reversed: we must compute the value now
- $logger?->info('Computing item "{key}" online: '.($item->isHit() ? 'callback cannot be reversed' : 'item is stale'), ['key' => $item->getKey()]);
+ $logger && $logger->info('Computing item "{key}" online: '.($item->isHit() ? 'callback cannot be reversed' : 'item is stale'), ['key' => $item->getKey()]);
return null !== $this->callbackWrapper ? ($this->callbackWrapper)($callback, $item, $save, $pool, $setMetadata, $logger) : $callback($item, $save);
}
diff --git a/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php b/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php
index 9d2aaecc..1f0bd565 100644
--- a/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php
+++ b/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php
@@ -20,8 +20,8 @@ use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
*/
class EarlyExpirationHandler implements MessageHandlerInterface
{
- private ReverseContainer $reverseContainer;
- private array $processedNonces = [];
+ private $reverseContainer;
+ private $processedNonces = [];
public function __construct(ReverseContainer $reverseContainer)
{
@@ -59,7 +59,7 @@ class EarlyExpirationHandler implements MessageHandlerInterface
static $setMetadata;
- $setMetadata ??= \Closure::bind(
+ $setMetadata ?? $setMetadata = \Closure::bind(
function (CacheItem $item, float $startTime) {
if ($item->expiry > $endTime = microtime(true)) {
$item->newMetadata[CacheItem::METADATA_EXPIRY] = $item->expiry;
diff --git a/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php b/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php
index 6056ebab..e25c07e9 100644
--- a/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php
+++ b/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php
@@ -20,16 +20,16 @@ use Symfony\Component\DependencyInjection\ReverseContainer;
*/
final class EarlyExpirationMessage
{
- private CacheItem $item;
- private string $pool;
- private string|array $callback;
+ private $item;
+ private $pool;
+ private $callback;
public static function create(ReverseContainer $reverseContainer, callable $callback, CacheItem $item, AdapterInterface $pool): ?self
{
try {
$item = clone $item;
$item->set(null);
- } catch (\Exception) {
+ } catch (\Exception $e) {
return null;
}
@@ -66,10 +66,7 @@ final class EarlyExpirationMessage
return $this->pool;
}
- /**
- * @return string|string[]
- */
- public function getCallback(): string|array
+ public function getCallback()
{
return $this->callback;
}
@@ -91,7 +88,7 @@ final class EarlyExpirationMessage
return $callback;
}
- private function __construct(CacheItem $item, string $pool, string|array $callback)
+ private function __construct(CacheItem $item, string $pool, $callback)
{
$this->item = $item;
$this->pool = $pool;
diff --git a/vendor/symfony/cache/PruneableInterface.php b/vendor/symfony/cache/PruneableInterface.php
index 3095c80f..42615253 100644
--- a/vendor/symfony/cache/PruneableInterface.php
+++ b/vendor/symfony/cache/PruneableInterface.php
@@ -16,5 +16,8 @@ namespace Symfony\Component\Cache;
*/
interface PruneableInterface
{
- public function prune(): bool;
+ /**
+ * @return bool
+ */
+ public function prune();
}
diff --git a/vendor/symfony/cache/Psr16Cache.php b/vendor/symfony/cache/Psr16Cache.php
index e36646ef..28c7de60 100644
--- a/vendor/symfony/cache/Psr16Cache.php
+++ b/vendor/symfony/cache/Psr16Cache.php
@@ -19,6 +19,10 @@ use Symfony\Component\Cache\Adapter\AdapterInterface;
use Symfony\Component\Cache\Exception\InvalidArgumentException;
use Symfony\Component\Cache\Traits\ProxyTrait;
+if (null !== (new \ReflectionMethod(CacheInterface::class, 'get'))->getReturnType()) {
+ throw new \LogicException('psr/simple-cache 3.0+ is not compatible with this version of symfony/cache. Please upgrade symfony/cache to 6.0+ or downgrade psr/simple-cache to 1.x or 2.x.');
+}
+
/**
* Turns a PSR-6 cache into a PSR-16 one.
*
@@ -28,9 +32,10 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf
{
use ProxyTrait;
- private ?\Closure $createCacheItem = null;
- private ?CacheItem $cacheItemPrototype = null;
- private static \Closure $packCacheItem;
+ private const METADATA_EXPIRY_OFFSET = 1527506807;
+
+ private $createCacheItem;
+ private $cacheItemPrototype;
public function __construct(CacheItemPoolInterface $pool)
{
@@ -66,21 +71,14 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf
return $createCacheItem($key, null, $allowInt)->set($value);
};
- self::$packCacheItem ??= \Closure::bind(
- static function (CacheItem $item) {
- $item->newMetadata = $item->metadata;
-
- return $item->pack();
- },
- null,
- CacheItem::class
- );
}
/**
* {@inheritdoc}
+ *
+ * @return mixed
*/
- public function get($key, $default = null): mixed
+ public function get($key, $default = null)
{
try {
$item = $this->pool->getItem($key);
@@ -99,8 +97,10 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf
/**
* {@inheritdoc}
+ *
+ * @return bool
*/
- public function set($key, $value, $ttl = null): bool
+ public function set($key, $value, $ttl = null)
{
try {
if (null !== $f = $this->createCacheItem) {
@@ -122,8 +122,10 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf
/**
* {@inheritdoc}
+ *
+ * @return bool
*/
- public function delete($key): bool
+ public function delete($key)
{
try {
return $this->pool->deleteItem($key);
@@ -136,16 +138,20 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf
/**
* {@inheritdoc}
+ *
+ * @return bool
*/
- public function clear(): bool
+ public function clear()
{
return $this->pool->clear();
}
/**
* {@inheritdoc}
+ *
+ * @return iterable
*/
- public function getMultiple($keys, $default = null): iterable
+ public function getMultiple($keys, $default = null)
{
if ($keys instanceof \Traversable) {
$keys = iterator_to_array($keys, false);
@@ -171,7 +177,20 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf
}
foreach ($items as $key => $item) {
- $values[$key] = $item->isHit() ? (self::$packCacheItem)($item) : $default;
+ if (!$item->isHit()) {
+ $values[$key] = $default;
+ continue;
+ }
+ $values[$key] = $item->get();
+
+ if (!$metadata = $item->getMetadata()) {
+ continue;
+ }
+ unset($metadata[CacheItem::METADATA_TAGS]);
+
+ if ($metadata) {
+ $values[$key] = ["\x9D".pack('VN', (int) (0.1 + $metadata[CacheItem::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[CacheItem::METADATA_CTIME])."\x5F" => $values[$key]];
+ }
}
return $values;
@@ -179,8 +198,10 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf
/**
* {@inheritdoc}
+ *
+ * @return bool
*/
- public function setMultiple($values, $ttl = null): bool
+ public function setMultiple($values, $ttl = null)
{
$valuesIsArray = \is_array($values);
if (!$valuesIsArray && !$values instanceof \Traversable) {
@@ -230,8 +251,10 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf
/**
* {@inheritdoc}
+ *
+ * @return bool
*/
- public function deleteMultiple($keys): bool
+ public function deleteMultiple($keys)
{
if ($keys instanceof \Traversable) {
$keys = iterator_to_array($keys, false);
@@ -250,8 +273,10 @@ class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterf
/**
* {@inheritdoc}
+ *
+ * @return bool
*/
- public function has($key): bool
+ public function has($key)
{
try {
return $this->pool->hasItem($key);
diff --git a/vendor/symfony/cache/Traits/AbstractAdapterTrait.php b/vendor/symfony/cache/Traits/AbstractAdapterTrait.php
index 9bddc458..a6814b5f 100644
--- a/vendor/symfony/cache/Traits/AbstractAdapterTrait.php
+++ b/vendor/symfony/cache/Traits/AbstractAdapterTrait.php
@@ -26,21 +26,21 @@ trait AbstractAdapterTrait
use LoggerAwareTrait;
/**
- * needs to be set by class, signature is function(string
@@ -24,9 +23,12 @@ trait FilesystemTrait
{
use FilesystemCommonTrait;
- private MarshallerInterface $marshaller;
+ private $marshaller;
- public function prune(): bool
+ /**
+ * @return bool
+ */
+ public function prune()
{
$time = time();
$pruned = true;
@@ -50,7 +52,7 @@ trait FilesystemTrait
/**
* {@inheritdoc}
*/
- protected function doFetch(array $ids): iterable
+ protected function doFetch(array $ids)
{
$values = [];
$now = time();
@@ -79,7 +81,7 @@ trait FilesystemTrait
/**
* {@inheritdoc}
*/
- protected function doHave(string $id): bool
+ protected function doHave(string $id)
{
$file = $this->getFile($id);
@@ -89,7 +91,7 @@ trait FilesystemTrait
/**
* {@inheritdoc}
*/
- protected function doSave(array $values, int $lifetime): array|bool
+ protected function doSave(array $values, int $lifetime)
{
$expiresAt = $lifetime ? (time() + $lifetime) : 0;
$values = $this->marshaller->marshall($values, $failed);
diff --git a/vendor/symfony/cache/Traits/ProxyTrait.php b/vendor/symfony/cache/Traits/ProxyTrait.php
index ba6f8cba..c86f360a 100644
--- a/vendor/symfony/cache/Traits/ProxyTrait.php
+++ b/vendor/symfony/cache/Traits/ProxyTrait.php
@@ -21,12 +21,12 @@ use Symfony\Contracts\Service\ResetInterface;
*/
trait ProxyTrait
{
- private object $pool;
+ private $pool;
/**
* {@inheritdoc}
*/
- public function prune(): bool
+ public function prune()
{
return $this->pool instanceof PruneableInterface && $this->pool->prune();
}
diff --git a/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php b/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php
index afcfb3a1..deba74f6 100644
--- a/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php
+++ b/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php
@@ -24,10 +24,13 @@ namespace Symfony\Component\Cache\Traits;
*/
class RedisClusterNodeProxy
{
- private array $host;
- private \RedisCluster|RedisClusterProxy $redis;
+ private $host;
+ private $redis;
- public function __construct(array $host, \RedisCluster|RedisClusterProxy $redis)
+ /**
+ * @param \RedisCluster|RedisClusterProxy $redis
+ */
+ public function __construct(array $host, $redis)
{
$this->host = $host;
$this->redis = $redis;
diff --git a/vendor/symfony/cache/Traits/RedisClusterProxy.php b/vendor/symfony/cache/Traits/RedisClusterProxy.php
index b4b750cf..73c6a4fd 100644
--- a/vendor/symfony/cache/Traits/RedisClusterProxy.php
+++ b/vendor/symfony/cache/Traits/RedisClusterProxy.php
@@ -18,8 +18,8 @@ namespace Symfony\Component\Cache\Traits;
*/
class RedisClusterProxy
{
- private \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy $redis;
- private \Closure $initializer;
+ private $redis;
+ private $initializer;
public function __construct(\Closure $initializer)
{
@@ -28,35 +28,35 @@ class RedisClusterProxy
public function __call(string $method, array $args)
{
- $this->redis ??= ($this->initializer)();
+ $this->redis ?: $this->redis = $this->initializer->__invoke();
return $this->redis->{$method}(...$args);
}
public function hscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
{
- $this->redis ??= ($this->initializer)();
+ $this->redis ?: $this->redis = $this->initializer->__invoke();
return $this->redis->hscan($strKey, $iIterator, $strPattern, $iCount);
}
public function scan(&$iIterator, $strPattern = null, $iCount = null)
{
- $this->redis ??= ($this->initializer)();
+ $this->redis ?: $this->redis = $this->initializer->__invoke();
return $this->redis->scan($iIterator, $strPattern, $iCount);
}
public function sscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
{
- $this->redis ??= ($this->initializer)();
+ $this->redis ?: $this->redis = $this->initializer->__invoke();
return $this->redis->sscan($strKey, $iIterator, $strPattern, $iCount);
}
public function zscan($strKey, &$iIterator, $strPattern = null, $iCount = null)
{
- $this->redis ??= ($this->initializer)();
+ $this->redis ?: $this->redis = $this->initializer->__invoke();
return $this->redis->zscan($strKey, $iIterator, $strPattern, $iCount);
}
diff --git a/vendor/symfony/cache/Traits/RedisProxy.php b/vendor/symfony/cache/Traits/RedisProxy.php
index a477dc87..ec5cfabb 100644
--- a/vendor/symfony/cache/Traits/RedisProxy.php
+++ b/vendor/symfony/cache/Traits/RedisProxy.php
@@ -18,9 +18,9 @@ namespace Symfony\Component\Cache\Traits;
*/
class RedisProxy
{
- private \Redis $redis;
- private \Closure $initializer;
- private bool $ready = false;
+ private $redis;
+ private $initializer;
+ private $ready = false;
public function __construct(\Redis $redis, \Closure $initializer)
{
diff --git a/vendor/symfony/cache/Traits/RedisTrait.php b/vendor/symfony/cache/Traits/RedisTrait.php
index c745deb6..accee44b 100644
--- a/vendor/symfony/cache/Traits/RedisTrait.php
+++ b/vendor/symfony/cache/Traits/RedisTrait.php
@@ -30,7 +30,7 @@ use Symfony\Component\Cache\Marshaller\MarshallerInterface;
*/
trait RedisTrait
{
- private static array $defaultConnectionOptions = [
+ private static $defaultConnectionOptions = [
'class' => null,
'persistent' => 0,
'persistent_id' => null,
@@ -45,10 +45,13 @@ trait RedisTrait
'failover' => 'none',
'ssl' => null, // see https://php.net/context.ssl
];
- private \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis;
- private MarshallerInterface $marshaller;
+ private $redis;
+ private $marshaller;
- private function init(\Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis, string $namespace, int $defaultLifetime, ?MarshallerInterface $marshaller)
+ /**
+ * @param \Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis
+ */
+ private function init($redis, string $namespace, int $defaultLifetime, ?MarshallerInterface $marshaller)
{
parent::__construct($namespace, $defaultLifetime);
@@ -56,6 +59,10 @@ trait RedisTrait
throw new InvalidArgumentException(sprintf('RedisAdapter namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0]));
}
+ if (!$redis instanceof \Redis && !$redis instanceof \RedisArray && !$redis instanceof \RedisCluster && !$redis instanceof \Predis\ClientInterface && !$redis instanceof RedisProxy && !$redis instanceof RedisClusterProxy) {
+ throw new InvalidArgumentException(sprintf('"%s()" expects parameter 1 to be Redis, RedisArray, RedisCluster or Predis\ClientInterface, "%s" given.', __METHOD__, get_debug_type($redis)));
+ }
+
if ($redis instanceof \Predis\ClientInterface && $redis->getOptions()->exceptions) {
$options = clone $redis->getOptions();
\Closure::bind(function () { $this->options['exceptions'] = false; }, $options, $options)();
@@ -78,9 +85,11 @@ trait RedisTrait
*
* @param array $options See self::$defaultConnectionOptions
*
+ * @return \Redis|\RedisArray|\RedisCluster|RedisClusterProxy|RedisProxy|\Predis\ClientInterface According to the "class" option
+ *
* @throws InvalidArgumentException when the DSN is invalid
*/
- public static function createConnection(string $dsn, array $options = []): \Redis|\RedisArray|\RedisCluster|RedisClusterProxy|RedisProxy|\Predis\ClientInterface
+ public static function createConnection(string $dsn, array $options = [])
{
if (str_starts_with($dsn, 'redis:')) {
$scheme = 'redis';
@@ -94,13 +103,9 @@ trait RedisTrait
throw new CacheException(sprintf('Cannot find the "redis" extension nor the "predis/predis" package: "%s".', $dsn));
}
- $params = preg_replace_callback('#^'.$scheme.':(//)?(?:(?:(?
- *
- * @internal
- */
-class
-{
- private const EXPIRY_OFFSET = 1648206727;
- private const INT32_MAX = 2147483647;
-
- public readonly mixed $value;
- public readonly array $metadata;
-
- public function __construct(mixed $value, array $metadata)
- {
- $this->value = $value;
- $this->metadata = $metadata;
- }
-
- public function __serialize(): array
- {
- // pack 31-bits ctime into 14bits
- $c = $this->metadata['ctime'] ?? 0;
- $c = match (true) {
- $c > self::INT32_MAX - 2 => self::INT32_MAX,
- $c > 0 => 1 + $c,
- default => 1,
- };
- $e = 0;
- while (!(0x40000000 & $c)) {
- $c <<= 1;
- ++$e;
- }
- $c = (0x7FE0 & ($c >> 16)) | $e;
-
- $pack = pack('Vn', (int) (0.1 + ($this->metadata['expiry'] ?: self::INT32_MAX + self::EXPIRY_OFFSET) - self::EXPIRY_OFFSET), $c);
-
- if (isset($this->metadata['tags'])) {
- $pack[4] = $pack[4] | "\x80";
- }
-
- return [$pack => $this->value] + ($this->metadata['tags'] ?? []);
- }
-
- public function __unserialize(array $data)
- {
- $pack = array_key_first($data);
- $this->value = $data[$pack];
-
- if ($hasTags = "\x80" === ($pack[4] & "\x80")) {
- unset($data[$pack]);
- $pack[4] = $pack[4] & "\x7F";
- }
-
- $metadata = unpack('Vexpiry/nctime', $pack);
- $metadata['expiry'] += self::EXPIRY_OFFSET;
-
- if (!$metadata['ctime'] = ((0x4000 | $metadata['ctime']) << 16 >> (0x1F & $metadata['ctime'])) - 1) {
- unset($metadata['ctime']);
- }
-
- if ($hasTags) {
- $metadata['tags'] = $data;
- }
-
- $this->metadata = $metadata;
- }
-}
diff --git a/vendor/symfony/cache/composer.json b/vendor/symfony/cache/composer.json
index 09dd1bbe..91296b04 100644
--- a/vendor/symfony/cache/composer.json
+++ b/vendor/symfony/cache/composer.json
@@ -16,41 +16,42 @@
}
],
"provide": {
- "psr/cache-implementation": "2.0|3.0",
- "psr/simple-cache-implementation": "1.0|2.0|3.0",
- "symfony/cache-implementation": "1.1|2.0|3.0"
+ "psr/cache-implementation": "1.0|2.0",
+ "psr/simple-cache-implementation": "1.0|2.0",
+ "symfony/cache-implementation": "1.0|2.0"
},
"require": {
- "php": ">=8.1",
- "psr/cache": "^2.0|^3.0",
+ "php": ">=7.2.5",
+ "psr/cache": "^1.0|^2.0",
"psr/log": "^1.1|^2|^3",
- "symfony/cache-contracts": "^1.1.7|^2|^3",
+ "symfony/cache-contracts": "^1.1.7|^2",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16",
"symfony/service-contracts": "^1.1|^2|^3",
- "symfony/var-exporter": "^5.4|^6.0"
+ "symfony/var-exporter": "^4.4|^5.0|^6.0"
},
"require-dev": {
"cache/integration-tests": "dev-master",
+ "doctrine/cache": "^1.6|^2.0",
"doctrine/dbal": "^2.13.1|^3.0",
"predis/predis": "^1.1",
- "psr/simple-cache": "^1.0|^2.0|^3.0",
- "symfony/config": "^5.4|^6.0",
- "symfony/dependency-injection": "^5.4|^6.0",
- "symfony/filesystem": "^5.4|^6.0",
- "symfony/http-kernel": "^5.4|^6.0",
- "symfony/messenger": "^5.4|^6.0",
- "symfony/var-dumper": "^5.4|^6.0"
+ "psr/simple-cache": "^1.0|^2.0",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/filesystem": "^4.4|^5.0|^6.0",
+ "symfony/http-kernel": "^4.4|^5.0|^6.0",
+ "symfony/messenger": "^4.4|^5.0|^6.0",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
},
"conflict": {
"doctrine/dbal": "<2.13.1",
- "symfony/dependency-injection": "<5.4",
- "symfony/http-kernel": "<5.4",
- "symfony/var-dumper": "<5.4"
+ "symfony/dependency-injection": "<4.4",
+ "symfony/http-kernel": "<4.4",
+ "symfony/var-dumper": "<4.4"
},
"autoload": {
"psr-4": { "Symfony\\Component\\Cache\\": "" },
- "classmap": [
- "Traits/ValueWrapper.php"
- ],
"exclude-from-classmap": [
"/Tests/"
]
diff --git a/vendor/symfony/css-selector/CssSelectorConverter.php b/vendor/symfony/css-selector/CssSelectorConverter.php
index 7120a295..bbb6afe2 100644
--- a/vendor/symfony/css-selector/CssSelectorConverter.php
+++ b/vendor/symfony/css-selector/CssSelectorConverter.php
@@ -26,11 +26,11 @@ use Symfony\Component\CssSelector\XPath\Translator;
*/
class CssSelectorConverter
{
- private Translator $translator;
- private array $cache;
+ private $translator;
+ private $cache;
- private static array $xmlCache = [];
- private static array $htmlCache = [];
+ private static $xmlCache = [];
+ private static $htmlCache = [];
/**
* @param bool $html Whether HTML support should be enabled. Disable it for XML documents
@@ -59,9 +59,11 @@ class CssSelectorConverter
*
* Optionally, a prefix can be added to the resulting XPath
* expression with the $prefix parameter.
+ *
+ * @return string
*/
- public function toXPath(string $cssExpr, string $prefix = 'descendant-or-self::'): string
+ public function toXPath(string $cssExpr, string $prefix = 'descendant-or-self::')
{
- return $this->cache[$prefix][$cssExpr] ??= $this->translator->cssToXPath($cssExpr, $prefix);
+ return $this->cache[$prefix][$cssExpr] ?? $this->cache[$prefix][$cssExpr] = $this->translator->cssToXPath($cssExpr, $prefix);
}
}
diff --git a/vendor/symfony/css-selector/Exception/SyntaxErrorException.php b/vendor/symfony/css-selector/Exception/SyntaxErrorException.php
index f73860ce..7deacf9c 100644
--- a/vendor/symfony/css-selector/Exception/SyntaxErrorException.php
+++ b/vendor/symfony/css-selector/Exception/SyntaxErrorException.php
@@ -23,27 +23,42 @@ use Symfony\Component\CssSelector\Parser\Token;
*/
class SyntaxErrorException extends ParseException
{
- public static function unexpectedToken(string $expectedValue, Token $foundToken): self
+ /**
+ * @return self
+ */
+ public static function unexpectedToken(string $expectedValue, Token $foundToken)
{
return new self(sprintf('Expected %s, but %s found.', $expectedValue, $foundToken));
}
- public static function pseudoElementFound(string $pseudoElement, string $unexpectedLocation): self
+ /**
+ * @return self
+ */
+ public static function pseudoElementFound(string $pseudoElement, string $unexpectedLocation)
{
return new self(sprintf('Unexpected pseudo-element "::%s" found %s.', $pseudoElement, $unexpectedLocation));
}
- public static function unclosedString(int $position): self
+ /**
+ * @return self
+ */
+ public static function unclosedString(int $position)
{
return new self(sprintf('Unclosed/invalid string at %s.', $position));
}
- public static function nestedNot(): self
+ /**
+ * @return self
+ */
+ public static function nestedNot()
{
return new self('Got nested ::not().');
}
- public static function stringAsFunctionArgument(): self
+ /**
+ * @return self
+ */
+ public static function stringAsFunctionArgument()
{
return new self('String not allowed as function argument.');
}
diff --git a/vendor/symfony/css-selector/Node/AbstractNode.php b/vendor/symfony/css-selector/Node/AbstractNode.php
index d99e80a8..1306aeac 100644
--- a/vendor/symfony/css-selector/Node/AbstractNode.php
+++ b/vendor/symfony/css-selector/Node/AbstractNode.php
@@ -23,10 +23,17 @@ namespace Symfony\Component\CssSelector\Node;
*/
abstract class AbstractNode implements NodeInterface
{
- private string $nodeName;
+ /**
+ * @var string
+ */
+ private $nodeName;
public function getNodeName(): string
{
- return $this->nodeName ??= preg_replace('~.*\\\\([^\\\\]+)Node$~', '$1', static::class);
+ if (null === $this->nodeName) {
+ $this->nodeName = preg_replace('~.*\\\\([^\\\\]+)Node$~', '$1', static::class);
+ }
+
+ return $this->nodeName;
}
}
diff --git a/vendor/symfony/css-selector/Node/AttributeNode.php b/vendor/symfony/css-selector/Node/AttributeNode.php
index bca9db70..0b6e0ee0 100644
--- a/vendor/symfony/css-selector/Node/AttributeNode.php
+++ b/vendor/symfony/css-selector/Node/AttributeNode.php
@@ -23,11 +23,11 @@ namespace Symfony\Component\CssSelector\Node;
*/
class AttributeNode extends AbstractNode
{
- private NodeInterface $selector;
- private ?string $namespace;
- private string $attribute;
- private string $operator;
- private ?string $value;
+ private $selector;
+ private $namespace;
+ private $attribute;
+ private $operator;
+ private $value;
public function __construct(NodeInterface $selector, ?string $namespace, string $attribute, string $operator, ?string $value)
{
diff --git a/vendor/symfony/css-selector/Node/ClassNode.php b/vendor/symfony/css-selector/Node/ClassNode.php
index b9284073..1efca808 100644
--- a/vendor/symfony/css-selector/Node/ClassNode.php
+++ b/vendor/symfony/css-selector/Node/ClassNode.php
@@ -23,8 +23,8 @@ namespace Symfony\Component\CssSelector\Node;
*/
class ClassNode extends AbstractNode
{
- private NodeInterface $selector;
- private string $name;
+ private $selector;
+ private $name;
public function __construct(NodeInterface $selector, string $name)
{
diff --git a/vendor/symfony/css-selector/Node/CombinedSelectorNode.php b/vendor/symfony/css-selector/Node/CombinedSelectorNode.php
index 33889948..a217a45e 100644
--- a/vendor/symfony/css-selector/Node/CombinedSelectorNode.php
+++ b/vendor/symfony/css-selector/Node/CombinedSelectorNode.php
@@ -23,9 +23,9 @@ namespace Symfony\Component\CssSelector\Node;
*/
class CombinedSelectorNode extends AbstractNode
{
- private NodeInterface $selector;
- private string $combinator;
- private NodeInterface $subSelector;
+ private $selector;
+ private $combinator;
+ private $subSelector;
public function __construct(NodeInterface $selector, string $combinator, NodeInterface $subSelector)
{
diff --git a/vendor/symfony/css-selector/Node/ElementNode.php b/vendor/symfony/css-selector/Node/ElementNode.php
index b05164fe..fbf8ea0f 100644
--- a/vendor/symfony/css-selector/Node/ElementNode.php
+++ b/vendor/symfony/css-selector/Node/ElementNode.php
@@ -23,8 +23,8 @@ namespace Symfony\Component\CssSelector\Node;
*/
class ElementNode extends AbstractNode
{
- private ?string $namespace;
- private ?string $element;
+ private $namespace;
+ private $element;
public function __construct(string $namespace = null, string $element = null)
{
diff --git a/vendor/symfony/css-selector/Node/FunctionNode.php b/vendor/symfony/css-selector/Node/FunctionNode.php
index 5bfca184..c464cf7c 100644
--- a/vendor/symfony/css-selector/Node/FunctionNode.php
+++ b/vendor/symfony/css-selector/Node/FunctionNode.php
@@ -25,9 +25,9 @@ use Symfony\Component\CssSelector\Parser\Token;
*/
class FunctionNode extends AbstractNode
{
- private NodeInterface $selector;
- private string $name;
- private array $arguments;
+ private $selector;
+ private $name;
+ private $arguments;
/**
* @param Token[] $arguments
diff --git a/vendor/symfony/css-selector/Node/HashNode.php b/vendor/symfony/css-selector/Node/HashNode.php
index 5f5923fb..94114c09 100644
--- a/vendor/symfony/css-selector/Node/HashNode.php
+++ b/vendor/symfony/css-selector/Node/HashNode.php
@@ -23,8 +23,8 @@ namespace Symfony\Component\CssSelector\Node;
*/
class HashNode extends AbstractNode
{
- private NodeInterface $selector;
- private string $id;
+ private $selector;
+ private $id;
public function __construct(NodeInterface $selector, string $id)
{
diff --git a/vendor/symfony/css-selector/Node/NegationNode.php b/vendor/symfony/css-selector/Node/NegationNode.php
index c75d052b..f00522fb 100644
--- a/vendor/symfony/css-selector/Node/NegationNode.php
+++ b/vendor/symfony/css-selector/Node/NegationNode.php
@@ -23,8 +23,8 @@ namespace Symfony\Component\CssSelector\Node;
*/
class NegationNode extends AbstractNode
{
- private NodeInterface $selector;
- private NodeInterface $subSelector;
+ private $selector;
+ private $subSelector;
public function __construct(NodeInterface $selector, NodeInterface $subSelector)
{
diff --git a/vendor/symfony/css-selector/Node/PseudoNode.php b/vendor/symfony/css-selector/Node/PseudoNode.php
index 6825f3a3..12b7bd26 100644
--- a/vendor/symfony/css-selector/Node/PseudoNode.php
+++ b/vendor/symfony/css-selector/Node/PseudoNode.php
@@ -23,8 +23,8 @@ namespace Symfony\Component\CssSelector\Node;
*/
class PseudoNode extends AbstractNode
{
- private NodeInterface $selector;
- private string $identifier;
+ private $selector;
+ private $identifier;
public function __construct(NodeInterface $selector, string $identifier)
{
diff --git a/vendor/symfony/css-selector/Node/SelectorNode.php b/vendor/symfony/css-selector/Node/SelectorNode.php
index b1d6c58e..6e52b2fa 100644
--- a/vendor/symfony/css-selector/Node/SelectorNode.php
+++ b/vendor/symfony/css-selector/Node/SelectorNode.php
@@ -23,8 +23,8 @@ namespace Symfony\Component\CssSelector\Node;
*/
class SelectorNode extends AbstractNode
{
- private NodeInterface $tree;
- private ?string $pseudoElement;
+ private $tree;
+ private $pseudoElement;
public function __construct(NodeInterface $tree, string $pseudoElement = null)
{
diff --git a/vendor/symfony/css-selector/Node/Specificity.php b/vendor/symfony/css-selector/Node/Specificity.php
index bb8e5e34..b00f6d28 100644
--- a/vendor/symfony/css-selector/Node/Specificity.php
+++ b/vendor/symfony/css-selector/Node/Specificity.php
@@ -29,9 +29,9 @@ class Specificity
public const B_FACTOR = 10;
public const C_FACTOR = 1;
- private int $a;
- private int $b;
- private int $c;
+ private $a;
+ private $b;
+ private $c;
public function __construct(int $a, int $b, int $c)
{
diff --git a/vendor/symfony/css-selector/Parser/Handler/HashHandler.php b/vendor/symfony/css-selector/Parser/Handler/HashHandler.php
index cde8cda2..7ae9b438 100644
--- a/vendor/symfony/css-selector/Parser/Handler/HashHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/HashHandler.php
@@ -29,8 +29,8 @@ use Symfony\Component\CssSelector\Parser\TokenStream;
*/
class HashHandler implements HandlerInterface
{
- private TokenizerPatterns $patterns;
- private TokenizerEscaping $escaping;
+ private $patterns;
+ private $escaping;
public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping)
{
diff --git a/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php b/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php
index 2b9e02e0..7b2a14e2 100644
--- a/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/IdentifierHandler.php
@@ -29,8 +29,8 @@ use Symfony\Component\CssSelector\Parser\TokenStream;
*/
class IdentifierHandler implements HandlerInterface
{
- private TokenizerPatterns $patterns;
- private TokenizerEscaping $escaping;
+ private $patterns;
+ private $escaping;
public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping)
{
diff --git a/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php b/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php
index d3bbe5f4..8291a68d 100644
--- a/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/NumberHandler.php
@@ -28,7 +28,7 @@ use Symfony\Component\CssSelector\Parser\TokenStream;
*/
class NumberHandler implements HandlerInterface
{
- private TokenizerPatterns $patterns;
+ private $patterns;
public function __construct(TokenizerPatterns $patterns)
{
diff --git a/vendor/symfony/css-selector/Parser/Handler/StringHandler.php b/vendor/symfony/css-selector/Parser/Handler/StringHandler.php
index 341c75fc..6ce83cdc 100644
--- a/vendor/symfony/css-selector/Parser/Handler/StringHandler.php
+++ b/vendor/symfony/css-selector/Parser/Handler/StringHandler.php
@@ -31,8 +31,8 @@ use Symfony\Component\CssSelector\Parser\TokenStream;
*/
class StringHandler implements HandlerInterface
{
- private TokenizerPatterns $patterns;
- private TokenizerEscaping $escaping;
+ private $patterns;
+ private $escaping;
public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping)
{
diff --git a/vendor/symfony/css-selector/Parser/Parser.php b/vendor/symfony/css-selector/Parser/Parser.php
index df77e2ce..d73489ed 100644
--- a/vendor/symfony/css-selector/Parser/Parser.php
+++ b/vendor/symfony/css-selector/Parser/Parser.php
@@ -27,7 +27,7 @@ use Symfony\Component\CssSelector\Parser\Tokenizer\Tokenizer;
*/
class Parser implements ParserInterface
{
- private Tokenizer $tokenizer;
+ private $tokenizer;
public function __construct(Tokenizer $tokenizer = null)
{
diff --git a/vendor/symfony/css-selector/Parser/Reader.php b/vendor/symfony/css-selector/Parser/Reader.php
index c0b6923a..4b43effe 100644
--- a/vendor/symfony/css-selector/Parser/Reader.php
+++ b/vendor/symfony/css-selector/Parser/Reader.php
@@ -23,9 +23,9 @@ namespace Symfony\Component\CssSelector\Parser;
*/
class Reader
{
- private string $source;
- private int $length;
- private int $position = 0;
+ private $source;
+ private $length;
+ private $position = 0;
public function __construct(string $source)
{
@@ -60,7 +60,10 @@ class Reader
return false === $position ? false : $position - $this->position;
}
- public function findPattern(string $pattern): array|false
+ /**
+ * @return array|false
+ */
+ public function findPattern(string $pattern)
{
$source = substr($this->source, $this->position);
diff --git a/vendor/symfony/css-selector/Parser/Token.php b/vendor/symfony/css-selector/Parser/Token.php
index a538d07f..a053203c 100644
--- a/vendor/symfony/css-selector/Parser/Token.php
+++ b/vendor/symfony/css-selector/Parser/Token.php
@@ -31,9 +31,9 @@ class Token
public const TYPE_NUMBER = 'number';
public const TYPE_STRING = 'string';
- private ?string $type;
- private ?string $value;
- private ?int $position;
+ private $type;
+ private $value;
+ private $position;
public function __construct(?string $type, ?string $value, ?int $position)
{
diff --git a/vendor/symfony/css-selector/Parser/TokenStream.php b/vendor/symfony/css-selector/Parser/TokenStream.php
index 69f77780..2085f2dd 100644
--- a/vendor/symfony/css-selector/Parser/TokenStream.php
+++ b/vendor/symfony/css-selector/Parser/TokenStream.php
@@ -29,23 +29,34 @@ class TokenStream
/**
* @var Token[]
*/
- private array $tokens = [];
+ private $tokens = [];
/**
* @var Token[]
*/
- private array $used = [];
+ private $used = [];
- private int $cursor = 0;
- private ?Token $peeked;
- private bool $peeking = false;
+ /**
+ * @var int
+ */
+ private $cursor = 0;
+
+ /**
+ * @var Token|null
+ */
+ private $peeked;
+
+ /**
+ * @var bool
+ */
+ private $peeking = false;
/**
* Pushes a token.
*
* @return $this
*/
- public function push(Token $token): static
+ public function push(Token $token): self
{
$this->tokens[] = $token;
@@ -57,7 +68,7 @@ class TokenStream
*
* @return $this
*/
- public function freeze(): static
+ public function freeze(): self
{
return $this;
}
diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php b/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php
index 35c96a48..e0dcc5bf 100644
--- a/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php
+++ b/vendor/symfony/css-selector/Parser/Tokenizer/Tokenizer.php
@@ -31,7 +31,7 @@ class Tokenizer
/**
* @var Handler\HandlerInterface[]
*/
- private array $handlers;
+ private $handlers;
public function __construct()
{
diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php
index 8c4b9f74..013e827d 100644
--- a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php
+++ b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerEscaping.php
@@ -23,7 +23,7 @@ namespace Symfony\Component\CssSelector\Parser\Tokenizer;
*/
class TokenizerEscaping
{
- private TokenizerPatterns $patterns;
+ private $patterns;
public function __construct(TokenizerPatterns $patterns)
{
diff --git a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php
index 0b2767a8..5f16ac48 100644
--- a/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php
+++ b/vendor/symfony/css-selector/Parser/Tokenizer/TokenizerPatterns.php
@@ -23,18 +23,18 @@ namespace Symfony\Component\CssSelector\Parser\Tokenizer;
*/
class TokenizerPatterns
{
- private string $unicodeEscapePattern;
- private string $simpleEscapePattern;
- private string $newLineEscapePattern;
- private string $escapePattern;
- private string $stringEscapePattern;
- private string $nonAsciiPattern;
- private string $nmCharPattern;
- private string $nmStartPattern;
- private string $identifierPattern;
- private string $hashPattern;
- private string $numberPattern;
- private string $quotedStringPattern;
+ private $unicodeEscapePattern;
+ private $simpleEscapePattern;
+ private $newLineEscapePattern;
+ private $escapePattern;
+ private $stringEscapePattern;
+ private $nonAsciiPattern;
+ private $nmCharPattern;
+ private $nmStartPattern;
+ private $identifierPattern;
+ private $hashPattern;
+ private $numberPattern;
+ private $quotedStringPattern;
public function __construct()
{
diff --git a/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php b/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php
index b40a86bf..a9879f1b 100644
--- a/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/AttributeMatchingExtension.php
@@ -32,14 +32,14 @@ class AttributeMatchingExtension extends AbstractExtension
public function getAttributeMatchingTranslators(): array
{
return [
- 'exists' => $this->translateExists(...),
- '=' => $this->translateEquals(...),
- '~=' => $this->translateIncludes(...),
- '|=' => $this->translateDashMatch(...),
- '^=' => $this->translatePrefixMatch(...),
- '$=' => $this->translateSuffixMatch(...),
- '*=' => $this->translateSubstringMatch(...),
- '!=' => $this->translateDifferent(...),
+ 'exists' => [$this, 'translateExists'],
+ '=' => [$this, 'translateEquals'],
+ '~=' => [$this, 'translateIncludes'],
+ '|=' => [$this, 'translateDashMatch'],
+ '^=' => [$this, 'translatePrefixMatch'],
+ '$=' => [$this, 'translateSuffixMatch'],
+ '*=' => [$this, 'translateSubstringMatch'],
+ '!=' => [$this, 'translateDifferent'],
];
}
diff --git a/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php b/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php
index e75da8b4..aee976e9 100644
--- a/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/CombinationExtension.php
@@ -31,10 +31,10 @@ class CombinationExtension extends AbstractExtension
public function getCombinationTranslators(): array
{
return [
- ' ' => $this->translateDescendant(...),
- '>' => $this->translateChild(...),
- '+' => $this->translateDirectAdjacent(...),
- '~' => $this->translateIndirectAdjacent(...),
+ ' ' => [$this, 'translateDescendant'],
+ '>' => [$this, 'translateChild'],
+ '+' => [$this, 'translateDirectAdjacent'],
+ '~' => [$this, 'translateIndirectAdjacent'],
];
}
diff --git a/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php b/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php
index 4ed9c239..d3f7222a 100644
--- a/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/FunctionExtension.php
@@ -36,12 +36,12 @@ class FunctionExtension extends AbstractExtension
public function getFunctionTranslators(): array
{
return [
- 'nth-child' => $this->translateNthChild(...),
- 'nth-last-child' => $this->translateNthLastChild(...),
- 'nth-of-type' => $this->translateNthOfType(...),
- 'nth-last-of-type' => $this->translateNthLastOfType(...),
- 'contains' => $this->translateContains(...),
- 'lang' => $this->translateLang(...),
+ 'nth-child' => [$this, 'translateNthChild'],
+ 'nth-last-child' => [$this, 'translateNthLastChild'],
+ 'nth-of-type' => [$this, 'translateNthOfType'],
+ 'nth-last-of-type' => [$this, 'translateNthLastOfType'],
+ 'contains' => [$this, 'translateContains'],
+ 'lang' => [$this, 'translateLang'],
];
}
diff --git a/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php b/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php
index 95289818..6edc0858 100644
--- a/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/HtmlExtension.php
@@ -42,14 +42,14 @@ class HtmlExtension extends AbstractExtension
public function getPseudoClassTranslators(): array
{
return [
- 'checked' => $this->translateChecked(...),
- 'link' => $this->translateLink(...),
- 'disabled' => $this->translateDisabled(...),
- 'enabled' => $this->translateEnabled(...),
- 'selected' => $this->translateSelected(...),
- 'invalid' => $this->translateInvalid(...),
- 'hover' => $this->translateHover(...),
- 'visited' => $this->translateVisited(...),
+ 'checked' => [$this, 'translateChecked'],
+ 'link' => [$this, 'translateLink'],
+ 'disabled' => [$this, 'translateDisabled'],
+ 'enabled' => [$this, 'translateEnabled'],
+ 'selected' => [$this, 'translateSelected'],
+ 'invalid' => [$this, 'translateInvalid'],
+ 'hover' => [$this, 'translateHover'],
+ 'visited' => [$this, 'translateVisited'],
];
}
@@ -59,7 +59,7 @@ class HtmlExtension extends AbstractExtension
public function getFunctionTranslators(): array
{
return [
- 'lang' => $this->translateLang(...),
+ 'lang' => [$this, 'translateLang'],
];
}
diff --git a/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php b/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php
index 70f287b5..aa6f3f70 100644
--- a/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/NodeExtension.php
@@ -31,7 +31,7 @@ class NodeExtension extends AbstractExtension
public const ATTRIBUTE_NAME_IN_LOWER_CASE = 2;
public const ATTRIBUTE_VALUE_IN_LOWER_CASE = 4;
- private int $flags;
+ private $flags;
public function __construct(int $flags = 0)
{
@@ -41,7 +41,7 @@ class NodeExtension extends AbstractExtension
/**
* @return $this
*/
- public function setFlag(int $flag, bool $on): static
+ public function setFlag(int $flag, bool $on): self
{
if ($on && !$this->hasFlag($flag)) {
$this->flags += $flag;
@@ -65,15 +65,15 @@ class NodeExtension extends AbstractExtension
public function getNodeTranslators(): array
{
return [
- 'Selector' => $this->translateSelector(...),
- 'CombinedSelector' => $this->translateCombinedSelector(...),
- 'Negation' => $this->translateNegation(...),
- 'Function' => $this->translateFunction(...),
- 'Pseudo' => $this->translatePseudo(...),
- 'Attribute' => $this->translateAttribute(...),
- 'Class' => $this->translateClass(...),
- 'Hash' => $this->translateHash(...),
- 'Element' => $this->translateElement(...),
+ 'Selector' => [$this, 'translateSelector'],
+ 'CombinedSelector' => [$this, 'translateCombinedSelector'],
+ 'Negation' => [$this, 'translateNegation'],
+ 'Function' => [$this, 'translateFunction'],
+ 'Pseudo' => [$this, 'translatePseudo'],
+ 'Attribute' => [$this, 'translateAttribute'],
+ 'Class' => [$this, 'translateClass'],
+ 'Hash' => [$this, 'translateHash'],
+ 'Element' => [$this, 'translateElement'],
];
}
diff --git a/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php b/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php
index a9b6abc4..a50b0486 100644
--- a/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php
+++ b/vendor/symfony/css-selector/XPath/Extension/PseudoClassExtension.php
@@ -32,14 +32,14 @@ class PseudoClassExtension extends AbstractExtension
public function getPseudoClassTranslators(): array
{
return [
- 'root' => $this->translateRoot(...),
- 'first-child' => $this->translateFirstChild(...),
- 'last-child' => $this->translateLastChild(...),
- 'first-of-type' => $this->translateFirstOfType(...),
- 'last-of-type' => $this->translateLastOfType(...),
- 'only-child' => $this->translateOnlyChild(...),
- 'only-of-type' => $this->translateOnlyOfType(...),
- 'empty' => $this->translateEmpty(...),
+ 'root' => [$this, 'translateRoot'],
+ 'first-child' => [$this, 'translateFirstChild'],
+ 'last-child' => [$this, 'translateLastChild'],
+ 'first-of-type' => [$this, 'translateFirstOfType'],
+ 'last-of-type' => [$this, 'translateLastOfType'],
+ 'only-child' => [$this, 'translateOnlyChild'],
+ 'only-of-type' => [$this, 'translateOnlyOfType'],
+ 'empty' => [$this, 'translateEmpty'],
];
}
diff --git a/vendor/symfony/css-selector/XPath/Translator.php b/vendor/symfony/css-selector/XPath/Translator.php
index 128a4a93..8ce47303 100644
--- a/vendor/symfony/css-selector/XPath/Translator.php
+++ b/vendor/symfony/css-selector/XPath/Translator.php
@@ -30,23 +30,23 @@ use Symfony\Component\CssSelector\Parser\ParserInterface;
*/
class Translator implements TranslatorInterface
{
- private ParserInterface $mainParser;
+ private $mainParser;
/**
* @var ParserInterface[]
*/
- private array $shortcutParsers = [];
+ private $shortcutParsers = [];
/**
* @var Extension\ExtensionInterface[]
*/
- private array $extensions = [];
+ private $extensions = [];
- private array $nodeTranslators = [];
- private array $combinationTranslators = [];
- private array $functionTranslators = [];
- private array $pseudoClassTranslators = [];
- private array $attributeMatchingTranslators = [];
+ private $nodeTranslators = [];
+ private $combinationTranslators = [];
+ private $functionTranslators = [];
+ private $pseudoClassTranslators = [];
+ private $attributeMatchingTranslators = [];
public function __construct(ParserInterface $parser = null)
{
@@ -117,7 +117,7 @@ class Translator implements TranslatorInterface
/**
* @return $this
*/
- public function registerExtension(Extension\ExtensionInterface $extension): static
+ public function registerExtension(Extension\ExtensionInterface $extension): self
{
$this->extensions[$extension->getName()] = $extension;
@@ -145,7 +145,7 @@ class Translator implements TranslatorInterface
/**
* @return $this
*/
- public function registerParserShortcut(ParserInterface $shortcut): static
+ public function registerParserShortcut(ParserInterface $shortcut): self
{
$this->shortcutParsers[] = $shortcut;
diff --git a/vendor/symfony/css-selector/XPath/XPathExpr.php b/vendor/symfony/css-selector/XPath/XPathExpr.php
index a76e30be..e45ce7d8 100644
--- a/vendor/symfony/css-selector/XPath/XPathExpr.php
+++ b/vendor/symfony/css-selector/XPath/XPathExpr.php
@@ -23,9 +23,9 @@ namespace Symfony\Component\CssSelector\XPath;
*/
class XPathExpr
{
- private string $path;
- private string $element;
- private string $condition;
+ private $path;
+ private $element;
+ private $condition;
public function __construct(string $path = '', string $element = '*', string $condition = '', bool $starPrefix = false)
{
@@ -46,7 +46,7 @@ class XPathExpr
/**
* @return $this
*/
- public function addCondition(string $condition): static
+ public function addCondition(string $condition): self
{
$this->condition = $this->condition ? sprintf('(%s) and (%s)', $this->condition, $condition) : $condition;
@@ -61,7 +61,7 @@ class XPathExpr
/**
* @return $this
*/
- public function addNameTest(): static
+ public function addNameTest(): self
{
if ('*' !== $this->element) {
$this->addCondition('name() = '.Translator::getXpathLiteral($this->element));
@@ -74,7 +74,7 @@ class XPathExpr
/**
* @return $this
*/
- public function addStarPrefix(): static
+ public function addStarPrefix(): self
{
$this->path .= '*/';
@@ -86,7 +86,7 @@ class XPathExpr
*
* @return $this
*/
- public function join(string $combiner, self $expr): static
+ public function join(string $combiner, self $expr): self
{
$path = $this->__toString().$combiner;
diff --git a/vendor/symfony/css-selector/composer.json b/vendor/symfony/css-selector/composer.json
index c08fdc2c..f0b71249 100644
--- a/vendor/symfony/css-selector/composer.json
+++ b/vendor/symfony/css-selector/composer.json
@@ -20,7 +20,8 @@
}
],
"require": {
- "php": ">=8.1"
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16"
},
"autoload": {
"psr-4": { "Symfony\\Component\\CssSelector\\": "" },
diff --git a/vendor/symfony/deprecation-contracts/composer.json b/vendor/symfony/deprecation-contracts/composer.json
index f5de4eb4..cc7cc123 100644
--- a/vendor/symfony/deprecation-contracts/composer.json
+++ b/vendor/symfony/deprecation-contracts/composer.json
@@ -15,7 +15,7 @@
}
],
"require": {
- "php": ">=8.1"
+ "php": ">=7.1"
},
"autoload": {
"files": [
@@ -25,7 +25,7 @@
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-main": "3.1-dev"
+ "dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
diff --git a/vendor/symfony/deprecation-contracts/function.php b/vendor/symfony/deprecation-contracts/function.php
index 2d56512b..d4371504 100644
--- a/vendor/symfony/deprecation-contracts/function.php
+++ b/vendor/symfony/deprecation-contracts/function.php
@@ -20,7 +20,7 @@ if (!function_exists('trigger_deprecation')) {
*
* @author Nicolas Grekas
*/
- function trigger_deprecation(string $package, string $version, string $message, mixed ...$args): void
+ function trigger_deprecation(string $package, string $version, string $message, ...$args): void
{
@trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED);
}
diff --git a/vendor/symfony/event-dispatcher-contracts/Event.php b/vendor/symfony/event-dispatcher-contracts/Event.php
index 384a650b..46dcb2ba 100644
--- a/vendor/symfony/event-dispatcher-contracts/Event.php
+++ b/vendor/symfony/event-dispatcher-contracts/Event.php
@@ -30,7 +30,7 @@ use Psr\EventDispatcher\StoppableEventInterface;
*/
class Event implements StoppableEventInterface
{
- private bool $propagationStopped = false;
+ private $propagationStopped = false;
/**
* {@inheritdoc}
diff --git a/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php b/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php
index 610d6ac0..351dc513 100644
--- a/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php
+++ b/vendor/symfony/event-dispatcher-contracts/EventDispatcherInterface.php
@@ -21,13 +21,11 @@ interface EventDispatcherInterface extends PsrEventDispatcherInterface
/**
* Dispatches an event to all registered listeners.
*
- * @template T of object
- *
- * @param T $event The event to pass to the event handlers/listeners
+ * @param object $event The event to pass to the event handlers/listeners
* @param string|null $eventName The name of the event to dispatch. If not supplied,
* the class of $event should be used instead.
*
- * @return T The passed $event MUST be returned
+ * @return object The passed $event MUST be returned
*/
public function dispatch(object $event, string $eventName = null): object;
}
diff --git a/vendor/symfony/event-dispatcher-contracts/composer.json b/vendor/symfony/event-dispatcher-contracts/composer.json
index 03ce8e45..660df81a 100644
--- a/vendor/symfony/event-dispatcher-contracts/composer.json
+++ b/vendor/symfony/event-dispatcher-contracts/composer.json
@@ -16,7 +16,7 @@
}
],
"require": {
- "php": ">=8.1",
+ "php": ">=7.2.5",
"psr/event-dispatcher": "^1"
},
"suggest": {
@@ -28,7 +28,7 @@
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-main": "3.1-dev"
+ "dev-main": "2.5-dev"
},
"thanks": {
"name": "symfony/contracts",
diff --git a/vendor/symfony/event-dispatcher/CHANGELOG.md b/vendor/symfony/event-dispatcher/CHANGELOG.md
index 76b2eab6..0f985989 100644
--- a/vendor/symfony/event-dispatcher/CHANGELOG.md
+++ b/vendor/symfony/event-dispatcher/CHANGELOG.md
@@ -1,11 +1,6 @@
CHANGELOG
=========
-6.0
----
-
- * Remove `LegacyEventDispatcherProxy`
-
5.4
---
diff --git a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
index 5005067e..acfbf619 100644
--- a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
+++ b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
@@ -13,7 +13,6 @@ namespace Symfony\Component\EventDispatcher\Debug;
use Psr\EventDispatcher\StoppableEventInterface;
use Psr\Log\LoggerInterface;
-use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
@@ -34,27 +33,29 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa
protected $stopwatch;
/**
- * @var \SplObjectStorage
+ *
+ * @deprecated since Symfony 5.1
+ */
+final class LegacyEventDispatcherProxy
+{
+ public static function decorate(?EventDispatcherInterface $dispatcher): ?EventDispatcherInterface
+ {
+ return $dispatcher;
+ }
+}
diff --git a/vendor/symfony/event-dispatcher/composer.json b/vendor/symfony/event-dispatcher/composer.json
index c05373f3..32b42e40 100644
--- a/vendor/symfony/event-dispatcher/composer.json
+++ b/vendor/symfony/event-dispatcher/composer.json
@@ -16,25 +16,27 @@
}
],
"require": {
- "php": ">=8.1",
- "symfony/event-dispatcher-contracts": "^2|^3"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/event-dispatcher-contracts": "^2|^3",
+ "symfony/polyfill-php80": "^1.16"
},
"require-dev": {
- "symfony/dependency-injection": "^5.4|^6.0",
- "symfony/expression-language": "^5.4|^6.0",
- "symfony/config": "^5.4|^6.0",
- "symfony/error-handler": "^5.4|^6.0",
- "symfony/http-foundation": "^5.4|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/http-foundation": "^4.4|^5.0|^6.0",
"symfony/service-contracts": "^1.1|^2|^3",
- "symfony/stopwatch": "^5.4|^6.0",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0",
"psr/log": "^1|^2|^3"
},
"conflict": {
- "symfony/dependency-injection": "<5.4"
+ "symfony/dependency-injection": "<4.4"
},
"provide": {
"psr/event-dispatcher-implementation": "1.0",
- "symfony/event-dispatcher-implementation": "2.0|3.0"
+ "symfony/event-dispatcher-implementation": "2.0"
},
"suggest": {
"symfony/dependency-injection": "",
diff --git a/vendor/symfony/options-resolver/CHANGELOG.md b/vendor/symfony/options-resolver/CHANGELOG.md
index 791a402f..84c45946 100644
--- a/vendor/symfony/options-resolver/CHANGELOG.md
+++ b/vendor/symfony/options-resolver/CHANGELOG.md
@@ -1,11 +1,6 @@
CHANGELOG
=========
-6.0
----
-
- * Remove `OptionsResolverIntrospector::getDeprecationMessage()`
-
5.3
---
diff --git a/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php b/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php
index 837fae08..95909f32 100644
--- a/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php
+++ b/vendor/symfony/options-resolver/Debug/OptionsResolverIntrospector.php
@@ -41,9 +41,11 @@ class OptionsResolverIntrospector
}
/**
+ * @return mixed
+ *
* @throws NoConfigurationException on no configured value
*/
- public function getDefault(string $option): mixed
+ public function getDefault(string $option)
{
return ($this->get)('defaults', $option, sprintf('No default value was set for the "%s" option.', $option));
}
@@ -94,6 +96,20 @@ class OptionsResolverIntrospector
return ($this->get)('normalizers', $option, sprintf('No normalizer was set for the "%s" option.', $option));
}
+ /**
+ * @return string|\Closure
+ *
+ * @throws NoConfigurationException on no configured deprecation
+ *
+ * @deprecated since Symfony 5.1, use "getDeprecation()" instead.
+ */
+ public function getDeprecationMessage(string $option)
+ {
+ trigger_deprecation('symfony/options-resolver', '5.1', 'The "%s()" method is deprecated, use "getDeprecation()" instead.', __METHOD__);
+
+ return $this->getDeprecation($option)['message'];
+ }
+
/**
* @throws NoConfigurationException on no configured deprecation
*/
diff --git a/vendor/symfony/options-resolver/OptionConfigurator.php b/vendor/symfony/options-resolver/OptionConfigurator.php
index 37d51384..62f03d06 100644
--- a/vendor/symfony/options-resolver/OptionConfigurator.php
+++ b/vendor/symfony/options-resolver/OptionConfigurator.php
@@ -32,7 +32,7 @@ final class OptionConfigurator
*
* @throws AccessException If called from a lazy option or normalizer
*/
- public function allowedTypes(string ...$types): static
+ public function allowedTypes(string ...$types): self
{
$this->resolver->setAllowedTypes($this->name, $types);
@@ -48,7 +48,7 @@ final class OptionConfigurator
*
* @throws AccessException If called from a lazy option or normalizer
*/
- public function allowedValues(mixed ...$values): static
+ public function allowedValues(...$values): self
{
$this->resolver->setAllowedValues($this->name, $values);
@@ -58,11 +58,13 @@ final class OptionConfigurator
/**
* Sets the default value for this option.
*
+ * @param mixed $value The default value of the option
+ *
* @return $this
*
* @throws AccessException If called from a lazy option or normalizer
*/
- public function default(mixed $value): static
+ public function default($value): self
{
$this->resolver->setDefault($this->name, $value);
@@ -86,7 +88,7 @@ final class OptionConfigurator
*
* @return $this
*/
- public function deprecated(string $package, string $version, string|\Closure $message = 'The option "%name%" is deprecated.'): static
+ public function deprecated(string $package, string $version, $message = 'The option "%name%" is deprecated.'): self
{
$this->resolver->setDeprecated($this->name, $package, $version, $message);
@@ -100,7 +102,7 @@ final class OptionConfigurator
*
* @throws AccessException If called from a lazy option or normalizer
*/
- public function normalize(\Closure $normalizer): static
+ public function normalize(\Closure $normalizer): self
{
$this->resolver->setNormalizer($this->name, $normalizer);
@@ -114,7 +116,7 @@ final class OptionConfigurator
*
* @throws AccessException If called from a lazy option or normalizer
*/
- public function required(): static
+ public function required(): self
{
$this->resolver->setRequired($this->name);
@@ -128,7 +130,7 @@ final class OptionConfigurator
*
* @throws AccessException If called from a lazy option or normalizer
*/
- public function info(string $info): static
+ public function info(string $info): self
{
$this->resolver->setInfo($this->name, $info);
diff --git a/vendor/symfony/options-resolver/OptionsResolver.php b/vendor/symfony/options-resolver/OptionsResolver.php
index 205c15b4..3db291f9 100644
--- a/vendor/symfony/options-resolver/OptionsResolver.php
+++ b/vendor/symfony/options-resolver/OptionsResolver.php
@@ -187,11 +187,14 @@ class OptionsResolver implements Options
* // 'default' === $parent['connection']
* }
*
+ * @param string $option The name of the option
+ * @param mixed $value The default value of the option
+ *
* @return $this
*
* @throws AccessException If called from a lazy option or normalizer
*/
- public function setDefault(string $option, mixed $value): static
+ public function setDefault(string $option, $value)
{
// Setting is not possible once resolving starts, because then lazy
// options could manipulate the state of the object, leading to
@@ -262,7 +265,7 @@ class OptionsResolver implements Options
*
* @throws AccessException If called from a lazy option or normalizer
*/
- public function setDefaults(array $defaults): static
+ public function setDefaults(array $defaults)
{
foreach ($defaults as $option => $value) {
$this->setDefault($option, $value);
@@ -276,8 +279,10 @@ class OptionsResolver implements Options
*
* Returns true if {@link setDefault()} was called for this option.
* An option is also considered set if it was set to null.
+ *
+ * @return bool
*/
- public function hasDefault(string $option): bool
+ public function hasDefault(string $option)
{
return \array_key_exists($option, $this->defaults);
}
@@ -291,7 +296,7 @@ class OptionsResolver implements Options
*
* @throws AccessException If called from a lazy option or normalizer
*/
- public function setRequired(string|array $optionNames): static
+ public function setRequired($optionNames)
{
if ($this->locked) {
throw new AccessException('Options cannot be made required from a lazy option or normalizer.');
@@ -309,8 +314,10 @@ class OptionsResolver implements Options
* Returns whether an option is required.
*
* An option is required if it was passed to {@link setRequired()}.
+ *
+ * @return bool
*/
- public function isRequired(string $option): bool
+ public function isRequired(string $option)
{
return isset($this->required[$option]);
}
@@ -322,7 +329,7 @@ class OptionsResolver implements Options
*
* @see isRequired()
*/
- public function getRequiredOptions(): array
+ public function getRequiredOptions()
{
return array_keys($this->required);
}
@@ -333,8 +340,10 @@ class OptionsResolver implements Options
* An option is missing if it was passed to {@link setRequired()}, but not
* to {@link setDefault()}. This option must be passed explicitly to
* {@link resolve()}, otherwise an exception will be thrown.
+ *
+ * @return bool
*/
- public function isMissing(string $option): bool
+ public function isMissing(string $option)
{
return isset($this->required[$option]) && !\array_key_exists($option, $this->defaults);
}
@@ -344,7 +353,7 @@ class OptionsResolver implements Options
*
* @return string[]
*/
- public function getMissingOptions(): array
+ public function getMissingOptions()
{
return array_keys(array_diff_key($this->required, $this->defaults));
}
@@ -362,7 +371,7 @@ class OptionsResolver implements Options
*
* @throws AccessException If called from a lazy option or normalizer
*/
- public function setDefined(string|array $optionNames): static
+ public function setDefined($optionNames)
{
if ($this->locked) {
throw new AccessException('Options cannot be defined from a lazy option or normalizer.');
@@ -380,8 +389,10 @@ class OptionsResolver implements Options
*
* Returns true for any option passed to {@link setDefault()},
* {@link setRequired()} or {@link setDefined()}.
+ *
+ * @return bool
*/
- public function isDefined(string $option): bool
+ public function isDefined(string $option)
{
return isset($this->defined[$option]);
}
@@ -393,7 +404,7 @@ class OptionsResolver implements Options
*
* @see isDefined()
*/
- public function getDefinedOptions(): array
+ public function getDefinedOptions()
{
return array_keys($this->defined);
}
@@ -426,7 +437,7 @@ class OptionsResolver implements Options
*
* @return $this
*/
- public function setDeprecated(string $option, string $package, string $version, string|\Closure $message = 'The option "%name%" is deprecated.'): static
+ public function setDeprecated(string $option/* , string $package, string $version, $message = 'The option "%name%" is deprecated.' */): self
{
if ($this->locked) {
throw new AccessException('Options cannot be deprecated from a lazy option or normalizer.');
@@ -436,6 +447,19 @@ class OptionsResolver implements Options
throw new UndefinedOptionsException(sprintf('The option "%s" does not exist, defined options are: "%s".', $this->formatOptions([$option]), implode('", "', array_keys($this->defined))));
}
+ $args = \func_get_args();
+
+ if (\func_num_args() < 3) {
+ trigger_deprecation('symfony/options-resolver', '5.1', 'The signature of method "%s()" requires 2 new arguments: "string $package, string $version", not defining them is deprecated.', __METHOD__);
+
+ $message = $args[1] ?? 'The option "%name%" is deprecated.';
+ $package = $version = '';
+ } else {
+ $package = $args[1];
+ $version = $args[2];
+ $message = $args[3] ?? 'The option "%name%" is deprecated.';
+ }
+
if (!\is_string($message) && !$message instanceof \Closure) {
throw new InvalidArgumentException(sprintf('Invalid type for deprecation message argument, expected string or \Closure, but got "%s".', get_debug_type($message)));
}
@@ -526,7 +550,7 @@ class OptionsResolver implements Options
* @throws UndefinedOptionsException If the option is undefined
* @throws AccessException If called from a lazy option or normalizer
*/
- public function addNormalizer(string $option, \Closure $normalizer, bool $forcePrepend = false): static
+ public function addNormalizer(string $option, \Closure $normalizer, bool $forcePrepend = false): self
{
if ($this->locked) {
throw new AccessException('Normalizers cannot be set from a lazy option or normalizer.');
@@ -562,14 +586,15 @@ class OptionsResolver implements Options
* The closure receives the value as argument and should return true to
* accept the value and false to reject the value.
*
- * @param mixed $allowedValues One or more acceptable values/closures
+ * @param string $option The option name
+ * @param mixed $allowedValues One or more acceptable values/closures
*
* @return $this
*
* @throws UndefinedOptionsException If the option is undefined
* @throws AccessException If called from a lazy option or normalizer
*/
- public function setAllowedValues(string $option, mixed $allowedValues)
+ public function setAllowedValues(string $option, $allowedValues)
{
if ($this->locked) {
throw new AccessException('Allowed values cannot be set from a lazy option or normalizer.');
@@ -602,14 +627,15 @@ class OptionsResolver implements Options
* The closure receives the value as argument and should return true to
* accept the value and false to reject the value.
*
- * @param mixed $allowedValues One or more acceptable values/closures
+ * @param string $option The option name
+ * @param mixed $allowedValues One or more acceptable values/closures
*
* @return $this
*
* @throws UndefinedOptionsException If the option is undefined
* @throws AccessException If called from a lazy option or normalizer
*/
- public function addAllowedValues(string $option, mixed $allowedValues)
+ public function addAllowedValues(string $option, $allowedValues)
{
if ($this->locked) {
throw new AccessException('Allowed values cannot be added from a lazy option or normalizer.');
@@ -649,7 +675,7 @@ class OptionsResolver implements Options
* @throws UndefinedOptionsException If the option is undefined
* @throws AccessException If called from a lazy option or normalizer
*/
- public function setAllowedTypes(string $option, string|array $allowedTypes)
+ public function setAllowedTypes(string $option, $allowedTypes)
{
if ($this->locked) {
throw new AccessException('Allowed types cannot be set from a lazy option or normalizer.');
@@ -683,7 +709,7 @@ class OptionsResolver implements Options
* @throws UndefinedOptionsException If the option is undefined
* @throws AccessException If called from a lazy option or normalizer
*/
- public function addAllowedTypes(string $option, string|array $allowedTypes)
+ public function addAllowedTypes(string $option, $allowedTypes)
{
if ($this->locked) {
throw new AccessException('Allowed types cannot be added from a lazy option or normalizer.');
@@ -725,7 +751,7 @@ class OptionsResolver implements Options
* @throws UndefinedOptionsException If the option is undefined
* @throws AccessException If called from a lazy option or normalizer
*/
- public function setInfo(string $option, string $info): static
+ public function setInfo(string $option, string $info): self
{
if ($this->locked) {
throw new AccessException('The Info message cannot be set from a lazy option or normalizer.');
@@ -759,7 +785,7 @@ class OptionsResolver implements Options
*
* @throws AccessException If called from a lazy option, a normalizer or a root definition
*/
- public function setPrototype(bool $prototype): static
+ public function setPrototype(bool $prototype): self
{
if ($this->locked) {
throw new AccessException('The prototype property cannot be set from a lazy option or normalizer.');
@@ -790,7 +816,7 @@ class OptionsResolver implements Options
*
* @throws AccessException If called from a lazy option or normalizer
*/
- public function remove(string|array $optionNames): static
+ public function remove($optionNames)
{
if ($this->locked) {
throw new AccessException('Options cannot be removed from a lazy option or normalizer.');
@@ -811,7 +837,7 @@ class OptionsResolver implements Options
*
* @throws AccessException If called from a lazy option or normalizer
*/
- public function clear(): static
+ public function clear()
{
if ($this->locked) {
throw new AccessException('Options cannot be cleared from a lazy option or normalizer.');
@@ -843,6 +869,8 @@ class OptionsResolver implements Options
* - Options have invalid types;
* - Options have invalid values.
*
+ * @return array
+ *
* @throws UndefinedOptionsException If an option name is undefined
* @throws InvalidOptionsException If an option doesn't fulfill the
* specified validation rules
@@ -852,7 +880,7 @@ class OptionsResolver implements Options
* @throws NoSuchOptionException If a lazy option reads an unavailable option
* @throws AccessException If called from a lazy option or normalizer
*/
- public function resolve(array $options = []): array
+ public function resolve(array $options = [])
{
if ($this->locked) {
throw new AccessException('Options cannot be resolved from a lazy option or normalizer.');
@@ -904,6 +932,8 @@ class OptionsResolver implements Options
*
* @param bool $triggerDeprecation Whether to trigger the deprecation or not (true by default)
*
+ * @return mixed
+ *
* @throws AccessException If accessing this method outside of
* {@link resolve()}
* @throws NoSuchOptionException If the option is not set
@@ -912,7 +942,8 @@ class OptionsResolver implements Options
* @throws OptionDefinitionException If there is a cyclic dependency between
* lazy options and/or normalizers
*/
- public function offsetGet(mixed $option, bool $triggerDeprecation = true): mixed
+ #[\ReturnTypeWillChange]
+ public function offsetGet($option, bool $triggerDeprecation = true)
{
if (!$this->locked) {
throw new AccessException('Array access is only supported within closures of lazy options and normalizers.');
@@ -1132,9 +1163,9 @@ class OptionsResolver implements Options
return $value;
}
- private function verifyTypes(string $type, mixed $value, array &$invalidTypes, int $level = 0): bool
+ private function verifyTypes(string $type, $value, array &$invalidTypes, int $level = 0): bool
{
- if (\is_array($value) && str_ends_with($type, '[]')) {
+ if (\is_array($value) && '[]' === substr($type, -2)) {
$type = substr($type, 0, -2);
$valid = true;
@@ -1161,11 +1192,16 @@ class OptionsResolver implements Options
/**
* Returns whether a resolved option with the given name exists.
*
+ * @param string $option The option name
+ *
+ * @return bool
+ *
* @throws AccessException If accessing this method outside of {@link resolve()}
*
* @see \ArrayAccess::offsetExists()
*/
- public function offsetExists(mixed $option): bool
+ #[\ReturnTypeWillChange]
+ public function offsetExists($option)
{
if (!$this->locked) {
throw new AccessException('Array access is only supported within closures of lazy options and normalizers.');
@@ -1177,9 +1213,12 @@ class OptionsResolver implements Options
/**
* Not supported.
*
+ * @return void
+ *
* @throws AccessException
*/
- public function offsetSet(mixed $option, mixed $value): void
+ #[\ReturnTypeWillChange]
+ public function offsetSet($option, $value)
{
throw new AccessException('Setting options via array access is not supported. Use setDefault() instead.');
}
@@ -1187,9 +1226,12 @@ class OptionsResolver implements Options
/**
* Not supported.
*
+ * @return void
+ *
* @throws AccessException
*/
- public function offsetUnset(mixed $option): void
+ #[\ReturnTypeWillChange]
+ public function offsetUnset($option)
{
throw new AccessException('Removing options via array access is not supported. Use remove() instead.');
}
@@ -1199,11 +1241,14 @@ class OptionsResolver implements Options
*
* This may be only a subset of the defined options.
*
+ * @return int
+ *
* @throws AccessException If accessing this method outside of {@link resolve()}
*
* @see \Countable::count()
*/
- public function count(): int
+ #[\ReturnTypeWillChange]
+ public function count()
{
if (!$this->locked) {
throw new AccessException('Counting is only supported within closures of lazy options and normalizers.');
@@ -1218,8 +1263,10 @@ class OptionsResolver implements Options
* This method returns the equivalent PHP tokens for most scalar types
* (i.e. "false" for false, "1" for 1 etc.). Strings are always wrapped
* in double quotes (").
+ *
+ * @param mixed $value The value to format as string
*/
- private function formatValue(mixed $value): string
+ private function formatValue($value): string
{
if (\is_object($value)) {
return \get_class($value);
diff --git a/vendor/symfony/options-resolver/composer.json b/vendor/symfony/options-resolver/composer.json
index 3355b24e..a38d1bd0 100644
--- a/vendor/symfony/options-resolver/composer.json
+++ b/vendor/symfony/options-resolver/composer.json
@@ -16,8 +16,10 @@
}
],
"require": {
- "php": ">=8.1",
- "symfony/deprecation-contracts": "^2.1|^3"
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php73": "~1.0",
+ "symfony/polyfill-php80": "^1.16"
},
"autoload": {
"psr-4": { "Symfony\\Component\\OptionsResolver\\": "" },
diff --git a/vendor/symfony/string/AbstractString.php b/vendor/symfony/string/AbstractString.php
index 29322127..13567c7b 100644
--- a/vendor/symfony/string/AbstractString.php
+++ b/vendor/symfony/string/AbstractString.php
@@ -74,7 +74,7 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
foreach ($values as $k => $v) {
if (\is_string($k) && '' !== $k && $k !== $j = (string) new static($k)) {
- $keys ??= array_keys($values);
+ $keys = $keys ?? array_keys($values);
$keys[$i] = $j;
}
@@ -92,17 +92,15 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
/**
* @param string|string[] $needle
+ *
+ * @return static
*/
- public function after(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static
+ public function after($needle, bool $includeNeedle = false, int $offset = 0): self
{
$str = clone $this;
$i = \PHP_INT_MAX;
- if (\is_string($needle)) {
- $needle = [$needle];
- }
-
- foreach ($needle as $n) {
+ foreach ((array) $needle as $n) {
$n = (string) $n;
$j = $this->indexOf($n, $offset);
@@ -125,17 +123,15 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
/**
* @param string|string[] $needle
+ *
+ * @return static
*/
- public function afterLast(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static
+ public function afterLast($needle, bool $includeNeedle = false, int $offset = 0): self
{
$str = clone $this;
$i = null;
- if (\is_string($needle)) {
- $needle = [$needle];
- }
-
- foreach ($needle as $n) {
+ foreach ((array) $needle as $n) {
$n = (string) $n;
$j = $this->indexOfLast($n, $offset);
@@ -156,21 +152,22 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
return $this->slice($i);
}
- abstract public function append(string ...$suffix): static;
+ /**
+ * @return static
+ */
+ abstract public function append(string ...$suffix): self;
/**
* @param string|string[] $needle
+ *
+ * @return static
*/
- public function before(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static
+ public function before($needle, bool $includeNeedle = false, int $offset = 0): self
{
$str = clone $this;
$i = \PHP_INT_MAX;
- if (\is_string($needle)) {
- $needle = [$needle];
- }
-
- foreach ($needle as $n) {
+ foreach ((array) $needle as $n) {
$n = (string) $n;
$j = $this->indexOf($n, $offset);
@@ -193,17 +190,15 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
/**
* @param string|string[] $needle
+ *
+ * @return static
*/
- public function beforeLast(string|iterable $needle, bool $includeNeedle = false, int $offset = 0): static
+ public function beforeLast($needle, bool $includeNeedle = false, int $offset = 0): self
{
$str = clone $this;
$i = null;
- if (\is_string($needle)) {
- $needle = [$needle];
- }
-
- foreach ($needle as $n) {
+ foreach ((array) $needle as $n) {
$n = (string) $n;
$j = $this->indexOfLast($n, $offset);
@@ -234,14 +229,20 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
return '' === $str->string ? [] : array_values(unpack('C*', $str->string));
}
- abstract public function camel(): static;
+ /**
+ * @return static
+ */
+ abstract public function camel(): self;
/**
* @return static[]
*/
abstract public function chunk(int $length = 1): array;
- public function collapseWhitespace(): static
+ /**
+ * @return static
+ */
+ public function collapseWhitespace(): self
{
$str = clone $this;
$str->string = trim(preg_replace("/(?:[ \n\r\t\x0C]{2,}+|[\n\r\t\x0C])/", ' ', $str->string), " \n\r\t\x0C");
@@ -252,7 +253,7 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
/**
* @param string|string[] $needle
*/
- public function containsAny(string|iterable $needle): bool
+ public function containsAny($needle): bool
{
return null !== $this->indexOf($needle);
}
@@ -260,9 +261,9 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
/**
* @param string|string[] $suffix
*/
- public function endsWith(string|iterable $suffix): bool
+ public function endsWith($suffix): bool
{
- if (\is_string($suffix)) {
+ if (!\is_array($suffix) && !$suffix instanceof \Traversable) {
throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
}
@@ -275,7 +276,10 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
return false;
}
- public function ensureEnd(string $suffix): static
+ /**
+ * @return static
+ */
+ public function ensureEnd(string $suffix): self
{
if (!$this->endsWith($suffix)) {
return $this->append($suffix);
@@ -287,7 +291,10 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
return $this->replaceMatches($regex.($this->ignoreCase ? 'i' : ''), '$1');
}
- public function ensureStart(string $prefix): static
+ /**
+ * @return static
+ */
+ public function ensureStart(string $prefix): self
{
$prefix = new static($prefix);
@@ -309,9 +316,9 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
/**
* @param string|string[] $string
*/
- public function equalsTo(string|iterable $string): bool
+ public function equalsTo($string): bool
{
- if (\is_string($string)) {
+ if (!\is_array($string) && !$string instanceof \Traversable) {
throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
}
@@ -324,9 +331,15 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
return false;
}
- abstract public function folded(): static;
+ /**
+ * @return static
+ */
+ abstract public function folded(): self;
- public function ignoreCase(): static
+ /**
+ * @return static
+ */
+ public function ignoreCase(): self
{
$str = clone $this;
$str->ignoreCase = true;
@@ -337,9 +350,9 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
/**
* @param string|string[] $needle
*/
- public function indexOf(string|iterable $needle, int $offset = 0): ?int
+ public function indexOf($needle, int $offset = 0): ?int
{
- if (\is_string($needle)) {
+ if (!\is_array($needle) && !$needle instanceof \Traversable) {
throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
}
@@ -359,9 +372,9 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
/**
* @param string|string[] $needle
*/
- public function indexOfLast(string|iterable $needle, int $offset = 0): ?int
+ public function indexOfLast($needle, int $offset = 0): ?int
{
- if (\is_string($needle)) {
+ if (!\is_array($needle) && !$needle instanceof \Traversable) {
throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
}
@@ -383,7 +396,10 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
return '' === $this->string;
}
- abstract public function join(array $strings, string $lastGlue = null): static;
+ /**
+ * @return static
+ */
+ abstract public function join(array $strings, string $lastGlue = null): self;
public function jsonSerialize(): string
{
@@ -392,7 +408,10 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
abstract public function length(): int;
- abstract public function lower(): static;
+ /**
+ * @return static
+ */
+ abstract public function lower(): self;
/**
* Matches the string using a regular expression.
@@ -403,15 +422,30 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
*/
abstract public function match(string $regexp, int $flags = 0, int $offset = 0): array;
- abstract public function padBoth(int $length, string $padStr = ' '): static;
+ /**
+ * @return static
+ */
+ abstract public function padBoth(int $length, string $padStr = ' '): self;
- abstract public function padEnd(int $length, string $padStr = ' '): static;
+ /**
+ * @return static
+ */
+ abstract public function padEnd(int $length, string $padStr = ' '): self;
- abstract public function padStart(int $length, string $padStr = ' '): static;
+ /**
+ * @return static
+ */
+ abstract public function padStart(int $length, string $padStr = ' '): self;
- abstract public function prepend(string ...$prefix): static;
+ /**
+ * @return static
+ */
+ abstract public function prepend(string ...$prefix): self;
- public function repeat(int $multiplier): static
+ /**
+ * @return static
+ */
+ public function repeat(int $multiplier): self
{
if (0 > $multiplier) {
throw new InvalidArgumentException(sprintf('Multiplier must be positive, %d given.', $multiplier));
@@ -423,17 +457,37 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
return $str;
}
- abstract public function replace(string $from, string $to): static;
+ /**
+ * @return static
+ */
+ abstract public function replace(string $from, string $to): self;
- abstract public function replaceMatches(string $fromRegexp, string|callable $to): static;
+ /**
+ * @param string|callable $to
+ *
+ * @return static
+ */
+ abstract public function replaceMatches(string $fromRegexp, $to): self;
- abstract public function reverse(): static;
+ /**
+ * @return static
+ */
+ abstract public function reverse(): self;
- abstract public function slice(int $start = 0, int $length = null): static;
+ /**
+ * @return static
+ */
+ abstract public function slice(int $start = 0, int $length = null): self;
- abstract public function snake(): static;
+ /**
+ * @return static
+ */
+ abstract public function snake(): self;
- abstract public function splice(string $replacement, int $start = 0, int $length = null): static;
+ /**
+ * @return static
+ */
+ abstract public function splice(string $replacement, int $start = 0, int $length = null): self;
/**
* @return static[]
@@ -455,7 +509,7 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
$lastError = preg_last_error();
foreach (get_defined_constants(true)['pcre'] as $k => $v) {
- if ($lastError === $v && str_ends_with($k, '_ERROR')) {
+ if ($lastError === $v && '_ERROR' === substr($k, -6)) {
throw new RuntimeException('Splitting failed with '.$k.'.');
}
}
@@ -486,9 +540,9 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
/**
* @param string|string[] $prefix
*/
- public function startsWith(string|iterable $prefix): bool
+ public function startsWith($prefix): bool
{
- if (\is_string($prefix)) {
+ if (!\is_array($prefix) && !$prefix instanceof \Traversable) {
throw new \TypeError(sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class));
}
@@ -501,7 +555,10 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
return false;
}
- abstract public function title(bool $allWords = false): static;
+ /**
+ * @return static
+ */
+ abstract public function title(bool $allWords = false): self;
public function toByteString(string $toEncoding = null): ByteString
{
@@ -549,16 +606,24 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
return new UnicodeString($this->string);
}
- abstract public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static;
+ /**
+ * @return static
+ */
+ abstract public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self;
- abstract public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static;
+ /**
+ * @return static
+ */
+ abstract public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self;
/**
* @param string|string[] $prefix
+ *
+ * @return static
*/
- public function trimPrefix($prefix): static
+ public function trimPrefix($prefix): self
{
- if (\is_array($prefix) || $prefix instanceof \Traversable) { // don't use is_iterable(), it's slow
+ if (\is_array($prefix) || $prefix instanceof \Traversable) {
foreach ($prefix as $s) {
$t = $this->trimPrefix($s);
@@ -585,14 +650,19 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
return $str;
}
- abstract public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static;
+ /**
+ * @return static
+ */
+ abstract public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): self;
/**
* @param string|string[] $suffix
+ *
+ * @return static
*/
- public function trimSuffix($suffix): static
+ public function trimSuffix($suffix): self
{
- if (\is_array($suffix) || $suffix instanceof \Traversable) { // don't use is_iterable(), it's slow
+ if (\is_array($suffix) || $suffix instanceof \Traversable) {
foreach ($suffix as $s) {
$t = $this->trimSuffix($s);
@@ -619,7 +689,10 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
return $str;
}
- public function truncate(int $length, string $ellipsis = '', bool $cut = true): static
+ /**
+ * @return static
+ */
+ public function truncate(int $length, string $ellipsis = '', bool $cut = true): self
{
$stringLength = $this->length();
@@ -646,14 +719,20 @@ abstract class AbstractString implements \Stringable, \JsonSerializable
return $ellipsisLength ? $str->trimEnd()->append($ellipsis) : $str;
}
- abstract public function upper(): static;
+ /**
+ * @return static
+ */
+ abstract public function upper(): self;
/**
* Returns the printable length on a terminal.
*/
abstract public function width(bool $ignoreAnsiDecoration = true): int;
- public function wordwrap(int $width = 75, string $break = "\n", bool $cut = false): static
+ /**
+ * @return static
+ */
+ public function wordwrap(int $width = 75, string $break = "\n", bool $cut = false): self
{
$lines = '' !== $break ? $this->split($break) : [clone $this];
$chars = [];
diff --git a/vendor/symfony/string/AbstractUnicodeString.php b/vendor/symfony/string/AbstractUnicodeString.php
index 68c59e34..1bc6f88f 100644
--- a/vendor/symfony/string/AbstractUnicodeString.php
+++ b/vendor/symfony/string/AbstractUnicodeString.php
@@ -52,7 +52,10 @@ abstract class AbstractUnicodeString extends AbstractString
private static $tableZero;
private static $tableWide;
- public static function fromCodePoints(int ...$codes): static
+ /**
+ * @return static
+ */
+ public static function fromCodePoints(int ...$codes): self
{
$string = '';
@@ -156,7 +159,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function camel(): static
+ public function camel(): parent
{
$str = clone $this;
$str->string = str_replace(' ', '', preg_replace_callback('/\b.(?![A-Z]{2,})/u', static function ($m) use (&$i) {
@@ -186,11 +189,11 @@ abstract class AbstractUnicodeString extends AbstractString
return $codePoints;
}
- public function folded(bool $compat = true): static
+ public function folded(bool $compat = true): parent
{
$str = clone $this;
- if (!$compat || !\defined('Normalizer::NFKC_CF')) {
+ if (!$compat || \PHP_VERSION_ID < 70300 || !\defined('Normalizer::NFKC_CF')) {
$str->string = normalizer_normalize($str->string, $compat ? \Normalizer::NFKC : \Normalizer::NFC);
$str->string = mb_strtolower(str_replace(self::FOLD_FROM, self::FOLD_TO, $this->string), 'UTF-8');
} else {
@@ -200,7 +203,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function join(array $strings, string $lastGlue = null): static
+ public function join(array $strings, string $lastGlue = null): parent
{
$str = clone $this;
@@ -214,7 +217,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function lower(): static
+ public function lower(): parent
{
$str = clone $this;
$str->string = mb_strtolower(str_replace('İ', 'i̇', $str->string), 'UTF-8');
@@ -237,7 +240,7 @@ abstract class AbstractUnicodeString extends AbstractString
$lastError = preg_last_error();
foreach (get_defined_constants(true)['pcre'] as $k => $v) {
- if ($lastError === $v && str_ends_with($k, '_ERROR')) {
+ if ($lastError === $v && '_ERROR' === substr($k, -6)) {
throw new RuntimeException('Matching failed with '.$k.'.');
}
}
@@ -251,7 +254,10 @@ abstract class AbstractUnicodeString extends AbstractString
return $matches;
}
- public function normalize(int $form = self::NFC): static
+ /**
+ * @return static
+ */
+ public function normalize(int $form = self::NFC): self
{
if (!\in_array($form, [self::NFC, self::NFD, self::NFKC, self::NFKD])) {
throw new InvalidArgumentException('Unsupported normalization form.');
@@ -263,7 +269,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function padBoth(int $length, string $padStr = ' '): static
+ public function padBoth(int $length, string $padStr = ' '): parent
{
if ('' === $padStr || !preg_match('//u', $padStr)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
@@ -275,7 +281,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $this->pad($length, $pad, \STR_PAD_BOTH);
}
- public function padEnd(int $length, string $padStr = ' '): static
+ public function padEnd(int $length, string $padStr = ' '): parent
{
if ('' === $padStr || !preg_match('//u', $padStr)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
@@ -287,7 +293,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $this->pad($length, $pad, \STR_PAD_RIGHT);
}
- public function padStart(int $length, string $padStr = ' '): static
+ public function padStart(int $length, string $padStr = ' '): parent
{
if ('' === $padStr || !preg_match('//u', $padStr)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
@@ -299,13 +305,17 @@ abstract class AbstractUnicodeString extends AbstractString
return $this->pad($length, $pad, \STR_PAD_LEFT);
}
- public function replaceMatches(string $fromRegexp, string|callable $to): static
+ public function replaceMatches(string $fromRegexp, $to): parent
{
if ($this->ignoreCase) {
$fromRegexp .= 'i';
}
if (\is_array($to) || $to instanceof \Closure) {
+ if (!\is_callable($to)) {
+ throw new \TypeError(sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class));
+ }
+
$replace = 'preg_replace_callback';
$to = static function (array $m) use ($to): string {
$to = $to($m);
@@ -329,7 +339,7 @@ abstract class AbstractUnicodeString extends AbstractString
$lastError = preg_last_error();
foreach (get_defined_constants(true)['pcre'] as $k => $v) {
- if ($lastError === $v && str_ends_with($k, '_ERROR')) {
+ if ($lastError === $v && '_ERROR' === substr($k, -6)) {
throw new RuntimeException('Matching failed with '.$k.'.');
}
}
@@ -346,7 +356,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function reverse(): static
+ public function reverse(): parent
{
$str = clone $this;
$str->string = implode('', array_reverse(preg_split('/(\X)/u', $str->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY)));
@@ -354,7 +364,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function snake(): static
+ public function snake(): parent
{
$str = $this->camel();
$str->string = mb_strtolower(preg_replace(['/(\p{Lu}+)(\p{Lu}\p{Ll})/u', '/([\p{Ll}0-9])(\p{Lu})/u'], '\1_\2', $str->string), 'UTF-8');
@@ -362,7 +372,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function title(bool $allWords = false): static
+ public function title(bool $allWords = false): parent
{
$str = clone $this;
@@ -375,7 +385,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static
+ public function trim(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent
{
if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) {
throw new InvalidArgumentException('Invalid UTF-8 chars.');
@@ -388,7 +398,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static
+ public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent
{
if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) {
throw new InvalidArgumentException('Invalid UTF-8 chars.');
@@ -401,7 +411,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function trimPrefix($prefix): static
+ public function trimPrefix($prefix): parent
{
if (!$this->ignoreCase) {
return parent::trimPrefix($prefix);
@@ -421,7 +431,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): static
+ public function trimStart(string $chars = " \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}"): parent
{
if (" \t\n\r\0\x0B\x0C\u{A0}\u{FEFF}" !== $chars && !preg_match('//u', $chars)) {
throw new InvalidArgumentException('Invalid UTF-8 chars.');
@@ -434,7 +444,7 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function trimSuffix($suffix): static
+ public function trimSuffix($suffix): parent
{
if (!$this->ignoreCase) {
return parent::trimSuffix($suffix);
@@ -454,11 +464,15 @@ abstract class AbstractUnicodeString extends AbstractString
return $str;
}
- public function upper(): static
+ public function upper(): parent
{
$str = clone $this;
$str->string = mb_strtoupper($str->string, 'UTF-8');
+ if (\PHP_VERSION_ID < 70300) {
+ $str->string = str_replace(self::UPPER_FROM, self::UPPER_TO, $str->string);
+ }
+
return $str;
}
@@ -467,7 +481,7 @@ abstract class AbstractUnicodeString extends AbstractString
$width = 0;
$s = str_replace(["\x00", "\x05", "\x07"], '', $this->string);
- if (str_contains($s, "\r")) {
+ if (false !== strpos($s, "\r")) {
$s = str_replace(["\r\n", "\r"], "\n", $s);
}
@@ -494,7 +508,10 @@ abstract class AbstractUnicodeString extends AbstractString
return $width;
}
- private function pad(int $len, self $pad, int $type): static
+ /**
+ * @return static
+ */
+ private function pad(int $len, self $pad, int $type): parent
{
$sLen = $this->length();
diff --git a/vendor/symfony/string/ByteString.php b/vendor/symfony/string/ByteString.php
index 1f8a76ea..626d8c1b 100644
--- a/vendor/symfony/string/ByteString.php
+++ b/vendor/symfony/string/ByteString.php
@@ -48,7 +48,7 @@ class ByteString extends AbstractString
throw new InvalidArgumentException(sprintf('A strictly positive length is expected, "%d" given.', $length));
}
- $alphabet ??= self::ALPHABET_ALPHANUMERIC;
+ $alphabet = $alphabet ?? self::ALPHABET_ALPHANUMERIC;
$alphabetSize = \strlen($alphabet);
$bits = (int) ceil(log($alphabetSize, 2.0));
if ($bits <= 0 || $bits > 56) {
@@ -92,7 +92,7 @@ class ByteString extends AbstractString
return '' === $str ? [] : [\ord($str)];
}
- public function append(string ...$suffix): static
+ public function append(string ...$suffix): parent
{
$str = clone $this;
$str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix);
@@ -100,7 +100,7 @@ class ByteString extends AbstractString
return $str;
}
- public function camel(): static
+ public function camel(): parent
{
$str = clone $this;
@@ -132,23 +132,27 @@ class ByteString extends AbstractString
return $chunks;
}
- public function endsWith(string|iterable|AbstractString $suffix): bool
+ public function endsWith($suffix): bool
{
- if ($suffix instanceof AbstractString) {
+ if ($suffix instanceof parent) {
$suffix = $suffix->string;
- } elseif (!\is_string($suffix)) {
+ } elseif (\is_array($suffix) || $suffix instanceof \Traversable) {
return parent::endsWith($suffix);
+ } else {
+ $suffix = (string) $suffix;
}
return '' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase);
}
- public function equalsTo(string|iterable|AbstractString $string): bool
+ public function equalsTo($string): bool
{
- if ($string instanceof AbstractString) {
+ if ($string instanceof parent) {
$string = $string->string;
- } elseif (!\is_string($string)) {
+ } elseif (\is_array($string) || $string instanceof \Traversable) {
return parent::equalsTo($string);
+ } else {
+ $string = (string) $string;
}
if ('' !== $string && $this->ignoreCase) {
@@ -158,7 +162,7 @@ class ByteString extends AbstractString
return $string === $this->string;
}
- public function folded(): static
+ public function folded(): parent
{
$str = clone $this;
$str->string = strtolower($str->string);
@@ -166,12 +170,14 @@ class ByteString extends AbstractString
return $str;
}
- public function indexOf(string|iterable|AbstractString $needle, int $offset = 0): ?int
+ public function indexOf($needle, int $offset = 0): ?int
{
- if ($needle instanceof AbstractString) {
+ if ($needle instanceof parent) {
$needle = $needle->string;
- } elseif (!\is_string($needle)) {
+ } elseif (\is_array($needle) || $needle instanceof \Traversable) {
return parent::indexOf($needle, $offset);
+ } else {
+ $needle = (string) $needle;
}
if ('' === $needle) {
@@ -183,12 +189,14 @@ class ByteString extends AbstractString
return false === $i ? null : $i;
}
- public function indexOfLast(string|iterable|AbstractString $needle, int $offset = 0): ?int
+ public function indexOfLast($needle, int $offset = 0): ?int
{
- if ($needle instanceof AbstractString) {
+ if ($needle instanceof parent) {
$needle = $needle->string;
- } elseif (!\is_string($needle)) {
+ } elseif (\is_array($needle) || $needle instanceof \Traversable) {
return parent::indexOfLast($needle, $offset);
+ } else {
+ $needle = (string) $needle;
}
if ('' === $needle) {
@@ -205,7 +213,7 @@ class ByteString extends AbstractString
return '' === $this->string || preg_match('//u', $this->string);
}
- public function join(array $strings, string $lastGlue = null): static
+ public function join(array $strings, string $lastGlue = null): parent
{
$str = clone $this;
@@ -220,7 +228,7 @@ class ByteString extends AbstractString
return \strlen($this->string);
}
- public function lower(): static
+ public function lower(): parent
{
$str = clone $this;
$str->string = strtolower($str->string);
@@ -243,7 +251,7 @@ class ByteString extends AbstractString
$lastError = preg_last_error();
foreach (get_defined_constants(true)['pcre'] as $k => $v) {
- if ($lastError === $v && str_ends_with($k, '_ERROR')) {
+ if ($lastError === $v && '_ERROR' === substr($k, -6)) {
throw new RuntimeException('Matching failed with '.$k.'.');
}
}
@@ -257,7 +265,7 @@ class ByteString extends AbstractString
return $matches;
}
- public function padBoth(int $length, string $padStr = ' '): static
+ public function padBoth(int $length, string $padStr = ' '): parent
{
$str = clone $this;
$str->string = str_pad($this->string, $length, $padStr, \STR_PAD_BOTH);
@@ -265,7 +273,7 @@ class ByteString extends AbstractString
return $str;
}
- public function padEnd(int $length, string $padStr = ' '): static
+ public function padEnd(int $length, string $padStr = ' '): parent
{
$str = clone $this;
$str->string = str_pad($this->string, $length, $padStr, \STR_PAD_RIGHT);
@@ -273,7 +281,7 @@ class ByteString extends AbstractString
return $str;
}
- public function padStart(int $length, string $padStr = ' '): static
+ public function padStart(int $length, string $padStr = ' '): parent
{
$str = clone $this;
$str->string = str_pad($this->string, $length, $padStr, \STR_PAD_LEFT);
@@ -281,7 +289,7 @@ class ByteString extends AbstractString
return $str;
}
- public function prepend(string ...$prefix): static
+ public function prepend(string ...$prefix): parent
{
$str = clone $this;
$str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$str->string;
@@ -289,7 +297,7 @@ class ByteString extends AbstractString
return $str;
}
- public function replace(string $from, string $to): static
+ public function replace(string $from, string $to): parent
{
$str = clone $this;
@@ -300,13 +308,21 @@ class ByteString extends AbstractString
return $str;
}
- public function replaceMatches(string $fromRegexp, string|callable $to): static
+ public function replaceMatches(string $fromRegexp, $to): parent
{
if ($this->ignoreCase) {
$fromRegexp .= 'i';
}
- $replace = \is_array($to) || $to instanceof \Closure ? 'preg_replace_callback' : 'preg_replace';
+ if (\is_array($to)) {
+ if (!\is_callable($to)) {
+ throw new \TypeError(sprintf('Argument 2 passed to "%s::replaceMatches()" must be callable, array given.', static::class));
+ }
+
+ $replace = 'preg_replace_callback';
+ } else {
+ $replace = $to instanceof \Closure ? 'preg_replace_callback' : 'preg_replace';
+ }
set_error_handler(static function ($t, $m) { throw new InvalidArgumentException($m); });
@@ -315,7 +331,7 @@ class ByteString extends AbstractString
$lastError = preg_last_error();
foreach (get_defined_constants(true)['pcre'] as $k => $v) {
- if ($lastError === $v && str_ends_with($k, '_ERROR')) {
+ if ($lastError === $v && '_ERROR' === substr($k, -6)) {
throw new RuntimeException('Matching failed with '.$k.'.');
}
}
@@ -332,7 +348,7 @@ class ByteString extends AbstractString
return $str;
}
- public function reverse(): static
+ public function reverse(): parent
{
$str = clone $this;
$str->string = strrev($str->string);
@@ -340,7 +356,7 @@ class ByteString extends AbstractString
return $str;
}
- public function slice(int $start = 0, int $length = null): static
+ public function slice(int $start = 0, int $length = null): parent
{
$str = clone $this;
$str->string = (string) substr($this->string, $start, $length ?? \PHP_INT_MAX);
@@ -348,7 +364,7 @@ class ByteString extends AbstractString
return $str;
}
- public function snake(): static
+ public function snake(): parent
{
$str = $this->camel();
$str->string = strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], '\1_\2', $str->string));
@@ -356,7 +372,7 @@ class ByteString extends AbstractString
return $str;
}
- public function splice(string $replacement, int $start = 0, int $length = null): static
+ public function splice(string $replacement, int $start = 0, int $length = null): parent
{
$str = clone $this;
$str->string = substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX);
@@ -366,7 +382,7 @@ class ByteString extends AbstractString
public function split(string $delimiter, int $limit = null, int $flags = null): array
{
- if (1 > $limit ??= \PHP_INT_MAX) {
+ if (1 > $limit = $limit ?? \PHP_INT_MAX) {
throw new InvalidArgumentException('Split limit must be a positive integer.');
}
@@ -391,9 +407,9 @@ class ByteString extends AbstractString
return $chunks;
}
- public function startsWith(string|iterable|AbstractString $prefix): bool
+ public function startsWith($prefix): bool
{
- if ($prefix instanceof AbstractString) {
+ if ($prefix instanceof parent) {
$prefix = $prefix->string;
} elseif (!\is_string($prefix)) {
return parent::startsWith($prefix);
@@ -402,7 +418,7 @@ class ByteString extends AbstractString
return '' !== $prefix && 0 === ($this->ignoreCase ? strncasecmp($this->string, $prefix, \strlen($prefix)) : strncmp($this->string, $prefix, \strlen($prefix)));
}
- public function title(bool $allWords = false): static
+ public function title(bool $allWords = false): parent
{
$str = clone $this;
$str->string = $allWords ? ucwords($str->string) : ucfirst($str->string);
@@ -452,7 +468,7 @@ class ByteString extends AbstractString
return $u;
}
- public function trim(string $chars = " \t\n\r\0\x0B\x0C"): static
+ public function trim(string $chars = " \t\n\r\0\x0B\x0C"): parent
{
$str = clone $this;
$str->string = trim($str->string, $chars);
@@ -460,7 +476,7 @@ class ByteString extends AbstractString
return $str;
}
- public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C"): static
+ public function trimEnd(string $chars = " \t\n\r\0\x0B\x0C"): parent
{
$str = clone $this;
$str->string = rtrim($str->string, $chars);
@@ -468,7 +484,7 @@ class ByteString extends AbstractString
return $str;
}
- public function trimStart(string $chars = " \t\n\r\0\x0B\x0C"): static
+ public function trimStart(string $chars = " \t\n\r\0\x0B\x0C"): parent
{
$str = clone $this;
$str->string = ltrim($str->string, $chars);
@@ -476,7 +492,7 @@ class ByteString extends AbstractString
return $str;
}
- public function upper(): static
+ public function upper(): parent
{
$str = clone $this;
$str->string = strtoupper($str->string);
diff --git a/vendor/symfony/string/CodePointString.php b/vendor/symfony/string/CodePointString.php
index f5c900fb..8ab92094 100644
--- a/vendor/symfony/string/CodePointString.php
+++ b/vendor/symfony/string/CodePointString.php
@@ -33,7 +33,7 @@ class CodePointString extends AbstractUnicodeString
$this->string = $string;
}
- public function append(string ...$suffix): static
+ public function append(string ...$suffix): AbstractString
{
$str = clone $this;
$str->string .= 1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix);
@@ -80,12 +80,14 @@ class CodePointString extends AbstractUnicodeString
return '' === $str->string ? [] : [mb_ord($str->string, 'UTF-8')];
}
- public function endsWith(string|iterable|AbstractString $suffix): bool
+ public function endsWith($suffix): bool
{
if ($suffix instanceof AbstractString) {
$suffix = $suffix->string;
- } elseif (!\is_string($suffix)) {
+ } elseif (\is_array($suffix) || $suffix instanceof \Traversable) {
return parent::endsWith($suffix);
+ } else {
+ $suffix = (string) $suffix;
}
if ('' === $suffix || !preg_match('//u', $suffix)) {
@@ -99,12 +101,14 @@ class CodePointString extends AbstractUnicodeString
return \strlen($this->string) >= \strlen($suffix) && 0 === substr_compare($this->string, $suffix, -\strlen($suffix));
}
- public function equalsTo(string|iterable|AbstractString $string): bool
+ public function equalsTo($string): bool
{
if ($string instanceof AbstractString) {
$string = $string->string;
- } elseif (!\is_string($string)) {
+ } elseif (\is_array($string) || $string instanceof \Traversable) {
return parent::equalsTo($string);
+ } else {
+ $string = (string) $string;
}
if ('' !== $string && $this->ignoreCase) {
@@ -114,12 +118,14 @@ class CodePointString extends AbstractUnicodeString
return $string === $this->string;
}
- public function indexOf(string|iterable|AbstractString $needle, int $offset = 0): ?int
+ public function indexOf($needle, int $offset = 0): ?int
{
if ($needle instanceof AbstractString) {
$needle = $needle->string;
- } elseif (!\is_string($needle)) {
+ } elseif (\is_array($needle) || $needle instanceof \Traversable) {
return parent::indexOf($needle, $offset);
+ } else {
+ $needle = (string) $needle;
}
if ('' === $needle) {
@@ -131,12 +137,14 @@ class CodePointString extends AbstractUnicodeString
return false === $i ? null : $i;
}
- public function indexOfLast(string|iterable|AbstractString $needle, int $offset = 0): ?int
+ public function indexOfLast($needle, int $offset = 0): ?int
{
if ($needle instanceof AbstractString) {
$needle = $needle->string;
- } elseif (!\is_string($needle)) {
+ } elseif (\is_array($needle) || $needle instanceof \Traversable) {
return parent::indexOfLast($needle, $offset);
+ } else {
+ $needle = (string) $needle;
}
if ('' === $needle) {
@@ -153,7 +161,7 @@ class CodePointString extends AbstractUnicodeString
return mb_strlen($this->string, 'UTF-8');
}
- public function prepend(string ...$prefix): static
+ public function prepend(string ...$prefix): AbstractString
{
$str = clone $this;
$str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string;
@@ -165,7 +173,7 @@ class CodePointString extends AbstractUnicodeString
return $str;
}
- public function replace(string $from, string $to): static
+ public function replace(string $from, string $to): AbstractString
{
$str = clone $this;
@@ -186,7 +194,7 @@ class CodePointString extends AbstractUnicodeString
return $str;
}
- public function slice(int $start = 0, int $length = null): static
+ public function slice(int $start = 0, int $length = null): AbstractString
{
$str = clone $this;
$str->string = mb_substr($this->string, $start, $length, 'UTF-8');
@@ -194,7 +202,7 @@ class CodePointString extends AbstractUnicodeString
return $str;
}
- public function splice(string $replacement, int $start = 0, int $length = null): static
+ public function splice(string $replacement, int $start = 0, int $length = null): AbstractString
{
if (!preg_match('//u', $replacement)) {
throw new InvalidArgumentException('Invalid UTF-8 string.');
@@ -210,7 +218,7 @@ class CodePointString extends AbstractUnicodeString
public function split(string $delimiter, int $limit = null, int $flags = null): array
{
- if (1 > $limit ??= \PHP_INT_MAX) {
+ if (1 > $limit = $limit ?? \PHP_INT_MAX) {
throw new InvalidArgumentException('Split limit must be a positive integer.');
}
@@ -239,12 +247,14 @@ class CodePointString extends AbstractUnicodeString
return $chunks;
}
- public function startsWith(string|iterable|AbstractString $prefix): bool
+ public function startsWith($prefix): bool
{
if ($prefix instanceof AbstractString) {
$prefix = $prefix->string;
- } elseif (!\is_string($prefix)) {
+ } elseif (\is_array($prefix) || $prefix instanceof \Traversable) {
return parent::startsWith($prefix);
+ } else {
+ $prefix = (string) $prefix;
}
if ('' === $prefix || !preg_match('//u', $prefix)) {
diff --git a/vendor/symfony/string/Inflector/EnglishInflector.php b/vendor/symfony/string/Inflector/EnglishInflector.php
index d9cc8e3d..9f2fac67 100644
--- a/vendor/symfony/string/Inflector/EnglishInflector.php
+++ b/vendor/symfony/string/Inflector/EnglishInflector.php
@@ -384,7 +384,7 @@ final class EnglishInflector implements InflectorInterface
if ($j === $suffixLength) {
// Is there any character preceding the suffix in the plural string?
if ($j < $pluralLength) {
- $nextIsVocal = str_contains('aeiou', $lowerPluralRev[$j]);
+ $nextIsVocal = false !== strpos('aeiou', $lowerPluralRev[$j]);
if (!$map[2] && $nextIsVocal) {
// suffix may not succeed a vocal but next char is one
@@ -464,7 +464,7 @@ final class EnglishInflector implements InflectorInterface
if ($j === $suffixLength) {
// Is there any character preceding the suffix in the plural string?
if ($j < $singularLength) {
- $nextIsVocal = str_contains('aeiou', $lowerSingularRev[$j]);
+ $nextIsVocal = false !== strpos('aeiou', $lowerSingularRev[$j]);
if (!$map[2] && $nextIsVocal) {
// suffix may not succeed a vocal but next char is one
diff --git a/vendor/symfony/string/LazyString.php b/vendor/symfony/string/LazyString.php
index 84fa7bf0..3b10595f 100644
--- a/vendor/symfony/string/LazyString.php
+++ b/vendor/symfony/string/LazyString.php
@@ -18,15 +18,17 @@ namespace Symfony\Component\String;
*/
class LazyString implements \Stringable, \JsonSerializable
{
- private \Closure|string $value;
+ private $value;
/**
* @param callable|array $callback A callable or a [Closure, method] lazy-callable
+ *
+ * @return static
*/
- public static function fromCallable(callable|array $callback, mixed ...$arguments): static
+ public static function fromCallable($callback, ...$arguments): self
{
- if (\is_array($callback) && !\is_callable($callback) && !(($callback[0] ?? null) instanceof \Closure || 2 < \count($callback))) {
- throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a callable or a [Closure, method] lazy-callable, "%s" given.', __METHOD__, '['.implode(', ', array_map('get_debug_type', $callback)).']'));
+ if (!\is_callable($callback) && !(\is_array($callback) && isset($callback[0]) && $callback[0] instanceof \Closure && 2 >= \count($callback))) {
+ throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a callable or a [Closure, method] lazy-callable, "%s" given.', __METHOD__, get_debug_type($callback)));
}
$lazyString = new static();
@@ -47,8 +49,17 @@ class LazyString implements \Stringable, \JsonSerializable
return $lazyString;
}
- public static function fromStringable(string|int|float|bool|\Stringable $value): static
+ /**
+ * @param string|int|float|bool|\Stringable $value
+ *
+ * @return static
+ */
+ public static function fromStringable($value): self
{
+ if (!self::isStringable($value)) {
+ throw new \TypeError(sprintf('Argument 1 passed to "%s()" must be a scalar or a stringable object, "%s" given.', __METHOD__, get_debug_type($value)));
+ }
+
if (\is_object($value)) {
return static::fromCallable([$value, '__toString']);
}
@@ -62,22 +73,27 @@ class LazyString implements \Stringable, \JsonSerializable
/**
* Tells whether the provided value can be cast to string.
*/
- final public static function isStringable(mixed $value): bool
+ final public static function isStringable($value): bool
{
- return \is_string($value) || $value instanceof \Stringable || \is_scalar($value);
+ return \is_string($value) || $value instanceof self || (\is_object($value) ? method_exists($value, '__toString') : \is_scalar($value));
}
/**
* Casts scalars and stringable objects to strings.
*
+ * @param object|string|int|float|bool $value
+ *
* @throws \TypeError When the provided value is not stringable
*/
- final public static function resolve(\Stringable|string|int|float|bool $value): string
+ final public static function resolve($value): string
{
return $value;
}
- public function __toString(): string
+ /**
+ * @return string
+ */
+ public function __toString()
{
if (\is_string($this->value)) {
return $this->value;
@@ -95,6 +111,11 @@ class LazyString implements \Stringable, \JsonSerializable
$e = new \TypeError(sprintf('Return value of %s() passed to %s::fromCallable() must be of the type string, %s returned.', $callback, static::class, $type));
}
+ if (\PHP_VERSION_ID < 70400) {
+ // leverage the ErrorHandler component with graceful fallback when it's not available
+ return trigger_error($e, \E_USER_ERROR);
+ }
+
throw $e;
}
}
@@ -127,7 +148,7 @@ class LazyString implements \Stringable, \JsonSerializable
} elseif ($callback instanceof \Closure) {
$r = new \ReflectionFunction($callback);
- if (str_contains($r->name, '{closure}') || !$class = $r->getClosureScopeClass()) {
+ if (false !== strpos($r->name, '{closure}') || !$class = $r->getClosureScopeClass()) {
return $r->name;
}
diff --git a/vendor/symfony/string/Resources/functions.php b/vendor/symfony/string/Resources/functions.php
index 7a970400..c950894f 100644
--- a/vendor/symfony/string/Resources/functions.php
+++ b/vendor/symfony/string/Resources/functions.php
@@ -31,7 +31,7 @@ if (!\function_exists(s::class)) {
*/
function s(?string $string = ''): AbstractString
{
- $string ??= '';
+ $string = $string ?? '';
return preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string);
}
diff --git a/vendor/symfony/string/Slugger/AsciiSlugger.php b/vendor/symfony/string/Slugger/AsciiSlugger.php
index d32e3051..5aecfeb5 100644
--- a/vendor/symfony/string/Slugger/AsciiSlugger.php
+++ b/vendor/symfony/string/Slugger/AsciiSlugger.php
@@ -54,8 +54,8 @@ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface
'zh' => 'Han-Latin',
];
- private ?string $defaultLocale;
- private \Closure|array $symbolsMap = [
+ private $defaultLocale;
+ private $symbolsMap = [
'en' => ['@' => 'at', '&' => 'and'],
];
@@ -64,10 +64,17 @@ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface
*
* @var \Transliterator[]
*/
- private array $transliterators = [];
+ private $transliterators = [];
- public function __construct(string $defaultLocale = null, array|\Closure $symbolsMap = null)
+ /**
+ * @param array|\Closure|null $symbolsMap
+ */
+ public function __construct(string $defaultLocale = null, $symbolsMap = null)
{
+ if (null !== $symbolsMap && !\is_array($symbolsMap) && !$symbolsMap instanceof \Closure) {
+ throw new \TypeError(sprintf('Argument 2 passed to "%s()" must be array, Closure or null, "%s" given.', __METHOD__, \gettype($symbolsMap)));
+ }
+
$this->defaultLocale = $defaultLocale;
$this->symbolsMap = $symbolsMap ?? $this->symbolsMap;
}
@@ -75,7 +82,7 @@ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface
/**
* {@inheritdoc}
*/
- public function setLocale(string $locale)
+ public function setLocale($locale)
{
$this->defaultLocale = $locale;
}
@@ -83,7 +90,7 @@ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface
/**
* {@inheritdoc}
*/
- public function getLocale(): string
+ public function getLocale()
{
return $this->defaultLocale;
}
@@ -93,10 +100,10 @@ class AsciiSlugger implements SluggerInterface, LocaleAwareInterface
*/
public function slug(string $string, string $separator = '-', string $locale = null): AbstractUnicodeString
{
- $locale ??= $this->defaultLocale;
+ $locale = $locale ?? $this->defaultLocale;
$transliterator = [];
- if ($locale && ('de' === $locale || str_starts_with($locale, 'de_'))) {
+ if ($locale && ('de' === $locale || 0 === strpos($locale, 'de_'))) {
// Use the shortcut for German in UnicodeString::ascii() if possible (faster and no requirement on intl)
$transliterator = ['de-ASCII'];
} elseif (\function_exists('transliterator_transliterate') && $locale) {
diff --git a/vendor/symfony/string/UnicodeString.php b/vendor/symfony/string/UnicodeString.php
index a64c6a9d..9b906c6f 100644
--- a/vendor/symfony/string/UnicodeString.php
+++ b/vendor/symfony/string/UnicodeString.php
@@ -41,7 +41,7 @@ class UnicodeString extends AbstractUnicodeString
}
}
- public function append(string ...$suffix): static
+ public function append(string ...$suffix): AbstractString
{
$str = clone $this;
$str->string = $this->string.(1 >= \count($suffix) ? ($suffix[0] ?? '') : implode('', $suffix));
@@ -82,12 +82,14 @@ class UnicodeString extends AbstractUnicodeString
return $chunks;
}
- public function endsWith(string|iterable|AbstractString $suffix): bool
+ public function endsWith($suffix): bool
{
if ($suffix instanceof AbstractString) {
$suffix = $suffix->string;
- } elseif (!\is_string($suffix)) {
+ } elseif (\is_array($suffix) || $suffix instanceof \Traversable) {
return parent::endsWith($suffix);
+ } else {
+ $suffix = (string) $suffix;
}
$form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
@@ -104,12 +106,14 @@ class UnicodeString extends AbstractUnicodeString
return $suffix === grapheme_extract($this->string, \strlen($suffix), \GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix));
}
- public function equalsTo(string|iterable|AbstractString $string): bool
+ public function equalsTo($string): bool
{
if ($string instanceof AbstractString) {
$string = $string->string;
- } elseif (!\is_string($string)) {
+ } elseif (\is_array($string) || $string instanceof \Traversable) {
return parent::equalsTo($string);
+ } else {
+ $string = (string) $string;
}
$form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
@@ -122,12 +126,14 @@ class UnicodeString extends AbstractUnicodeString
return $string === $this->string;
}
- public function indexOf(string|iterable|AbstractString $needle, int $offset = 0): ?int
+ public function indexOf($needle, int $offset = 0): ?int
{
if ($needle instanceof AbstractString) {
$needle = $needle->string;
- } elseif (!\is_string($needle)) {
+ } elseif (\is_array($needle) || $needle instanceof \Traversable) {
return parent::indexOf($needle, $offset);
+ } else {
+ $needle = (string) $needle;
}
$form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
@@ -139,19 +145,21 @@ class UnicodeString extends AbstractUnicodeString
try {
$i = $this->ignoreCase ? grapheme_stripos($this->string, $needle, $offset) : grapheme_strpos($this->string, $needle, $offset);
- } catch (\ValueError) {
+ } catch (\ValueError $e) {
return null;
}
return false === $i ? null : $i;
}
- public function indexOfLast(string|iterable|AbstractString $needle, int $offset = 0): ?int
+ public function indexOfLast($needle, int $offset = 0): ?int
{
if ($needle instanceof AbstractString) {
$needle = $needle->string;
- } elseif (!\is_string($needle)) {
+ } elseif (\is_array($needle) || $needle instanceof \Traversable) {
return parent::indexOfLast($needle, $offset);
+ } else {
+ $needle = (string) $needle;
}
$form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
@@ -176,7 +184,7 @@ class UnicodeString extends AbstractUnicodeString
return false === $i ? null : $i;
}
- public function join(array $strings, string $lastGlue = null): static
+ public function join(array $strings, string $lastGlue = null): AbstractString
{
$str = parent::join($strings, $lastGlue);
normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);
@@ -189,7 +197,10 @@ class UnicodeString extends AbstractUnicodeString
return grapheme_strlen($this->string);
}
- public function normalize(int $form = self::NFC): static
+ /**
+ * @return static
+ */
+ public function normalize(int $form = self::NFC): parent
{
$str = clone $this;
@@ -205,7 +216,7 @@ class UnicodeString extends AbstractUnicodeString
return $str;
}
- public function prepend(string ...$prefix): static
+ public function prepend(string ...$prefix): AbstractString
{
$str = clone $this;
$str->string = (1 >= \count($prefix) ? ($prefix[0] ?? '') : implode('', $prefix)).$this->string;
@@ -218,7 +229,7 @@ class UnicodeString extends AbstractUnicodeString
return $str;
}
- public function replace(string $from, string $to): static
+ public function replace(string $from, string $to): AbstractString
{
$str = clone $this;
normalizer_is_normalized($from) ?: $from = normalizer_normalize($from);
@@ -245,7 +256,7 @@ class UnicodeString extends AbstractUnicodeString
return $str;
}
- public function replaceMatches(string $fromRegexp, string|callable $to): static
+ public function replaceMatches(string $fromRegexp, $to): AbstractString
{
$str = parent::replaceMatches($fromRegexp, $to);
normalizer_is_normalized($str->string) ?: $str->string = normalizer_normalize($str->string);
@@ -253,19 +264,25 @@ class UnicodeString extends AbstractUnicodeString
return $str;
}
- public function slice(int $start = 0, int $length = null): static
+ public function slice(int $start = 0, int $length = null): AbstractString
{
$str = clone $this;
+ if (\PHP_VERSION_ID < 80000 && 0 > $start && grapheme_strlen($this->string) < -$start) {
+ $start = 0;
+ }
$str->string = (string) grapheme_substr($this->string, $start, $length ?? 2147483647);
return $str;
}
- public function splice(string $replacement, int $start = 0, int $length = null): static
+ public function splice(string $replacement, int $start = 0, int $length = null): AbstractString
{
$str = clone $this;
+ if (\PHP_VERSION_ID < 80000 && 0 > $start && grapheme_strlen($this->string) < -$start) {
+ $start = 0;
+ }
$start = $start ? \strlen(grapheme_substr($this->string, 0, $start)) : 0;
$length = $length ? \strlen(grapheme_substr($this->string, $start, $length ?? 2147483647)) : $length;
$str->string = substr_replace($this->string, $replacement, $start, $length ?? 2147483647);
@@ -280,7 +297,7 @@ class UnicodeString extends AbstractUnicodeString
public function split(string $delimiter, int $limit = null, int $flags = null): array
{
- if (1 > $limit ??= 2147483647) {
+ if (1 > $limit = $limit ?? 2147483647) {
throw new InvalidArgumentException('Split limit must be a positive integer.');
}
@@ -316,12 +333,14 @@ class UnicodeString extends AbstractUnicodeString
return $chunks;
}
- public function startsWith(string|iterable|AbstractString $prefix): bool
+ public function startsWith($prefix): bool
{
if ($prefix instanceof AbstractString) {
$prefix = $prefix->string;
- } elseif (!\is_string($prefix)) {
+ } elseif (\is_array($prefix) || $prefix instanceof \Traversable) {
return parent::startsWith($prefix);
+ } else {
+ $prefix = (string) $prefix;
}
$form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC;
diff --git a/vendor/symfony/string/composer.json b/vendor/symfony/string/composer.json
index 5e4febb5..2b88fd52 100644
--- a/vendor/symfony/string/composer.json
+++ b/vendor/symfony/string/composer.json
@@ -16,20 +16,21 @@
}
],
"require": {
- "php": ">=8.1",
+ "php": ">=7.2.5",
"symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-grapheme": "~1.0",
"symfony/polyfill-intl-normalizer": "~1.0",
- "symfony/polyfill-mbstring": "~1.0"
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "~1.15"
},
"require-dev": {
- "symfony/error-handler": "^5.4|^6.0",
- "symfony/http-client": "^5.4|^6.0",
- "symfony/translation-contracts": "^2.0|^3.0",
- "symfony/var-exporter": "^5.4|^6.0"
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/http-client": "^4.4|^5.0|^6.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "symfony/var-exporter": "^4.4|^5.0|^6.0"
},
"conflict": {
- "symfony/translation-contracts": "<2.0"
+ "symfony/translation-contracts": ">=3.0"
},
"autoload": {
"psr-4": { "Symfony\\Component\\String\\": "" },
diff --git a/vendor/symfony/translation-contracts/LocaleAwareInterface.php b/vendor/symfony/translation-contracts/LocaleAwareInterface.php
index 6923b977..693f92ba 100644
--- a/vendor/symfony/translation-contracts/LocaleAwareInterface.php
+++ b/vendor/symfony/translation-contracts/LocaleAwareInterface.php
@@ -16,12 +16,16 @@ interface LocaleAwareInterface
/**
* Sets the current locale.
*
+ * @param string $locale The locale
+ *
* @throws \InvalidArgumentException If the locale contains invalid characters
*/
public function setLocale(string $locale);
/**
* Returns the current locale.
+ *
+ * @return string
*/
- public function getLocale(): string;
+ public function getLocale();
}
diff --git a/vendor/symfony/translation-contracts/Test/TranslatorTest.php b/vendor/symfony/translation-contracts/Test/TranslatorTest.php
index 4e5999df..a3e9b20a 100644
--- a/vendor/symfony/translation-contracts/Test/TranslatorTest.php
+++ b/vendor/symfony/translation-contracts/Test/TranslatorTest.php
@@ -43,7 +43,10 @@ class TranslatorTest extends TestCase
\Locale::setDefault($this->defaultLocale);
}
- public function getTranslator(): TranslatorInterface
+ /**
+ * @return TranslatorInterface
+ */
+ public function getTranslator()
{
return new class() implements TranslatorInterface {
use TranslatorTrait;
@@ -314,8 +317,10 @@ class TranslatorTest extends TestCase
* This array should contain all currently known langcodes.
*
* As it is impossible to have this ever complete we should try as hard as possible to have it almost complete.
+ *
+ * @return array
*/
- public function successLangcodes(): array
+ public function successLangcodes()
{
return [
['1', ['ay', 'bo', 'cgg', 'dz', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky']],
@@ -334,7 +339,7 @@ class TranslatorTest extends TestCase
*
* @return array with nplural together with langcodes
*/
- public function failingLangcodes(): array
+ public function failingLangcodes()
{
return [
['1', ['fa']],
@@ -348,10 +353,11 @@ class TranslatorTest extends TestCase
/**
* We validate only on the plural coverage. Thus the real rules is not tested.
*
- * @param string $nplural Plural expected
- * @param array $matrix Containing langcodes and their plural index values
+ * @param string $nplural Plural expected
+ * @param array $matrix Containing langcodes and their plural index values
+ * @param bool $expectSuccess
*/
- protected function validateMatrix(string $nplural, array $matrix, bool $expectSuccess = true)
+ protected function validateMatrix($nplural, $matrix, $expectSuccess = true)
{
foreach ($matrix as $langCode => $data) {
$indexes = array_flip($data);
diff --git a/vendor/symfony/translation-contracts/TranslatorInterface.php b/vendor/symfony/translation-contracts/TranslatorInterface.php
index 018db07e..77b7a9c5 100644
--- a/vendor/symfony/translation-contracts/TranslatorInterface.php
+++ b/vendor/symfony/translation-contracts/TranslatorInterface.php
@@ -13,6 +13,8 @@ namespace Symfony\Contracts\Translation;
/**
* @author Fabien Potencier